Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
N
NewParkAPP
Project
Project
Details
Activity
Releases
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
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
YONG-LIN SU
NewParkAPP
Commits
fb151307
Commit
fb151307
authored
Aug 29, 2022
by
YONG-LIN SU
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
修正流程,以拍照為基礎判別是否為新單或舊單
parent
292e92e8
Changes
18
Show whitespace changes
Inline
Side-by-side
Showing
18 changed files
with
1052 additions
and
78 deletions
+1052
-78
deploymentTargetDropDown.xml
.idea/deploymentTargetDropDown.xml
+1
-1
misc.xml
.idea/misc.xml
+2
-0
AndroidManifest.xml
app/src/main/AndroidManifest.xml
+8
-13
Common.java
app/src/main/java/ecom/android/newparkapp/Common.java
+88
-0
ModifyPhoto.java
app/src/main/java/ecom/android/newparkapp/ModifyPhoto.java
+15
-0
CaseDao.java
app/src/main/java/ecom/android/newparkapp/dao/CaseDao.java
+7
-0
SpaceDao.java
app/src/main/java/ecom/android/newparkapp/dao/SpaceDao.java
+1
-1
CarPrinter_TPB250.java
...va/ecom/android/newparkapp/printer/CarPrinter_TPB250.java
+7
-2
InfoRepository.java
...va/ecom/android/newparkapp/repository/InfoRepository.java
+29
-0
T02KeyInPlateNumberActivity.java
.../android/newparkapp/view/T02KeyInPlateNumberActivity.java
+26
-0
T02PlateAndSpaceConfirmActivity.java
...roid/newparkapp/view/T02PlateAndSpaceConfirmActivity.java
+200
-0
T02StartActivity.java
...n/java/ecom/android/newparkapp/view/T02StartActivity.java
+125
-17
T02StartViewModel.java
.../ecom/android/newparkapp/viewModel/T02StartViewModel.java
+133
-30
plate.jpg
app/src/main/res/drawable/plate.jpg
+0
-0
activity_t02_key_in_plate_number.xml
app/src/main/res/layout/activity_t02_key_in_plate_number.xml
+2
-2
activity_t02_plate_and_space_confirm.xml
.../main/res/layout/activity_t02_plate_and_space_confirm.xml
+133
-0
activity_t02_start.xml
app/src/main/res/layout/activity_t02_start.xml
+4
-12
alert_dialog_t03_new_cumulative_time.xml
.../main/res/layout/alert_dialog_t03_new_cumulative_time.xml
+271
-0
No files found.
.idea/deploymentTargetDropDown.xml
View file @
fb151307
...
@@ -12,6 +12,6 @@
...
@@ -12,6 +12,6 @@
</deviceKey>
</deviceKey>
</Target>
</Target>
</runningDeviceTargetSelectedWithDropDown>
</runningDeviceTargetSelectedWithDropDown>
<timeTargetWasSelectedWithDropDown
value=
"2022-08-2
4T09:01:07.8385344
00Z"
/>
<timeTargetWasSelectedWithDropDown
value=
"2022-08-2
9T05:19:03.5955581
00Z"
/>
</component>
</component>
</project>
</project>
\ No newline at end of file
.idea/misc.xml
View file @
fb151307
...
@@ -25,6 +25,7 @@
...
@@ -25,6 +25,7 @@
<entry
key=
"..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t01_import_db.xml"
value=
"0.34375"
/>
<entry
key=
"..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t01_import_db.xml"
value=
"0.34375"
/>
<entry
key=
"..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t02_key_in_plate_number.xml"
value=
"0.34375"
/>
<entry
key=
"..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t02_key_in_plate_number.xml"
value=
"0.34375"
/>
<entry
key=
"..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t02_key_in_plate_number_reverse.xml"
value=
"0.34375"
/>
<entry
key=
"..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t02_key_in_plate_number_reverse.xml"
value=
"0.34375"
/>
<entry
key=
"..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t02_plate_and_space_confirm.xml"
value=
"0.3654891304347826"
/>
<entry
key=
"..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t02_select_road.xml"
value=
"0.34375"
/>
<entry
key=
"..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t02_select_road.xml"
value=
"0.34375"
/>
<entry
key=
"..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t02_select_space.xml"
value=
"0.34375"
/>
<entry
key=
"..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t02_select_space.xml"
value=
"0.34375"
/>
<entry
key=
"..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t02_select_vehicle_type.xml"
value=
"0.34375"
/>
<entry
key=
"..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t02_select_vehicle_type.xml"
value=
"0.34375"
/>
...
@@ -39,6 +40,7 @@
...
@@ -39,6 +40,7 @@
<entry
key=
"..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/alert_dialog_progress_bar.xml"
value=
"0.29957264957264956"
/>
<entry
key=
"..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/alert_dialog_progress_bar.xml"
value=
"0.29957264957264956"
/>
<entry
key=
"..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/alert_dialog_t02_device_list.xml"
value=
"0.34375"
/>
<entry
key=
"..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/alert_dialog_t02_device_list.xml"
value=
"0.34375"
/>
<entry
key=
"..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/alert_dialog_t03_cumulative_time.xml"
value=
"0.34375"
/>
<entry
key=
"..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/alert_dialog_t03_cumulative_time.xml"
value=
"0.34375"
/>
<entry
key=
"..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/alert_dialog_t03_new_cumulative_time.xml"
value=
"0.3651041666666667"
/>
<entry
key=
"..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/card_view_image_plate_number_item.xml"
value=
"0.34375"
/>
<entry
key=
"..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/card_view_image_plate_number_item.xml"
value=
"0.34375"
/>
<entry
key=
"..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/card_view_large_list_files_item.xml"
value=
"0.34375"
/>
<entry
key=
"..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/card_view_large_list_files_item.xml"
value=
"0.34375"
/>
<entry
key=
"..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/card_view_list_files_item.xml"
value=
"0.34375"
/>
<entry
key=
"..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/card_view_list_files_item.xml"
value=
"0.34375"
/>
...
...
app/src/main/AndroidManifest.xml
View file @
fb151307
...
@@ -2,7 +2,6 @@
...
@@ -2,7 +2,6 @@
<manifest
xmlns:android=
"http://schemas.android.com/apk/res/android"
<manifest
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:tools=
"http://schemas.android.com/tools"
xmlns:tools=
"http://schemas.android.com/tools"
package=
"ecom.android.newparkapp"
>
package=
"ecom.android.newparkapp"
>
<!-- Android 11 調用相機拍照意圖 註冊 -->
<!-- Android 11 調用相機拍照意圖 註冊 -->
<queries>
<queries>
<intent>
<intent>
...
@@ -23,22 +22,23 @@
...
@@ -23,22 +22,23 @@
<uses-permission
android:name=
"android.permission.VIBRATE"
/>
<uses-permission
android:name=
"android.permission.VIBRATE"
/>
<uses-permission
android:name=
"android.permission.WRITE_EXTERNAL_STORAGE"
/>
<uses-permission
android:name=
"android.permission.WRITE_EXTERNAL_STORAGE"
/>
<uses-permission
android:name=
"android.permission.READ_EXTERNAL_STORAGE"
/>
<uses-permission
android:name=
"android.permission.READ_EXTERNAL_STORAGE"
/>
<uses-permission
android:name=
"android.permission.FOREGROUND_SERVICE"
/>
<uses-permission
android:name=
"android.permission.FOREGROUND_SERVICE"
/>
<!-- android 11 管理所有檔案權限 -->
<!-- android 11 管理所有檔案權限 -->
<uses-permission
android:name=
"android.permission.MANAGE_EXTERNAL_STORAGE"
/>
<uses-permission
android:name=
"android.permission.MANAGE_EXTERNAL_STORAGE"
/>
<application
<application
android:allowBackup=
"true"
android:allowBackup=
"true"
android:dataExtractionRules=
"@xml/data_extraction_rules"
android:dataExtractionRules=
"@xml/data_extraction_rules"
android:fullBackupContent=
"@xml/backup_rules"
android:fullBackupContent=
"@xml/backup_rules"
android:networkSecurityConfig=
"@xml/network_security_config"
android:icon=
"@mipmap/ic_icon_launcher"
android:icon=
"@mipmap/ic_icon_launcher"
android:label=
"@string/app_name"
android:label=
"@string/app_name"
android:networkSecurityConfig=
"@xml/network_security_config"
android:roundIcon=
"@mipmap/ic_icon_launcher_round"
android:roundIcon=
"@mipmap/ic_icon_launcher_round"
android:supportsRtl=
"true"
android:supportsRtl=
"true"
android:theme=
"@style/Theme.AppCompat.Light.NoActionBar"
android:theme=
"@style/Theme.AppCompat.Light.NoActionBar"
tools:targetApi=
"31"
>
tools:targetApi=
"31"
>
<activity
android:name=
".view.T02PlateAndSpaceConfirmActivity"
android:exported=
"false"
/>
<activity
<activity
android:name=
".view.MainActivity"
android:name=
".view.MainActivity"
android:exported=
"true"
>
android:exported=
"true"
>
...
@@ -48,7 +48,6 @@
...
@@ -48,7 +48,6 @@
<category
android:name=
"android.intent.category.LAUNCHER"
/>
<category
android:name=
"android.intent.category.LAUNCHER"
/>
</intent-filter>
</intent-filter>
</activity>
</activity>
<activity
<activity
android:name=
".view.T01SettingActivity"
android:name=
".view.T01SettingActivity"
android:exported=
"false"
android:exported=
"false"
...
@@ -98,16 +97,12 @@
...
@@ -98,16 +97,12 @@
android:name=
".view.T03SearchingParkingSpaceActivity"
android:name=
".view.T03SearchingParkingSpaceActivity"
android:exported=
"false"
android:exported=
"false"
android:label=
"案件搜尋"
android:label=
"案件搜尋"
android:theme=
"@style/Theme.AppCompat.Light"
android:theme=
"@style/Theme.AppCompat.Light"
/>
/>
<activity
<activity
android:name=
".view.T04RenewListActivity"
android:name=
".view.T04RenewListActivity"
android:exported=
"false"
android:exported=
"false"
android:label=
"GPS巡場模式"
android:label=
"GPS巡場模式"
android:theme=
"@style/Theme.AppCompat.Light"
android:theme=
"@style/Theme.AppCompat.Light"
/>
/>
<provider
<provider
android:name=
"androidx.core.content.FileProvider"
android:name=
"androidx.core.content.FileProvider"
...
...
app/src/main/java/ecom/android/newparkapp/Common.java
View file @
fb151307
package
ecom
.
android
.
newparkapp
;
package
ecom
.
android
.
newparkapp
;
import
android.app.Activity
;
import
android.app.Application
;
import
android.content.Context
;
import
android.content.Context
;
import
android.graphics.Bitmap
;
import
android.graphics.Bitmap
;
import
android.graphics.BitmapFactory
;
import
android.graphics.Matrix
;
import
android.graphics.Matrix
;
import
androidx.exifinterface.media.ExifInterface
;
import
androidx.exifinterface.media.ExifInterface
;
import
android.media.MediaScannerConnection
;
import
android.media.MediaScannerConnection
;
import
android.os.Environment
;
import
android.os.Environment
;
import
android.util.DisplayMetrics
;
import
android.util.Log
;
import
android.widget.Toast
;
import
android.widget.Toast
;
import
java.io.File
;
import
java.io.File
;
import
java.io.FileInputStream
;
import
java.io.FileInputStream
;
import
java.io.FileNotFoundException
;
import
java.io.FileOutputStream
;
import
java.io.FileOutputStream
;
import
java.io.FileReader
;
import
java.io.FileReader
;
import
java.io.IOException
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.io.InputStream
;
import
java.io.OutputStream
;
import
java.io.OutputStreamWriter
;
import
java.io.OutputStreamWriter
;
import
java.nio.ByteBuffer
;
import
java.nio.ByteBuffer
;
import
java.nio.charset.StandardCharsets
;
import
java.nio.charset.StandardCharsets
;
import
java.util.Calendar
;
import
java.util.Calendar
;
import
java.util.Locale
;
import
java.util.Locale
;
import
ecom.android.newparkapp.entity.BoxInfo
;
public
class
Common
{
public
class
Common
{
public
static
final
String
CHANNEL_ID
=
"ecom.android.park.notification.channel"
;
public
static
final
String
CHANNEL_ID
=
"ecom.android.park.notification.channel"
;
...
@@ -696,4 +705,83 @@ public class Common {
...
@@ -696,4 +705,83 @@ public class Common {
bitmap
.
copyPixelsToBuffer
(
buf
);
bitmap
.
copyPixelsToBuffer
(
buf
);
return
buf
.
array
();
return
buf
.
array
();
}
}
public
static
Bitmap
decodeFile2ScaledBitmap
(
String
path
,
Activity
activity
){
BitmapFactory
.
Options
options
=
new
BitmapFactory
.
Options
();
options
.
inJustDecodeBounds
=
true
;
//开启只读取尺寸
Bitmap
bitmap
=
BitmapFactory
.
decodeFile
(
path
,
options
);
DisplayMetrics
DM
=
new
DisplayMetrics
();
activity
.
getWindowManager
().
getDefaultDisplay
().
getMetrics
(
DM
);
int
size
=
1
;
if
(
options
.
outWidth
>
DM
.
widthPixels
)
{
size
=
options
.
outWidth
/
DM
.
widthPixels
;
//计算比例
}
options
.
inSampleSize
=
size
;
//设置缩放值
options
.
inJustDecodeBounds
=
false
;
//关闭只读取尺寸
bitmap
=
BitmapFactory
.
decodeFile
(
path
,
options
);
return
bitmap
;
}
public
static
Bitmap
decodeFile2ScaledPlateBitmap
(
String
path
,
BoxInfo
boxInfo
,
Activity
activity
){
BitmapFactory
.
Options
options
=
new
BitmapFactory
.
Options
();
options
.
inJustDecodeBounds
=
true
;
Bitmap
bitmap
=
BitmapFactory
.
decodeFile
(
path
,
options
);
DisplayMetrics
DM
=
new
DisplayMetrics
();
activity
.
getWindowManager
().
getDefaultDisplay
().
getMetrics
(
DM
);
int
size
=
1
;
if
(
options
.
outWidth
>
DM
.
widthPixels
)
{
size
=
options
.
outWidth
/
DM
.
widthPixels
;
}
// 固定縮放比例
size
=
4
;
options
.
inSampleSize
=
size
;
options
.
inJustDecodeBounds
=
false
;
bitmap
=
BitmapFactory
.
decodeFile
(
path
,
options
);
int
x0
=
(
int
)(
boxInfo
.
x0
/
size
);
int
y0
=
(
int
)(
boxInfo
.
y0
/
size
);
int
w
=
(
int
)(
boxInfo
.
getRect
().
width
()/
size
);
int
h
=
(
int
)(
boxInfo
.
getRect
().
height
()/
size
);
Bitmap
plateBitmap
=
null
;
try
{
plateBitmap
=
Bitmap
.
createBitmap
(
bitmap
,
x0
,
y0
,
w
,
h
);
}
catch
(
Exception
exception
){
exception
.
printStackTrace
();
}
return
plateBitmap
;
}
public
static
void
moveFile
(
String
inputPath
,
String
outputPath
)
{
InputStream
in
=
null
;
OutputStream
out
=
null
;
try
{
in
=
new
FileInputStream
(
inputPath
);
out
=
new
FileOutputStream
(
outputPath
);
byte
[]
buffer
=
new
byte
[
1024
];
int
read
;
while
((
read
=
in
.
read
(
buffer
))
!=
-
1
)
{
out
.
write
(
buffer
,
0
,
read
);
}
in
.
close
();
in
=
null
;
// write the output file
out
.
flush
();
out
.
close
();
out
=
null
;
// delete the original file
new
File
(
inputPath
).
delete
();
}
catch
(
FileNotFoundException
fnfe1
)
{
Log
.
e
(
"tag"
,
fnfe1
.
getMessage
());
}
catch
(
Exception
e
)
{
Log
.
e
(
"tag"
,
e
.
getMessage
());
}
}
}
}
app/src/main/java/ecom/android/newparkapp/ModifyPhoto.java
View file @
fb151307
package
ecom
.
android
.
newparkapp
;
package
ecom
.
android
.
newparkapp
;
import
static
ecom
.
android
.
newparkapp
.
Common
.
moveFile
;
import
android.graphics.Bitmap
;
import
android.graphics.Bitmap
;
import
android.graphics.BitmapFactory
;
import
android.graphics.BitmapFactory
;
import
android.graphics.Canvas
;
import
android.graphics.Canvas
;
...
@@ -14,9 +16,16 @@ import java.util.Calendar;
...
@@ -14,9 +16,16 @@ import java.util.Calendar;
public
class
ModifyPhoto
implements
Runnable
{
public
class
ModifyPhoto
implements
Runnable
{
private
final
String
path
;
private
final
String
path
;
private
final
String
newPath
;
public
ModifyPhoto
(
String
path
)
{
public
ModifyPhoto
(
String
path
)
{
this
.
path
=
path
;
this
.
path
=
path
;
this
.
newPath
=
path
;
}
public
ModifyPhoto
(
String
path
,
String
newPath
){
this
.
path
=
path
;
this
.
newPath
=
newPath
;
}
}
@Override
@Override
...
@@ -69,6 +78,12 @@ public class ModifyPhoto implements Runnable {
...
@@ -69,6 +78,12 @@ public class ModifyPhoto implements Runnable {
icon
.
recycle
();
icon
.
recycle
();
}
}
}
}
if
(!
path
.
equals
(
newPath
)){
// 搬移檔案至目標位置
moveFile
(
path
,
newPath
);
}
//Log.d("ModifyPhoto", " Ends Work : " + Thread.currentThread().getName());
//Log.d("ModifyPhoto", " Ends Work : " + Thread.currentThread().getName());
}
}
}
}
app/src/main/java/ecom/android/newparkapp/dao/CaseDao.java
View file @
fb151307
...
@@ -13,6 +13,7 @@ import java.util.List;
...
@@ -13,6 +13,7 @@ import java.util.List;
import
ecom.android.newparkapp.entity.Case
;
import
ecom.android.newparkapp.entity.Case
;
import
ecom.android.newparkapp.entity.CaseAndAllCasePhoto
;
import
ecom.android.newparkapp.entity.CaseAndAllCasePhoto
;
import
ecom.android.newparkapp.entity.Shift
;
import
ecom.android.newparkapp.entity.Shift
;
import
ecom.android.newparkapp.entity.Space
;
@Dao
@Dao
public
interface
CaseDao
{
public
interface
CaseDao
{
...
@@ -26,6 +27,12 @@ public interface CaseDao {
...
@@ -26,6 +27,12 @@ public interface CaseDao {
@Query
(
"SELECT * FROM `case` WHERE shift=:shift AND user_id=:userId AND case_time>=:startDate AND case_time<=:endDate"
)
@Query
(
"SELECT * FROM `case` WHERE shift=:shift AND user_id=:userId AND case_time>=:startDate AND case_time<=:endDate"
)
List
<
CaseAndAllCasePhoto
>
getAllWithCasePhotoByShitAndUserIdInDay
(
Shift
shift
,
int
userId
,
Date
startDate
,
Date
endDate
);
List
<
CaseAndAllCasePhoto
>
getAllWithCasePhotoByShitAndUserIdInDay
(
Shift
shift
,
int
userId
,
Date
startDate
,
Date
endDate
);
@Query
(
"SELECT * FROM `case` WHERE shift=:shift AND user_id=:userId AND plate_number=:plateNumber AND case_time>=:startDate AND case_time<=:endDate"
)
List
<
Case
>
getAllByShitAndUserIdAndPlateNumberInDay
(
Shift
shift
,
int
userId
,
String
plateNumber
,
Date
startDate
,
Date
endDate
);
@Query
(
"SELECT * FROM `case` WHERE shift=:shift AND user_id=:userId AND plate_number=:plateNumber AND space_id=:spaceId AND case_time>=:startDate AND case_time<=:endDate"
)
List
<
Case
>
getAllByShitAndUserIdAndPlateNumberAndSpaceIdInDay
(
Shift
shift
,
int
userId
,
String
plateNumber
,
String
spaceId
,
Date
startDate
,
Date
endDate
);
@Query
(
"SELECT * FROM `case` WHERE space_id=:spaceId"
)
@Query
(
"SELECT * FROM `case` WHERE space_id=:spaceId"
)
List
<
CaseAndAllCasePhoto
>
getAllWithCasePhotoBySpace
(
String
spaceId
);
List
<
CaseAndAllCasePhoto
>
getAllWithCasePhotoBySpace
(
String
spaceId
);
...
...
app/src/main/java/ecom/android/newparkapp/dao/SpaceDao.java
View file @
fb151307
...
@@ -27,7 +27,7 @@ public interface SpaceDao {
...
@@ -27,7 +27,7 @@ public interface SpaceDao {
List
<
Space
>
getAllByLocation
(
double
latitudeBigger
,
double
latitudeSmaller
,
double
longitudeBigger
,
double
longitudeSmaller
);
List
<
Space
>
getAllByLocation
(
double
latitudeBigger
,
double
latitudeSmaller
,
double
longitudeBigger
,
double
longitudeSmaller
);
@Query
(
"SELECT * FROM space WHERE id IN (:Ids)"
)
@Query
(
"SELECT * FROM space WHERE id IN (:Ids)"
)
List
<
Space
>
loadAllByIds
(
int
[]
Ids
);
List
<
Space
>
loadAllByIds
(
String
[]
Ids
);
@Query
(
"SELECT * FROM space WHERE road_id=:RoadIds"
)
@Query
(
"SELECT * FROM space WHERE road_id=:RoadIds"
)
List
<
Space
>
loadAllByRoadId
(
String
RoadIds
);
List
<
Space
>
loadAllByRoadId
(
String
RoadIds
);
...
...
app/src/main/java/ecom/android/newparkapp/printer/CarPrinter_TPB250.java
View file @
fb151307
...
@@ -164,8 +164,13 @@ public class CarPrinter_TPB250 implements IBluetoothPrinter {
...
@@ -164,8 +164,13 @@ public class CarPrinter_TPB250 implements IBluetoothPrinter {
PrintString
(
outPutBT
,
" "
+
carCase
.
plateNumber
,
52
,
true
);
PrintString
(
outPutBT
,
" "
+
carCase
.
plateNumber
,
52
,
true
);
//-------------------------------------------
//-------------------------------------------
//路段、格號
// 路段、格號
PrintString
(
outPutBT
,
" "
+
carCase
.
space
.
id
+
" "
+
carCase
.
space
.
road
.
name
,
52
,
true
);
// 避免超出範圍
String
roadNSpace
=
carCase
.
space
.
id
+
" "
+
carCase
.
space
.
road
.
name
;
if
(
roadNSpace
.
length
()
>
11
){
roadNSpace
=
roadNSpace
.
substring
(
0
,
11
);
}
PrintString
(
outPutBT
,
" "
+
roadNSpace
,
52
,
true
);
//-------------------------------------------
//-------------------------------------------
//日期
//日期
...
...
app/src/main/java/ecom/android/newparkapp/repository/InfoRepository.java
View file @
fb151307
...
@@ -2,12 +2,17 @@ package ecom.android.newparkapp.repository;
...
@@ -2,12 +2,17 @@ package ecom.android.newparkapp.repository;
import
android.app.Application
;
import
android.app.Application
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
import
java.util.Calendar
;
import
java.util.Calendar
;
import
java.util.Date
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.List
;
import
java.util.Locale
;
import
java.util.Locale
;
import
java.util.Map
;
import
java.util.Set
;
import
java.util.concurrent.ExecutorService
;
import
java.util.concurrent.ExecutorService
;
import
java.util.concurrent.Executors
;
import
java.util.concurrent.Executors
;
import
java.util.stream.Collectors
;
import
ecom.android.newparkapp.R
;
import
ecom.android.newparkapp.R
;
import
ecom.android.newparkapp.dao.CaseDao
;
import
ecom.android.newparkapp.dao.CaseDao
;
...
@@ -25,6 +30,7 @@ import ecom.android.newparkapp.database.InfoDatabase;
...
@@ -25,6 +30,7 @@ import ecom.android.newparkapp.database.InfoDatabase;
import
ecom.android.newparkapp.entity.Case
;
import
ecom.android.newparkapp.entity.Case
;
import
ecom.android.newparkapp.entity.CaseAndAllCasePhoto
;
import
ecom.android.newparkapp.entity.CaseAndAllCasePhoto
;
import
ecom.android.newparkapp.entity.Shift
;
import
ecom.android.newparkapp.entity.Shift
;
import
ecom.android.newparkapp.entity.Space
;
public
class
InfoRepository
{
public
class
InfoRepository
{
private
InfoDatabase
infoDatabase
;
private
InfoDatabase
infoDatabase
;
...
@@ -82,6 +88,29 @@ public class InfoRepository {
...
@@ -82,6 +88,29 @@ public class InfoRepository {
return
caseDao
.
getAllWithCasePhotoBySpaceAndShiftAndUserIdInDay
(
spaceId
,
shift
,
userId
,
startDate
,
endDate
);
return
caseDao
.
getAllWithCasePhotoBySpaceAndShiftAndUserIdInDay
(
spaceId
,
shift
,
userId
,
startDate
,
endDate
);
}
}
public
List
<
Case
>
getAllCaseByShitAndUserIdAndPlateNumberAndSpaceIdToday
(
Shift
shift
,
int
userId
,
String
plateNumber
,
String
spaceId
){
getStartEndToday
();
return
caseDao
.
getAllByShitAndUserIdAndPlateNumberAndSpaceIdInDay
(
shift
,
userId
,
plateNumber
,
spaceId
,
startDate
,
endDate
);
}
public
List
<
Case
>
getAllCaseByShitAndUserIdAndPlateNumberToday
(
Shift
shift
,
int
userId
,
String
plateNumber
){
getStartEndToday
();
return
caseDao
.
getAllByShitAndUserIdAndPlateNumberInDay
(
shift
,
userId
,
plateNumber
,
startDate
,
endDate
);
}
public
List
<
Space
>
getAllCaseSpaceByShitAndUserIdAndPlateNumberToday
(
Shift
shift
,
int
userId
,
String
plateNumber
){
List
<
Space
>
spaces
=
new
ArrayList
<>();
List
<
Case
>
cases
=
getAllCaseByShitAndUserIdAndPlateNumberToday
(
shift
,
userId
,
plateNumber
);
if
(
cases
.
size
()
==
0
){
return
spaces
;
}
Map
<
String
,
List
<
Case
>>
casesGroupBySpaceId
=
cases
.
stream
().
collect
(
Collectors
.
groupingBy
(
c
->
c
.
space
.
id
));
Set
<
String
>
spaceIdKeySet
=
casesGroupBySpaceId
.
keySet
();
String
[]
spaceIds
=
spaceIdKeySet
.
toArray
(
new
String
[
spaceIdKeySet
.
size
()]);
return
spaceDao
.
loadAllByIds
(
spaceIds
);
}
private
void
getStartEndToday
()
private
void
getStartEndToday
()
{
{
Calendar
calendar
=
Calendar
.
getInstance
(
Locale
.
getDefault
());
Calendar
calendar
=
Calendar
.
getInstance
(
Locale
.
getDefault
());
...
...
app/src/main/java/ecom/android/newparkapp/view/T02KeyInPlateNumberActivity.java
View file @
fb151307
package
ecom
.
android
.
newparkapp
.
view
;
package
ecom
.
android
.
newparkapp
.
view
;
import
static
ecom
.
android
.
newparkapp
.
Common
.
decodeFile2ScaledPlateBitmap
;
import
android.content.Intent
;
import
android.content.Intent
;
import
android.graphics.Bitmap
;
import
android.graphics.BitmapFactory
;
import
android.os.Bundle
;
import
android.os.Bundle
;
import
androidx.appcompat.app.AppCompatActivity
;
import
androidx.appcompat.app.AppCompatActivity
;
import
androidx.databinding.DataBindingUtil
;
import
androidx.databinding.DataBindingUtil
;
import
java.io.File
;
import
ecom.android.newparkapp.Common
;
import
ecom.android.newparkapp.Common
;
import
ecom.android.newparkapp.R
;
import
ecom.android.newparkapp.R
;
import
ecom.android.newparkapp.databinding.ActivityT02KeyInPlateNumberBinding
;
import
ecom.android.newparkapp.databinding.ActivityT02KeyInPlateNumberBinding
;
import
ecom.android.newparkapp.entity.BoxInfo
;
public
class
T02KeyInPlateNumberActivity
extends
AppCompatActivity
{
public
class
T02KeyInPlateNumberActivity
extends
AppCompatActivity
{
private
ActivityT02KeyInPlateNumberBinding
dataBinding
;
private
ActivityT02KeyInPlateNumberBinding
dataBinding
;
private
BoxInfo
boxInfo
;
private
File
file
;
@Override
@Override
protected
void
onCreate
(
Bundle
savedInstanceState
)
{
protected
void
onCreate
(
Bundle
savedInstanceState
)
{
super
.
onCreate
(
savedInstanceState
);
super
.
onCreate
(
savedInstanceState
);
dataBinding
=
DataBindingUtil
.
setContentView
(
this
,
R
.
layout
.
activity_t02_key_in_plate_number
);
dataBinding
=
DataBindingUtil
.
setContentView
(
this
,
R
.
layout
.
activity_t02_key_in_plate_number
);
Bundle
bundle
=
getIntent
().
getExtras
();
try
{
boxInfo
=
(
BoxInfo
)
bundle
.
getSerializable
(
"BoxInfo"
);
file
=
(
File
)
bundle
.
getSerializable
(
"PhotoFile"
);
}
catch
(
NullPointerException
nullPointerException
){
nullPointerException
.
printStackTrace
();
}
if
(
file
!=
null
&&
boxInfo
!=
null
&&
file
.
exists
()){
Bitmap
plateBitmap
=
decodeFile2ScaledPlateBitmap
(
file
.
getAbsolutePath
(),
boxInfo
,
this
);
if
(
plateBitmap
!=
null
){
dataBinding
.
ivCroppedPlate
.
setImageBitmap
(
plateBitmap
);
}
}
eventBinding
();
eventBinding
();
}
}
...
...
app/src/main/java/ecom/android/newparkapp/view/T02PlateAndSpaceConfirmActivity.java
0 → 100644
View file @
fb151307
package
ecom
.
android
.
newparkapp
.
view
;
import
static
ecom
.
android
.
newparkapp
.
Common
.
decodeFile2ScaledPlateBitmap
;
import
android.content.Intent
;
import
android.graphics.Bitmap
;
import
android.location.Location
;
import
android.os.Bundle
;
import
androidx.activity.result.ActivityResultLauncher
;
import
androidx.activity.result.contract.ActivityResultContracts
;
import
androidx.appcompat.app.AppCompatActivity
;
import
androidx.databinding.DataBindingUtil
;
import
androidx.lifecycle.ViewModelProvider
;
import
androidx.recyclerview.widget.GridLayoutManager
;
import
java.io.File
;
import
java.util.List
;
import
ecom.android.newparkapp.R
;
import
ecom.android.newparkapp.adapter.SelectSpaceAdapter
;
import
ecom.android.newparkapp.databinding.ActivityT02PlateAndSpaceConfirmBinding
;
import
ecom.android.newparkapp.entity.BoxInfo
;
import
ecom.android.newparkapp.entity.Case
;
import
ecom.android.newparkapp.entity.Road
;
import
ecom.android.newparkapp.entity.Shift
;
import
ecom.android.newparkapp.entity.Space
;
import
ecom.android.newparkapp.repository.InfoRepository
;
import
ecom.android.newparkapp.viewModel.T02SelectSpaceViewModel
;
public
class
T02PlateAndSpaceConfirmActivity
extends
AppCompatActivity
{
private
ActivityT02PlateAndSpaceConfirmBinding
dataBinding
;
private
InfoRepository
infoRepository
;
private
BoxInfo
boxInfo
;
private
File
file
;
private
String
plateNumber
;
private
int
userId
;
private
Shift
shift
;
private
Location
location
;
private
ActivityResultLauncher
keyInPlateNumberActivityResultLauncher
;
private
ActivityResultLauncher
roadResultLauncher
;
private
SelectSpaceAdapter
reNewCandidateSpaceAdapter
;
private
SelectSpaceAdapter
selectSpaceAdapter
;
private
T02SelectSpaceViewModel
t02SelectSpaceViewModel
;
private
ViewModelProvider
viewModelProvider
;
@Override
protected
void
onCreate
(
Bundle
savedInstanceState
)
{
super
.
onCreate
(
savedInstanceState
);
dataBinding
=
DataBindingUtil
.
setContentView
(
this
,
R
.
layout
.
activity_t02_plate_and_space_confirm
);
Bundle
bundle
=
getIntent
().
getExtras
();
try
{
userId
=
bundle
.
getInt
(
"UserId"
,
-
1
);
shift
=
bundle
.
getParcelable
(
"Shift"
);
location
=
bundle
.
getParcelable
(
"Location"
);
boxInfo
=
(
BoxInfo
)
bundle
.
getSerializable
(
"BoxInfo"
);
file
=
(
File
)
bundle
.
getSerializable
(
"PhotoFile"
);
}
catch
(
NullPointerException
nullPointerException
){
nullPointerException
.
printStackTrace
();
}
plateNumber
=
boxInfo
==
null
?
null
:
boxInfo
.
getPlateNumbs
();
if
(
userId
==
-
1
||
shift
==
null
||
location
==
null
){
finish
();
}
viewModelProvider
=
new
ViewModelProvider
(
this
);
t02SelectSpaceViewModel
=
viewModelProvider
.
get
(
T02SelectSpaceViewModel
.
class
);
t02SelectSpaceViewModel
.
searchNearSpace
(
location
);
infoRepository
=
new
InfoRepository
(
this
.
getApplication
());
selectSpaceAdapter
=
new
SelectSpaceAdapter
(
space
->
nextStage
(
space
));
dataBinding
.
rvSpaceOption
.
setLayoutManager
(
new
GridLayoutManager
(
this
,
3
));
dataBinding
.
rvSpaceOption
.
setAdapter
(
selectSpaceAdapter
);
reNewCandidateSpaceAdapter
=
new
SelectSpaceAdapter
(
space
->
nextStage
(
space
));
dataBinding
.
rvRenewSpaceOption
.
setLayoutManager
(
new
GridLayoutManager
(
this
,
3
));
dataBinding
.
rvRenewSpaceOption
.
setAdapter
(
reNewCandidateSpaceAdapter
);
plateImageInit
();
layoutInit
();
eventBinding
();
resultLauncherRegister
();
observeBinding
();
if
(
plateNumber
==
null
||
plateNumber
.
trim
().
isEmpty
()){
btnKeyinPlateNumberOnClicked
();
}
}
private
void
plateImageInit
(){
if
(
boxInfo
==
null
){
return
;
}
Bitmap
plateBitmap
=
decodeFile2ScaledPlateBitmap
(
file
.
getAbsolutePath
(),
boxInfo
,
this
);
if
(
plateBitmap
!=
null
){
dataBinding
.
ivCroppedPlate
.
setImageBitmap
(
plateBitmap
);
}
}
private
void
layoutInit
(){
if
(
plateNumber
!=
null
&&
!
plateNumber
.
trim
().
isEmpty
()){
dataBinding
.
btnKeyinPlateNumber
.
setText
(
plateNumber
);
// 搜尋鄰近已知case,當日是否有該車停留
List
<
Space
>
reNewCandidateSpace
=
infoRepository
.
getAllCaseSpaceByShitAndUserIdAndPlateNumberToday
(
shift
,
userId
,
plateNumber
);
reNewCandidateSpaceAdapter
.
submitList
(
reNewCandidateSpace
);
}
}
private
void
eventBinding
()
{
dataBinding
.
btnKeyinPlateNumber
.
setOnClickListener
(
view
->
btnKeyinPlateNumberOnClicked
());
dataBinding
.
btnSelectRoad
.
setOnClickListener
(
view
->
btnSelectRoadOnClicked
());
}
private
void
resultLauncherRegister
()
{
keyInPlateNumberActivityResultLauncher
=
registerForActivityResult
(
new
ActivityResultContracts
.
StartActivityForResult
(),
result
->
{
if
(
result
.
getResultCode
()
==
RESULT_OK
&&
result
.
getData
()
!=
null
){
plateNumber
=
result
.
getData
().
getStringExtra
(
"PlateNumber"
);
layoutInit
();
}
});
roadResultLauncher
=
registerForActivityResult
(
new
ActivityResultContracts
.
StartActivityForResult
(),
result
->
{
if
(
result
.
getResultCode
()
==
RESULT_OK
&&
result
.
getData
()
!=
null
){
Road
selectedRoad
=
result
.
getData
().
getParcelableExtra
(
"Road"
);
if
(
selectedRoad
!=
null
){
t02SelectSpaceViewModel
.
updateCurrentRoad
(
selectedRoad
);
}
}
});
}
private
void
observeBinding
()
{
t02SelectSpaceViewModel
.
getCurrentRoad
().
observe
(
this
,
road
->
{
String
roadString
=
""
;
if
(
road
!=
null
){
roadString
=
road
.
id
+
" "
+
road
.
name
;
}
dataBinding
.
btnSelectRoad
.
setText
(
roadString
);
});
t02SelectSpaceViewModel
.
getCurrentSpace
().
observe
(
this
,
spaces
->
{
if
(
spaces
!=
null
){
selectSpaceAdapter
.
submitList
(
spaces
);
}
});
}
private
void
btnSelectRoadOnClicked
(){
Intent
intent
=
new
Intent
();
intent
.
setClass
(
this
,
T02SelectRoadActivity
.
class
);
roadResultLauncher
.
launch
(
intent
);
}
private
void
btnKeyinPlateNumberOnClicked
(){
// TODO: 2022/8/25 加入reverse選項
Intent
intent
=
new
Intent
();
if
(
boxInfo
!=
null
&&
file
!=
null
&&
file
.
exists
()){
Bundle
bundle
=
new
Bundle
();
bundle
.
putSerializable
(
"PhotoFile"
,
file
);
bundle
.
putSerializable
(
"BoxInfo"
,
boxInfo
);
intent
.
putExtras
(
bundle
);
}
intent
.
setClass
(
this
,
T02KeyInPlateNumberActivity
.
class
);
keyInPlateNumberActivityResultLauncher
.
launch
(
intent
);
}
private
void
nextStage
(
Space
space
){
boolean
isNewCase
=
false
;
Intent
intent
=
getIntent
();
Bundle
bundle
=
new
Bundle
();
List
<
Case
>
selectedCases
=
infoRepository
.
getAllCaseByShitAndUserIdAndPlateNumberAndSpaceIdToday
(
shift
,
userId
,
plateNumber
,
space
.
id
);
if
(
selectedCases
.
size
()
==
0
){
// 新單
isNewCase
=
true
;
bundle
.
putString
(
"PlateNumber"
,
plateNumber
);
bundle
.
putParcelable
(
"Space"
,
space
);
}
else
{
// sort by time
selectedCases
.
sort
((
t1
,
t2
)
->
t1
.
caseTime
.
compareTo
(
t2
.
caseTime
));
Case
selectedCase
=
selectedCases
.
get
(
0
);
bundle
.
putString
(
"BillingNumber2"
,
selectedCase
.
billingNumber2
);
}
bundle
.
putBoolean
(
"IsNewCase"
,
isNewCase
);
intent
.
putExtras
(
bundle
);
setResult
(
RESULT_OK
,
intent
);
finish
();
}
}
\ No newline at end of file
app/src/main/java/ecom/android/newparkapp/view/T02StartActivity.java
View file @
fb151307
...
@@ -3,7 +3,9 @@ package ecom.android.newparkapp.view;
...
@@ -3,7 +3,9 @@ package ecom.android.newparkapp.view;
import
static
android
.
Manifest
.
permission
.
BLUETOOTH_CONNECT
;
import
static
android
.
Manifest
.
permission
.
BLUETOOTH_CONNECT
;
import
static
android
.
Manifest
.
permission
.
BLUETOOTH_SCAN
;
import
static
android
.
Manifest
.
permission
.
BLUETOOTH_SCAN
;
import
android.app.Dialog
;
import
android.bluetooth.BluetoothAdapter
;
import
android.bluetooth.BluetoothAdapter
;
import
android.content.DialogInterface
;
import
android.content.Intent
;
import
android.content.Intent
;
import
android.content.pm.ActivityInfo
;
import
android.content.pm.ActivityInfo
;
import
android.content.pm.PackageManager
;
import
android.content.pm.PackageManager
;
...
@@ -37,11 +39,14 @@ import java.util.Date;
...
@@ -37,11 +39,14 @@ import java.util.Date;
import
java.util.List
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Map
;
import
ecom.android.newparkapp.Common
;
import
ecom.android.newparkapp.R
;
import
ecom.android.newparkapp.R
;
import
ecom.android.newparkapp.databinding.ActivityT02StartBinding
;
import
ecom.android.newparkapp.databinding.ActivityT02StartBinding
;
import
ecom.android.newparkapp.databinding.AlertDialogT02DeviceListBinding
;
import
ecom.android.newparkapp.databinding.AlertDialogT02DeviceListBinding
;
import
ecom.android.newparkapp.databinding.AlertDialogT03CumulativeTimeBinding
;
import
ecom.android.newparkapp.databinding.AlertDialogT03CumulativeTimeBinding
;
import
ecom.android.newparkapp.databinding.AlertDialogProgressBarBinding
;
import
ecom.android.newparkapp.databinding.AlertDialogProgressBarBinding
;
import
ecom.android.newparkapp.databinding.AlertDialogT03NewCumulativeTimeBinding
;
import
ecom.android.newparkapp.entity.BoxInfo
;
import
ecom.android.newparkapp.entity.Case
;
import
ecom.android.newparkapp.entity.Case
;
import
ecom.android.newparkapp.entity.CaseStatus
;
import
ecom.android.newparkapp.entity.CaseStatus
;
import
ecom.android.newparkapp.entity.Shift
;
import
ecom.android.newparkapp.entity.Shift
;
...
@@ -77,12 +82,14 @@ public class T02StartActivity extends AppCompatActivity {
...
@@ -77,12 +82,14 @@ public class T02StartActivity extends AppCompatActivity {
private
ActivityResultLauncher
spaceResultLauncher
;
private
ActivityResultLauncher
spaceResultLauncher
;
private
ActivityResultLauncher
plateNumberResultLauncher
;
private
ActivityResultLauncher
plateNumberResultLauncher
;
private
ActivityResultLauncher
takePhotosActivityResultLauncher
;
private
ActivityResultLauncher
takePhotosActivityResultLauncher
;
private
ActivityResultLauncher
addPhotosActivityResultLauncher
;
private
ActivityResultLauncher
cumulativeTimeActivityResultLauncher
;
private
ActivityResultLauncher
cumulativeTimeActivityResultLauncher
;
private
ActivityResultLauncher
inventoryActivityResultLauncher
;
private
ActivityResultLauncher
inventoryActivityResultLauncher
;
private
ActivityResultLauncher
requestMultiplePermissions
;
private
ActivityResultLauncher
requestMultiplePermissions
;
private
ActivityResultLauncher
requestBluetooth
;
private
ActivityResultLauncher
requestBluetooth
;
private
ActivityResultLauncher
searchingParkingSpaceActivityResultLauncher
;
private
ActivityResultLauncher
searchingParkingSpaceActivityResultLauncher
;
private
ActivityResultLauncher
gpsSearchModeActivityResultLauncher
;
private
ActivityResultLauncher
gpsSearchModeActivityResultLauncher
;
private
ActivityResultLauncher
plateSpaceConfirmActivityResultLauncher
;
private
User
currentUser
;
private
User
currentUser
;
private
Shift
shift
;
private
Shift
shift
;
...
@@ -158,14 +165,12 @@ public class T02StartActivity extends AppCompatActivity {
...
@@ -158,14 +165,12 @@ public class T02StartActivity extends AppCompatActivity {
dataBinding
.
btnPrint
.
setEnabled
(
false
);
dataBinding
.
btnPrint
.
setEnabled
(
false
);
dataBinding
.
btnSearchingParkingSpace
.
setEnabled
(
false
);
dataBinding
.
btnSearchingParkingSpace
.
setEnabled
(
false
);
dataBinding
.
btnTimeNow
.
setEnabled
(
false
);
dataBinding
.
btnTimeNow
.
setEnabled
(
false
);
dataBinding
.
btnCumulativeTime
.
setEnabled
(
false
);
dataBinding
.
btnAddPhoto
.
setEnabled
(
false
);
dataBinding
.
btnNewPage
.
setEnabled
(
false
);
dataBinding
.
btnPlateNumber
.
setEnabled
(
false
);
dataBinding
.
btnPlateNumber
.
setEnabled
(
false
);
dataBinding
.
btnParkingSpace
.
setEnabled
(
false
);
dataBinding
.
btnParkingSpace
.
setEnabled
(
false
);
dataBinding
.
btnVehicleType
.
setEnabled
(
false
);
dataBinding
.
btnVehicleType
.
setEnabled
(
false
);
dataBinding
.
btnPhotograph
.
setEnabled
(
false
);
dataBinding
.
btnPhotograph
.
setEnabled
(
false
);
dataBinding
.
btnSelectPrinter
.
setEnabled
(
false
);
dataBinding
.
btnSelectPrinter
.
setEnabled
(
false
);
}
}
...
@@ -175,16 +180,15 @@ public class T02StartActivity extends AppCompatActivity {
...
@@ -175,16 +180,15 @@ public class T02StartActivity extends AppCompatActivity {
dataBinding
.
btnTimeNow
.
setOnClickListener
(
v
->
btnTimeNowOnClicked
());
dataBinding
.
btnTimeNow
.
setOnClickListener
(
v
->
btnTimeNowOnClicked
());
dataBinding
.
btnPlateNumber
.
setOnClickListener
(
v
->
btnPlateNumberOnClicked
());
dataBinding
.
btnPlateNumber
.
setOnClickListener
(
v
->
btnPlateNumberOnClicked
());
dataBinding
.
btnPhotograph
.
setOnClickListener
(
v
->
btnPhotographOnClicked
());
dataBinding
.
btnPhotograph
.
setOnClickListener
(
v
->
btnPhotographOnClicked
());
dataBinding
.
btnNewPage
.
setOnClickListener
(
v
->
btnNewPageOnClicked
());
dataBinding
.
btnPageDown
.
setOnClickListener
(
v
->
btnPageDownOnClicked
());
dataBinding
.
btnPageDown
.
setOnClickListener
(
v
->
btnPageDownOnClicked
());
dataBinding
.
btnPageUp
.
setOnClickListener
(
v
->
btnPageUpOnClicked
());
dataBinding
.
btnPageUp
.
setOnClickListener
(
v
->
btnPageUpOnClicked
());
dataBinding
.
btnPhotoCount
.
setOnClickListener
(
v
->
btnPhotoCountOnClicked
());
dataBinding
.
btnPhotoCount
.
setOnClickListener
(
v
->
btnPhotoCountOnClicked
());
dataBinding
.
btnCumulativeTime
.
setOnClickListener
(
v
->
btnCumulativeTimeOnClicked
());
dataBinding
.
btnInventory
.
setOnClickListener
(
v
->
btnInventoryOnClicked
());
dataBinding
.
btnInventory
.
setOnClickListener
(
v
->
btnInventoryOnClicked
());
dataBinding
.
btnMonthlyReport
.
setOnClickListener
(
v
->
btnMonthlyReportOnClicked
());
dataBinding
.
btnMonthlyReport
.
setOnClickListener
(
v
->
btnMonthlyReportOnClicked
());
dataBinding
.
btnPrint
.
setOnClickListener
(
v
->
btnPrintOnClicked
());
dataBinding
.
btnPrint
.
setOnClickListener
(
v
->
btnPrintOnClicked
());
dataBinding
.
btnGpsSearchMode
.
setOnClickListener
(
v
->
btnGpsSearchModeOnClicked
());
dataBinding
.
btnGpsSearchMode
.
setOnClickListener
(
v
->
btnGpsSearchModeOnClicked
());
dataBinding
.
btnSelectPrinter
.
setOnClickListener
(
v
->
selectPrinterDialog
());
dataBinding
.
btnSelectPrinter
.
setOnClickListener
(
v
->
selectPrinterDialog
());
dataBinding
.
btnAddPhoto
.
setOnClickListener
(
v
->
btnAddPhotoOnClicked
());
// 搜尋是否有相關車格資料
// 搜尋是否有相關車格資料
dataBinding
.
btnParkingSpace
.
setOnClickListener
(
v
->
btnParkingSpaceOnClicked
());
dataBinding
.
btnParkingSpace
.
setOnClickListener
(
v
->
btnParkingSpaceOnClicked
());
...
@@ -239,7 +243,8 @@ public class T02StartActivity extends AppCompatActivity {
...
@@ -239,7 +243,8 @@ public class T02StartActivity extends AppCompatActivity {
return
;
return
;
}
}
// 判斷是否偵測不到車牌,或車牌辨識異常
// 判斷是否偵測不到車牌,或車牌辨識異常
if
(!
t02StartViewModel
.
takeNewPhoto
(
photoFile
)){
BoxInfo
boxInfo
=
t02StartViewModel
.
takeNewPhoto
(
photoFile
,
true
);
if
(
boxInfo
==
null
||
!
Common
.
plateRuleCheck
(
boxInfo
.
getPlateNumbs
())){
// 異常彈窗,是否手動輸入,或重新辨識
// 異常彈窗,是否手動輸入,或重新辨識
AlertDialog
.
Builder
builder
=
new
AlertDialog
.
Builder
(
this
);
AlertDialog
.
Builder
builder
=
new
AlertDialog
.
Builder
(
this
);
builder
.
setTitle
(
"車牌偵測失敗"
);
builder
.
setTitle
(
"車牌偵測失敗"
);
...
@@ -248,12 +253,17 @@ public class T02StartActivity extends AppCompatActivity {
...
@@ -248,12 +253,17 @@ public class T02StartActivity extends AppCompatActivity {
btnPhotographOnClicked
();
btnPhotographOnClicked
();
});
});
builder
.
setNegativeButton
(
"手動輸入車牌"
,
(
dialog
,
which
)
->
{
builder
.
setNegativeButton
(
"手動輸入車牌"
,
(
dialog
,
which
)
->
{
btnPlateNumberOnClicked
();
// 舊的,流程
// btnPlateNumberOnClicked();
// 新的流程
go2PlateAndSpaceConfirm
(
null
);
});
});
builder
.
create
().
show
();
builder
.
create
().
show
();
}
else
{
}
else
{
// 自動下一階段
// 自動下一階段
autoNext
(
t01SettingViewModel
.
getAutoNext
(),
Stage
.
PLATE_NUMBER
);
// autoNext(t01SettingViewModel.getAutoNext(), Stage.PLATE_NUMBER);
// TODO: 2022/8/25 修改流程改為拍照辨識完跳車格搜尋及確認視窗
go2PlateAndSpaceConfirm
(
boxInfo
);
}
}
}
}
});
});
...
@@ -263,7 +273,7 @@ public class T02StartActivity extends AppCompatActivity {
...
@@ -263,7 +273,7 @@ public class T02StartActivity extends AppCompatActivity {
if
(
photoFile
==
null
)
{
if
(
photoFile
==
null
)
{
return
;
return
;
}
}
t02StartViewModel
.
cumulativeTime
(
photoFile
);
t02StartViewModel
.
cumulativeTime
(
photoFile
,
false
);
}
}
});
});
...
@@ -328,6 +338,41 @@ public class T02StartActivity extends AppCompatActivity {
...
@@ -328,6 +338,41 @@ public class T02StartActivity extends AppCompatActivity {
t02StartViewModel
.
go2Page
(
billingNumber2
);
t02StartViewModel
.
go2Page
(
billingNumber2
);
}
}
});
});
plateSpaceConfirmActivityResultLauncher
=
registerForActivityResult
(
new
ActivityResultContracts
.
StartActivityForResult
(),
result
->
{
if
(
result
.
getResultCode
()
==
RESULT_OK
&&
result
.
getData
()
!=
null
){
Bundle
bundle
=
result
.
getData
().
getExtras
();
boolean
isNewCase
=
bundle
.
getBoolean
(
"IsNewCase"
);
if
(
isNewCase
){
String
plateNumber
=
bundle
.
getString
(
"PlateNumber"
);
Space
space
=
bundle
.
getParcelable
(
"Space"
);
// TODO: 2022/8/25 接續新單流程
// 更新圖片
t02StartViewModel
.
setNewCasePhoto
(
photoFile
);
// 更新路段
Toast
.
makeText
(
this
,
space
.
road
.
name
+
" "
+
space
.
id
,
Toast
.
LENGTH_SHORT
).
show
();
t02StartViewModel
.
setSpace
(
space
);
t02StartViewModel
.
setPlateNumber
(
plateNumber
,
t01SettingViewModel
.
getAutoDeduction
());
// 跳至下一階段
autoNext
(
t01SettingViewModel
.
getAutoNext
(),
Stage
.
SPACE
);
}
else
{
String
billingNumber2
=
bundle
.
getString
(
"BillingNumber2"
);
// TODO: 2022/8/25 跳至累加確認
t02StartViewModel
.
go2Page
(
billingNumber2
);
btnCumulativeTimeOnClicked
();
}
}
});
addPhotosActivityResultLauncher
=
registerForActivityResult
(
new
ActivityResultContracts
.
StartActivityForResult
(),
result
->
{
if
(
result
.
getResultCode
()
==
RESULT_OK
)
{
if
(
photoFile
==
null
)
{
return
;
}
t02StartViewModel
.
addNewPhotos
(
photoFile
);
}
});
}
}
private
void
observeBinding
()
{
private
void
observeBinding
()
{
...
@@ -464,7 +509,9 @@ public class T02StartActivity extends AppCompatActivity {
...
@@ -464,7 +509,9 @@ public class T02StartActivity extends AppCompatActivity {
}
}
}
}
photoFile
=
new
File
(
path
,
"/"
+
currentCase
.
billingNumber2
+
currentCase
.
photoCount
+
".jpg"
);
//photoFile = new File(path, "/" + currentCase.billingNumber2 + currentCase.photoCount + ".jpg");
photoFile
=
new
File
(
path
,
"/temp.jpg"
);
Uri
photoURI
=
FileProvider
.
getUriForFile
(
this
,
"ecom.android.newparkapp.fileprovider"
,
photoFile
);
Uri
photoURI
=
FileProvider
.
getUriForFile
(
this
,
"ecom.android.newparkapp.fileprovider"
,
photoFile
);
takePhotoIntent
.
putExtra
(
MediaStore
.
EXTRA_SCREEN_ORIENTATION
,
ActivityInfo
.
SCREEN_ORIENTATION_PORTRAIT
);
takePhotoIntent
.
putExtra
(
MediaStore
.
EXTRA_SCREEN_ORIENTATION
,
ActivityInfo
.
SCREEN_ORIENTATION_PORTRAIT
);
takePhotoIntent
.
putExtra
(
MediaStore
.
EXTRA_OUTPUT
,
photoURI
);
takePhotoIntent
.
putExtra
(
MediaStore
.
EXTRA_OUTPUT
,
photoURI
);
...
@@ -523,7 +570,7 @@ public class T02StartActivity extends AppCompatActivity {
...
@@ -523,7 +570,7 @@ public class T02StartActivity extends AppCompatActivity {
return
;
return
;
}
}
AlertDialogT03
CumulativeTimeBinding
t03CumulativeTimeDataBinding
=
AlertDialogT03
CumulativeTimeBinding
.
inflate
(
LayoutInflater
.
from
(
this
));
AlertDialogT03
NewCumulativeTimeBinding
t03CumulativeTimeDataBinding
=
AlertDialogT03New
CumulativeTimeBinding
.
inflate
(
LayoutInflater
.
from
(
this
));
AlertDialog
.
Builder
alertDialog
=
new
AlertDialog
.
Builder
(
this
);
AlertDialog
.
Builder
alertDialog
=
new
AlertDialog
.
Builder
(
this
);
final
AlertDialog
tempDialog
=
alertDialog
.
create
();
final
AlertDialog
tempDialog
=
alertDialog
.
create
();
...
@@ -544,6 +591,10 @@ public class T02StartActivity extends AppCompatActivity {
...
@@ -544,6 +591,10 @@ public class T02StartActivity extends AppCompatActivity {
t03CumulativeTimeDataBinding
.
diaBillingTimeTextView
.
setText
(
simpleDate
.
format
(
tempCase
.
caseTime
));
t03CumulativeTimeDataBinding
.
diaBillingTimeTextView
.
setText
(
simpleDate
.
format
(
tempCase
.
caseTime
));
t03CumulativeTimeDataBinding
.
diaCumulativeTimeTextView
.
setText
(
simpleDate
.
format
(
tempCase
.
finalTime
));
t03CumulativeTimeDataBinding
.
diaCumulativeTimeTextView
.
setText
(
simpleDate
.
format
(
tempCase
.
finalTime
));
// 顯示 車牌
t03CumulativeTimeDataBinding
.
diaPlateNumber
.
setText
(
tempCase
.
plateNumber
);
// 顯示 車格
t03CumulativeTimeDataBinding
.
diaSpace
.
setText
(
tempCase
.
space
.
id
);
// 關閉視窗
// 關閉視窗
t03CumulativeTimeDataBinding
.
dialogClose
.
setOnClickListener
(
view
->
{
t03CumulativeTimeDataBinding
.
dialogClose
.
setOnClickListener
(
view
->
{
...
@@ -579,7 +630,15 @@ public class T02StartActivity extends AppCompatActivity {
...
@@ -579,7 +630,15 @@ public class T02StartActivity extends AppCompatActivity {
// 累加確認
// 累加確認
t03CumulativeTimeDataBinding
.
diaConfirmButton
.
setOnClickListener
(
view
->
{
t03CumulativeTimeDataBinding
.
diaConfirmButton
.
setOnClickListener
(
view
->
{
takePhoto
(
cumulativeTimeActivityResultLauncher
);
// 舊版,按下累加後拍照
//takePhoto(cumulativeTimeActivityResultLauncher);
// 新版,先拍照,選擇完畢直接累加
if
(
photoFile
!=
null
&&
photoFile
.
exists
()){
t02StartViewModel
.
cumulativeTime
(
photoFile
,
false
);
}
else
{
Toast
.
makeText
(
this
,
"讀取相片失敗,請重新操作"
,
Toast
.
LENGTH_SHORT
).
show
();
}
tempDialog
.
dismiss
();
});
});
tempDialog
.
setCanceledOnTouchOutside
(
false
);
tempDialog
.
setCanceledOnTouchOutside
(
false
);
...
@@ -708,10 +767,7 @@ public class T02StartActivity extends AppCompatActivity {
...
@@ -708,10 +767,7 @@ public class T02StartActivity extends AppCompatActivity {
private
void
btnPrintOnClicked
(){
private
void
btnPrintOnClicked
(){
Case
tempCase
=
t02StartViewModel
.
getCurrentCase
().
getValue
();
Case
tempCase
=
t02StartViewModel
.
getCurrentCase
().
getValue
();
if
(
blueToothViewModel
.
getBlueToothStatus
().
getValue
()
!=
BlueToothViewModel
.
BlueToothStatus
.
CONNECT_SUCCESS
){
Toast
.
makeText
(
this
,
"請先連結藍芽印表機裝置"
,
Toast
.
LENGTH_SHORT
).
show
();
return
;
}
if
(
tempCase
.
caseStatus
!=
CaseStatus
.
LIST
){
if
(
tempCase
.
caseStatus
!=
CaseStatus
.
LIST
){
// TODO: 2022/8/8 檢查是否完整,完整的話寫入DB後列印
// TODO: 2022/8/8 檢查是否完整,完整的話寫入DB後列印
if
(
t02StartViewModel
.
caseDataConfirm
())
{
if
(
t02StartViewModel
.
caseDataConfirm
())
{
...
@@ -719,9 +775,42 @@ public class T02StartActivity extends AppCompatActivity {
...
@@ -719,9 +775,42 @@ public class T02StartActivity extends AppCompatActivity {
}
else
{
}
else
{
Toast
.
makeText
(
this
,
"請先確認資料後再列印"
,
Toast
.
LENGTH_SHORT
).
show
();
Toast
.
makeText
(
this
,
"請先確認資料後再列印"
,
Toast
.
LENGTH_SHORT
).
show
();
}
}
if
(
blueToothViewModel
.
getBlueToothStatus
().
getValue
()
!=
BlueToothViewModel
.
BlueToothStatus
.
CONNECT_SUCCESS
){
Toast
.
makeText
(
this
,
"請先連結藍芽印表機裝置"
,
Toast
.
LENGTH_SHORT
).
show
();
return
;
}
blueToothViewModel
.
printCase
(
tempCase
);
}
else
{
if
(
blueToothViewModel
.
getBlueToothStatus
().
getValue
()
!=
BlueToothViewModel
.
BlueToothStatus
.
CONNECT_SUCCESS
){
Toast
.
makeText
(
this
,
"請先連結藍芽印表機裝置"
,
Toast
.
LENGTH_SHORT
).
show
();
return
;
}
}
AlertDialog
.
Builder
builder
=
new
AlertDialog
.
Builder
(
this
);
builder
.
setTitle
(
"是否重新列印"
);
builder
.
setNegativeButton
(
"否"
,
new
DialogInterface
.
OnClickListener
()
{
@Override
public
void
onClick
(
DialogInterface
dialogInterface
,
int
i
)
{
dialogInterface
.
dismiss
();
return
;
}
});
builder
.
setPositiveButton
(
"是"
,
new
DialogInterface
.
OnClickListener
()
{
@Override
public
void
onClick
(
DialogInterface
dialogInterface
,
int
i
)
{
dialogInterface
.
dismiss
();
blueToothViewModel
.
printCase
(
tempCase
);
blueToothViewModel
.
printCase
(
tempCase
);
}
});
builder
.
create
().
show
();
}
}
}
...
@@ -864,6 +953,25 @@ public class T02StartActivity extends AppCompatActivity {
...
@@ -864,6 +953,25 @@ public class T02StartActivity extends AppCompatActivity {
}
}
private
void
go2PlateAndSpaceConfirm
(
BoxInfo
boxInfo
){
Intent
intent
=
new
Intent
();
intent
.
setClass
(
this
,
T02PlateAndSpaceConfirmActivity
.
class
);
Bundle
bundle
=
new
Bundle
();
if
(
boxInfo
!=
null
){
bundle
.
putSerializable
(
"BoxInfo"
,
boxInfo
);
}
bundle
.
putParcelable
(
"Shift"
,
shift
);
bundle
.
putInt
(
"UserId"
,
currentUser
.
id
);
bundle
.
putParcelable
(
"Location"
,
fusedGpsViewModel
.
getLocation
().
getValue
());
bundle
.
putSerializable
(
"PhotoFile"
,
photoFile
);
intent
.
putExtras
(
bundle
);
plateSpaceConfirmActivityResultLauncher
.
launch
(
intent
);
}
private
void
btnAddPhotoOnClicked
(){
takePhoto
(
addPhotosActivityResultLauncher
);
}
enum
Stage
{
enum
Stage
{
TAKE_PHOTO
,
TAKE_PHOTO
,
SPACE
,
SPACE
,
...
...
app/src/main/java/ecom/android/newparkapp/viewModel/T02StartViewModel.java
View file @
fb151307
...
@@ -11,6 +11,7 @@ import android.graphics.BitmapFactory;
...
@@ -11,6 +11,7 @@ import android.graphics.BitmapFactory;
import
android.location.Location
;
import
android.location.Location
;
import
android.media.MediaScannerConnection
;
import
android.media.MediaScannerConnection
;
import
android.os.Environment
;
import
android.os.Environment
;
import
android.widget.Toast
;
import
androidx.annotation.NonNull
;
import
androidx.annotation.NonNull
;
import
androidx.lifecycle.AndroidViewModel
;
import
androidx.lifecycle.AndroidViewModel
;
...
@@ -21,8 +22,10 @@ import java.io.File;
...
@@ -21,8 +22,10 @@ import java.io.File;
import
java.io.IOException
;
import
java.io.IOException
;
import
java.io.PrintWriter
;
import
java.io.PrintWriter
;
import
java.sql.Time
;
import
java.sql.Time
;
import
java.text.SimpleDateFormat
;
import
java.util.ArrayList
;
import
java.util.ArrayList
;
import
java.util.Calendar
;
import
java.util.Calendar
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.List
;
import
java.util.Locale
;
import
java.util.Locale
;
import
java.util.Timer
;
import
java.util.Timer
;
...
@@ -366,22 +369,21 @@ public class T02StartViewModel extends AndroidViewModel {
...
@@ -366,22 +369,21 @@ public class T02StartViewModel extends AndroidViewModel {
/**
/**
* @param photoFile 拍照回傳檔案
* @param photoFile 拍照回傳檔案
*/
*/
public
boolean
takeNewPhoto
(
File
photoFile
){
public
BoxInfo
takeNewPhoto
(
File
photoFile
,
boolean
withoutModify
){
Case
tempCase
=
currentCase
.
getValue
();
Case
tempCase
=
currentCase
.
getValue
();
// 更新照片數量
tempCase
.
photoCount
+=
1
;
// 取得完整路徑
// 取得完整路徑
final
String
path
=
photoFile
.
getAbsolutePath
();
final
String
path
=
photoFile
.
getAbsolutePath
();
// TODO: 2022/7/29 加入車牌辨識功能
// TODO: 2022/7/29 加入車牌辨識功能
// 進行車牌辨識
// 進行車牌辨識
String
plateNumber
=
doLPRByFilePath
(
path
,
threshold
,
nms_threshold
);
BoxInfo
boxInfo
=
getLPRBoxInfoByFilePath
(
path
,
threshold
,
nms_threshold
);
String
plateNumber
=
boxInfo
!=
null
?
boxInfo
.
getPlateNumbs
()
:
""
;
// 車牌結果修正
// 車牌結果修正
String
newPlateNumber
=
plateModifyByRule
(
plateNumber
);
String
newPlateNumber
=
plateModifyByRule
(
plateNumber
);
if
(
boxInfo
!=
null
){
CasePhoto
newCasePhoto
=
new
CasePhoto
(
0
,
tempCase
.
billingNumber2
,
path
,
newPlateNumber
);
boxInfo
.
setPlateNumbs
(
newPlateNumber
);
tempCasePhoto
.
add
(
newCasePhoto
);
}
// 未填寫車牌,自動填寫
// 未填寫車牌,自動填寫
if
(
tempCase
.
plateNumber
==
null
||
tempCase
.
plateNumber
.
trim
().
isEmpty
()){
if
(
tempCase
.
plateNumber
==
null
||
tempCase
.
plateNumber
.
trim
().
isEmpty
()){
...
@@ -389,11 +391,19 @@ public class T02StartViewModel extends AndroidViewModel {
...
@@ -389,11 +391,19 @@ public class T02StartViewModel extends AndroidViewModel {
}
}
// 為圖片壓制浮水印
// 為圖片壓制浮水印
if
(!
withoutModify
){
// 更新照片數量
tempCase
.
photoCount
+=
1
;
CasePhoto
newCasePhoto
=
new
CasePhoto
(
0
,
tempCase
.
billingNumber2
,
path
,
newPlateNumber
);
tempCasePhoto
.
add
(
newCasePhoto
);
Thread
ModifyPhotoT
=
new
Thread
(
new
ModifyPhoto
(
path
),
"ModifyPhoto_Thread"
);
Thread
ModifyPhotoT
=
new
Thread
(
new
ModifyPhoto
(
path
),
"ModifyPhoto_Thread"
);
ModifyPhotoT
.
start
();
ModifyPhotoT
.
start
();
// 重新搜尋檔案
// 重新搜尋檔案
MediaScannerConnection
.
scanFile
(
getApplication
().
getApplicationContext
(),
new
String
[]{
path
},
null
,
null
);
MediaScannerConnection
.
scanFile
(
getApplication
().
getApplicationContext
(),
new
String
[]{
path
},
null
,
null
);
}
// 更新當前案件
// 更新當前案件
if
(
tempCase
.
caseStatus
==
CaseStatus
.
LIST
||
tempCase
.
caseStatus
==
CaseStatus
.
CHANGED
){
if
(
tempCase
.
caseStatus
==
CaseStatus
.
LIST
||
tempCase
.
caseStatus
==
CaseStatus
.
CHANGED
){
...
@@ -403,7 +413,54 @@ public class T02StartViewModel extends AndroidViewModel {
...
@@ -403,7 +413,54 @@ public class T02StartViewModel extends AndroidViewModel {
currentCase
.
setValue
(
tempCase
);
currentCase
.
setValue
(
tempCase
);
}
}
return
plateRuleCheck
(
tempCase
.
plateNumber
);
return
boxInfo
;
}
public
void
setNewCasePhoto
(
File
photoFile
){
Case
tempCase
=
getCurrentCase
().
getValue
();
// 取得完整路徑
final
String
path
=
photoFile
.
getAbsolutePath
();
// TODO: 2022/7/29 加入車牌辨識功能
// 進行車牌辨識
String
plateNumber
=
doLPRByFilePath
(
path
,
threshold
,
nms_threshold
);
// 車牌辨識結果 車牌規則 過濾
String
newPlateNumber
=
plateModifyByRule
(
plateNumber
);
String
day
=
new
SimpleDateFormat
(
"yyyyMMdd"
).
format
(
new
Date
());
String
newPath
=
Environment
.
getExternalStorageDirectory
()
+
getApplication
().
getString
(
R
.
string
.
sysDataPhoto_path
)
+
day
;
File
temp
=
new
File
(
newPath
);
if
(!
temp
.
exists
())
{
temp
.
mkdirs
();
}
File
newFile
=
new
File
(
newPath
,
"/"
+
tempCase
.
billingNumber2
+
tempCase
.
photoCount
+
".jpg"
);
String
newFilePath
=
newFile
.
getAbsolutePath
();
// 添加車牌辨識 結果
CasePhoto
newCasePhoto
=
new
CasePhoto
(
0
,
tempCase
.
billingNumber2
,
newFilePath
,
newPlateNumber
);
tempCasePhoto
.
add
(
newCasePhoto
);
// 為圖片壓制浮水印
Thread
ModifyPhotoT
=
new
Thread
(
new
ModifyPhoto
(
path
,
newFilePath
),
"ModifyPhoto_Thread"
);
ModifyPhotoT
.
start
();
// 重新搜尋檔案
MediaScannerConnection
.
scanFile
(
getApplication
().
getApplicationContext
(),
new
String
[]{
newFilePath
},
null
,
null
);
// 更新照片數量
tempCase
.
photoCount
+=
1
;
if
(
tempCase
.
caseStatus
!=
CaseStatus
.
NEW
)
{
tempCase
.
caseStatus
=
CaseStatus
.
CHANGED
;
}
currentCase
.
setValue
(
tempCase
);
}
public
void
addNewPhotos
(
File
photoFile
){
setNewCasePhoto
(
photoFile
);
saveCurrentCase
(
false
);
}
}
...
@@ -597,36 +654,47 @@ public class T02StartViewModel extends AndroidViewModel {
...
@@ -597,36 +654,47 @@ public class T02StartViewModel extends AndroidViewModel {
* 累加時間處理
* 累加時間處理
* @param photoFile 拍照傳回
* @param photoFile 拍照傳回
*/
*/
public
void
cumulativeTime
(
File
photoFile
)
{
public
void
cumulativeTime
(
File
photoFile
,
boolean
isPhotoProcessed
)
{
Case
tempCase
=
currentCase
.
getValue
();
Case
tempCase
=
currentCase
.
getValue
();
tempCase
.
caseStatus
=
CaseStatus
.
CHANGED
;
tempCase
.
caseStatus
=
CaseStatus
.
CHANGED
;
// 更新照片數量
tempCase
.
photoCount
+=
1
;
// 更新累加時間
// 更新累加時間
int
addCount
=
calcPeriodHourCount
(
tempCase
);
int
addCount
=
calcPeriodHourCount
(
tempCase
);
tempCase
.
periodHour
=
addCount
*
tempCase
.
space
.
spaceRate
.
perHours
;
tempCase
.
periodHour
=
addCount
*
tempCase
.
space
.
spaceRate
.
perHours
;
tempCase
.
finalExpenses
=
addCount
*
tempCase
.
space_fee
;
tempCase
.
finalExpenses
=
addCount
*
tempCase
.
space_fee
;
if
(!
isPhotoProcessed
){
// 取得完整路徑
// 取得完整路徑
final
String
path
=
photoFile
.
getAbsolutePath
();
final
String
path
=
photoFile
.
getAbsolutePath
();
// TODO: 2022/7/29 加入車牌辨識功能
// 進行車牌辨識
// 進行車牌辨識
String
plateNumber
=
doLPRByFilePath
(
path
,
threshold
,
nms_threshold
);
String
plateNumber
=
doLPRByFilePath
(
path
,
threshold
,
nms_threshold
);
// 車牌辨識結果 車牌規則 過濾
// 車牌辨識結果 車牌規則 過濾
String
newPlateNumber
=
plateModifyByRule
(
plateNumber
);
String
newPlateNumber
=
plateModifyByRule
(
plateNumber
);
String
day
=
new
SimpleDateFormat
(
"yyyyMMdd"
).
format
(
new
Date
());
String
newPath
=
Environment
.
getExternalStorageDirectory
()
+
getApplication
().
getString
(
R
.
string
.
sysDataPhoto_path
)
+
day
;
File
temp
=
new
File
(
newPath
);
if
(!
temp
.
exists
())
{
temp
.
mkdirs
();
}
File
newFile
=
new
File
(
newPath
,
"/"
+
tempCase
.
billingNumber2
+
tempCase
.
photoCount
+
".jpg"
);
String
newFilePath
=
newFile
.
getAbsolutePath
();
// 添加車牌辨識 結果
// 添加車牌辨識 結果
CasePhoto
newCasePhoto
=
new
CasePhoto
(
0
,
tempCase
.
billingNumber2
,
p
ath
,
newPlateNumber
);
CasePhoto
newCasePhoto
=
new
CasePhoto
(
0
,
tempCase
.
billingNumber2
,
newFileP
ath
,
newPlateNumber
);
tempCasePhoto
.
add
(
newCasePhoto
);
tempCasePhoto
.
add
(
newCasePhoto
);
// 為圖片壓制浮水印
// 為圖片壓制浮水印
Thread
ModifyPhotoT
=
new
Thread
(
new
ModifyPhoto
(
p
ath
),
"ModifyPhoto_Thread"
);
Thread
ModifyPhotoT
=
new
Thread
(
new
ModifyPhoto
(
path
,
newFileP
ath
),
"ModifyPhoto_Thread"
);
ModifyPhotoT
.
start
();
ModifyPhotoT
.
start
();
// 重新搜尋檔案
// 重新搜尋檔案
MediaScannerConnection
.
scanFile
(
getApplication
().
getApplicationContext
(),
new
String
[]{
path
},
null
,
null
);
MediaScannerConnection
.
scanFile
(
getApplication
().
getApplicationContext
(),
new
String
[]{
newFilePath
},
null
,
null
);
// 更新照片數量
tempCase
.
photoCount
+=
1
;
}
// 更新當前案件
// 更新當前案件
currentCase
.
setValue
(
tempCase
);
currentCase
.
setValue
(
tempCase
);
...
@@ -721,6 +789,41 @@ public class T02StartViewModel extends AndroidViewModel {
...
@@ -721,6 +789,41 @@ public class T02StartViewModel extends AndroidViewModel {
return
plateNumber
;
return
plateNumber
;
}
}
// 車牌辨識回傳Boxinfo
public
BoxInfo
getLPRBoxInfoByFilePath
(
String
filePath
,
float
threshold
,
float
nms_threshold
){
// 進行車牌辨識
BoxInfo
boxInfo
=
null
;
Bitmap
bitmap
=
BitmapFactory
.
decodeFile
(
filePath
);
bitmap
=
Common
.
turnPictureDegree
(
bitmap
,
filePath
);
byte
[]
imageDataBytes
=
bitampToByteArray
(
bitmap
);
BoxInfo
[]
boxInfos
=
null
;
boxInfos
=
EcomALPR
.
retinaplate_detect
(
bitmap
,
imageDataBytes
,
bitmap
.
getWidth
(),
bitmap
.
getHeight
(),
threshold
,
nms_threshold
);
if
(
boxInfos
!=
null
&&
boxInfos
.
length
!=
0
){
int
maxPlateIndex
=
0
;
for
(
int
i
=
0
;
i
<
boxInfos
.
length
;
i
++){
String
plateNumbs
=
null
;
if
(
boxInfos
[
i
].
getLandmarks
()
!=
null
){
// 整張圖丟進去透過 landmark進行校正
plateNumbs
=
EcomALPR
.
ctcocr_recognize
(
bitmap
,
imageDataBytes
,
bitmap
.
getWidth
(),
bitmap
.
getHeight
(),
boxInfos
[
i
].
getLandmarks
());
}
else
{
Bitmap
plateBitmap
=
Bitmap
.
createBitmap
(
bitmap
,
(
int
)
boxInfos
[
i
].
x0
,
(
int
)
boxInfos
[
i
].
y0
,
(
int
)
boxInfos
[
i
].
getRect
().
width
(),
(
int
)
boxInfos
[
i
].
getRect
().
height
());
byte
[]
plateImageDataBytes
=
bitampToByteArray
(
plateBitmap
);
plateNumbs
=
EcomALPR
.
ctcocr_recognize
(
plateBitmap
,
plateImageDataBytes
,
plateBitmap
.
getWidth
(),
plateBitmap
.
getHeight
());
}
if
(
plateNumbs
!=
null
){
boxInfos
[
i
].
setPlateNumbs
(
plateNumbs
);
if
(
boxInfos
[
maxPlateIndex
].
getRect
().
height
()
*
boxInfos
[
maxPlateIndex
].
getRect
().
width
()
<
boxInfos
[
i
].
getRect
().
height
()
*
boxInfos
[
i
].
getRect
().
width
()){
maxPlateIndex
=
i
;
}
}
}
boxInfo
=
boxInfos
[
maxPlateIndex
];
}
return
boxInfo
;
}
public
boolean
isWorkTime
(){
public
boolean
isWorkTime
(){
Calendar
calendar
=
Calendar
.
getInstance
();
Calendar
calendar
=
Calendar
.
getInstance
();
Shift
currentShift
=
shift
.
getValue
();
Shift
currentShift
=
shift
.
getValue
();
...
...
app/src/main/res/drawable/plate.jpg
0 → 100644
View file @
fb151307
23.4 KB
app/src/main/res/layout/activity_t02_key_in_plate_number.xml
View file @
fb151307
...
@@ -17,8 +17,8 @@
...
@@ -17,8 +17,8 @@
android:layout_weight=
"1"
android:layout_weight=
"1"
android:orientation=
"horizontal"
>
android:orientation=
"horizontal"
>
<
Text
View
<
Image
View
android:id=
"@+id/
enterTitle_txv
"
android:id=
"@+id/
iv_cropped_plate
"
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:layout_height=
"match_parent"
android:layout_weight=
"0.333"
android:layout_weight=
"0.333"
...
...
app/src/main/res/layout/activity_t02_plate_and_space_confirm.xml
0 → 100644
View file @
fb151307
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:tools=
"http://schemas.android.com/tools"
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:orientation=
"vertical"
tools:context=
".view.T02PlateAndSpaceConfirmActivity"
>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"0dp"
android:layout_weight=
"0.6"
android:orientation=
"vertical"
>
<TextView
android:id=
"@+id/textView25"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"5dp"
android:layout_marginBottom=
"5dp"
android:text=
"車牌辨識搜尋結果"
android:textAlignment=
"center"
android:textSize=
"30sp"
/>
<TextView
android:id=
"@+id/textView"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:textAlignment=
"center"
android:text=
"車牌辨識結果"
android:textSize=
"24sp"
/>
<ImageView
android:id=
"@+id/iv_cropped_plate"
android:layout_width=
"match_parent"
android:layout_height=
"50dp"
android:scaleType=
"fitCenter"
/>
<Button
android:id=
"@+id/btn_keyin_plate_number"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:text=
"8052-LZ"
android:textSize=
"24sp"
/>
<TextView
android:id=
"@+id/textView28"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:textAlignment=
"center"
android:text=
"車格搜尋結果"
android:textSize=
"24sp"
/>
<androidx.recyclerview.widget.RecyclerView
android:id=
"@+id/rv_renew_space_option"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
tools:listitem=
"@layout/recycler_view_space_item"
tools:spanCount=
"3"
tools:layoutManager=
"GridLayoutManager"
/>
</LinearLayout>
<ImageView
android:layout_width=
"match_parent"
android:layout_height=
"0dp"
android:layout_marginTop=
"10dp"
android:layout_marginBottom=
"10dp"
android:layout_weight=
"0.01"
app:srcCompat=
"@color/black"
>
</ImageView>
<TextView
android:id=
"@+id/textView2"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"5dp"
android:layout_marginBottom=
"5dp"
android:text=
"選取鄰近車格"
android:textAlignment=
"center"
android:textSize=
"30sp"
/>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"0dp"
android:layout_weight=
"0.12"
android:gravity=
"center"
android:orientation=
"horizontal"
android:paddingEnd=
"5dp"
tools:ignore=
"RtlSymmetry"
>
<TextView
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:layout_weight=
"1"
android:gravity=
"center|center_vertical"
android:text=
"格號"
android:textSize=
"30sp"
tools:ignore=
"NestedWeights"
/>
<Button
android:id=
"@+id/btn_select_road"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:layout_weight=
"0.7"
android:textSize=
"30sp"
/>
<Button
android:id=
"@+id/btn_select_space_back"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:layout_weight=
"1"
android:text=
"@string/label_back"
android:textSize=
"30sp"
android:visibility=
"gone"
/>
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id=
"@+id/rv_space_option"
android:layout_width=
"match_parent"
android:layout_height=
"0dp"
android:layout_weight=
"0.4"
tools:listitem=
"@layout/recycler_view_space_item"
tools:spanCount=
"3"
tools:layoutManager=
"GridLayoutManager"
/>
</LinearLayout>
</layout>
\ No newline at end of file
app/src/main/res/layout/activity_t02_start.xml
View file @
fb151307
...
@@ -442,11 +442,11 @@ tools:layout_editor_absoluteY="25dp">
...
@@ -442,11 +442,11 @@ tools:layout_editor_absoluteY="25dp">
app:layout_constraintTop_toBottomOf=
"@+id/linearLayout4"
>
app:layout_constraintTop_toBottomOf=
"@+id/linearLayout4"
>
<Button
<Button
android:id=
"@+id/btn_
cumulative_time
"
android:id=
"@+id/btn_
add_photo
"
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:layout_height=
"match_parent"
android:layout_weight=
"0.26"
android:layout_weight=
"0.26"
android:text=
"
@string/cumulativeTime_button_text
"
android:text=
"
添加照片
"
android:textSize=
"28sp"
android:textSize=
"28sp"
tools:ignore=
"ButtonStyle"
/>
tools:ignore=
"ButtonStyle"
/>
...
@@ -462,14 +462,6 @@ tools:layout_editor_absoluteY="25dp">
...
@@ -462,14 +462,6 @@ tools:layout_editor_absoluteY="25dp">
tools:ignore=
"ButtonStyle"
tools:ignore=
"ButtonStyle"
/>
/>
<Button
android:id=
"@+id/btn_photograph"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:layout_weight=
"0.5"
android:text=
"@string/photograph_button_text"
android:textSize=
"28sp"
tools:ignore=
"ButtonStyle"
/>
</LinearLayout>
</LinearLayout>
...
@@ -543,11 +535,11 @@ tools:layout_editor_absoluteY="25dp">
...
@@ -543,11 +535,11 @@ tools:layout_editor_absoluteY="25dp">
</LinearLayout>
</LinearLayout>
<Button
<Button
android:id=
"@+id/btn_
new_page
"
android:id=
"@+id/btn_
photograph
"
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:layout_height=
"match_parent"
android:layout_weight=
"1"
android:layout_weight=
"1"
android:text=
"@string/
newPage
_button_text"
android:text=
"@string/
photograph
_button_text"
android:textSize=
"28sp"
/>
android:textSize=
"28sp"
/>
</LinearLayout>
</LinearLayout>
...
...
app/src/main/res/layout/alert_dialog_t03_new_cumulative_time.xml
0 → 100644
View file @
fb151307
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:tools=
"http://schemas.android.com/tools"
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
>
<TextView
android:id=
"@+id/title_cumulative_data"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:background=
"@color/colorPrimaryDark"
android:gravity=
"center"
android:padding=
"5dp"
android:text=
"累加時間"
android:textColor=
"#fff"
android:textSize=
"30sp"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintHorizontal_bias=
"0.5"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
/>
<ImageButton
android:id=
"@+id/dialog_close"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginEnd=
"5dp"
android:background=
"@drawable/ic_baseline_cancel_24"
app:layout_constraintBottom_toBottomOf=
"@+id/title_cumulative_data"
app:layout_constraintEnd_toEndOf=
"@+id/title_cumulative_data"
app:layout_constraintTop_toTopOf=
"@+id/title_cumulative_data"
/>
<TextView
android:id=
"@+id/textView5"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"8dp"
android:layout_marginTop=
"20dp"
android:layout_marginBottom=
"1dp"
android:layout_weight=
"1"
android:gravity=
"center_vertical"
android:text=
"累加時間"
android:textSize=
"21sp"
app:layout_constraintBottom_toTopOf=
"@+id/textView10"
app:layout_constraintEnd_toStartOf=
"@id/dia_cumulativeTime_textView"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@+id/title_cumulative_data"
tools:ignore=
"NestedWeights"
/>
<TextView
android:id=
"@+id/dia_cumulativeTime_textView"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_marginEnd=
"8dp"
android:layout_weight=
"1"
android:gravity=
"center"
android:text=
"00:00"
android:textSize=
"21sp"
app:layout_constraintBottom_toBottomOf=
"@+id/textView5"
app:layout_constraintEnd_toStartOf=
"@+id/dia_periodSub_button"
app:layout_constraintHorizontal_bias=
"0.0"
app:layout_constraintStart_toEndOf=
"@+id/textView5"
app:layout_constraintTop_toTopOf=
"@+id/textView5"
app:layout_constraintVertical_bias=
"0.0"
/>
<Button
android:id=
"@+id/dia_periodSub_button"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_marginEnd=
"8dp"
android:text=
"減段"
android:textSize=
"21sp"
app:layout_constraintBottom_toBottomOf=
"@+id/dia_cumulativeTime_textView"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintTop_toTopOf=
"@+id/dia_cumulativeTime_textView"
app:layout_constraintVertical_bias=
"0.45"
/>
<Button
android:id=
"@+id/dia_periodAdd_button"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_marginEnd=
"8dp"
android:text=
"加段"
android:textSize=
"21sp"
app:layout_constraintBottom_toBottomOf=
"@+id/dia_parkingHours_textView"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintTop_toTopOf=
"@+id/dia_parkingHours_textView"
app:layout_constraintVertical_bias=
"0.35"
/>
<TextView
android:id=
"@+id/textView10"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"8dp"
android:layout_marginTop=
"20dp"
android:layout_weight=
"1"
android:gravity=
"center_vertical"
android:text=
"開單時間"
android:textSize=
"21sp"
app:layout_constraintBottom_toTopOf=
"@+id/textView12"
app:layout_constraintEnd_toStartOf=
"@+id/dia_BillingTime_textView"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@+id/textView5"
tools:ignore=
"NestedWeights"
/>
<TextView
android:id=
"@+id/dia_BillingTime_textView"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_weight=
"1"
android:gravity=
"center"
android:text=
"00:00"
android:textColor=
"@color/yellow_2"
android:textSize=
"21sp"
app:layout_constraintBottom_toBottomOf=
"@+id/textView10"
app:layout_constraintEnd_toEndOf=
"@+id/dia_cumulativeTime_textView"
app:layout_constraintStart_toEndOf=
"@+id/textView10"
app:layout_constraintTop_toTopOf=
"@+id/textView10"
app:layout_constraintVertical_bias=
"0.0"
/>
<TextView
android:id=
"@+id/textView12"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"8dp"
android:layout_marginTop=
"20dp"
android:layout_weight=
"1"
android:gravity=
"center_vertical"
android:text=
"停車時數"
android:textSize=
"21sp"
app:layout_constraintBottom_toTopOf=
"@+id/textView15"
app:layout_constraintEnd_toStartOf=
"@+id/dia_parkingHours_textView"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@+id/textView10"
tools:ignore=
"NestedWeights"
/>
<TextView
android:id=
"@+id/dia_parkingHours_textView"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_weight=
"1"
android:gravity=
"center"
android:text=
"1"
android:textSize=
"21sp"
app:layout_constraintBottom_toBottomOf=
"@+id/textView12"
app:layout_constraintEnd_toEndOf=
"@+id/dia_cumulativeTime_textView"
app:layout_constraintStart_toEndOf=
"@+id/textView12"
app:layout_constraintTop_toTopOf=
"@+id/textView12"
/>
<TextView
android:id=
"@+id/textView15"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"8dp"
android:layout_marginTop=
"20dp"
android:layout_weight=
"1"
android:gravity=
"center_vertical"
android:text=
"停 車 費"
android:textSize=
"21sp"
app:layout_constraintEnd_toStartOf=
"@+id/dia_parkingExpenses_textView"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@+id/textView12"
tools:ignore=
"NestedWeights"
/>
<TextView
android:id=
"@+id/dia_parkingExpenses_textView"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_weight=
"1"
android:gravity=
"center"
android:text=
"20"
android:textSize=
"21sp"
app:layout_constraintBottom_toBottomOf=
"@+id/textView15"
app:layout_constraintEnd_toEndOf=
"@+id/dia_cumulativeTime_textView"
app:layout_constraintStart_toEndOf=
"@+id/textView15"
app:layout_constraintTop_toTopOf=
"@+id/textView15"
app:layout_constraintVertical_bias=
"0.0"
/>
<Button
android:id=
"@+id/dia_off_button"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"30dp"
android:layout_marginTop=
"90dp"
android:layout_marginEnd=
"5dp"
android:layout_marginBottom=
"20dp"
android:layout_weight=
"1"
android:text=
"註銷本單"
android:textSize=
"24sp"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintEnd_toStartOf=
"@+id/dia_confirm_button"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@+id/textView29"
tools:ignore=
"ButtonStyle,NestedWeights"
/>
<Button
android:id=
"@+id/dia_confirm_button"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"5dp"
android:layout_marginEnd=
"30dp"
android:layout_weight=
"1"
android:text=
"累加確認"
android:textSize=
"24sp"
app:layout_constraintBottom_toBottomOf=
"@+id/dia_off_button"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintStart_toEndOf=
"@+id/dia_off_button"
app:layout_constraintTop_toTopOf=
"@+id/dia_off_button"
tools:ignore=
"ButtonStyle"
/>
<TextView
android:id=
"@+id/textView23"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"8dp"
android:layout_marginTop=
"20dp"
android:layout_weight=
"1"
android:gravity=
"center_vertical"
android:text=
"車 牌"
android:textSize=
"21sp"
app:layout_constraintEnd_toStartOf=
"@+id/dia_plate_number"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@+id/textView15"
tools:ignore=
"NestedWeights"
/>
<TextView
android:id=
"@+id/dia_plate_number"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_weight=
"1"
android:gravity=
"center"
android:text=
"8052-LZZ"
android:textSize=
"21sp"
app:layout_constraintBottom_toBottomOf=
"@+id/textView23"
app:layout_constraintEnd_toEndOf=
"@+id/dia_cumulativeTime_textView"
app:layout_constraintStart_toEndOf=
"@+id/textView23"
app:layout_constraintTop_toTopOf=
"@+id/textView23"
app:layout_constraintVertical_bias=
"0.0"
/>
<TextView
android:id=
"@+id/textView29"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"8dp"
android:layout_marginTop=
"20dp"
android:layout_weight=
"1"
android:gravity=
"center_vertical"
android:text=
"車 格"
android:textSize=
"21sp"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@+id/textView23"
app:layout_constraintEnd_toStartOf=
"@id/dia_space"
/>
<TextView
android:id=
"@+id/dia_space"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_weight=
"1"
android:gravity=
"center"
android:text=
"CY104"
android:textSize=
"21sp"
app:layout_constraintBottom_toBottomOf=
"@+id/textView29"
app:layout_constraintEnd_toEndOf=
"@+id/dia_cumulativeTime_textView"
app:layout_constraintStart_toEndOf=
"@+id/textView29"
app:layout_constraintTop_toTopOf=
"@+id/textView29"
app:layout_constraintVertical_bias=
"1.0"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
\ No newline at end of file
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