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
74ad0e0b
Commit
74ad0e0b
authored
Aug 01, 2022
by
YONG-LIN SU
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
新增 拍照存證照片預覽功能及顯示車牌辨識結果
parent
f657a352
Changes
13
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
334 additions
and
4 deletions
+334
-4
deploymentTargetDropDown.xml
.idea/deploymentTargetDropDown.xml
+17
-0
misc.xml
.idea/misc.xml
+3
-0
AndroidManifest.xml
app/src/main/AndroidManifest.xml
+6
-0
T03CumulativeActivity.java
...n/java/ecom/android/newparkapp/T03CumulativeActivity.java
+14
-0
T03ImgViewerActivity.java
...in/java/ecom/android/newparkapp/T03ImgViewerActivity.java
+92
-0
ImgViewerAdapter.java
...ava/ecom/android/newparkapp/adapter/ImgViewerAdapter.java
+77
-0
CasePhoto.java
...c/main/java/ecom/android/newparkapp/entity/CasePhoto.java
+1
-1
T02StartActivity.java
...n/java/ecom/android/newparkapp/view/T02StartActivity.java
+13
-1
T02StartViewModel.java
.../ecom/android/newparkapp/viewModel/T02StartViewModel.java
+2
-2
ic_texture_black_24dp.xml
app/src/main/res/drawable/ic_texture_black_24dp.xml
+10
-0
activity_t03_cumulative.xml
app/src/main/res/layout/activity_t03_cumulative.xml
+9
-0
activity_t03_img_viewer.xml
app/src/main/res/layout/activity_t03_img_viewer.xml
+35
-0
card_view_image_plate_number_item.xml
...src/main/res/layout/card_view_image_plate_number_item.xml
+55
-0
No files found.
.idea/deploymentTargetDropDown.xml
0 → 100644
View file @
74ad0e0b
<?xml version="1.0" encoding="UTF-8"?>
<project
version=
"4"
>
<component
name=
"deploymentTargetDropDown"
>
<runningDeviceTargetSelectedWithDropDown>
<Target>
<type
value=
"RUNNING_DEVICE_TARGET"
/>
<deviceKey>
<Key>
<type
value=
"SERIAL_NUMBER"
/>
<value
value=
"JCAXB7655018EJ6"
/>
</Key>
</deviceKey>
</Target>
</runningDeviceTargetSelectedWithDropDown>
<timeTargetWasSelectedWithDropDown
value=
"2022-08-01T01:49:20.422744100Z"
/>
</component>
</project>
\ No newline at end of file
.idea/misc.xml
View file @
74ad0e0b
...
...
@@ -19,6 +19,7 @@
<entry
key=
"..\:/AndroidStudioProject/newparkapp/app/src/main/res/layout/recycler_view_space_item.xml"
value=
"0.14947916666666666"
/>
<entry
key=
"..\:/AndroidStudioProject/newparkapp/app/src/main/res/layout/recycler_view_user_item.xml"
value=
"0.18645833333333334"
/>
<entry
key=
"..\:/AndroidStudioProject/newparkapp/app/src/main/res/layout/recycler_view_vehicle_type_item.xml"
value=
"0.14947916666666666"
/>
<entry
key=
"..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/drawable/ic_texture_black_24dp.xml"
value=
"0.2985"
/>
<entry
key=
"..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_main.xml"
value=
"0.34375"
/>
<entry
key=
"..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t01_bulletin_board.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"
/>
...
...
@@ -27,6 +28,8 @@
<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_start.xml"
value=
"0.34375"
/>
<entry
key=
"..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t03_img_viewer.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/recycler_view_bulletin_board_item.xml"
value=
"0.34375"
/>
<entry
key=
"..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/recycler_view_db_table_item.xml"
value=
"0.33"
/>
<entry
key=
"..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/recycler_view_item.xml"
value=
"0.34375"
/>
...
...
app/src/main/AndroidManifest.xml
View file @
74ad0e0b
...
...
@@ -27,6 +27,12 @@
android:supportsRtl=
"true"
android:theme=
"@style/Theme.AppCompat.Light.NoActionBar"
tools:targetApi=
"31"
>
<activity
android:name=
".T03CumulativeActivity"
android:exported=
"false"
/>
<activity
android:name=
".T03ImgViewerActivity"
android:exported=
"false"
/>
<activity
android:name=
".view.T02KeyInPlateNumberActivity"
android:exported=
"false"
/>
...
...
app/src/main/java/ecom/android/newparkapp/T03CumulativeActivity.java
0 → 100644
View file @
74ad0e0b
package
ecom
.
android
.
newparkapp
;
import
androidx.appcompat.app.AppCompatActivity
;
import
android.os.Bundle
;
public
class
T03CumulativeActivity
extends
AppCompatActivity
{
@Override
protected
void
onCreate
(
Bundle
savedInstanceState
)
{
super
.
onCreate
(
savedInstanceState
);
setContentView
(
R
.
layout
.
activity_t03_cumulative
);
}
}
\ No newline at end of file
app/src/main/java/ecom/android/newparkapp/T03ImgViewerActivity.java
0 → 100644
View file @
74ad0e0b
package
ecom
.
android
.
newparkapp
;
import
androidx.appcompat.app.AppCompatActivity
;
import
androidx.core.view.ViewCompat
;
import
androidx.databinding.DataBindingUtil
;
import
androidx.viewpager2.widget.ViewPager2
;
import
android.os.Bundle
;
import
java.util.List
;
import
ecom.android.newparkapp.adapter.ImgViewerAdapter
;
import
ecom.android.newparkapp.entity.CasePhoto
;
import
ecom.android.newparkapp.repository.InfoRepository
;
import
ecom.android.newparkapp.databinding.ActivityT03ImgViewerBinding
;
public
class
T03ImgViewerActivity
extends
AppCompatActivity
{
private
ActivityT03ImgViewerBinding
dataBinding
;
private
String
billingNumber2
;
private
InfoRepository
infoRepository
;
private
ImgViewerAdapter
imgViewerAdapter
;
private
List
<
CasePhoto
>
casePhotos
;
@Override
protected
void
onCreate
(
Bundle
savedInstanceState
)
{
super
.
onCreate
(
savedInstanceState
);
dataBinding
=
DataBindingUtil
.
setContentView
(
this
,
R
.
layout
.
activity_t03_img_viewer
);
billingNumber2
=
getIntent
().
getStringExtra
(
"BillingNumber2"
);
if
(
billingNumber2
.
trim
().
isEmpty
()
||
billingNumber2
.
length
()
==
0
){
return
;
}
infoRepository
=
new
InfoRepository
(
getApplication
());
casePhotos
=
infoRepository
.
casePhotoDao
.
loadAllByIds
(
new
String
[]{
billingNumber2
});
imgViewerAdapter
=
new
ImgViewerAdapter
(
getString
(
R
.
string
.
no_plate_message
));
imgViewerAdapter
.
submitList
(
casePhotos
);
initLayout
();
}
private
void
initLayout
(){
dataBinding
.
showPhoto
.
setClipToPadding
(
false
);
dataBinding
.
showPhoto
.
setOrientation
(
ViewPager2
.
ORIENTATION_HORIZONTAL
);
dataBinding
.
showPhoto
.
setAdapter
(
imgViewerAdapter
);
/*換頁動畫效果--------------------------------------------------------------------*/
dataBinding
.
showPhoto
.
setPadding
(
45
,
0
,
45
,
0
);
dataBinding
.
showPhoto
.
setOffscreenPageLimit
(
3
);
final
float
MIN_SCALE
=
0.85f
;
final
float
MIN_ALPHA
=
0.8f
;
//0.5f
final
float
pageMargin
=
0
;
final
float
pageOffset
=
40
;
dataBinding
.
showPhoto
.
setPageTransformer
((
view
,
position
)
->
{
//大小、透明度變化
int
pageWidth
=
view
.
getWidth
();
int
pageHeight
=
view
.
getHeight
();
if
(
position
<
-
1
)
{
// [-Infinity,-1)
view
.
setAlpha
(
0
f
);
}
else
if
(
position
<=
1
)
{
// [-1,1]
float
scaleFactor
=
Math
.
max
(
MIN_SCALE
,
1
-
Math
.
abs
(
position
));
float
vertMargin
=
pageHeight
*
(
1
-
scaleFactor
)
/
2
;
float
horzMargin
=
pageWidth
*
(
1
-
scaleFactor
)
/
2
;
if
(
position
<
0
)
{
view
.
setTranslationX
(
horzMargin
-
vertMargin
/
2
);
}
else
{
view
.
setTranslationX
(-
horzMargin
+
vertMargin
/
2
);
}
view
.
setScaleX
(
scaleFactor
);
view
.
setScaleY
(
scaleFactor
);
view
.
setAlpha
(
MIN_ALPHA
+
(
scaleFactor
-
MIN_SCALE
)
/
(
1
-
MIN_SCALE
)
*
(
1
-
MIN_ALPHA
));
}
else
{
view
.
setAlpha
(
0
f
);
}
//左右照片偏移量變化
float
myOffset
=
position
*
-(
2
*
pageOffset
+
pageMargin
);
if
(
dataBinding
.
showPhoto
.
getOrientation
()
==
ViewPager2
.
ORIENTATION_HORIZONTAL
)
{
if
(
ViewCompat
.
getLayoutDirection
(
dataBinding
.
showPhoto
)
==
ViewCompat
.
LAYOUT_DIRECTION_RTL
)
{
view
.
setTranslationX
(-
myOffset
);
}
else
{
view
.
setTranslationX
(
myOffset
);
}
}
else
{
view
.
setTranslationY
(
myOffset
);
}
});
}
}
\ No newline at end of file
app/src/main/java/ecom/android/newparkapp/adapter/ImgViewerAdapter.java
0 → 100644
View file @
74ad0e0b
package
ecom
.
android
.
newparkapp
.
adapter
;
import
android.graphics.Bitmap
;
import
android.graphics.BitmapFactory
;
import
android.view.LayoutInflater
;
import
android.view.ViewGroup
;
import
android.widget.ImageView
;
import
androidx.annotation.NonNull
;
import
androidx.recyclerview.widget.DiffUtil
;
import
androidx.recyclerview.widget.ListAdapter
;
import
androidx.recyclerview.widget.RecyclerView
;
import
java.io.File
;
import
ecom.android.newparkapp.databinding.CardViewImagePlateNumberItemBinding
;
import
ecom.android.newparkapp.entity.CasePhoto
;
public
class
ImgViewerAdapter
extends
ListAdapter
<
CasePhoto
,
ImgViewerAdapter
.
ImgViewerViewHolder
>
{
private
String
noPlateString
=
""
;
public
ImgViewerAdapter
(
String
noPlateString
){
super
(
casePhotoItemCallback
);
this
.
noPlateString
=
noPlateString
;
}
@NonNull
@Override
public
ImgViewerViewHolder
onCreateViewHolder
(
@NonNull
ViewGroup
parent
,
int
viewType
)
{
CardViewImagePlateNumberItemBinding
cardViewImagePlateNumberItemBinding
=
CardViewImagePlateNumberItemBinding
.
inflate
(
LayoutInflater
.
from
(
parent
.
getContext
()),
parent
,
false
);
return
new
ImgViewerViewHolder
(
cardViewImagePlateNumberItemBinding
,
noPlateString
);
}
@Override
public
void
onBindViewHolder
(
@NonNull
ImgViewerViewHolder
holder
,
int
position
)
{
holder
.
setBinding
(
getItem
(
position
));
}
public
static
final
DiffUtil
.
ItemCallback
<
CasePhoto
>
casePhotoItemCallback
=
new
DiffUtil
.
ItemCallback
<
CasePhoto
>()
{
@Override
public
boolean
areItemsTheSame
(
@NonNull
CasePhoto
oldItem
,
@NonNull
CasePhoto
newItem
)
{
return
oldItem
.
id
==
newItem
.
id
;
}
@Override
public
boolean
areContentsTheSame
(
@NonNull
CasePhoto
oldItem
,
@NonNull
CasePhoto
newItem
)
{
return
oldItem
.
photoPath
.
equals
(
newItem
.
photoPath
);
}
};
static
class
ImgViewerViewHolder
extends
RecyclerView
.
ViewHolder
{
private
final
CardViewImagePlateNumberItemBinding
dataBinding
;
private
final
String
noPlateString
;
ImgViewerViewHolder
(
CardViewImagePlateNumberItemBinding
dataBinding
,
String
noPlateString
)
{
super
(
dataBinding
.
getRoot
());
this
.
dataBinding
=
dataBinding
;
this
.
noPlateString
=
noPlateString
;
}
void
setBinding
(
CasePhoto
casePhoto
){
File
file
=
new
File
(
casePhoto
.
photoPath
);
if
(!
file
.
isFile
()){
return
;
}
BitmapFactory
.
Options
options
=
new
BitmapFactory
.
Options
();
options
.
inSampleSize
=
2
;
Bitmap
bitmap
=
BitmapFactory
.
decodeFile
(
file
.
getPath
(),
options
);
// 設置圖片
dataBinding
.
imageId2
.
setImageBitmap
(
bitmap
);
dataBinding
.
imageId2
.
setScaleType
(
ImageView
.
ScaleType
.
FIT_XY
);
// 設置檔案名稱
dataBinding
.
imgTextView
.
setText
(
file
.
getName
());
// 設置車牌辨識結果
dataBinding
.
plateNumberTextView
.
setText
(
casePhoto
.
plateNumber
.
trim
().
length
()
==
0
?
noPlateString
:
casePhoto
.
plateNumber
);
}
}
}
app/src/main/java/ecom/android/newparkapp/entity/CasePhoto.java
View file @
74ad0e0b
...
...
@@ -12,7 +12,7 @@ import androidx.room.PrimaryKey;
childColumns
=
"case_billing_number2"
,
onDelete
=
CASCADE
)
)
public
class
CasePhoto
{
@PrimaryKey
@PrimaryKey
(
autoGenerate
=
true
)
public
int
id
;
@ColumnInfo
(
name
=
"case_billing_number2"
)
...
...
app/src/main/java/ecom/android/newparkapp/view/T02StartActivity.java
View file @
74ad0e0b
...
...
@@ -25,6 +25,7 @@ import java.util.List;
import
java.util.Objects
;
import
ecom.android.newparkapp.R
;
import
ecom.android.newparkapp.T03ImgViewerActivity
;
import
ecom.android.newparkapp.entity.Case
;
import
ecom.android.newparkapp.entity.Road
;
import
ecom.android.newparkapp.entity.Space
;
...
...
@@ -77,7 +78,7 @@ public class T02StartActivity extends AppCompatActivity {
dataBinding
.
btnNewPage
.
setOnClickListener
(
v
->
btnNewPageOnClicked
());
dataBinding
.
btnPageDown
.
setOnClickListener
(
v
->
btnPageDownOnClicked
());
dataBinding
.
btnPageUp
.
setOnClickListener
(
v
->
btnPageUpOnClicked
());
dataBinding
.
btnPhotoCount
.
setOnClickListener
(
v
->
btnPhotoCountOnClicked
());
dataBinding
.
btnStartBack
.
setOnClickListener
(
v
->
{
finish
();});
}
...
...
@@ -230,4 +231,15 @@ public class T02StartActivity extends AppCompatActivity {
private
void
btnPageUpOnClicked
(){
t02StartViewModel
.
pageUp
();
}
private
void
btnPhotoCountOnClicked
(){
Case
tempCase
=
t02StartViewModel
.
getCurrentCase
().
getValue
();
if
(
tempCase
==
null
||
tempCase
.
photoCount
==
0
||
tempCase
.
billingNumber2
.
trim
().
isEmpty
()){
return
;
}
Intent
intent
=
new
Intent
();
intent
.
setClass
(
this
,
T03ImgViewerActivity
.
class
);
intent
.
putExtra
(
"BillingNumber2"
,
tempCase
.
billingNumber2
);
startActivity
(
intent
);
}
}
\ No newline at end of file
app/src/main/java/ecom/android/newparkapp/viewModel/T02StartViewModel.java
View file @
74ad0e0b
...
...
@@ -171,13 +171,13 @@ public class T02StartViewModel extends AndroidViewModel {
// 加入清單
cases
.
add
(
tempCase
);
caseCursor
.
se
tValue
(
caseCursor
.
getValue
()
+
1
);
caseCursor
.
pos
tValue
(
caseCursor
.
getValue
()
+
1
);
});
break
;
case
LIST:
// 跳至新單
currentCase
.
postValue
(
newCase
());
caseCursor
.
se
tValue
(
caseCursor
.
getValue
()
+
1
);
caseCursor
.
pos
tValue
(
caseCursor
.
getValue
()
+
1
);
break
;
case
CHANGED:
...
...
app/src/main/res/drawable/ic_texture_black_24dp.xml
0 → 100644
View file @
74ad0e0b
<vector
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:width=
"160dp"
android:height=
"120dp"
android:tint=
"#FFFFFF"
android:viewportWidth=
"24.0"
android:viewportHeight=
"24.0"
>
<path
android:fillColor=
"#FF000000"
android:pathData=
"M19.51,3.08L3.08,19.51c0.09,0.34 0.27,0.65 0.51,0.9 0.25,0.24 0.56,0.42 0.9,0.51L20.93,4.49c-0.19,-0.69 -0.73,-1.23 -1.42,-1.41zM11.88,3L3,11.88v2.83L14.71,3h-2.83zM5,3c-1.1,0 -2,0.9 -2,2v2l4,-4L5,3zM19,21c0.55,0 1.05,-0.22 1.41,-0.59 0.37,-0.36 0.59,-0.86 0.59,-1.41v-2l-4,4h2zM9.29,21h2.83L21,12.12L21,9.29L9.29,21z,"
/>
</vector>
app/src/main/res/layout/activity_t03_cumulative.xml
0 → 100644
View file @
74ad0e0b
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
xmlns:tools=
"http://schemas.android.com/tools"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
tools:context=
".T03CumulativeActivity"
>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
app/src/main/res/layout/activity_t03_img_viewer.xml
0 → 100644
View file @
74ad0e0b
<?xml version="1.0" encoding="utf-8"?>
<layout>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
xmlns:tools=
"http://schemas.android.com/tools"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:orientation=
"vertical"
android:paddingTop=
"10dp"
android:paddingBottom=
"10dp"
tools:context=
".T03ImgViewerActivity"
>
<TextView
android:id=
"@+id/title_textView"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:gravity=
"center"
android:textSize=
"26sp"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintHorizontal_bias=
"0.5"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
/>
<androidx.viewpager2.widget.ViewPager2
android:id=
"@+id/show_photo"
android:layout_width=
"0dp"
android:layout_height=
"0dp"
android:clipChildren=
"false"
android:clipToPadding=
"false"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintHorizontal_bias=
"0.0"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
\ No newline at end of file
app/src/main/res/layout/card_view_image_plate_number_item.xml
0 → 100644
View file @
74ad0e0b
<?xml version="1.0" encoding="utf-8"?>
<layout>
<androidx.cardview.widget.CardView
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
xmlns:tools=
"http://schemas.android.com/tools"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:layout_margin=
"6dp"
android:background=
"#FFFFFF"
android:padding=
"6dp"
>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
>
<TextView
android:id=
"@+id/img_textView"
android:layout_width=
"match_parent"
android:layout_height=
"40dp"
android:background=
"@color/colorPrimaryDark"
android:gravity=
"center"
android:text=
"照片名稱"
android:textColor=
"#D6D6D6"
android:textSize=
"26sp"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
/>
<TextView
android:id=
"@+id/plate_number_textView"
android:layout_width=
"match_parent"
android:layout_height=
"40dp"
android:background=
"@color/white"
android:text=
"車牌號碼"
android:textAlignment=
"center"
android:textColor=
"@color/black"
android:textSize=
"24sp"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@+id/img_textView"
/>
<ImageView
android:id=
"@+id/imageId2"
android:layout_width=
"match_parent"
android:layout_height=
"0dp"
android:scaleType=
"center"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintHorizontal_bias=
"0.486"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@+id/plate_number_textView"
app:srcCompat=
"@drawable/ic_texture_black_24dp"
tools:ignore=
"ContentDescription"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
</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