Commit 071a871d authored by wanglei's avatar wanglei

[拆包]首页

parent 9de782f1
...@@ -144,8 +144,10 @@ dependencies { ...@@ -144,8 +144,10 @@ dependencies {
implementation("io.github.cymchad:BaseRecyclerViewAdapterHelper4:4.1.4") implementation("io.github.cymchad:BaseRecyclerViewAdapterHelper4:4.1.4")
implementation("com.github.angcyo.DslTablayout:TabLayout:3.7.1") implementation("com.github.angcyo.DslTablayout:TabLayout:3.7.1")
implementation("com.github.zhpanvip:viewpagerindicator:1.2.3") implementation("com.github.zhpanvip:viewpagerindicator:1.2.3")
implementation("nl.dionsegijn:konfetti-xml:2.0.5") // implementation("nl.dionsegijn:konfetti-xml:2.0.5")
implementation("com.scwang.wave:MultiWaveHeader:1.0.0-andx") implementation("com.scwang.wave:MultiWaveHeader:1.0.0-andx")
implementation("com.github.angcyo.DslTablayout:TabLayout:3.7.1")
implementation("com.github.angcyo.DslTablayout:ViewPager2Delegate:3.7.1")
//lottie //lottie
......
...@@ -5,6 +5,7 @@ import com.base.appzxhy.BuildConfig ...@@ -5,6 +5,7 @@ import com.base.appzxhy.BuildConfig
import com.base.appzxhy.SpConstObject.ifAgreePrivacy import com.base.appzxhy.SpConstObject.ifAgreePrivacy
import com.base.appzxhy.GlobalConfig import com.base.appzxhy.GlobalConfig
import com.base.appzxhy.bean.config.ConfigBean import com.base.appzxhy.bean.config.ConfigBean
import com.base.appzxhy.business.helper.InstallHelps.installEvent
import com.base.appzxhy.utils.AppPreferences import com.base.appzxhy.utils.AppPreferences
import com.base.appzxhy.utils.LogEx import com.base.appzxhy.utils.LogEx
import okhttp3.Call import okhttp3.Call
...@@ -96,7 +97,10 @@ object EventUtils { ...@@ -96,7 +97,10 @@ object EventUtils {
override fun onResponse(call: Call, response: Response) { override fun onResponse(call: Call, response: Response) {
if (response.code == 200 && response.isSuccessful) { if (response.code == 200 && response.isSuccessful) {
LogEx.logDebug(TAG, "onResponse 200") LogEx.logDebug(TAG, "onResponse 200 key=$key")
if (key == "install_referrer") {
installEvent = true
}
} }
} }
}) })
......
...@@ -2,10 +2,10 @@ package com.base.appzxhy.business.helper ...@@ -2,10 +2,10 @@ package com.base.appzxhy.business.helper
import com.android.installreferrer.api.InstallReferrerClient import com.android.installreferrer.api.InstallReferrerClient
import com.android.installreferrer.api.InstallReferrerStateListener import com.android.installreferrer.api.InstallReferrerStateListener
import com.android.installreferrer.api.ReferrerDetails
import com.base.appzxhy.BuildConfig import com.base.appzxhy.BuildConfig
import com.base.appzxhy.MyApplication import com.base.appzxhy.MyApplication
import com.base.appzxhy.utils.AppPreferences import com.base.appzxhy.utils.AppPreferences
import com.base.appzxhy.utils.LogEx
import org.json.JSONObject import org.json.JSONObject
/** /**
...@@ -15,45 +15,78 @@ object InstallHelps { ...@@ -15,45 +15,78 @@ object InstallHelps {
private val TAG = "InstallHelps" private val TAG = "InstallHelps"
var installReferrer = ""
get() {
return AppPreferences.getInstance().getString("install_referrer", field)
}
set(value) {
field = value
AppPreferences.getInstance().put("install_referrer", value, true)
}
//用户来源
var installSource = ""
get() {
return AppPreferences.getInstance().getString("install_source", field)
}
set(value) {
field = value
AppPreferences.getInstance().put("install_source", value, true)
}
//用户是否上报过
var installEvent = false
get() {
return AppPreferences.getInstance().getBoolean("installEvent", field)
}
set(value) {
field = value
AppPreferences.getInstance().put("installEvent", value, true)
}
fun eventInstallReferrer(response: ReferrerDetails) {
val obj = JSONObject()
obj.put("referrerUrl", response.installReferrer)
obj.put("referrerClickTime", response.referrerClickTimestampSeconds)
obj.put("appInstallTime", response.installBeginTimestampSeconds)
obj.put("instantExperienceLaunched", response.installReferrer.toString())
EventUtils.event("install_referrer", ext = obj)
}
fun init(requestCfg: () -> Unit) { fun init(requestCfg: () -> Unit) {
val installReferrer = AppPreferences.getInstance().getString("install_referrer", "") if (installEvent) {
if (installReferrer.isNotEmpty()) {
requestCfg.invoke() requestCfg.invoke()
return return
} }
val referrerClient = InstallReferrerClient.newBuilder(MyApplication.appContext).build() val referrerClient = InstallReferrerClient.newBuilder(MyApplication.appContext).build()
referrerClient.startConnection(object : InstallReferrerStateListener { referrerClient.startConnection(object : InstallReferrerStateListener {
//当与 Google Play 的 Install Referrer 服务连接完成时回调
override fun onInstallReferrerSetupFinished(responseCode: Int) { override fun onInstallReferrerSetupFinished(responseCode: Int) {
try { try {
when (responseCode) { when (responseCode) {
InstallReferrerClient.InstallReferrerResponse.OK -> { InstallReferrerClient.InstallReferrerResponse.OK -> {
val response = referrerClient.installReferrer val response = referrerClient.installReferrer
val installInfo = response.installReferrer
val obj = JSONObject() eventInstallReferrer(response)
obj.put("referrerUrl", response.installReferrer) installReferrer = response.installReferrer
obj.put("referrerClickTime", response.referrerClickTimestampSeconds)
obj.put("appInstallTime", response.installBeginTimestampSeconds) installSource = if (listOf(
obj.put("instantExperienceLaunched", installInfo.toString())
EventUtils.event("install_referrer", ext = obj)
LogEx.logDebug(TAG, "referrerUrl=${response.installReferrer}")
AppPreferences.getInstance().put("install_referrer", response.installReferrer)
if (listOf(
"gclid", "gclid",
"facebook", "facebook",
"instagram" "instagram"
).all { !installInfo.contains(it, true) } ).all { !response.installReferrer.contains(it, true) }
) { ) {
//自然用户 //自然用户
if (BuildConfig.DEBUG) { if (BuildConfig.DEBUG) {
AppPreferences.getInstance().put("install_source", "channel") "channel"
} else { } else {
AppPreferences.getInstance().put("install_source", "origin") "origin"
} }
} else { } else {
//渠道用户 "channel"
AppPreferences.getInstance().put("install_source", "channel")
} }
requestCfg() requestCfg()
} }
...@@ -70,6 +103,7 @@ object InstallHelps { ...@@ -70,6 +103,7 @@ object InstallHelps {
} }
//当与 Install Referrer 服务的连接意外断开时回调
override fun onInstallReferrerServiceDisconnected() { override fun onInstallReferrerServiceDisconnected() {
} }
}) })
......
...@@ -8,6 +8,7 @@ import com.base.appzxhy.SpConstObject.useTypeEvent ...@@ -8,6 +8,7 @@ import com.base.appzxhy.SpConstObject.useTypeEvent
import com.base.appzxhy.bean.config.AdConfigBean import com.base.appzxhy.bean.config.AdConfigBean
import com.base.appzxhy.bean.config.ConfigBean import com.base.appzxhy.bean.config.ConfigBean
import com.base.appzxhy.bean.config.PopupConfigBean import com.base.appzxhy.bean.config.PopupConfigBean
import com.base.appzxhy.business.helper.InstallHelps.installReferrer
import com.base.appzxhy.utils.AppPreferences import com.base.appzxhy.utils.AppPreferences
import com.base.appzxhy.utils.LogEx import com.base.appzxhy.utils.LogEx
import com.google.gson.Gson import com.google.gson.Gson
...@@ -55,7 +56,7 @@ object NewComUtils { ...@@ -55,7 +56,7 @@ object NewComUtils {
val appCode = packageName.substringAfter(PACKAGE_NAME_PREFIX).take(5).toLowerCase(Locale.getDefault()) val appCode = packageName.substringAfter(PACKAGE_NAME_PREFIX).take(5).toLowerCase(Locale.getDefault())
val bRefer = Base64.encodeToString( val bRefer = Base64.encodeToString(
AppPreferences.getInstance().getString("install_referrer", "").toByteArray(), installReferrer.toByteArray(),
Base64.DEFAULT Base64.DEFAULT
) )
......
...@@ -13,6 +13,8 @@ import com.base.appzxhy.bean.DeviceInfoBean.Companion.PROCESSOR_INFORMATION ...@@ -13,6 +13,8 @@ import com.base.appzxhy.bean.DeviceInfoBean.Companion.PROCESSOR_INFORMATION
import com.base.appzxhy.bean.DeviceInfoBean.Companion.RAM_INFORMATION import com.base.appzxhy.bean.DeviceInfoBean.Companion.RAM_INFORMATION
import com.base.appzxhy.bean.DeviceInfoBean.Companion.ROM_INFORMATION import com.base.appzxhy.bean.DeviceInfoBean.Companion.ROM_INFORMATION
import com.base.appzxhy.bean.DeviceInfoBean.Companion.WIFI_INFORMATION import com.base.appzxhy.bean.DeviceInfoBean.Companion.WIFI_INFORMATION
import com.base.appzxhy.business.ads.AdsMgr
import com.base.appzxhy.business.ads.AdsShowCallBack
import com.base.appzxhy.databinding.ActivityDeviceInfoBinding import com.base.appzxhy.databinding.ActivityDeviceInfoBinding
import com.base.appzxhy.databinding.ItemDeviceInformationBinding import com.base.appzxhy.databinding.ItemDeviceInformationBinding
import com.base.appzxhy.ui.adapter.CommonViewHolder import com.base.appzxhy.ui.adapter.CommonViewHolder
...@@ -45,9 +47,13 @@ class DeviceInfoActivity : BaseActivity<ActivityDeviceInfoBinding>(ActivityDevic ...@@ -45,9 +47,13 @@ class DeviceInfoActivity : BaseActivity<ActivityDeviceInfoBinding>(ActivityDevic
itemBinding.ivIcon.setImageResource(item.iconRes) itemBinding.ivIcon.setImageResource(item.iconRes)
itemBinding.tv.setText(item.titleRes) itemBinding.tv.setText(item.titleRes)
itemBinding.root.setOnClickListener { itemBinding.root.setOnClickListener {
AdsMgr.showInsert(this@DeviceInfoActivity, showCallBack = object : AdsShowCallBack() {
override fun next() {
DeviceInfoKey = item.key DeviceInfoKey = item.key
goToAc(DeviceInfoDetailActivity::class.java) goToAc(DeviceInfoDetailActivity::class.java)
overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left); overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left)
}
})
} }
} }
......
...@@ -9,11 +9,6 @@ import com.base.appzxhy.SpConstObject.scoreRate ...@@ -9,11 +9,6 @@ import com.base.appzxhy.SpConstObject.scoreRate
import androidx.core.net.toUri import androidx.core.net.toUri
import com.base.appzxhy.SpConstObject.isScoreRated import com.base.appzxhy.SpConstObject.isScoreRated
import com.base.appzxhy.databinding.DialogRate1Binding import com.base.appzxhy.databinding.DialogRate1Binding
import nl.dionsegijn.konfetti.core.Angle
import nl.dionsegijn.konfetti.core.Party
import nl.dionsegijn.konfetti.core.Position
import nl.dionsegijn.konfetti.core.emitter.Emitter
import java.util.concurrent.TimeUnit
class RateDialog( class RateDialog(
val activity: Activity val activity: Activity
......
...@@ -3,6 +3,8 @@ package com.base.appzxhy.ui.main ...@@ -3,6 +3,8 @@ package com.base.appzxhy.ui.main
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.ActivityManager import android.app.ActivityManager
import android.view.View import android.view.View
import android.widget.Toast
import androidx.appcompat.widget.TooltipCompat
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.content.ContextCompat.getSystemService import androidx.core.content.ContextCompat.getSystemService
import androidx.core.graphics.Insets import androidx.core.graphics.Insets
...@@ -40,6 +42,7 @@ import kotlinx.coroutines.isActive ...@@ -40,6 +42,7 @@ import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlin.random.Random import kotlin.random.Random
class HomeFragment : BaseFragment<FragmentHome1Binding>(FragmentHome1Binding::inflate) { class HomeFragment : BaseFragment<FragmentHome1Binding>(FragmentHome1Binding::inflate) {
private val adapter = FeatureItemAdapter() private val adapter = FeatureItemAdapter()
...@@ -216,6 +219,8 @@ class HomeFragment : BaseFragment<FragmentHome1Binding>(FragmentHome1Binding::in ...@@ -216,6 +219,8 @@ class HomeFragment : BaseFragment<FragmentHome1Binding>(FragmentHome1Binding::in
(requireActivity() as MainActivity).permissionStorageJump(JUNK_CLEAN) (requireActivity() as MainActivity).permissionStorageJump(JUNK_CLEAN)
} }
adapter.itemClick = { adapter.itemClick = {
......
package com.base.appzxhy.ui.main package com.base.appzxhy.ui.main
import android.os.Build
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.widget.TextView import android.widget.TextView
import androidx.appcompat.widget.TooltipCompat
import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
...@@ -33,7 +35,7 @@ import com.google.android.material.tabs.TabLayout ...@@ -33,7 +35,7 @@ import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayout.OnTabSelectedListener import com.google.android.material.tabs.TabLayout.OnTabSelectedListener
import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import androidx.core.graphics.toColorInt import com.base.appzxhy.utils.LogEx
class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::inflate) { class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::inflate) {
...@@ -123,19 +125,21 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl ...@@ -123,19 +125,21 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
val view = LayoutInflater.from(this).inflate(R.layout.item_home_tab, null) val view = LayoutInflater.from(this).inflate(R.layout.item_home_tab, null)
val tabBinding = ItemHomeTabBinding.bind(view) val tabBinding = ItemHomeTabBinding.bind(view)
tabBinding.ivIcon.setImageResource(homeTab.icon) tabBinding.ivIcon.setImageResource(homeTab.icon)
tabBinding.ivIcon.isSelected=false
tabBinding.tvTab.text = homeTab.tab tabBinding.tvTab.text = homeTab.tab
// tabBinding.tvTab.setTextColor(ContextCompat.getColor(this, R.color.color_tab_home)) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
tabBinding.v.tooltipText = homeTab.tab
tabBinding.v.setOnLongClickListener {
false
}
}
tab.customView = tabBinding.root tab.customView = tabBinding.root
tab.id = index tab.id = index
if (index == 1) {
tabBinding.vDian.visibility = View.VISIBLE
} else {
tabBinding.vDian.visibility = View.GONE
}
binding.tabLayout.addTab(tab) binding.tabLayout.addTab(tab)
} }
binding.tabLayout.addOnTabSelectedListener(object : OnTabSelectedListener { binding.tabLayout.addOnTabSelectedListener(object : OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab?) { override fun onTabSelected(tab: TabLayout.Tab?) {
LogEx.logDebug(TAG, "onTabSelected ${tab?.id}")
tab?.let { tab?.let {
if (binding.viewPager2.currentItem == tab.id) return if (binding.viewPager2.currentItem == tab.id) return
binding.viewPager2.setCurrentItem(tab.id, false) binding.viewPager2.setCurrentItem(tab.id, false)
...@@ -143,6 +147,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl ...@@ -143,6 +147,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
} }
override fun onTabUnselected(tab: TabLayout.Tab?) { override fun onTabUnselected(tab: TabLayout.Tab?) {
LogEx.logDebug(TAG, "onTabUnselected ${tab?.id}")
tab?.setUnselected() tab?.setUnselected()
} }
...@@ -155,13 +160,15 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl ...@@ -155,13 +160,15 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
fun TabLayout.Tab.setSelected() { fun TabLayout.Tab.setSelected() {
val textView = customView?.findViewById<TextView>(R.id.tv_tab) val textView = customView?.findViewById<TextView>(R.id.tv_tab)
textView?.setTextColor( textView?.setTextColor(
ContextCompat.getColor(this@MainActivity, R.color.colorPrimary) ContextCompat.getColor(this@MainActivity, R.color.white)
) )
} }
fun TabLayout.Tab.setUnselected() { fun TabLayout.Tab.setUnselected() {
val textView = customView?.findViewById<TextView>(R.id.tv_tab) val textView = customView?.findViewById<TextView>(R.id.tv_tab)
textView?.setTextColor("#A6A6A6".toColorInt()) textView?.setTextColor(
ContextCompat.getColor(this@MainActivity, R.color.black)
)
} }
private fun initViewPager2() { private fun initViewPager2() {
......
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#A3DBEB" />
<corners android:radius="@dimen/dp_38" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/colorPrimary" />
<corners android:radius="@dimen/dp_38" />
</shape>
\ No newline at end of file
...@@ -25,18 +25,27 @@ ...@@ -25,18 +25,27 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<com.google.android.material.tabs.TabLayout <com.google.android.material.tabs.TabLayout
android:id="@+id/tabLayout" android:id="@+id/tabLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="@dimen/dp_52"
android:layout_gravity="center" android:layout_gravity="center"
android:background="@color/white" android:layout_marginHorizontal="@dimen/dp_24"
app:tabIndicatorHeight="0dp" android:layout_marginTop="@dimen/dp_8"
app:tabMinWidth="100dp" android:layout_marginBottom="@dimen/dp_8"
android:background="@drawable/bg_a3dbeb_38"
android:visibility="visible"
app:tabIndicator="@drawable/indicator_main"
app:tabIndicatorColor="@color/colorPrimary"
app:tabIndicatorFullWidth="true"
app:tabIndicatorGravity="center"
app:tabIndicatorHeight="@dimen/dp_52"
app:tabMode="fixed" app:tabMode="fixed"
app:tabRippleColor="@android:color/transparent" app:tabRippleColor="@android:color/transparent"
tools:ignore="SpeakableTextPresentCheck" /> tools:ignore="SpeakableTextPresentCheck" />
<View <View
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="1dp" android:layout_height="1dp"
......
...@@ -149,6 +149,7 @@ ...@@ -149,6 +149,7 @@
android:background="@drawable/bg_stroke_ffffff_48" android:background="@drawable/bg_stroke_ffffff_48"
android:foreground="?attr/selectableItemBackground" android:foreground="?attr/selectableItemBackground"
android:gravity="center" android:gravity="center"
android:longClickable="true"
android:text="@string/clean" android:text="@string/clean"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="@dimen/sp_14" android:textSize="@dimen/sp_14"
......
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@color/white"
android:orientation="vertical"
tools:ignore="UseCompoundDrawables"> tools:ignore="UseCompoundDrawables">
<androidx.constraintlayout.widget.ConstraintLayout
<LinearLayout
android:id="@+id/ll"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" android:layout_gravity="center"
android:layout_marginTop="10dp"> android:orientation="horizontal"
tools:ignore="UselessParent">
<ImageView <androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_icon" android:id="@+id/iv_icon"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_below="@id/vDian" app:srcCompat="@drawable/tab_home_selector"
app:layout_constraintBottom_toBottomOf="parent" tools:ignore="ContentDescription" />
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="ContentDescription"
tools:src="@mipmap/ic_launcher" />
<View
android:id="@+id/vDian"
android:layout_width="6dp"
android:layout_height="6dp"
android:layout_gravity="end|top"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<TextView <TextView
android:id="@+id/tv_tab" android:id="@+id/tv_tab"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" android:layout_gravity="center_vertical"
android:layout_marginTop="3dp" android:layout_marginStart="@dimen/dp_5"
android:layout_marginBottom="8dp" android:includeFontPadding="false"
android:gravity="center" android:text="@string/home"
android:textColor="#838383" android:textColor="@color/black"
android:textSize="13sp" /> android:textSize="@dimen/sp_19" />
</LinearLayout>
<View
android:id="@+id/v"
android:layout_gravity="center"
android:layout_width="@dimen/dp_8"
android:layout_height="@dimen/dp_8"/>
</LinearLayout> </FrameLayout>
\ No newline at end of file \ No newline at end of file
...@@ -70,4 +70,5 @@ ...@@ -70,4 +70,5 @@
<dimen name="dp__50">-50dp</dimen> <dimen name="dp__50">-50dp</dimen>
<dimen name="dp__25">-25dp</dimen> <dimen name="dp__25">-25dp</dimen>
<dimen name="dp_56">56dp</dimen> <dimen name="dp_56">56dp</dimen>
<dimen name="dp_52">52dp</dimen>
</resources> </resources>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment