Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Room Park Android
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
Vladislav Bogdashkin
Room Park Android
Commits
76e62401
Commit
76e62401
authored
Mar 20, 2020
by
Vladislav Bogdashkin
🎣
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'feature/clear_cache' into develop
parents
8f4943c3
ab7bae22
Changes
20
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
177 additions
and
9 deletions
+177
-9
build.gradle
app/build.gradle
+1
-0
FilesRepository.kt
...nto/visual/roompark/data/data_provider/FilesRepository.kt
+2
-0
FileModule.kt
...iganto/visual/roompark/data/repository/file/FileModule.kt
+19
-0
RoomParkGlideModule.kt
.../biganto/visual/roompark/di/dagger/RoomParkGlideModule.kt
+41
-0
FilesContract.kt
.../biganto/visual/roompark/domain/contract/FilesContract.kt
+3
-0
settings.kt
...com/biganto/visual/roompark/domain/interactor/settings.kt
+2
-0
settingsUseCase.kt
...iganto/visual/roompark/domain/use_case/settingsUseCase.kt
+2
-0
AlbumHeaderAdapter.kt
...ark/presentation/screen/albums/util/AlbumHeaderAdapter.kt
+2
-0
AlbumListAdapter.kt
...mpark/presentation/screen/albums/util/AlbumListAdapter.kt
+2
-0
ScreenController.kt
.../roompark/presentation/screen/article/ScreenController.kt
+3
-0
textAdapter.kt
.../roompark/presentation/screen/article/util/textAdapter.kt
+2
-0
ScreenController.kt
...ual/roompark/presentation/screen/deal/ScreenController.kt
+2
-0
Adapter.kt
...visual/roompark/presentation/screen/deals/util/Adapter.kt
+2
-3
Adapter.kt
...al/roompark/presentation/screen/feed_list/util/Adapter.kt
+2
-0
ScreenContract.kt
...l/roompark/presentation/screen/settings/ScreenContract.kt
+2
-0
ScreenController.kt
...roompark/presentation/screen/settings/ScreenController.kt
+28
-0
ScreenPresenter.kt
.../roompark/presentation/screen/settings/ScreenPresenter.kt
+19
-0
ScreenViewState.kt
.../roompark/presentation/screen/settings/ScreenViewState.kt
+1
-0
settings_screen.xml
app/src/main/res/layout/settings_screen.xml
+29
-6
styles.xml
app/src/main/res/values/styles.xml
+13
-0
No files found.
app/build.gradle
View file @
76e62401
...
...
@@ -125,6 +125,7 @@ dependencies {
implementation
'com.squareup.retrofit2:converter-gson:2.3.0'
implementation
'com.squareup.retrofit2:converter-scalars:2.3.0'
implementation
'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
implementation
'com.squareup.okhttp3:okhttp:3.14.0'
implementation
'com.squareup.okhttp3:logging-interceptor:3.12.2'
implementation
'com.squareup.okhttp3:okhttp-urlconnection:3.14.0'
...
...
app/src/main/java/com/biganto/visual/roompark/data/data_provider/FilesRepository.kt
View file @
76e62401
...
...
@@ -30,6 +30,8 @@ class FilesContractModule @Inject constructor(
return
FileModule
.
getDirectory
(
context
,
d
)
}
override
fun
deleteAllFiles
()
=
files
.
deleteAllCacheObservable
()
override
fun
getPlansSize
()
=
getFile
<
FileModule
.
FileDirectory
.
PlanTypeDir
>().
folderSize
override
fun
getToursSize
()
=
getFile
<
FileModule
.
FileDirectory
.
ToursDir
>().
folderSize
...
...
app/src/main/java/com/biganto/visual/roompark/data/repository/file/FileModule.kt
View file @
76e62401
...
...
@@ -6,6 +6,8 @@ import android.os.Environment
import
com.biganto.visual.roompark.util.extensions.asInt
import
com.google.gson.JsonElement
import
dagger.Module
import
io.reactivex.Observable
import
kotlinx.io.IOException
import
timber.log.Timber
import
java.io.File
import
javax.inject.Inject
...
...
@@ -61,7 +63,24 @@ class FileModule @Inject constructor(val context: Application) {
fun
deleteFile
(
uri
:
String
)=
getFile
(
uri
).
delete
()
fun
deleteAllCacheObservable
()
=
Observable
.
create
<
Pair
<
Int
,
Int
>>
{
emitter
->
val
foldersToDelete
=
listOf
(
FileDirectory
.
Albums
(),
FileDirectory
.
FeedsDir
(),
FileDirectory
.
PlanTypeDir
(),
FileDirectory
.
ToursDir
()
)
foldersToDelete
.
forEachIndexed
{
index
,
dir
->
if
(
getDirectory
(
context
,
dir
).
deleteRecursively
())
emitter
.
onNext
(
Pair
(
index
,
foldersToDelete
.
size
-
1
))
else
emitter
.
onError
(
IOException
(
"Error occurred on files deleting!"
))
}
emitter
.
onComplete
()
}
val
getCoreCacheDirectory
:
String
get
(){
return
rootFolder
.
absolutePath
}
...
...
app/src/main/java/com/biganto/visual/roompark/di/dagger/RoomParkGlideModule.kt
0 → 100644
View file @
76e62401
package
com.biganto.visual.roompark.di.dagger
import
android.content.Context
import
com.bumptech.glide.GlideBuilder
import
com.bumptech.glide.annotation.GlideModule
import
com.bumptech.glide.load.engine.cache.InternalCacheDiskCacheFactory
import
com.bumptech.glide.module.AppGlideModule
/**
* Created by Vladislav Bogdashkin on 19.03.2020.
*/
@GlideModule
class
RoomParkGlideModule
:
AppGlideModule
()
{
// fun applyOptions(@NonNull context: Context?, @NonNull builder: GlideBuilder) {
// super.applyOptions(context, builder)
// builder.setDefaultRequestOptions(RequestOptions().format(DecodeFormat.PREFER_ARGB_8888))
// }
override
fun
applyOptions
(
context
:
Context
,
builder
:
GlideBuilder
)
{
val
filderName
=
"../files/photos"
builder
.
setDiskCache
(
InternalCacheDiskCacheFactory
(
context
,
filderName
,
1024L
*
1024L
*
256L
)
)
}
//
// fun registerComponents(
// @NonNull context: Context?, @NonNull glide: Glide?, @NonNull registry: Registry
// ) {
// registry.append(Photo::class.java, InputStream::class.java, Factory())
// }
// Disable manifest parsing to avoid adding similar modules twice.
override
fun
isManifestParsingEnabled
():
Boolean
{
return
false
}
}
\ No newline at end of file
app/src/main/java/com/biganto/visual/roompark/domain/contract/FilesContract.kt
View file @
76e62401
package
com.biganto.visual.roompark.domain.contract
import
io.reactivex.Observable
/**
* Created by Vladislav Bogdashkin on 24.09.2019.
*/
...
...
@@ -11,4 +13,5 @@ interface FilesContract{
fun
getFeedSize
():
Long
fun
getToursSize
():
Long
fun
getPlansSize
():
Long
fun
deleteAllFiles
():
Observable
<
Pair
<
Int
,
Int
>>
}
\ No newline at end of file
app/src/main/java/com/biganto/visual/roompark/domain/interactor/settings.kt
View file @
76e62401
...
...
@@ -47,6 +47,8 @@ class SettingsInteractor @Inject constructor(
CachedDataModel
(
activity
.
resources
.
getString
(
R
.
string
.
overall_cache
),
it
,
0
)
}
fun
deleteCacheFiles
()
=
settingsUseCase
.
clearAllCache
()
fun
getCacheInfo
()
=
Observable
.
concatArray
(
plans
,
tours
,
feeds
,
albums
,
overall
).
toList
().
toObservable
()
...
...
app/src/main/java/com/biganto/visual/roompark/domain/use_case/settingsUseCase.kt
View file @
76e62401
...
...
@@ -16,6 +16,8 @@ class SettingsUseCase @Inject constructor(
){
fun
signOut
()
=
authContract
.
signOut
()
fun
clearAllCache
()
=
fileContract
.
deleteAllFiles
()
val
planTypesSize
get
()
=
Observable
.
just
(
fileContract
.
getPlansSize
())
...
...
app/src/main/java/com/biganto/visual/roompark/presentation/screen/albums/util/AlbumHeaderAdapter.kt
View file @
76e62401
...
...
@@ -9,6 +9,7 @@ import com.biganto.visual.roompark.domain.model.AlbumPreviewModel
import
com.biganto.visual.roompark.presentation.screen.settings.util.CommonRecyclerAdapter
import
com.biganto.visual.roompark.presentation.screen.settings.util.CommonViewHolder
import
com.bumptech.glide.Glide
import
com.bumptech.glide.load.engine.DiskCacheStrategy
/**
...
...
@@ -40,6 +41,7 @@ class AlbumsHeaderViewHolder(itemView: View) : CommonViewHolder<AlbumPreviewMode
.
load
(
model
.
previewUrl
)
.
centerCrop
()
.
fitCenter
()
.
diskCacheStrategy
(
DiskCacheStrategy
.
ALL
)
.
into
(
preview
)
}
}
app/src/main/java/com/biganto/visual/roompark/presentation/screen/albums/util/AlbumListAdapter.kt
View file @
76e62401
...
...
@@ -13,6 +13,7 @@ import com.biganto.visual.roompark.presentation.screen.settings.util.CommonRecyc
import
com.biganto.visual.roompark.presentation.screen.settings.util.CommonViewHolder
import
com.biganto.visual.roompark.util.view_utils.image_view.RoundedImageView
import
com.bumptech.glide.Glide
import
com.bumptech.glide.load.engine.DiskCacheStrategy
import
com.google.android.material.textview.MaterialTextView
import
com.jakewharton.rxbinding3.view.detaches
import
com.jakewharton.rxrelay2.BehaviorRelay
...
...
@@ -90,6 +91,7 @@ class PhotosViewHolder(itemView: View) : CommonViewHolder<PhotoModel>(itemView)
.
load
(
it
.
url
)
.
centerCrop
()
.
fitCenter
()
.
diskCacheStrategy
(
DiskCacheStrategy
.
ALL
)
.
into
(
photoPreview
)
}}
}
...
...
app/src/main/java/com/biganto/visual/roompark/presentation/screen/article/ScreenController.kt
View file @
76e62401
...
...
@@ -17,6 +17,7 @@ import com.biganto.visual.roompark.presentation.screen.article.util.HtmlPageAdap
import
com.biganto.visual.roompark.presentation.screen.article.util.HtmlTag
import
com.biganto.visual.roompark.util.extensions.formatToSimple
import
com.bumptech.glide.Glide
import
com.bumptech.glide.load.engine.DiskCacheStrategy
import
com.google.android.material.textview.MaterialTextView
import
jp.wasabeef.glide.transformations.BlurTransformation
import
timber.log.Timber
...
...
@@ -123,10 +124,12 @@ class ArticleScreenController :
Glide
.
with
(
blurPreview
)
.
load
(
viewState
.
item
.
previewUrl
)
.
transform
(
BlurTransformation
(
40
,
4
))
.
diskCacheStrategy
(
DiskCacheStrategy
.
ALL
)
.
into
(
blurPreview
)
Glide
.
with
(
articlePreview
)
.
load
(
viewState
.
item
.
previewUrl
)
.
diskCacheStrategy
(
DiskCacheStrategy
.
ALL
)
.
into
(
articlePreview
)
}
...
...
app/src/main/java/com/biganto/visual/roompark/presentation/screen/article/util/textAdapter.kt
View file @
76e62401
...
...
@@ -10,6 +10,7 @@ import androidx.recyclerview.widget.RecyclerView
import
butterknife.ButterKnife
import
com.biganto.visual.roompark.R
import
com.bumptech.glide.Glide
import
com.bumptech.glide.load.engine.DiskCacheStrategy
import
com.google.android.material.textview.MaterialTextView
/**
...
...
@@ -94,6 +95,7 @@ class HtmlImageViewHolder(itemView: View) :HtmlTagViewHolder<HtmlTag.ImageSource
Glide
.
with
(
itemView
)
.
load
(
url
)
.
diskCacheStrategy
(
DiskCacheStrategy
.
ALL
)
.
into
(
itemView
as
ImageView
)
}
}
...
...
app/src/main/java/com/biganto/visual/roompark/presentation/screen/deal/ScreenController.kt
View file @
76e62401
...
...
@@ -23,6 +23,7 @@ import com.biganto.visual.roompark.util.view_utils.status_progress_view.StatusPr
import
com.bluelinelabs.conductor.RouterTransaction
import
com.bluelinelabs.conductor.changehandler.FadeChangeHandler
import
com.bumptech.glide.Glide
import
com.bumptech.glide.load.engine.DiskCacheStrategy
import
com.google.android.material.textview.MaterialTextView
import
com.jakewharton.rxbinding3.view.clicks
import
com.jakewharton.rxbinding3.view.scrollChangeEvents
...
...
@@ -212,6 +213,7 @@ class DealScreenController :
viewState
.
estate
.
estate
.
multitourPreview
?.
let
{
Glide
.
with
(
tourScreen
)
.
load
(
it
)
.
diskCacheStrategy
(
DiskCacheStrategy
.
ALL
)
.
into
(
tourScreen
)
}
...
...
app/src/main/java/com/biganto/visual/roompark/presentation/screen/deals/util/Adapter.kt
View file @
76e62401
...
...
@@ -19,6 +19,7 @@ import com.biganto.visual.roompark.util.view_utils.image_view.RoundedImageView
import
com.biganto.visual.roompark.util.view_utils.status_progress_view.StatusProgressAnimationState
import
com.biganto.visual.roompark.util.view_utils.status_progress_view.StatusProgressCeil
import
com.bumptech.glide.Glide
import
com.bumptech.glide.load.engine.DiskCacheStrategy
import
com.google.android.material.textview.MaterialTextView
import
com.jakewharton.rxbinding3.view.clicks
import
io.reactivex.Observable
...
...
@@ -98,12 +99,10 @@ class DealViewHolder(itemView: View) : CommonViewHolder<DealPreviewModel>(itemVi
statusLayout
.
addView
(
currentStatusText
,
0
)
statusLayout
.
invalidate
()
model
.
tourPreview
?.
let
{
Glide
.
with
(
tourScreen
)
.
load
(
it
)
.
diskCacheStrategy
(
DiskCacheStrategy
.
ALL
)
.
into
(
tourScreen
)
}
}
...
...
app/src/main/java/com/biganto/visual/roompark/presentation/screen/feed_list/util/Adapter.kt
View file @
76e62401
...
...
@@ -10,6 +10,7 @@ import com.biganto.visual.roompark.presentation.screen.settings.util.CommonRecyc
import
com.biganto.visual.roompark.presentation.screen.settings.util.CommonViewHolder
import
com.biganto.visual.roompark.util.extensions.setGone
import
com.bumptech.glide.Glide
import
com.bumptech.glide.load.engine.DiskCacheStrategy
import
timber.log.Timber
import
java.text.SimpleDateFormat
import
java.util.*
...
...
@@ -46,6 +47,7 @@ class ArticleViewHolder(itemView: View) : CommonViewHolder<ArticlePreviewModel>(
Glide
.
with
(
preview
)
.
load
(
model
.
previewUrl
)
.
diskCacheStrategy
(
DiskCacheStrategy
.
ALL
)
.
into
(
preview
)
}
...
...
app/src/main/java/com/biganto/visual/roompark/presentation/screen/settings/ScreenContract.kt
View file @
76e62401
...
...
@@ -9,5 +9,7 @@ import io.reactivex.Observable
interface
SettingsScreen
:
BigantoBaseContract
<
SettingsScreenViewState
>
{
fun
signOut
():
Observable
<
Int
>
fun
clearCache
():
Observable
<
Int
>
fun
refreshCacheInfo
():
Observable
<
Int
>
}
app/src/main/java/com/biganto/visual/roompark/presentation/screen/settings/ScreenController.kt
View file @
76e62401
...
...
@@ -16,13 +16,16 @@ import com.biganto.visual.roompark.presentation.screen.settings.util.CahcedListA
import
com.biganto.visual.roompark.presentation.screen.settings.util.PushListAdapter
import
com.biganto.visual.roompark.presentation.screen.splash.SplashScreenController
import
com.biganto.visual.roompark.util.extensions.bytesToSize
import
com.biganto.visual.roompark.util.extensions.setGone
import
com.bluelinelabs.conductor.RouterTransaction
import
com.bluelinelabs.conductor.changehandler.FadeChangeHandler
import
com.google.android.material.textview.MaterialTextView
import
com.jakewharton.rxbinding3.view.clicks
import
com.jakewharton.rxrelay2.BehaviorRelay
import
io.reactivex.Observable
import
io.reactivex.android.schedulers.AndroidSchedulers
import
timber.log.Timber
import
java.util.concurrent.TimeUnit
import
javax.inject.Inject
/**
...
...
@@ -40,6 +43,15 @@ class SettingsScreenController :
.
map
{
Timber
.
d
(
"Clicked sign out button"
);
1
}
.
observeOn
(
AndroidSchedulers
.
mainThread
())
override
fun
clearCache
():
Observable
<
Int
>
=
clearCacheButton
.
clicks
()
.
debounce
(
500
,
TimeUnit
.
MICROSECONDS
)
.
map
{
Timber
.
d
(
"Clicked clear cache button"
);
1
}
.
observeOn
(
AndroidSchedulers
.
mainThread
())
private
val
refreshEmitter
=
BehaviorRelay
.
create
<
Int
>()
override
fun
refreshCacheInfo
():
Observable
<
Int
>
=
refreshEmitter
override
fun
injectDependencies
()
{
getComponent
()
}
...
...
@@ -72,6 +84,12 @@ class SettingsScreenController :
@BindView
(
R
.
id
.
signOutButton
)
lateinit
var
signOutButton
:
MaterialTextView
@BindView
(
R
.
id
.
clear_cache_button
)
lateinit
var
clearCacheButton
:
MaterialTextView
@BindView
(
R
.
id
.
progress_lock_background
)
lateinit
var
progressShame
:
View
private
fun
setToolbar
(){
toolBar
.
appBar
.
liftOnScrollTargetViewId
=
R
.
id
.
nestedScrollContainer
pushRecycler
.
isNestedScrollingEnabled
=
false
...
...
@@ -112,6 +130,7 @@ class SettingsScreenController :
is
SettingsScreenViewState
.
LoadSettingsList
->
render
(
viewState
)
is
SettingsScreenViewState
.
SomeError
->
render
(
viewState
)
is
SettingsScreenViewState
.
SignOut
->
render
(
viewState
)
is
SettingsScreenViewState
.
OnCacheDeleting
->
render
(
viewState
)
}
}
...
...
@@ -119,7 +138,16 @@ class SettingsScreenController :
showError
(
viewState
.
exception
)
private
fun
render
(
viewState
:
SettingsScreenViewState
.
Idle
){
progressShame
.
setGone
(
true
)
clearCacheButton
.
setGone
(
false
)
}
private
fun
render
(
viewState
:
SettingsScreenViewState
.
OnCacheDeleting
){
val
isProgressed
=
viewState
.
progress
>=
1f
progressShame
.
setGone
(
isProgressed
)
clearCacheButton
.
setGone
(!
isProgressed
)
refreshEmitter
.
accept
(
1
)
}
private
fun
render
(
viewState
:
SettingsScreenViewState
.
SignOut
){
...
...
app/src/main/java/com/biganto/visual/roompark/presentation/screen/settings/ScreenPresenter.kt
View file @
76e62401
...
...
@@ -43,9 +43,28 @@ class SettingsScreenPresenter @Inject constructor(
}
val
refreshInfo
=
intent
(
SettingsScreen
::
refreshCacheInfo
)
.
flatMap
{
fetchSettings
}
val
onClearCache
=
intent
(
SettingsScreen
::
clearCache
)
.
flatMap
{
interactor
.
deleteCacheFiles
()
.
map
<
SettingsScreenViewState
>{
SettingsScreenViewState
.
OnCacheDeleting
(
it
.
first
/
it
.
second
.
toFloat
()
)
}
.
startWith
(
SettingsScreenViewState
.
OnCacheDeleting
(
0f
))
.
onErrorReturn
(
::
parseError
)
}
val
state
=
restoreStateObservable
.
mergeWith
(
fetchSettings
)
.
mergeWith
(
onSignOut
)
.
mergeWith
(
onClearCache
)
.
mergeWith
(
refreshInfo
)
.
doOnError
{
Timber
.
e
(
it
)}
.
subscribeOn
(
Schedulers
.
io
())
.
onErrorReturn
(
::
parseError
)
...
...
app/src/main/java/com/biganto/visual/roompark/presentation/screen/settings/ScreenViewState.kt
View file @
76e62401
...
...
@@ -15,4 +15,5 @@ sealed class SettingsScreenViewState : BigantoBaseViewState() {
// class LoadCachedInfo(val cached:SettingsModel) : SettingsScreenViewState()
class
SomeError
(
val
exception
:
ExceptionString
)
:
SettingsScreenViewState
()
class
SignOut
()
:
SettingsScreenViewState
()
class
OnCacheDeleting
(
val
progress
:
Float
)
:
SettingsScreenViewState
()
}
\ No newline at end of file
app/src/main/res/layout/settings_screen.xml
View file @
76e62401
...
...
@@ -123,10 +123,33 @@
tools:listitem=
"@layout/text_description_viewholder"
/>
<com.google.android.material.textview.MaterialTextView
style=
"@style/Default_TextView.Cancel_Text"
android:id=
"@+id/clear_cache_button"
style=
"@style/Default_TextView.Clear_Cache_Text"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_margin=
"32dp"
/>
android:layout_height=
"48dp"
android:layout_margin=
"16dp"
android:textAlignment=
"center"
/>
<FrameLayout
android:id=
"@+id/progress_lock_background"
android:background=
"@color/colorOpacityBackgroundInv"
android:layout_width=
"match_parent"
android:layout_height=
"48dp"
android:layout_margin=
"16dp"
android:backgroundTint=
"@color/colorPrimary"
android:visibility=
"gone"
>
<ProgressBar
android:id=
"@+id/settings_progress_bar"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:indeterminate=
"true"
android:layout_gravity=
"center"
/>
</FrameLayout>
<com.google.android.material.textview.MaterialTextView
...
...
@@ -142,10 +165,10 @@
<com.google.android.material.textview.MaterialTextView
android:id=
"@+id/signOutButton"
style=
"@style/Default_TextView.
Cancel
_Text"
style=
"@style/Default_TextView.
Sign_Out
_Text"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_margin=
"32dp"
android:text=
"СМЕНИТЬ АККАУНТ"
/>
android:layout_margin=
"32dp"
/>
</LinearLayout>
</androidx.core.widget.NestedScrollView>
\ No newline at end of file
app/src/main/res/values/styles.xml
View file @
76e62401
...
...
@@ -317,6 +317,19 @@
<item
name=
"android:textColor"
>
@color/colorError
</item>
</style>
<style
name=
"Default_TextView.Clear_Cache_Text"
>
<item
name=
"android:text"
>
"ОЧИСТИТЬ КЭШ"
</item>
<item
name=
"android:gravity"
>
center
</item>
<item
name=
"android:textColor"
>
@color/colorError
</item>
</style>
<style
name=
"Default_TextView.Sign_Out_Text"
>
<item
name=
"android:text"
>
"СМЕНИТЬ АККАУНТ"
</item>
<item
name=
"android:gravity"
>
center
</item>
<item
name=
"android:textColor"
>
@color/colorError
</item>
</style>
<style
name=
"Default_TextView.Notice_Text"
>
<item
name=
"android:textColor"
>
@color/colorNoticeText
</item>
</style>
...
...
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