Commit f456d2b4 authored by 王雪伟's avatar 王雪伟

[提交人]:王雪伟

[提交简述] :修改测试登录方式
[实现方案] :
parent 9cd6b5c6
......@@ -153,7 +153,7 @@ dependencies {
implementation project(':moduleUc')
implementation project(':chat')
implementation project(':cms')
implementation "androidx.core:core-ktx:1.3.2"
implementation "androidx.core:core-ktx:1.6.0"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation "androidx.multidex:multidex:2.0.1"
......
......@@ -19,6 +19,16 @@ buildscript {
classpath "com.tencent.android.tpns:tpnsplugin:1.8.0"
classpath 'com.huawei.agconnect:agcp:1.6.0.300' // 华为推送 gradle 插件依赖
}
subprojects {
project.configurations.all {
resolutionStrategy.eachDependency { details ->
if (details.requested.group == 'androidx.core'
&& !details.requested.name.contains('androidx') ) {
details.useVersion "1.6.0"
}
}
}
}
}
allprojects {
......
......@@ -121,4 +121,6 @@ dependencies {
api("com.android.installreferrer:installreferrer:2.2")
//适配
api 'com.github.JessYanCoding:AndroidAutoSize:v1.2.1'
//播放器
api 'com.google.android.exoplayer:exoplayer:2.17.1'
}
......@@ -118,7 +118,7 @@ public class Constant {
public static class Param {
public static final String mPacketName = "com.zhangxin.starlight";
public static boolean isLocal = mPacketName.equals("com.zx.localnews");
public static String APPLS = "e9c509214aba55b8";
public static String APPLS = "dee4f3dbc8fcb897";
public static String androidId = "";
public static String carrier = "";
public static String h = "";
......
......@@ -53,10 +53,10 @@ public class NetConfig {
BASE_FEED_URL = "https://feedapi-sandbox.zhangxinhulian.com/";
break;
default:
BASE_URL = "http://feedapitest3.zhangxinhulian.com/";
BASE_WEB_URL = "http://feedapitest3.zhangxinhulian.com/";
BASE_NEW_URL = "http://feedapitest3.zhangxinhulian.com/";
BASE_FEED_URL = "http://feedapitest3.zhangxinhulian.com/";
BASE_URL = "http://feedapitest4.zhangxinhulian.com/";
BASE_WEB_URL = "http://feedapitest4.zhangxinhulian.com/";
BASE_NEW_URL = "http://feedapitest4.zhangxinhulian.com/";
BASE_FEED_URL = "http://feedapitest4.zhangxinhulian.com/";
break;
}
}
......@@ -218,34 +218,15 @@ public class NetConfig {
}
public static class Box {
public static final String HOME_BOX_LIST = "app/v1/game/box/boxList";//盲盒列表
public static final String HOME_BOX_INFO = "app/v1/game/box/boxInfo";//盲盒详情
public static final String HOME_BOX_MARQUEE = "app/v1/game/box/marquee";//跑马灯
public static final String HOME_BOX_GOODS = "app/v1/game/box/boxInfo/goods";//盲盒详情 - 奖品池
public static final String HOME_BOX_GET_ADDRESS = "app/v1/game/box/address";//获取地址
public static final String HOME_BOX_EDIT_ADDRESS = "app/v1/game/box/address";//新增或修改地址
public static final String HOME_BOX_DEPOT = "app/v1/game/box/depot";//用户仓库
public static final String HOME_BOX_LOTTERY = "app/v2/game/box/lottery";//单抽
public static final String HOME_BOX_FIVE_LOTTERY = "app/v2/game/box/lotteryFive";//5连抽奖
public static final String HOME_BOX_LOTTERY_TEST = "app/v1/game/box/lotteryTest";//盲盒抽取 - 试玩(单抽)
public static final String HOME_BOX_ORDER = "app/v1/game/box/order";//用户订单
public static final String HOME_BOX_RECOVER = "app/v1/game/box/recover";//分解物品
public static final String HOME_BOX_SHIPPING = "app/v1/game/box/getShipping";//用户仓库 - 获取运费
public static final String HOME_BOX_CREATE_SHAOPPING_ORDER = "app/v1/game/box/createShippingOrder";//创建发货订单
public static final String HOME_BOX_NEW_PEOPLE = "app/v1/game/box/newBox";//新人盲盒
public static final String HOME_BOX_VERIFICATION = "app/v1/game/box/rechargeVerification";//用户是否可以充值验证
public static final String HOME_BOX_GOODS_PICK_UP = "app/v1/game/box/goodsPickUp";//用户仓库 - 虚拟商品提货
public static final String HOME_BOX_CANCE_CHOOSE = "app/v1/game/box/chose";//取消新人宝箱
public static final String HOME_BOX_TAB = "app/v1/game/box/tab";//tab列表
public static final String HOME_BOX_APP_INFO = "app/v1/app_info";//配置信息
}
public static class StarLight {
public static final String HOME_STAR_LIGHT_LIST = "app/v1/hk/game/star/pageList";//首页列表
public static final String HOME_STAR_LIGHT_USER_INFO = "app/v1/game/star/getUserInfo";//访问他人主页
public static final String HOME_STAR_LIGHT_USER_LIKE = "app/v1/game/star/like";//喜欢/取消喜欢
public static final String HOME_STAR_LIGHT_USER_INFO = "app/v1/hk/game/star/getUserInfo";//访问他人主页
public static final String HOME_STAR_LIGHT_USER_LIKE = "app/v1/hk/game/star/like";//喜欢/取消喜欢
public static final String HOME_STAR_LIGHT_USER_FOLLOW = "app/v1/game/star/follow";//关注用户/取消关注
public static final String HOME_STAR_LIGHT_ADD_USERINFO = "app/v1/game/star/addUserInfo";//注册 - 填写资料
public static final String HOME_STAR_LIGHT_UPLOAD = "app/v1/game/star/upload";//上传图片
......@@ -303,4 +284,5 @@ public class NetConfig {
}
}
......@@ -40,6 +40,7 @@ class HomeListEntity {
var isUpload = false
var videoPrice: String? = ""
var location: LocationHomeEntity? = null
var matchingDegree: String? = ""//匹配度
}
class LocationHomeEntity {
......
......@@ -28,7 +28,7 @@ class GoogleLoginUtil {
private val TAG = "GoogleLoginUtil"
private val RC_SIGN_IN = 9009
private val googleClientId =
"535211515800-fcblld827b8ojq7dccuohmeo199205ce.apps.googleusercontent.com"
"455706215296-ap310uge09hg2opald90v68bh2brp6vm.apps.googleusercontent.com"
private var mActivity: Activity;
private var mGoogleSignInClient: GoogleSignInClient? = null;
......
This diff is collapsed.
package com.zxhl.cms.widget;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
/**
* @author (wangXuewei)
* @datetime 2022-04-16 15:37 GMT+8
* @detail :
*/
public class HorizontalAutoBrLayout extends ViewGroup {
/**
* 可使用的最大宽度
*/
private int maxWidth;
public HorizontalAutoBrLayout(Context context) {
super(context);
}
public HorizontalAutoBrLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public HorizontalAutoBrLayout(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
maxWidth = MeasureSpec.getSize(widthMeasureSpec);
/**
* 容器的高度,也就是本布局的高度。初始化赋值为0.
*/
int containorHeight = 0;
/**
* 获取该布局内子组件的个数
*/
int count = getChildCount();
for (int i = 0; i < count; i++) {
View view = getChildAt(i);
/**
* measure(int widthMeasureSpec,int
* heightMeasureSpec)用于设置子组件显示模式.有三个值:
* MeasureSpec.AT_MOST 该组件可以设置自己的大小,但是最大不能超过其父组件的限定
* MeasureSpec.EXACTLY 无论该组件设置大小是多少,都只能按照父组件限制的大小来显示
* MeasureSpec.UNSPECIFIED 该组件不受父组件的限制,可以设置任意大小
*/
view.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
// 把每个子组件的高度相加就是该组件要显示的高度。
containorHeight += view.getMeasuredHeight();
}
/**
* onMeasure方法的关键代码,该句设置父容器的大小。
*/
setMeasuredDimension(maxWidth, containorHeight);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
// 获取子组件数
int childCount = getChildCount();
// 子组件行数,初始化赋值为1
int row = 1;
// 子组件的左边“坐标”
int left = 0;
// 子组件的右边“坐标”
int right = 0;
// 子组件的顶部“坐标”
int top = 0;
// 子组件的底部“坐标”
int bottom = 0;
// 在父组件中设置的padding属性的值,该值显然也会影响到子组件在屏幕的显示位置
int p = getPaddingLeft();
for (int i = 0; i < childCount; i++) {
View view = getChildAt(i);
// 测量子组件的宽
int width = view.getMeasuredWidth();
// 测量子组件的高
int height = view.getMeasuredHeight();
left = p + right;
right = left + width;
top = p * row + height * (row - 1);
bottom = top + height;
if (right > maxWidth) {
row++;
//每次换行后要将子组件左边“坐标”与右边“坐标”重新初始化
left = 0;
right = 0;
left = p + right;
right = left + width;
top = p * row + height * (row - 1);
bottom = top + height;
}
// 最后按照计算出来的“坐标”将子组件放在父容器内
view.layout(left, top, right, bottom);
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="FlowLayout">
<attr name="flow" format="boolean"/>
<attr name="childSpacing" format="enum|dimension">
<enum name="auto" value="-65536"/>
</attr>
<attr name="childSpacingForLastRow" format="enum|dimension">
<enum name="auto" value="-65536"/>
<enum name="align" value="-65537"/>
</attr>
<attr name="rowSpacing" format="enum|dimension">
<enum name="auto" value="-65536"/>
</attr>
<attr name="rtl" format="boolean"/>
</declare-styleable>
</resources>
\ No newline at end of file
......@@ -8,6 +8,7 @@ import android.text.TextPaint
import android.text.method.LinkMovementMethod
import android.text.style.ClickableSpan
import android.text.style.ForegroundColorSpan
import android.util.Log
import android.view.View
import com.zxhl.cms.AppContext
import com.zxhl.cms.common.Constant
......@@ -49,8 +50,6 @@ class LoginBeforeActivity : BaseActivity() {
id_tv_google_login?.setOnClickListener {
imLogin()
return@setOnClickListener
EventUtils.onEvent("googleLoginClick")
mLoading?.setLoading(getString(R.string.wait_ing))
mLoading?.show()
......@@ -63,6 +62,7 @@ class LoginBeforeActivity : BaseActivity() {
}
override fun onLoginError(errorMsg: String) {
// Log.d("LogonLoginError", errorMsg)
EventUtils.onEvent("GoogleLoginError", errorMsg)
runOnUiThread {
mLoading?.setResult(false, "login error", 1000)
......@@ -72,8 +72,6 @@ class LoginBeforeActivity : BaseActivity() {
}
id_tv_facebook_login?.setOnClickListener {
imLogin()
return@setOnClickListener
EventUtils.onEvent("facebookLoginClick")
mLoading?.setLoading(getString(R.string.wait_ing))
mLoading?.show()
......@@ -86,11 +84,11 @@ class LoginBeforeActivity : BaseActivity() {
}
override fun onLoginError(errorMsg: String) {
if (errorMsg == "Success_未获取到登录信息"){
if (errorMsg == "Success_未获取到登录信息") {
runOnUiThread {
mLoading?.setResult(false, "try again", 1000)
}
}else{
} else {
runOnUiThread {
mLoading?.setResult(false, "login error", 1000)
}
......@@ -103,7 +101,7 @@ class LoginBeforeActivity : BaseActivity() {
initBottomDesc()
}
private fun initBottomDesc(){
private fun initBottomDesc() {
val spannableString =
SpannableString("By signing up, you confirm that you agree to our Terms of service and have read and understand our Privacy policy. ")
......@@ -112,6 +110,7 @@ class LoginBeforeActivity : BaseActivity() {
override fun onClick(widget: View) {
JumpUtils.webJump("Terms Of Service", NetConfig.H5.WEB_URL_USER)
}
override fun updateDrawState(ds: TextPaint) {
ds.isUnderlineText = false;
ds.color = Color.parseColor("#FF772E")
......@@ -175,32 +174,32 @@ class LoginBeforeActivity : BaseActivity() {
googleLogin?.onActivityResult(requestCode, resultCode, data)
}
private fun imLogin(){
// UserDataUtils.updateUserInfo(AdCallback { _, _ ->
// JumpUtils.activityJump(
// RounterBus.getRounter(RounterApi::class.java).getIntentActivityMain()
// )
// finish()
// })
ApiClient.userInfoAPi.deviceLogin().compose(RxSchedulers.observableIO2Main())
.subscribe(object : BaseObserver<UserInfo>() {
override fun onSuccess(result: UserInfo) {
val token = result.token
SettingPreference.saveToken(token)
UserDataUtils.updateUserInfo(AdCallback { _, _ ->
JumpUtils.activityJump(
RounterBus.getRounter(RounterApi::class.java).getIntentActivityMain()
)
finish()
})
}
override fun onFailure(e: Throwable, code: String, errorMsg: String) {
SettingPreference.saveToken("")
SettingPreference.saveUserInfo(null)
}
})
private fun imLogin() {
UserDataUtils.updateUserInfo(AdCallback { _, _ ->
JumpUtils.activityJump(
RounterBus.getRounter(RounterApi::class.java).getIntentActivityMain()
)
finish()
})
// ApiClient.userInfoAPi.deviceLogin().compose(RxSchedulers.observableIO2Main())
// .subscribe(object : BaseObserver<UserInfo>() {
// override fun onSuccess(result: UserInfo) {
// val token = result.token
// SettingPreference.saveToken(token)
// UserDataUtils.updateUserInfo(AdCallback { _, _ ->
// JumpUtils.activityJump(
// RounterBus.getRounter(RounterApi::class.java).getIntentActivityMain()
// )
// finish()
// })
// }
//
// override fun onFailure(e: Throwable, code: String, errorMsg: String) {
// SettingPreference.saveToken("")
// SettingPreference.saveUserInfo(null)
//
// }
// })
}
}
\ No newline at end of file
package com.zxhl.main.page.activity
import android.graphics.Color
import android.net.Uri
import android.view.View
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
import android.widget.RelativeLayout
import android.widget.TextView
import androidx.recyclerview.widget.LinearLayoutManager
import com.bumptech.glide.Glide
import com.google.android.exoplayer2.ExoPlayer
import com.google.android.exoplayer2.MediaItem
import com.zxhl.cms.AppContext
import com.zxhl.cms.common.base.BaseActivity
import com.zxhl.cms.net.model.box.HomeListEntity
......@@ -19,6 +20,7 @@ import com.zxhl.main.page.contract.UserDetailsContract
import com.zxhl.main.page.presenter.UserDetailsPresenter
import kotlinx.android.synthetic.main.activity_layout_user_details_hw.*
/**
* @author (wangXuewei)
* @datetime 2022-04-15 10:48 GMT+8
......@@ -54,6 +56,7 @@ class UserDetailsActivity : BaseActivity(), UserDetailsContract.View,
id_img_btn_report.setOnClickListener(this)
id_img_user_details_sms.setOnClickListener(this)
id_ll_user_details_call_video.setOnClickListener(this)
id_ll_user_details_like_btn.setOnClickListener(this)
mPresenter?.getUserDetails(userId, detailfree)
}
......@@ -74,7 +77,11 @@ class UserDetailsActivity : BaseActivity(), UserDetailsContract.View,
VipPayDialog.showVipPayDialog(this)
}
id_ll_user_details_like_btn -> {
showToast("like")
if (!isLike) {
mPresenter?.likeUser(userId, detailfree)
} else {
showToast("已经点赞成功啦")
}
}
}
}
......@@ -84,11 +91,40 @@ class UserDetailsActivity : BaseActivity(), UserDetailsContract.View,
return R.layout.activity_layout_user_details_hw
}
private var userDetails: HomeListEntity? = null;
override fun setUserDetails(result: HomeListEntity) {
userDetails = result;
//Name
id_tv_user_details_name.text = result.nickname
//国旗
Glide.with(this).load(result.nationalFlag ?: "").into(id_img_national_flag)
//年龄
id_tv_user_details_age.text = result.age
//是否在线
if (result.onlineStatus.equals("0")) {
id_tv_user_details_online.text = "Offline"
} else {
id_tv_user_details_online.text = "Online"
}
//匹配度
id_tv_user_details_percentage.text = result.matchingDegree ?: "0%"
//自我介绍
id_tv_user_details_introduction.text = result.description ?: ""
//喜欢的数量
id_tv_user_details_like_num.text = result.likes ?: "0"
//是否点击了喜欢
isLike = result.hasLikes.equals("1")
if (isLike) {
id_img_user_details_like.setImageResource(R.drawable.icon_like_click_user2)
id_tv_user_details_like_num.setTextColor(Color.parseColor("#E838AC"))
} else {
id_img_user_details_like.setImageResource(R.drawable.icon_like_default_user2)
id_tv_user_details_like_num.setTextColor(Color.parseColor("#666666"))
}
//tag
setPersonalTagUI(listOf("aaaa","cc","bbbbbb","d","eeeee","aaafaa","aaaaag",))
setPersonalTagUI(result.tags?.split('|'))
//视频价格
id_tv_user_details_call_price.text = "${result.videoPrice}/min"
mPhotoAdapter?.clear()
mPhotoAdapter?.appendToList(result.picturesList)
......@@ -99,8 +135,15 @@ class UserDetailsActivity : BaseActivity(), UserDetailsContract.View,
}
}
override fun followCallBack(boolean: Boolean) {
private var isLike = false;
override fun likeCallBack(boolean: Boolean) {
if (isLike) {
return
}
isLike = boolean
if (boolean) {
val i = id_tv_user_details_like_num.text.toString().toInt() + 1
id_tv_user_details_like_num.text = i.toString()
id_img_user_details_like.setImageResource(R.drawable.icon_like_click_user2)
id_tv_user_details_like_num.setTextColor(Color.parseColor("#E838AC"))
} else {
......@@ -112,13 +155,38 @@ class UserDetailsActivity : BaseActivity(), UserDetailsContract.View,
override fun onItemClick(view: View?, position: Int, data: String?) {
mPhotoAdapter?.setSelectPhoto(position)
id_img_user_details_photo.setLoadImageUrl(data, true)
//Video
if (position == 1) {
//http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4
id_sfv_user_detail_video.visibility = View.VISIBLE
id_img_user_details_photo.visibility = View.INVISIBLE
playUserVideo("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")
} else {
id_sfv_user_detail_video.visibility = View.INVISIBLE
id_img_user_details_photo.visibility = View.VISIBLE
}
}
var player: ExoPlayer? = null
private fun playUserVideo(url: String) {
if (player == null) {
player = ExoPlayer.Builder(this).build()
}
id_sfv_user_detail_video.player = player
// Build the media item.
val mediaItem: MediaItem = MediaItem.fromUri(Uri.parse(url))
player?.setMediaItem(mediaItem)
player?.prepare()
player?.play()
}
//设置标签UI
private fun setPersonalTagUI(tagList: List<String>) {
private fun setPersonalTagUI(tagList: List<String>?) {
if (tagList.isNullOrEmpty()) {
return
}
id_fl_tag_list_view.removeAllViews()
val lps = RelativeLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT)
lps.setMargins(Utils.dip2px(5), Utils.dip2px(5), Utils.dip2px(5), Utils.dip2px(5))
for (tagStr in tagList) {
var tagView = TextView(this)
tagView.text = tagStr
......@@ -126,7 +194,6 @@ class UserDetailsActivity : BaseActivity(), UserDetailsContract.View,
tagView.setTextColor(Color.parseColor("#824FFF"))
tagView.background = resources.getDrawable(R.drawable.shape_eae1ff_r3)
tagView.setPadding(Utils.dip2px(5), Utils.dip2px(2), Utils.dip2px(5), Utils.dip2px(2))
tagView.layoutParams = lps
id_fl_tag_list_view.addView(tagView)
}
}
......
......@@ -7,11 +7,11 @@ import com.zxhl.cms.net.model.chat.DistanceEntity
class UserDetailsContract {
interface View {
fun setUserDetails(result: HomeListEntity)
fun followCallBack(boolean: Boolean)
fun likeCallBack(boolean: Boolean)
}
interface Presenter {
fun getUserDetails(id: String?,free: String?)
fun followUser(uid: String?)
fun likeUser(uid: String?,free: String?)
}
}
\ No newline at end of file
......@@ -31,11 +31,11 @@ class UserDetailsPresenter : UserDetailsContract.Presenter {
})
}
override fun followUser(uid: String?) {
ApiClient.homeApi.followUser(uid).compose(RxSchedulers.observableIO2Main())
override fun likeUser(uid: String?, free: String?) {
ApiClient.homeApi.likeUser(uid,free).compose(RxSchedulers.observableIO2Main())
.subscribe(object : BaseObserver<Any>() {
override fun onSuccess(result: Any?) {
mView.followCallBack(true)
mView.likeCallBack(true)
}
override fun onFailure(e: Throwable?, code: String?, errorMsg: String?) {
......
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white">
......@@ -13,11 +14,14 @@
android:layout_height="match_parent"
android:paddingBottom="70dp">
<SurfaceView
<!-- <com.google.android.exoplayer2.ui.StyledPlayerView-->
<!-- android:id="@+id/id_sfv_user_detail_video"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="360dp" />-->
<com.google.android.exoplayer2.ui.PlayerView
android:id="@+id/id_sfv_user_detail_video"
android:layout_width="match_parent"
android:layout_height="360dp"
android:visibility="gone" />
android:layout_height="360dp" />
<com.zxhl.cms.widget.RecycleImageView
android:id="@+id/id_img_user_details_photo"
......@@ -72,7 +76,7 @@
android:gravity="center"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:text="27"
android:text=""
android:textColor="@color/white"
android:textSize="11sp" />
......@@ -85,7 +89,7 @@
android:gravity="center"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:text="Online"
android:text=""
android:textColor="@color/white"
android:textSize="11sp" />
......@@ -98,7 +102,7 @@
android:gravity="center"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:text="90%"
android:text="0%"
android:textColor="@color/white"
android:textSize="11sp" />
......@@ -127,7 +131,7 @@
android:layout_marginLeft="10dp"
android:layout_marginTop="5dp"
android:layout_marginRight="10dp"
android:text="Naughty most od the times"
android:text=""
android:textColor="@color/color_666666"
android:textSize="13sp" />
......@@ -145,15 +149,16 @@
android:textColor="@color/color_333333"
android:textSize="14sp" />
<com.zxhl.cms.widget.HorizontalAutoBrLayout
<com.zxhl.cms.widget.FlowLayout
android:id="@+id/id_fl_tag_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/id_tv_personal_tag"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp">
android:layout_margin="5dp"
app:childSpacing="5dp"
app:childSpacingForLastRow="align"
app:rowSpacing="5dp" />
</com.zxhl.cms.widget.HorizontalAutoBrLayout>
<LinearLayout
android:id="@+id/id_ll_user_details_like_btn"
......
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