Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Sign in / Register
Toggle navigation
D
Data Recovery White
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wanglei
Data Recovery White
Commits
d66a36b3
Commit
d66a36b3
authored
Jul 25, 2024
by
wanglei
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
...
parent
bdd92431
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
145 additions
and
44 deletions
+145
-44
AndroidManifest.xml
app/src/main/AndroidManifest.xml
+2
-2
SplashActivity.kt
...ain/java/com/base/datarecovery/activity/SplashActivity.kt
+7
-15
AppProcessActivity.kt
...se/datarecovery/activity/appprocess/AppProcessActivity.kt
+3
-6
AppProcessAnimationActivity.kt
...covery/activity/appprocess/AppProcessAnimationActivity.kt
+5
-5
LargeFileActivity.kt
...base/datarecovery/activity/largefile/LargeFileActivity.kt
+9
-5
AppFunctionAdapter.kt
.../java/com/base/datarecovery/adapter/AppFunctionAdapter.kt
+2
-3
ConstObject.kt
app/src/main/java/com/base/datarecovery/bean/ConstObject.kt
+2
-2
NotificationUtil.kt
...c/main/java/com/base/datarecovery/fcm/NotificationUtil.kt
+25
-1
HomeFragment.kt
.../main/java/com/base/datarecovery/fragment/HomeFragment.kt
+2
-3
AppProcessStringManager.java
.../com/base/datarecovery/utils/AppProcessStringManager.java
+28
-0
LargeFileStringManager.java
...a/com/base/datarecovery/utils/LargeFileStringManager.java
+29
-0
WhatsappStringManager.java
...va/com/base/datarecovery/utils/WhatsappStringManager.java
+29
-0
activity_app_manager.xml
app/src/main/res/layout/activity_app_manager.xml
+1
-1
activity_app_manager_animation.xml
app/src/main/res/layout/activity_app_manager_animation.xml
+1
-1
No files found.
app/src/main/AndroidManifest.xml
View file @
d66a36b3
...
...
@@ -59,13 +59,13 @@
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
android:name=
".activity.app
manager.AppManager
AnimationActivity"
android:name=
".activity.app
process.AppProcess
AnimationActivity"
android:exported=
"false"
android:launchMode=
"singleTop"
android:screenOrientation=
"portrait"
tools:ignore=
"DiscouragedApi,LockedOrientationActivity"
/>
<activity
android:name=
".activity.app
manager.AppManager
Activity"
android:name=
".activity.app
process.AppProcess
Activity"
android:exported=
"false"
android:launchMode=
"singleTop"
android:screenOrientation=
"portrait"
...
...
app/src/main/java/com/base/datarecovery/activity/SplashActivity.kt
View file @
d66a36b3
...
...
@@ -7,30 +7,22 @@ import android.net.Uri
import
android.text.SpannableString
import
android.text.Spanned
import
android.text.style.UnderlineSpan
import
android.util.Log
import
android.view.View
import
androidx.lifecycle.lifecycleScope
import
com.base.datarecovery.MyApplication
import
com.base.datarecovery.activity.appprocess.AppProcessAnimationActivity
import
com.base.datarecovery.activity.guide.GuideActivity
import
com.base.datarecovery.activity.junkclean.ScanJunkActivity
import
com.base.datarecovery.activity.largefile.LargeFileActivity
import
com.base.datarecovery.activity.largefile.LargeFileAnimationActivity
import
com.base.datarecovery.activity.photomanager.PhotoManagerAnimationActivity
import
com.base.datarecovery.activity.privacyspace.PrivacyPinOneActivity
import
com.base.datarecovery.activity.privacyspace.PrivacySpaceActivity
import
com.base.datarecovery.activity.recovery.FileScanResultActivity
import
com.base.datarecovery.activity.repeat.RepeatActivity
import
com.base.datarecovery.activity.repeat.RepeatAnimationActivity
import
com.base.datarecovery.activity.screenshot.ScreenShotActivity
import
com.base.datarecovery.activity.screenshot.ScreenShotAnimationActivity
import
com.base.datarecovery.activity.whatsapp.WhatsAppCleanerAnimationActivity
import
com.base.datarecovery.ads.AdmobMaxHelper
import
com.base.datarecovery.ads.admob.AdmobInterstitialUtils
import
com.base.datarecovery.ads.admob.AdmobNativeUtils
import
com.base.datarecovery.ads.admob.AdmobOpenUtils
import
com.base.datarecovery.ads.max.AdMaxInit.maxInitAction
import
com.base.datarecovery.ads.max.AdMaxInterstitialUtils
import
com.base.datarecovery.ads.max.AdMaxOpenUtils
import
com.base.datarecovery.bean.ConstObject
import
com.base.datarecovery.bean.ConstObject.ID_APP_
MANAGER
import
com.base.datarecovery.bean.ConstObject.ID_APP_
PROCESS
import
com.base.datarecovery.bean.ConstObject.ID_JUNK_CLEAN_PUSH
import
com.base.datarecovery.bean.ConstObject.ID_LARGE_FILE
import
com.base.datarecovery.bean.ConstObject.ID_PRIVACY_SPACE
...
...
@@ -189,11 +181,11 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() {
}
ID_LARGE_FILE
->
{
startActivity
(
Intent
(
this
,
LargeFileAnimationActivity
::
class
.
java
))
}
ID_APP_
MANAGER
->
{
ID_APP_
PROCESS
->
{
startActivity
(
Intent
(
this
,
AppProcessAnimationActivity
::
class
.
java
))
}
else
->
{
...
...
app/src/main/java/com/base/datarecovery/activity/app
manager/AppManager
Activity.kt
→
app/src/main/java/com/base/datarecovery/activity/app
process/AppProcess
Activity.kt
View file @
d66a36b3
package
com.base.datarecovery.activity.app
manager
package
com.base.datarecovery.activity.app
process
import
android.annotation.SuppressLint
import
android.content.Context
...
...
@@ -16,17 +16,14 @@ import com.base.datarecovery.bean.AppBean
import
com.base.datarecovery.databinding.ActivityAppManagerBinding
import
com.base.datarecovery.help.BaseActivity
import
com.base.datarecovery.help.KotlinExt.toFormatSize
import
com.base.datarecovery.help.PermissionHelp.checkStorePermission
import
com.base.datarecovery.help.PermissionHelp.requestStorePermission
import
com.base.datarecovery.utils.BarUtils
import
com.base.datarecovery.utils.RamUtils.ramPair
import
com.base.datarecovery.view.DialogViews.showExitFunctionDialog
import
com.base.datarecovery.view.DialogViews.showGerPermission
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.launch
class
App
Manager
Activity
:
BaseActivity
<
ActivityAppManagerBinding
>()
{
class
App
Process
Activity
:
BaseActivity
<
ActivityAppManagerBinding
>()
{
override
val
binding
:
ActivityAppManagerBinding
by
lazy
{
ActivityAppManagerBinding
.
inflate
(
layoutInflater
)
...
...
@@ -80,7 +77,7 @@ class AppManagerActivity : BaseActivity<ActivityAppManagerBinding>() {
val
list
=
arrayListOf
<
AppBean
>()
packages
.
forEach
{
app
->
if
(
isLaunchApp
(
this
@App
Manager
Activity
,
app
))
{
if
(
isLaunchApp
(
this
@App
Process
Activity
,
app
))
{
val
appBean
=
AppBean
(
app
.
applicationInfo
.
loadIcon
(
pm
),
...
...
app/src/main/java/com/base/datarecovery/activity/app
manager/AppManager
AnimationActivity.kt
→
app/src/main/java/com/base/datarecovery/activity/app
process/AppProcess
AnimationActivity.kt
View file @
d66a36b3
package
com.base.datarecovery.activity.app
manager
package
com.base.datarecovery.activity.app
process
import
android.annotation.SuppressLint
import
android.content.Intent
...
...
@@ -14,7 +14,7 @@ import kotlinx.coroutines.delay
import
kotlinx.coroutines.launch
import
kotlin.random.Random
class
App
Manager
AnimationActivity
:
BaseActivity
<
ActivityAppManagerAnimationBinding
>()
{
class
App
Process
AnimationActivity
:
BaseActivity
<
ActivityAppManagerAnimationBinding
>()
{
override
val
binding
:
ActivityAppManagerAnimationBinding
by
lazy
{
ActivityAppManagerAnimationBinding
.
inflate
(
layoutInflater
)
...
...
@@ -26,7 +26,7 @@ class AppManagerAnimationActivity : BaseActivity<ActivityAppManagerAnimationBind
override
fun
initListener
()
{
onBackPressedDispatcher
.
addCallback
{
Toast
.
makeText
(
this
@App
Manager
AnimationActivity
,
"wait a moment"
,
Toast
.
LENGTH_SHORT
).
show
()
Toast
.
makeText
(
this
@App
Process
AnimationActivity
,
"wait a moment"
,
Toast
.
LENGTH_SHORT
).
show
()
}
}
...
...
@@ -43,8 +43,8 @@ class AppManagerAnimationActivity : BaseActivity<ActivityAppManagerAnimationBind
binding
.
tv
.
text
=
"Completed!"
delay
(
1000
)
AdmobMaxHelper
.
admobMaxShowInterstitialAd
(
this
@App
ManagerAnimationActivity
)
{
startActivity
(
Intent
(
this
@App
ManagerAnimationActivity
,
AppManager
Activity
::
class
.
java
))
AdmobMaxHelper
.
admobMaxShowInterstitialAd
(
this
@App
ProcessAnimationActivity
)
{
startActivity
(
Intent
(
this
@App
ProcessAnimationActivity
,
AppProcess
Activity
::
class
.
java
))
finish
()
}
...
...
app/src/main/java/com/base/datarecovery/activity/largefile/LargeFileActivity.kt
View file @
d66a36b3
...
...
@@ -65,11 +65,15 @@ class LargeFileActivity : BaseActivity<ActivityLargeFileBinding>() {
if
(
checkStorePermission
())
{
initData
()
}
else
{
showGerPermission
(
null
,
deny
=
{
finishToMain
()
},
allow
=
{
requestStorePermission
(
launcher
)
{
if
(
it
)
initData
()
else
finishToMain
()
}
})
showGerPermission
(
"This feature requires access to your storage to scan your large files and clean up large files."
+
"We will not transmit your data to any third-party service. Please grant permission so that we can provide you with better service."
,
deny
=
{
finishToMain
()
},
allow
=
{
requestStorePermission
(
launcher
)
{
if
(
it
)
initData
()
else
finishToMain
()
}
})
}
}
...
...
app/src/main/java/com/base/datarecovery/adapter/AppFunctionAdapter.kt
View file @
d66a36b3
...
...
@@ -7,7 +7,7 @@ import androidx.core.content.ContextCompat
import
androidx.recyclerview.widget.RecyclerView
import
androidx.recyclerview.widget.RecyclerView.ViewHolder
import
com.base.datarecovery.R
import
com.base.datarecovery.bean.ConstObject.APP_
MANAGER
import
com.base.datarecovery.bean.ConstObject.APP_
PROCESS
import
com.base.datarecovery.bean.ConstObject.JUNK_CLEANER
import
com.base.datarecovery.bean.ConstObject.LARGE_FILE
import
com.base.datarecovery.bean.ConstObject.PRIVACY_SPACE
...
...
@@ -18,7 +18,6 @@ import com.base.datarecovery.bean.ConstObject.REPEAT_PHOTOS
import
com.base.datarecovery.bean.ConstObject.SCREENSHOT_CLEANER
import
com.base.datarecovery.bean.ConstObject.WHATSAPP_CLEANER
import
com.base.datarecovery.databinding.ItemResultFun2Binding
import
com.base.datarecovery.databinding.ItemResultFunBinding
import
com.base.datarecovery.utils.AppPreferences
import
com.base.datarecovery.view.XmlEx.inflate
import
java.util.Collections
...
...
@@ -36,7 +35,7 @@ class AppFunctionAdapter(val click: (name: String) -> Unit) :
Fun
(
SCREENSHOT_CLEANER
,
R
.
mipmap
.
screenshots
),
Fun
(
WHATSAPP_CLEANER
,
R
.
mipmap
.
whatsapp
),
Fun
(
LARGE_FILE
,
R
.
mipmap
.
large
),
Fun
(
APP_
MANAGER
,
R
.
mipmap
.
app
),
Fun
(
APP_
PROCESS
,
R
.
mipmap
.
app
),
)
class
JJJ
(
view
:
View
)
:
ViewHolder
(
view
)
...
...
app/src/main/java/com/base/datarecovery/bean/ConstObject.kt
View file @
d66a36b3
...
...
@@ -13,7 +13,7 @@ object ConstObject {
const
val
ID_PRIVACY_SPACE
=
13003
const
val
ID_WHATSAPP_CLEANER
=
13006
const
val
ID_LARGE_FILE
=
13009
const
val
ID_APP_
MANAGER
=
13009
const
val
ID_APP_
PROCESS
=
13011
const
val
RECOVERY_PHOTOS
=
"Recovery Photos"
const
val
RECOVERY_VIDEOS
=
"Recovery Videos"
...
...
@@ -24,7 +24,7 @@ object ConstObject {
const
val
PRIVACY_SPACE
=
"Privacy Space"
const
val
WHATSAPP_CLEANER
=
"Whatsapp Cleaner"
const
val
LARGE_FILE
=
"Large File"
const
val
APP_
MANAGER
=
"App Manager
"
const
val
APP_
PROCESS
=
"App Process
"
const
val
SCAN_PHOTOS
=
1
const
val
SCAN_DOCUMENTS
=
2
...
...
app/src/main/java/com/base/datarecovery/fcm/NotificationUtil.kt
View file @
d66a36b3
...
...
@@ -16,23 +16,29 @@ import com.base.datarecovery.MyApplication
import
com.base.datarecovery.R
import
com.base.datarecovery.activity.SplashActivity
import
com.base.datarecovery.ads.AdDisplayUtils
import
com.base.datarecovery.bean.ConstObject.ID_APP_PROCESS
import
com.base.datarecovery.bean.ConstObject.ID_JUNK_CLEAN_PUSH
import
com.base.datarecovery.bean.ConstObject.ID_LARGE_FILE
import
com.base.datarecovery.bean.ConstObject.ID_PRIVACY_SPACE
import
com.base.datarecovery.bean.ConstObject.ID_RECOVERY_DOCUMENTS
import
com.base.datarecovery.bean.ConstObject.ID_RECOVERY_PHOTOS
import
com.base.datarecovery.bean.ConstObject.ID_RECOVERY_VIDEOS
import
com.base.datarecovery.bean.ConstObject.ID_SCREENSHOT_CLEAN
import
com.base.datarecovery.bean.ConstObject.ID_SIMILAR_IMAGE
import
com.base.datarecovery.bean.ConstObject.ID_WHATSAPP_CLEANER
import
com.base.datarecovery.utils.AppProcessStringManager
import
com.base.datarecovery.utils.AppPreferences
import
com.base.datarecovery.utils.CleanJunkStringResourceManager
import
com.base.datarecovery.utils.DocumentRecoveryStringManager
import
com.base.datarecovery.utils.DuplicatePhotoStringResourceManager
import
com.base.datarecovery.utils.EventUtils
import
com.base.datarecovery.utils.LargeFileStringManager
import
com.base.datarecovery.utils.LogEx
import
com.base.datarecovery.utils.PhotoRecoveryStringManager
import
com.base.datarecovery.utils.PrivacySpaceStringManager
import
com.base.datarecovery.utils.ScreenshotCleanupStringManager
import
com.base.datarecovery.utils.VideoRecoveryStringManager
import
com.base.datarecovery.utils.WhatsappStringManager
import
java.util.Random
/**
...
...
@@ -93,6 +99,24 @@ object NotificationUtil {
desc
=
PrivacySpaceStringManager
.
getNextPrivacySpaceCopy
()
btn
=
"Hide"
}
ID_WHATSAPP_CLEANER
->
{
icon
=
R
.
mipmap
.
whatsapp
desc
=
WhatsappStringManager
.
getNextPrivacySpaceCopy
()
btn
=
"Clean Up"
}
ID_LARGE_FILE
->
{
icon
=
R
.
mipmap
.
large
desc
=
LargeFileStringManager
.
getNextPrivacySpaceCopy
()
btn
=
"Clean Up"
}
ID_APP_PROCESS
->
{
icon
=
R
.
mipmap
.
app
desc
=
AppProcessStringManager
.
getNextPrivacySpaceCopy
()
btn
=
"Setting"
}
}
bigRemoteViews
.
setImageViewResource
(
R
.
id
.
iv_icon
,
icon
)
bigRemoteViews
.
setTextViewText
(
R
.
id
.
tv_desc
,
desc
)
...
...
@@ -213,7 +237,7 @@ object NotificationUtil {
AppPreferences
.
getInstance
().
put
(
key
,
s
)
}
fun
sendNotification
(
context
:
Context
,
where
:
String
=
""
)
{
fun
sendNotification
(
context
:
Context
,
where
:
String
=
""
)
{
val
currentNum
=
AppPreferences
.
getInstance
().
getInt
(
"showNotificationCount_"
+
AdDisplayUtils
.
getInstance
().
getCurrentDate
(),
0
)
val
maxNum
=
AppPreferences
.
getInstance
().
getString
(
"maxShowNotificationCount"
,
"156"
).
toIntOrNull
()
?:
156
...
...
app/src/main/java/com/base/datarecovery/fragment/HomeFragment.kt
View file @
d66a36b3
...
...
@@ -7,7 +7,7 @@ import android.content.Intent
import
android.view.View
import
android.view.animation.AccelerateDecelerateInterpolator
import
com.base.datarecovery.activity.SettingActivity
import
com.base.datarecovery.activity.app
manager.AppManager
AnimationActivity
import
com.base.datarecovery.activity.app
process.AppProcess
AnimationActivity
import
com.base.datarecovery.activity.junkclean.ScanJunkActivity
import
com.base.datarecovery.activity.largefile.LargeFileAnimationActivity
import
com.base.datarecovery.activity.photomanager.PhotoManagerAnimationActivity
...
...
@@ -21,7 +21,6 @@ import com.base.datarecovery.bean.ConstObject.SCAN_VIDEOS
import
com.base.datarecovery.bean.ConstObject.privacyPinPassword
import
com.base.datarecovery.databinding.FragmentHomeBinding
import
com.base.datarecovery.help.BaseFragment
import
com.base.datarecovery.help.KotlinExt.toFormatSize
class
HomeFragment
:
BaseFragment
<
FragmentHomeBinding
>()
{
...
...
@@ -71,7 +70,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
startActivity
(
Intent
(
requireContext
(),
WhatsAppCleanerAnimationActivity
::
class
.
java
))
}
binding
.
cardAppManager
.
setOnClickListener
{
startActivity
(
Intent
(
requireContext
(),
App
Manager
AnimationActivity
::
class
.
java
))
startActivity
(
Intent
(
requireContext
(),
App
Process
AnimationActivity
::
class
.
java
))
}
binding
.
cardLargeFile
.
setOnClickListener
{
startActivity
(
Intent
(
requireContext
(),
LargeFileAnimationActivity
::
class
.
java
))
...
...
app/src/main/java/com/base/datarecovery/utils/AppProcessStringManager.java
0 → 100644
View file @
d66a36b3
package
com
.
base
.
datarecovery
.
utils
;
import
java.util.ArrayList
;
import
java.util.List
;
public
class
AppProcessStringManager
{
private
static
final
List
<
String
>
appManagerCopies
=
new
ArrayList
<>();
private
static
int
currentCopyIndex
=
0
;
static
{
// 初始化并添加文案到列表
appManagerCopies
.
add
(
"Manage Your Apps: Keep your device running smoothly with our App Process Manager."
);
appManagerCopies
.
add
(
"App Process Alert: Time to clean up your device's background processes."
);
appManagerCopies
.
add
(
"Optimize Performance: Discover which apps are running in the background and manage them with ease."
);
appManagerCopies
.
add
(
"App Process Check: Ensure your device is running efficiently by managing your app processes."
);
}
public
static
String
getNextPrivacySpaceCopy
()
{
if
(
appManagerCopies
.
isEmpty
())
{
return
null
;
// 根据您的需要处理错误情况
}
String
copy
=
appManagerCopies
.
get
(
currentCopyIndex
);
currentCopyIndex
=
(
currentCopyIndex
+
1
)
%
appManagerCopies
.
size
();
return
copy
;
}
}
app/src/main/java/com/base/datarecovery/utils/LargeFileStringManager.java
0 → 100644
View file @
d66a36b3
package
com
.
base
.
datarecovery
.
utils
;
import
java.util.ArrayList
;
import
java.util.List
;
public
class
LargeFileStringManager
{
private
static
final
List
<
String
>
largeFileCopies
=
new
ArrayList
<>();
private
static
int
currentCopyIndex
=
0
;
static
{
// 初始化并添加文案到列表
largeFileCopies
.
add
(
"Need more space? We've found large files to clean."
);
largeFileCopies
.
add
(
"Optimize your storage. Large files detected."
);
largeFileCopies
.
add
(
"Streamline your device storage. Time to clear large files."
);
largeFileCopies
.
add
(
"Refresh your storage. Large files are ready to be cleared."
);
largeFileCopies
.
add
(
"Tidy up your device. Large files identified."
);
}
public
static
String
getNextPrivacySpaceCopy
()
{
if
(
largeFileCopies
.
isEmpty
())
{
return
null
;
// 根据您的需要处理错误情况
}
String
copy
=
largeFileCopies
.
get
(
currentCopyIndex
);
currentCopyIndex
=
(
currentCopyIndex
+
1
)
%
largeFileCopies
.
size
();
return
copy
;
}
}
app/src/main/java/com/base/datarecovery/utils/WhatsappStringManager.java
0 → 100644
View file @
d66a36b3
package
com
.
base
.
datarecovery
.
utils
;
import
java.util.ArrayList
;
import
java.util.List
;
public
class
WhatsappStringManager
{
private
static
final
List
<
String
>
whatsappCopies
=
new
ArrayList
<>();
private
static
int
currentCopyIndex
=
0
;
static
{
// 初始化并添加文案到列表
whatsappCopies
.
add
(
"Clean up your WhatsApp to free up some room. Tap here to start."
);
whatsappCopies
.
add
(
"Clean old files from your WhatsApp and keep things organized."
);
whatsappCopies
.
add
(
"Your WhatsApp storage could use some freshening up."
);
whatsappCopies
.
add
(
"Let us help you remove unnecessary files from WhatsApp."
);
whatsappCopies
.
add
(
"Archive old chats and clear out old media in WhatsApp with a few taps."
);
}
public
static
String
getNextPrivacySpaceCopy
()
{
if
(
whatsappCopies
.
isEmpty
())
{
return
null
;
// 根据您的需要处理错误情况
}
String
copy
=
whatsappCopies
.
get
(
currentCopyIndex
);
currentCopyIndex
=
(
currentCopyIndex
+
1
)
%
whatsappCopies
.
size
();
return
copy
;
}
}
app/src/main/res/layout/activity_app_manager.xml
View file @
d66a36b3
...
...
@@ -6,7 +6,7 @@
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:orientation=
"vertical"
tools:context=
".activity.app
manager.AppManager
Activity"
>
tools:context=
".activity.app
process.AppProcess
Activity"
>
<FrameLayout
android:layout_width=
"match_parent"
...
...
app/src/main/res/layout/activity_app_manager_animation.xml
View file @
d66a36b3
...
...
@@ -6,7 +6,7 @@
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:background=
"@color/white"
tools:context=
".activity.app
manager.AppManager
AnimationActivity"
>
tools:context=
".activity.app
process.AppProcess
AnimationActivity"
>
<com.base.datarecovery.view.XmlLottieAnimationView
...
...
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