From c43f3af8a0eb951daf5aa087842a3a0cd46f0826 Mon Sep 17 00:00:00 2001 From: bbaa Date: Mon, 20 Mar 2023 00:10:32 +0800 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20=E5=AE=8C=E6=95=B4=E7=9F=AD?= =?UTF-8?q?=E4=BF=A1=E9=AA=8C=E8=AF=81=E7=A0=81=E4=BA=8C=E6=AD=A5=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../guettable/activity/AboutActivity.java | 13 ++ .../guettable/activity/LoginActivity.java | 38 +++-- .../top/yvyan/guettable/data/TokenData.java | 137 +++++++++++++++++- .../yvyan/guettable/service/AutoUpdate.java | 12 +- .../top/yvyan/guettable/service/CommFunc.java | 45 +++++- .../guettable/service/MoreFunService.java | 24 +-- .../yvyan/guettable/service/fetch/Net.java | 6 +- .../service/fetch/StaticService.java | 10 +- app/src/main/res/layout/activity_about.xml | 38 +++++ app/src/main/res/layout/login_phoneotp.xml | 115 --------------- app/src/main/res/values/strings.xml | 10 +- 11 files changed, 288 insertions(+), 160 deletions(-) delete mode 100644 app/src/main/res/layout/login_phoneotp.xml diff --git a/app/src/main/java/top/yvyan/guettable/activity/AboutActivity.java b/app/src/main/java/top/yvyan/guettable/activity/AboutActivity.java index 8ea3912..e101617 100644 --- a/app/src/main/java/top/yvyan/guettable/activity/AboutActivity.java +++ b/app/src/main/java/top/yvyan/guettable/activity/AboutActivity.java @@ -8,6 +8,7 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.view.View; +import android.widget.LinearLayout; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; @@ -32,12 +33,17 @@ public class AboutActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SingleSettingData singleSettingData = SingleSettingData.newInstance(this); + SettingData Settings=SettingData.newInstance(getContext()); BackgroundUtil.setPageTheme(this, singleSettingData.getThemeId()); setContentView(R.layout.activity_about); BackgroundUtil.setFullAlphaStatus(this); TextView title = findViewById(R.id.title); title.setText(getString(R.string.person_about)); TextView profileVersion = findViewById(R.id.about_version); + LinearLayout debug_ClearMFACookie= findViewById(R.id.clear_mfa_cookie); + debug_ClearMFACookie.setVisibility(Settings.isDevelopMode() ? LinearLayout.VISIBLE : LinearLayout.GONE); + View debug_ClearMFACookie_spliter= findViewById(R.id.clear_mfa_cookie_spliter); + debug_ClearMFACookie_spliter.setVisibility(Settings.isDevelopMode() ? View.VISIBLE : View.GONE); profileVersion.setText(AppUtil.getAppVersionName(getContext())); } @@ -78,6 +84,13 @@ public class AboutActivity extends AppCompatActivity { helpTest(); } + public void clearMFACookie(View view) { + TokenData tokenData = TokenData.newInstance(getContext()); + tokenData.setMFACookie(null); + tokenData.setBkjwCookie(null); + ToastUtil.showToast(getContext(),"清除成功"); + } + /** * 协助测试 */ diff --git a/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java b/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java index b6abd18..5422e19 100644 --- a/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java +++ b/app/src/main/java/top/yvyan/guettable/activity/LoginActivity.java @@ -127,14 +127,14 @@ public class LoginActivity extends Activity implements View.OnClickListener { } /** - * 验证智慧校园密码 OTP Version + * 验证智慧校园密码 SMSCode Version */ - private void testCASWithOTP(String OTP, String CASCookie, TokenData tokenData) { + private void testCASWithSMSCode(String SMSCode, String CASCookie, TokenData tokenData) { String account = etAccount.getText().toString(); String pwd = etPwd.getText().toString(); new Thread(() -> { runOnUiThread(() -> button.setText("正在认证-手机验证码")); - String MultiFactorAuth = StaticService.VerifyPhoneOTP(this, OTP, CASCookie); + String MultiFactorAuth = StaticService.VerifySMSCode(this, SMSCode, CASCookie); if (MultiFactorAuth.contains("ERROR")) { if (MultiFactorAuth.equals("ERROR1")) { showErrorToast(-3); @@ -167,7 +167,25 @@ public class LoginActivity extends Activity implements View.OnClickListener { if (CasCookie.contains("ERROR5")) { tokenData.setTGTToken(CasCookie.substring(CasCookie.indexOf(";") + 1)); tokenData.setBkjwCookie(null); - bypass2FA(account, password, CasCookie.substring(CasCookie.indexOf(";") + 1), tokenData); + String phoneNumber = StaticService.SendSMSCode(this, account,CasCookie.substring(CasCookie.indexOf(";")+1)); + if (!phoneNumber.contains("ERROR")) { + runOnUiThread(() -> { + showSMSCodeDialog(phoneNumber,CasCookie.substring(CasCookie.indexOf(";")+1),tokenData); + }); + } else { + if (phoneNumber.equals("ERROR1")) { + showErrorToast(-4); + } else if (phoneNumber.equals("ERROR2")) { + showErrorToast(-2); + } else if(phoneNumber.contains("ERROR3")) { + runOnUiThread(() -> { + setEnClick(); + ToastUtil.showToast(this, getResources().getString(R.string.login_fail_SMSCodeSend)+phoneNumber.substring(7)); + }); + } else { + showErrorToast(-8); + } + } } else { tokenData.setTGTToken(CasCookie); tokenData.setBkjwCookie(null); @@ -220,7 +238,7 @@ public class LoginActivity extends Activity implements View.OnClickListener { /** * 显示手机验证码2FA */ - private void showPhoneOtpDialog(String phoneNumber, String CasCookie, TokenData tokenData) { + private void showSMSCodeDialog(String phoneNumber, String CasCookie, TokenData tokenData) { try { AlertDialog dialog; AlertDialog.Builder builder = new AlertDialog.Builder(this); @@ -231,17 +249,17 @@ public class LoginActivity extends Activity implements View.OnClickListener { dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); Window window = dialog.getWindow(); - window.setContentView(R.layout.login_phoneotp); + window.setContentView(R.layout.login_smscode); TextView phoneNumberView = window .findViewById(R.id.et_phone); phoneNumberView.setText(phoneNumber); Button buttonYes = window.findViewById(R.id.btn_text_yes); buttonYes.setOnClickListener(view -> { - TextView phoneOTP = window - .findViewById(R.id.et_phoneotp); - String OTP = phoneOTP.getText().toString(); + TextView SMSCode = window + .findViewById(R.id.et_smscode); + String SMSCodeOTP = SMSCode.getText().toString(); + testCASWithSMSCode(SMSCodeOTP, CasCookie, tokenData); dialog.dismiss(); - testCASWithOTP(OTP, CasCookie, tokenData); }); } catch (Exception ignore) { } diff --git a/app/src/main/java/top/yvyan/guettable/data/TokenData.java b/app/src/main/java/top/yvyan/guettable/data/TokenData.java index 272896a..a462107 100644 --- a/app/src/main/java/top/yvyan/guettable/data/TokenData.java +++ b/app/src/main/java/top/yvyan/guettable/data/TokenData.java @@ -1,18 +1,33 @@ package top.yvyan.guettable.data; import android.annotation.SuppressLint; +import android.app.Activity; import android.content.Context; +import android.content.ContextWrapper; import android.content.SharedPreferences; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.view.Window; +import android.view.WindowManager; +import android.widget.Button; +import android.widget.TextView; + +import java.lang.reflect.*; + +import androidx.appcompat.app.AlertDialog; import top.yvyan.guettable.R; import top.yvyan.guettable.service.fetch.Net; import top.yvyan.guettable.service.fetch.StaticService; +import top.yvyan.guettable.util.ToastUtil; public class TokenData { @SuppressLint("StaticFieldLeak") private static TokenData tokenData; private final SharedPreferences.Editor editor; - private final Context context; + private Context context; + + private Object Caller; private static final String SHP_NAME = "tokenData"; @@ -60,7 +75,6 @@ public class TokenData { */ public String getVpnToken() { forceVPN = true; - refresh(); //isVPN = Net.testNet(context) != 0; return VPNToken; } @@ -83,6 +97,17 @@ public class TokenData { if (tokenData == null) { tokenData = new TokenData(context); } + tokenData.context = context; // Update Context + tokenData.Caller = null; + return tokenData; + } + + public static TokenData newInstance(Context context, Object Caller) { + if (tokenData == null) { + tokenData = new TokenData(context); + } + tokenData.context = context; // Update Context + tokenData.Caller = Caller; return tokenData; } @@ -176,14 +201,32 @@ public class TokenData { * @return 操作结果 */ public int refreshTGT() { - String TGTTokenStr = StaticService.SSOLogin(context, accountData.getUsername(), accountData.getPwd(),TGTToken, MFACookie); + String TGTTokenStr = StaticService.SSOLogin(context, accountData.getUsername(), accountData.getPwd(), TGTToken, MFACookie); if (TGTTokenStr.equals("ERROR2") || TGTTokenStr.equals("ERROR0")) { return -2; } if (TGTTokenStr.contains("TGT-")) { if (TGTTokenStr.contains("ERROR5")) { - setTGTToken(TGTTokenStr.substring(TGTTokenStr.indexOf(";") + 1)); - return bypass2FA(accountData.getPwd(), TGTTokenStr.substring(TGTTokenStr.indexOf(";") + 1)); + String CASCookie = TGTTokenStr.substring(TGTTokenStr.indexOf(";") + 1); + setTGTToken(CASCookie); + Activity activity = this.getActivity(context); + if (activity == null) return 1; + String phoneNumber = StaticService.SendSMSCode(context, accountData.getUsername(), CASCookie); + if (!phoneNumber.contains("ERROR")) { + showSMSCodeDialog(activity, phoneNumber, CASCookie); + } else { + if (phoneNumber.contains("ERROR3")) { + activity.runOnUiThread(() -> { + ToastUtil.showToast(context, context.getResources().getString(R.string.login_fail_SMSCodeSend) + phoneNumber.substring(7)); + }); + } else { + activity.runOnUiThread(() -> { + ToastUtil.showToast(context, context.getResources().getString(R.string.login_fail_SMSCodeSend) + "未知错误"); + }); + } + } + return 1; + // return bypass2FA(accountData.getPwd(), TGTTokenStr.substring(TGTTokenStr.indexOf(";") + 1)); } else { setTGTToken(TGTTokenStr); } @@ -193,6 +236,88 @@ public class TokenData { } } + public Activity getActivity(Context context) { + if (context == null) { + return null; + } else if (context instanceof ContextWrapper) { + if (context instanceof Activity) { + return (Activity) context; + } else { + return getActivity(((ContextWrapper) context).getBaseContext()); + } + } + + return null; + } + + private void showSMSCodeDialog(Activity activity, String phoneNumber, String CasCookie) { + activity.runOnUiThread(() -> { + try { + AlertDialog dialog; + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + dialog = builder.create(); + dialog.show(); + dialog.setCanceledOnTouchOutside(false); + dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); + dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); + dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + Window window = dialog.getWindow(); + window.setContentView(R.layout.login_smscode); + TextView phoneNumberView = window + .findViewById(R.id.et_phone); + phoneNumberView.setText(phoneNumber); + Button buttonYes = window.findViewById(R.id.btn_text_yes); + buttonYes.setOnClickListener(view -> { + TextView SMSCode = window + .findViewById(R.id.et_smscode); + String SMSCodeOTP = SMSCode.getText().toString(); + //ToastUtil.showToast(activity, "正在验证验证码"); + new Thread(() -> { + int State = verifySMSCode(SMSCodeOTP, CasCookie); + activity.runOnUiThread(() -> ToastUtil.showToast(activity, State == 0 ? "验证成功" : "验证码有误")); + }).start(); + dialog.dismiss(); + }); + } catch (Exception ignore) { + + } + }); + } + + private int verifySMSCode(String SMSCode, String CASCookie) { + try { + String MultiFactorAuth = StaticService.VerifySMSCode(context, SMSCode, CASCookie); + if (MultiFactorAuth.contains("ERROR")) { + if (Caller != null) { + try { + // 反射尝试调用updateView方法 (如果有) + Class CallerClass = Caller.getClass(); + Method Update = CallerClass.getMethod("updateView", int.class); + Update.invoke(Caller, -3); + } catch (Exception ignore) { + + } + } + return -1; + } else { + setMFACookie(MultiFactorAuth); + if (Caller != null) { + try { + // 反射尝试调用Update方法 (如果有) + Class ContextClass = Caller.getClass(); + Method Update = ContextClass.getMethod("update"); + Update.invoke(Caller); + } catch (Exception ignore) { + + } + } + return 0; + } + } catch (Exception ignore) { + return -1; + } + } + /** * bypass 2FA */ @@ -215,7 +340,7 @@ public class TokenData { } public String getCASCookie() { - return (MFACookie != null ? MFACookie : "") + (TGTToken != null ? ((MFACookie!=null ? "; " : "")+TGTToken) : ""); + return (MFACookie != null ? MFACookie : "") + (TGTToken != null ? ((MFACookie != null ? "; " : "") + TGTToken) : ""); } public String getTGTToken() { diff --git a/app/src/main/java/top/yvyan/guettable/service/AutoUpdate.java b/app/src/main/java/top/yvyan/guettable/service/AutoUpdate.java index e91f570..a44ac92 100644 --- a/app/src/main/java/top/yvyan/guettable/service/AutoUpdate.java +++ b/app/src/main/java/top/yvyan/guettable/service/AutoUpdate.java @@ -40,7 +40,7 @@ public class AutoUpdate { this.activity = fragment.getActivity(); accountData = AccountData.newInstance(activity); generalData = GeneralData.newInstance(activity); - tokenData = TokenData.newInstance(activity); + tokenData = TokenData.newInstance(activity,this); settingData = SettingData.newInstance(activity); init(); } @@ -72,8 +72,8 @@ public class AutoUpdate { * 启动同步 */ public void update() { - // 判断状态是否符合;合适的状态:就绪 网络错误 同步成功(点击同步) - if (state == 0 || state == -2 || state == 5) { + // 判断状态是否符合;合适的状态:就绪 登录失效 网络错误 验证码错误 同步成功(点击同步) + if (state == 0 || state == 1 || state == -2 || state == -3 || state == 5) { update_thread(); } } @@ -93,6 +93,9 @@ public class AutoUpdate { case 0: text = "已登录(点击同步)"; break; + case 1: + text = "登录失效"; + break; case 2: text = "去登录"; break; @@ -102,6 +105,9 @@ public class AutoUpdate { case -2: text = "网络错误"; break; + case -3: + text = "验证码错误(点击重试)"; + break; case 91: text = "尝试同步理论课"; break; diff --git a/app/src/main/java/top/yvyan/guettable/service/CommFunc.java b/app/src/main/java/top/yvyan/guettable/service/CommFunc.java index f6fa2cf..0176e6d 100644 --- a/app/src/main/java/top/yvyan/guettable/service/CommFunc.java +++ b/app/src/main/java/top/yvyan/guettable/service/CommFunc.java @@ -106,7 +106,16 @@ public class CommFunc { final AlertDialog[] dialog = new AlertDialog[1]; activity.runOnUiThread(() -> dialog[0] = DialogUtil.setTextDialog(activity, "自动登录中...(最长需要15s)", "跳过", iDialogService, true)); - tokenData.refresh(); + int LoginState=tokenData.refresh(); + if ( LoginState==1 ) { + ToastUtil.showToast(activity,"登录状态丢失,请输入验证码后稍后重试"); + activity.runOnUiThread(() -> { + if (dialog[0] != null && dialog[0].isShowing()) { + dialog[0].dismiss(); + } + }); + return; + } if (!noLogin[0]) { activity.runOnUiThread(() -> { if (dialog[0] != null && dialog[0].isShowing()) { @@ -151,7 +160,17 @@ public class CommFunc { final AlertDialog[] dialog = new AlertDialog[1]; activity.runOnUiThread(() -> dialog[0] = DialogUtil.setTextDialog(activity, "自动登录中...(最长需要15s)", "跳过", iDialogService, true)); - tokenData.refresh(); + int LoginState=tokenData.refresh(); + if ( LoginState==1 ) { + ToastUtil.showToast(activity,"登录状态丢失,请输入验证码后稍后重试"); + activity.runOnUiThread(() -> { + if (dialog[0] != null && dialog[0].isShowing()) { + dialog[0].dismiss(); + } + }); + return; + } + if (TokenData.isVPN()) { tokenData.setVPNCASCookie(); } @@ -204,7 +223,16 @@ public class CommFunc { }; final AlertDialog[] dialog = new AlertDialog[1]; activity.runOnUiThread(() -> dialog[0] = DialogUtil.setTextDialog(activity, "自动建立连接中...(最长需要15s)", "跳过", iDialogService, true)); - + int LoginState=tokenData.refresh(); + if (LoginState==1) { + ToastUtil.showToast(activity,"登录状态丢失,请输入验证码后稍后重试"); + activity.runOnUiThread(() -> { + if (dialog[0] != null && dialog[0].isShowing()) { + dialog[0].dismiss(); + } + }); + return; + } String token = tokenData.getVpnToken(); tokenData.setVPNCASCookie(); if (!noLogin[0]) { @@ -272,7 +300,16 @@ public class CommFunc { }; final AlertDialog[] dialog = new AlertDialog[1]; activity.runOnUiThread(() -> dialog[0] = DialogUtil.setTextDialog(activity, "自动建立连接中...(最长需要15s)", "跳过", iDialogService, true)); - + int LoginState=tokenData.refresh(); + if ( LoginState==1 ) { + ToastUtil.showToast(activity,"登录状态丢失,请输入验证码后稍后重试"); + activity.runOnUiThread(() -> { + if (dialog[0] != null && dialog[0].isShowing()) { + dialog[0].dismiss(); + } + }); + return; + } String token = tokenData.getVpnToken(); tokenData.setVPNCASCookie(); if (!noLogin[0]) { diff --git a/app/src/main/java/top/yvyan/guettable/service/MoreFunService.java b/app/src/main/java/top/yvyan/guettable/service/MoreFunService.java index 62a69f8..7b882cd 100644 --- a/app/src/main/java/top/yvyan/guettable/service/MoreFunService.java +++ b/app/src/main/java/top/yvyan/guettable/service/MoreFunService.java @@ -18,34 +18,34 @@ public class MoreFunService { this.activity = activity; this.iMoreFun = iMoreFun; accountData = AccountData.newInstance(activity); - tokenData = TokenData.newInstance(activity); + tokenData = TokenData.newInstance(activity,this); } public void update() { new Thread(() -> { try { if (accountData.getIsLogin()) { - setView(91); //显示:尝试同步 + updateView(91); //显示:尝试同步 int state; state = iMoreFun.updateData(tokenData.getCookie()); if (state == 5 || state == -2) { //同步成功或网络错误 - setView(state); + updateView(state); return; } - setView(92); //显示:正在登录 + updateView(92); //显示:正在登录 state = tokenData.refresh(); if (state == -2) { state = tokenData.refresh(); } if (state != 0) { - setView(state); + updateView(state); return; } - setView(93); //显示:正在同步 + updateView(93); //显示:正在同步 state = iMoreFun.updateData(tokenData.getCookie()); - setView(state); + updateView(state); } else { - setView(2); + updateView(2); } } catch (Exception e) { UMCrash.generateCustomLog(e, "MoreFunService"); @@ -69,18 +69,24 @@ public class MoreFunService { * 92 : 正在登录 * 93 : 正在同步 */ - private void setView(int state) { + private void updateView(int state) { String hint; switch (state) { case 2: hint = "未登录"; break; + case 1: + hint = "登录失效"; + break; case -1: hint = "密码错误"; break; case -2: hint = "网络错误"; break; + case -3: + hint = "验证码错误(点击重试)"; + break; case 91: hint = "尝试同步"; break; diff --git a/app/src/main/java/top/yvyan/guettable/service/fetch/Net.java b/app/src/main/java/top/yvyan/guettable/service/fetch/Net.java index b83d263..702e53b 100644 --- a/app/src/main/java/top/yvyan/guettable/service/fetch/Net.java +++ b/app/src/main/java/top/yvyan/guettable/service/fetch/Net.java @@ -159,10 +159,10 @@ public class Net { * @param account account * @return Response */ - public static HttpConnectionAndCode sendPhoneOTP(Context context, String account, String CASCookie) { + public static HttpConnectionAndCode sendSMSCode(Context context, String account, String CASCookie) { Resources resources = context.getResources(); return Post.post( - resources.getString(R.string.url_SendPhoneOTP), + resources.getString(R.string.url_SendSMSCode), null, resources.getString(R.string.user_agent), resources.getString(R.string.SSO_referer), @@ -184,7 +184,7 @@ public class Net { * @param OTP OTP * @return Response */ - public static HttpConnectionAndCode verifyPhoneOTP(Context context, String OTP, String CASCookie) { + public static HttpConnectionAndCode verifySMSCode(Context context, String OTP, String CASCookie) { Resources resources = context.getResources(); return Post.post( resources.getString(R.string.url_ReAuth), diff --git a/app/src/main/java/top/yvyan/guettable/service/fetch/StaticService.java b/app/src/main/java/top/yvyan/guettable/service/fetch/StaticService.java index 7212665..6f16591 100644 --- a/app/src/main/java/top/yvyan/guettable/service/fetch/StaticService.java +++ b/app/src/main/java/top/yvyan/guettable/service/fetch/StaticService.java @@ -48,8 +48,8 @@ public class StaticService { * ERROR2 : 需要使用外网网址进行访问 * ERROR3 : 验证码发送CD */ - public static String SendPhoneOTP(Context context, String account, String CASCookie) { - HttpConnectionAndCode response = Net.sendPhoneOTP(context, account, CASCookie); + public static String SendSMSCode(Context context, String account, String CASCookie) { + HttpConnectionAndCode response = Net.sendSMSCode(context, account, CASCookie); if (response.code != 0) { if (response.code == -5) { return "ERROR2"; @@ -88,14 +88,14 @@ public class StaticService { * * @param context context * @param CASCookie CAS Cookie - * @param OTP OTP手机验证码 + * @param SMSCode OTP手机验证码 * @return 多因素身份验证令牌Cookie * ERROR0 : 网络错误 * ERROR1 : 验证码错误 * ERROR2 : 需要使用外网网址进行访问 */ - public static String VerifyPhoneOTP(Context context, String OTP, String CASCookie) { - HttpConnectionAndCode response = Net.verifyPhoneOTP(context, OTP, CASCookie); + public static String VerifySMSCode(Context context, String SMSCode, String CASCookie) { + HttpConnectionAndCode response = Net.verifySMSCode(context, SMSCode, CASCookie); if (response.code != 0) { if (response.code == -5) { return "ERROR2"; diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml index ad01191..e20cfd2 100644 --- a/app/src/main/res/layout/activity_about.xml +++ b/app/src/main/res/layout/activity_about.xml @@ -443,6 +443,44 @@ android:layout_height="0.1dp" android:background="@color/xui_config_color_gray_9" /> + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/login_phoneotp.xml b/app/src/main/res/layout/login_phoneotp.xml deleted file mode 100644 index ddf08e0..0000000 --- a/app/src/main/res/layout/login_phoneotp.xml +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - -