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
Expand all
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
This diff is collapsed.
Click to expand it.
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
This diff is collapsed.
Click to expand it.
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