diff --git a/app/src/main/java/com/pkusz/min_vpn_client/activity/register/RegisterActivity.java b/app/src/main/java/com/pkusz/min_vpn_client/activity/register/RegisterActivity.java index 83ebaf3..d917d6a 100644 --- a/app/src/main/java/com/pkusz/min_vpn_client/activity/register/RegisterActivity.java +++ b/app/src/main/java/com/pkusz/min_vpn_client/activity/register/RegisterActivity.java @@ -7,5 +7,233 @@ package com.pkusz.min_vpn_client.activity.register; * @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 */ -public class RegisterActivity { +import android.os.Build; +import android.os.Bundle; +import android.view.View; +import android.widget.ImageView; +import android.widget.Toast; + +import com.pkusz.min_vpn_client.R; +import com.pkusz.min_vpn_client.activity.base.MINVpnBaseActivity; +import com.pkusz.min_vpn_client.activity.login.LoginActivity; +import com.pkusz.min_vpn_client.activity.setting.SettingActivity; +import com.pkusz.min_vpn_client.utils.AccountValidatorRegexUtil; +import com.pkusz.min_vpn_client.utils.Base64Util; +import com.pkusz.min_vpn_client.utils.KeyManager; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Objects; + +import br.com.simplepass.loadingbutton.customViews.CircularProgressButton; +import cn.qjm253.min_vpn.extensions.ActivityExtensionsKt; +import cn.qjm253.quick_android_base.GlideApp; +import cn.qjm253.quick_android_base.extensions.ContextExtensionKt; +import cn.qjm253.quick_android_base.extensions.ViewExtensionKt; +import cn.qjm253.quick_android_base.util.DisplayUtils; +import cn.qjm253.quick_android_custom_view.other.ClearAbleEditText; +import cn.qjm253.quick_android_easy_bar.EasyBar; +import cn.qjm253.quick_android_easy_bar.EasyBarExtensionsKt; +import kotlin.Unit; +import kotlin.jvm.functions.Function1; + +public class RegisterActivity extends MINVpnBaseActivity + implements RegisterActivityContract.View{ + // 界面变量区 + private EasyBar easyBar; + private ImageView imgLogo; + private CircularProgressButton btnRegister; + private ClearAbleEditText etPhoneNumber; + private ClearAbleEditText etUsername; + private ClearAbleEditText etPassword; + private ClearAbleEditText etEmail; + private ClearAbleEditText etInviteCode; + private ClearAbleEditText etRePassword; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_register); + // 初始化各个组件 + easyBar=findViewById(R.id.easyBar); + imgLogo=findViewById(R.id.imgLogo); + btnRegister=findViewById(R.id.btnRegister); + etPhoneNumber=findViewById(R.id.etPhoneNumber); + etUsername=findViewById(R.id.etUsername); + etPassword=findViewById(R.id.etPassword); + etEmail=findViewById(R.id.etEmail); + etInviteCode=findViewById(R.id.etInviteCode); + etRePassword=findViewById(R.id.etRePassword); + + initView(); + } + + private void initView(){ + // 初始化bar + EasyBarExtensionsKt.init(easyBar, EasyBar.Mode.ICON, "", + (Function1) view -> { + onBackPressed(); + return null; + }, + (Function1) view -> { + return null; + }, + R.drawable.scan, R.drawable.setting, "", "", R.string.register, + true, R.color.white); + + GlideApp.with(this) + .load(R.drawable.logo) + .circleCrop() + .into(imgLogo); + + btnRegister.setBackgroundResource(R.drawable.button_shape_default); + btnRegister.setOnClickListener(v->{ + ContextExtensionKt.hideSoftKeyboard(this,btnRegister); + btnRegister.startMorphAnimation(); + + String phone= Objects.requireNonNull(etPhoneNumber.getText()).toString().trim(); + if(phone.length()==0){ + showWarning("手机号不能为空"); + btnRegister.revertAnimation(); + return; + } + if(!AccountValidatorRegexUtil.INSTANCE.isMobile(phone)){ + showWarning("请输入有效的手机号"); + btnRegister.revertAnimation(); + return; + } + + String email = Objects.requireNonNull(etEmail.getText()).toString().trim(); + if(email.length()==0){ + showWarning("电子邮箱不能为空"); + btnRegister.revertAnimation(); + return; + } + if(!AccountValidatorRegexUtil.INSTANCE.isEmail(email)){ + showWarning("请输入有效的电子邮箱"); + btnRegister.revertAnimation(); + return; + } + + String username= Objects.requireNonNull(etUsername.getText()).toString().trim(); + String password= Objects.requireNonNull(etPassword.getText()).toString().trim(); + String rePassword= Objects.requireNonNull(etPassword.getText()).toString().trim(); + String inviteCode= Objects.requireNonNull(etInviteCode.getText()).toString().trim(); + if(username.length()==0 || password.length()==0 || rePassword.length()==0 || inviteCode.length()==0){ + showWarning("请将信息填写完整"); + btnRegister.revertAnimation(); + return; + } + if(!AccountValidatorRegexUtil.INSTANCE.isUsername(username)){ + showWarning("请输入有效的用户名,用户名长度需要大于0小于20"); + btnRegister.revertAnimation(); + return; + } + if(!AccountValidatorRegexUtil.INSTANCE.isPassword(password)){ + showWarning("请输入有效的密码,密码为8-16位,必须包含大小写字母和特殊符号"); + btnRegister.revertAnimation(); + return; + } + if(!AccountValidatorRegexUtil.INSTANCE.isPassword(rePassword)){ + showWarning("请输入有效的密码,密码为8-16位,必须包含大小写字母和特殊符号"); + btnRegister.revertAnimation(); + return; + } + if(!AccountValidatorRegexUtil.INSTANCE.isInviteCode(inviteCode)){ + showWarning("请输入有效的邀请码,邀请码长度需要大于0小于20"); + btnRegister.revertAnimation(); + return; + } + if(!password.equals(rePassword)){ + showWarning("两次输入的密码不一致"); + btnRegister.revertAnimation(); + return; + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + username= Base64Util.Base64PlusEncode(username); + }else{ + showWarning("username base64 error"); + return; + } + + System.out.println("username: "+username); + + // todo: 这里存疑 + byte[] certification= KeyManager.INSTANCE.initKeyChain("/"+username) + .getCertification("/"+username).getSignature(); + + // todo: 发送注册信息 + + }); + + // 监听键盘是否弹起 + ActivityExtensionsKt.listenKeyboardVisible(this,(isOpen)->{ + if(isOpen){ + ViewExtensionKt.animer(imgLogo, + ViewExtensionKt.scaleXAnimation(imgLogo,1f, 0.5f), + ViewExtensionKt.scaleYAnimation(imgLogo,1f, 0.5f), + ViewExtensionKt.transYAnimation(imgLogo, + 0f, -DisplayUtils.dp2px(this, 40)), + ViewExtensionKt.transYAnimation(etUsername, + 0f, -DisplayUtils.dp2px(this, 90)), + ViewExtensionKt.transYAnimation(etPassword, + 0f, -DisplayUtils.dp2px(this, 90)), + ViewExtensionKt.transYAnimation(etRePassword, + 0f, -DisplayUtils.dp2px(this, 90)), + ViewExtensionKt.transYAnimation(etPhoneNumber, + 0f, -DisplayUtils.dp2px(this, 90)), + ViewExtensionKt.transYAnimation(etInviteCode, + 0f, -DisplayUtils.dp2px(this, 90)), + ViewExtensionKt.transYAnimation(etEmail, + 0f, -DisplayUtils.dp2px(this, 90)), + ViewExtensionKt.transYAnimation(btnRegister, + 0f, -DisplayUtils.dp2px(this, 90)) + ); + }else{ + ViewExtensionKt.animer(imgLogo, + ViewExtensionKt.scaleXAnimation(imgLogo, 0.5f,1f), + ViewExtensionKt.scaleYAnimation(imgLogo, 0.5f,1f), + ViewExtensionKt.transYAnimation(imgLogo, + -DisplayUtils.dp2px(this, 40),0f), + ViewExtensionKt.transYAnimation(etUsername, + -DisplayUtils.dp2px(this, 90),0f), + ViewExtensionKt.transYAnimation(etPassword, + -DisplayUtils.dp2px(this, 90),0f), + ViewExtensionKt.transYAnimation(etRePassword, + -DisplayUtils.dp2px(this, 90),0f), + ViewExtensionKt.transYAnimation(etPhoneNumber, + -DisplayUtils.dp2px(this, 90),0f), + ViewExtensionKt.transYAnimation(etInviteCode, + -DisplayUtils.dp2px(this, 90),0f), + ViewExtensionKt.transYAnimation(etEmail, + -DisplayUtils.dp2px(this, 90),0f), + ViewExtensionKt.transYAnimation(btnRegister, + -DisplayUtils.dp2px(this, 90),0f) + ); + } + return null; + }); + + } + + @NotNull + @Override + public RegisterActivityPresenter onCreatePresenter() { + return new RegisterActivityPresenter(this); + } + + @Override + public void registerSuccess() { + Toast.makeText(getApplicationContext(),"注册成功",Toast.LENGTH_SHORT).show(); + ContextExtensionKt.jumpTo(this, LoginActivity.class); + btnRegister.revertAnimation(); + } + + @Override + public void registerFailed(String errMsg) { + toast("注册失败: "+errMsg); + btnRegister.revertAnimation(); + } } diff --git a/app/src/main/java/com/pkusz/min_vpn_client/activity/register/RegisterActivityModel.java b/app/src/main/java/com/pkusz/min_vpn_client/activity/register/RegisterActivityModel.java index 394ce5e..929b26c 100644 --- a/app/src/main/java/com/pkusz/min_vpn_client/activity/register/RegisterActivityModel.java +++ b/app/src/main/java/com/pkusz/min_vpn_client/activity/register/RegisterActivityModel.java @@ -19,16 +19,16 @@ public class RegisterActivityModel implements RegisterActivityContract.Model{ @Override public void register(RegisterRequest registerRequest) { - + mPresenter.registerSuccess(); } @Override public void registerWithSafetyInfo(RegisterRequest registerRequest, Context context) { - + mPresenter.registerSuccess(); } @Override public void uploadRegisterFacePicture(String username, RegisterRequest registerRequest, Context context) { - + // 废弃接口。 } } diff --git a/app/src/main/java/com/pkusz/min_vpn_client/activity/register/RegisterActivityPresenter.java b/app/src/main/java/com/pkusz/min_vpn_client/activity/register/RegisterActivityPresenter.java index 244b354..acce09b 100644 --- a/app/src/main/java/com/pkusz/min_vpn_client/activity/register/RegisterActivityPresenter.java +++ b/app/src/main/java/com/pkusz/min_vpn_client/activity/register/RegisterActivityPresenter.java @@ -7,5 +7,38 @@ package com.pkusz.min_vpn_client.activity.register; * @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 */ -public class RegisterActivityPresenter { +import android.content.Context; + +import com.pkusz.min_vpn_client.model.request.RegisterRequest; + +public class RegisterActivityPresenter extends RegisterActivityContract.Presenter{ + public RegisterActivityPresenter(RegisterActivity registerActivity){ + mView=registerActivity; + mModel=new RegisterActivityModel(this); + } + + @Override + void registerSuccess() { + mView.registerSuccess(); + } + + @Override + void registerFailed(String errMsg) { + mView.registerFailed(errMsg); + } + + @Override + void register(RegisterRequest registerRequest) { + mModel.register(registerRequest); + } + + @Override + void registerWithSafetyInfo(RegisterRequest registerRequest, Context context) { + mModel.registerWithSafetyInfo(registerRequest,context); + } + + @Override + void uploadRegisterFacePicture(String username, RegisterRequest registerRequest, Context context) { + mModel.uploadRegisterFacePicture(username, registerRequest, context); + } }