diff --git a/src/Common.ClientLib/Application/Services/ITelephonyService.cs b/src/Common.ClientLib/Application/Services/ITelephonyService.cs index 81edd992523..5967ef54295 100644 --- a/src/Common.ClientLib/Application/Services/ITelephonyService.cs +++ b/src/Common.ClientLib/Application/Services/ITelephonyService.cs @@ -29,7 +29,7 @@ public interface ITelephonyService if ((!string.IsNullOrWhiteSpace(value)) && (string.IsNullOrWhiteSpace(textBoxText) || (textBoxText.Length < value.Length && - value.Substring(0, textBoxText.Length) == textBoxText))) + value[..textBoxText.Length] == textBoxText))) { return value; } diff --git a/src/ST.Client.Android/GoToPlatformPages.cs b/src/ST.Client.Android/GoToPlatformPages.cs index 2b915444e5d..c96c9bbf6a7 100644 --- a/src/ST.Client.Android/GoToPlatformPages.cs +++ b/src/ST.Client.Android/GoToPlatformPages.cs @@ -84,34 +84,38 @@ static void StartActivity(this Activity activity, Type activityType, byte[] view return default; } - public static void StartActivity(Activity activity, Type activityType, object viewModel, Type? viewModelType = null) - { - viewModelType ??= viewModel.GetType(); - var viewModel_ = Serializable.SMP(viewModelType, viewModel); -#if DEBUG - var t = Serializable.DMP(viewModelType, viewModel_); -#endif - StartActivity(activity, activityType, viewModel_); - } +// [Obsolete] +// public static void StartActivity(Activity activity, Type activityType, object viewModel, Type? viewModelType = null) +// { +// viewModelType ??= viewModel.GetType(); +// var viewModel_ = Serializable.SMP(viewModelType, viewModel); +//#if DEBUG +// var t = Serializable.DMP(viewModelType, viewModel_); +//#endif +// StartActivity(activity, activityType, viewModel_); +// } - public static void StartActivity(Fragment fragment, Type activityType, object viewModel, Type? viewModelType = null) - { - var activity = fragment.Activity; - if (activity == null) return; - StartActivity(activity, activityType, viewModel, viewModelType); - } +// [Obsolete] +// public static void StartActivity(Fragment fragment, Type activityType, object viewModel, Type? viewModelType = null) +// { +// var activity = fragment.Activity; +// if (activity == null) return; +// StartActivity(activity, activityType, viewModel, viewModelType); +// } - public static void StartActivity(Activity activity, object viewModel, Type? viewModelType = null) - { - StartActivity(activity, typeof(TActivity), viewModel, viewModelType); - } +// [Obsolete] +// public static void StartActivity(Activity activity, object viewModel, Type? viewModelType = null) +// { +// StartActivity(activity, typeof(TActivity), viewModel, viewModelType); +// } - public static void StartActivity(Fragment fragment, object viewModel, Type? viewModelType = null) - { - var activity = fragment.Activity; - if (activity == null) return; - StartActivity(activity, viewModel, viewModelType); - } +// [Obsolete] +// public static void StartActivity(Fragment fragment, object viewModel, Type? viewModelType = null) +// { +// var activity = fragment.Activity; +// if (activity == null) return; +// StartActivity(activity, viewModel, viewModelType); +// } public static void StartActivity(Activity activity, Type activityType, TViewModel viewModel) { diff --git a/src/ST.Client.Android/ST.Client.Android.csproj b/src/ST.Client.Android/ST.Client.Android.csproj index 03189fea434..9a67e6c6777 100644 --- a/src/ST.Client.Android/ST.Client.Android.csproj +++ b/src/ST.Client.Android/ST.Client.Android.csproj @@ -529,6 +529,18 @@ Resources\layout\fragment_basic_profile_content.xml + + Resources\layout\fragment_bind_phone_number.xml + + + Resources\layout\fragment_bind_phone_number_content.xml + + + Resources\layout\fragment_change_bind_phone_number.xml + + + Resources\layout\fragment_change_bind_phone_number_content.xml + Resources\layout\fragment_community_fix.xml diff --git a/src/ST.Client.Android/UI/Activities/UserProfile/BindPhoneNumberActivity.cs b/src/ST.Client.Android/UI/Activities/UserProfile/BindPhoneNumberActivity.cs deleted file mode 100644 index c797de74682..00000000000 --- a/src/ST.Client.Android/UI/Activities/UserProfile/BindPhoneNumberActivity.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Android.App; -using Android.Content.PM; -using Android.OS; -using Android.Runtime; - -namespace System.Application.UI.Activities -{ - [Authorize] - [Register(JavaPackageConstants.Activities + nameof(BindPhoneNumberActivity))] - [Activity(Theme = ManifestConstants.MainTheme2, - LaunchMode = LaunchMode.SingleTask, - ConfigurationChanges = ManifestConstants.ConfigurationChanges)] - internal sealed class BindPhoneNumberActivity : BaseActivity - { - protected override int? LayoutResource => throw new NotImplementedException(); - - protected override void OnCreate2(Bundle? savedInstanceState) - { - base.OnCreate2(savedInstanceState); - } - } -} diff --git a/src/ST.Client.Android/UI/Activities/UserProfile/ChangePhoneNumberActivity.cs b/src/ST.Client.Android/UI/Activities/UserProfile/ChangePhoneNumberActivity.cs deleted file mode 100644 index 9bb91ea792f..00000000000 --- a/src/ST.Client.Android/UI/Activities/UserProfile/ChangePhoneNumberActivity.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Android.App; -using Android.Content.PM; -using Android.OS; -using Android.Runtime; - -namespace System.Application.UI.Activities -{ - [Authorize] - [Register(JavaPackageConstants.Activities + nameof(ChangePhoneNumberActivity))] - [Activity(Theme = ManifestConstants.MainTheme2, - LaunchMode = LaunchMode.SingleTask, - ConfigurationChanges = ManifestConstants.ConfigurationChanges)] - internal sealed class ChangePhoneNumberActivity : BaseActivity - { - protected override int? LayoutResource => throw new NotImplementedException(); - - protected override void OnCreate2(Bundle? savedInstanceState) - { - base.OnCreate2(savedInstanceState); - } - } -} diff --git a/src/ST.Client.Android/UI/Activities/UserProfile/UserProfileActivity.cs b/src/ST.Client.Android/UI/Activities/UserProfile/UserProfileActivity.cs index 7e868a61358..7e4040eb20c 100644 --- a/src/ST.Client.Android/UI/Activities/UserProfile/UserProfileActivity.cs +++ b/src/ST.Client.Android/UI/Activities/UserProfile/UserProfileActivity.cs @@ -8,6 +8,8 @@ using System.Application.UI.Resx; using System.Application.UI.ViewModels; using Fragment = AndroidX.Fragment.App.Fragment; +using NUserService = System.Application.Services.UserService; +using static System.Application.UI.ViewModels.UserProfileWindowViewModel; namespace System.Application.UI.Activities { @@ -33,14 +35,18 @@ protected override void OnCreate2(Bundle? savedInstanceState) var adapter = new ViewPagerWithTabLayoutAdapter(this, this); binding!.pager.SetupWithTabLayout(binding!.tab_layout, adapter); + + var position = this.GetViewModel(); + GoToSubPage(position); } - int ViewPagerAdapter.IHost.ItemCount => 2; + int ViewPagerAdapter.IHost.ItemCount => pageCount; Fragment ViewPagerAdapter.IHost.CreateFragment(int position) => position switch { 0 => new UserBasicInfoFragment(), 1 => new UserAccountBindFragment(), + 2 => NUserService.Current.HasPhoneNumber ? new ChangePhoneNumberFragment() : new BindPhoneNumberFragment(), _ => throw new ArgumentOutOfRangeException(nameof(position), position.ToString()), }; @@ -48,6 +54,7 @@ protected override void OnCreate2(Bundle? savedInstanceState) { 0 => AppResources.User_BasicInfo, 1 => AppResources.User_AccountBind, + 2 => NUserService.Current.HasPhoneNumber ? AppResources.User_ChangePhoneNum : AppResources.User_BindPhoneNum, _ => throw new ArgumentOutOfRangeException(nameof(position), position.ToString()), }; @@ -64,5 +71,26 @@ public override void OnBackPressed() base.OnBackPressed(); } + + const int pageCount = 3; + public static void StartActivity(Activity activity, SubPageType position = 0) + { + if (position.IsDefined()) + { + GoToPlatformPages.StartActivity(activity, position); + } + else + { + activity.StartActivity(); + } + } + + public void GoToSubPage(SubPageType position) + { + if (position.IsDefined()) + { + binding!.pager.SetCurrentItem((int)position, false); + } + } } } \ No newline at end of file diff --git a/src/ST.Client.Android/UI/Fragments/MyFragment.cs b/src/ST.Client.Android/UI/Fragments/MyFragment.cs index 847a35db4f7..4af91a11df9 100644 --- a/src/ST.Client.Android/UI/Fragments/MyFragment.cs +++ b/src/ST.Client.Android/UI/Fragments/MyFragment.cs @@ -42,19 +42,19 @@ public override void OnCreateView(View view) return; } -#if !DEBUG - var isUnderConstruction = e.Current.Id switch - { - PreferenceButton.BindPhoneNumber or - PreferenceButton.ChangePhoneNumber or PreferenceButton.UserProfile => true, - _ => false, - }; - if (isUnderConstruction) - { - MainApplication.ShowUnderConstructionTips(); - return; - } -#endif + //#if !DEBUG + // var isUnderConstruction = e.Current.Id switch + // { + // PreferenceButton.BindPhoneNumber or + // PreferenceButton.ChangePhoneNumber or PreferenceButton.UserProfile => true, + // _ => false, + // }; + // if (isUnderConstruction) + // { + // MainApplication.ShowUnderConstructionTips(); + // return; + // } + //#endif #if __XAMARIN_FORMS__ var route = e.Current.Id switch @@ -73,16 +73,23 @@ PreferenceButton.BindPhoneNumber or } #endif - var activityType = e.Current.Id switch + switch (e.Current.Id) { - PreferenceButton.UserProfile => typeof(UserProfileActivity), - PreferenceButton.BindPhoneNumber => typeof(BindPhoneNumberActivity), - PreferenceButton.ChangePhoneNumber => typeof(ChangePhoneNumberActivity), - PreferenceButton.Settings => typeof(SettingsActivity), - PreferenceButton.About => typeof(AboutActivity), - _ => (Type?)null, - }; - if (activityType != null) this.StartActivity(activityType); + case PreferenceButton.UserProfile: + this.StartActivity(); + break; + case PreferenceButton.BindPhoneNumber: + case PreferenceButton.ChangePhoneNumber: + UserProfileActivity.StartActivity(RequireActivity(), + UserProfileWindowViewModel.SubPageType.ChangeOrBindPhoneNumber); + break; + case PreferenceButton.Settings: + this.StartActivity(); + break; + case PreferenceButton.About: + this.StartActivity(); + break; + } }; binding.rvPreferenceButtons.SetLinearLayoutManager(); binding.rvPreferenceButtons.AddVerticalGroupItemDecoration(binding.rvPreferenceButtons.PaddingTop); @@ -93,9 +100,9 @@ protected override bool OnClick(View view) { if (view.Id == Resource.Id.layoutUser) { -#if !DEBUG - MainApplication.ShowUnderConstructionTips(); -#else + //#if !DEBUG + // MainApplication.ShowUnderConstructionTips(); + //#else if (UserService.Current.IsAuthenticated) { this.StartActivity(); @@ -104,7 +111,7 @@ protected override bool OnClick(View view) { this.StartActivity(); } -#endif + //#endif return true; } //else if (view.Id == Resource.Id.???) diff --git a/src/ST.Client.Android/UI/Fragments/UserProfile/BindPhoneNumberFragment.cs b/src/ST.Client.Android/UI/Fragments/UserProfile/BindPhoneNumberFragment.cs new file mode 100644 index 00000000000..1fe9fc5eb61 --- /dev/null +++ b/src/ST.Client.Android/UI/Fragments/UserProfile/BindPhoneNumberFragment.cs @@ -0,0 +1,137 @@ +using Android.Text; +using Android.Views; +using Android.Views.InputMethods; +using Android.Widget; +using Binding; +using ReactiveUI; +using System.Application.Services; +using System.Application.UI.Resx; +using System.Application.UI.ViewModels; +using System.Collections.Generic; +using static System.Application.UI.ViewModels.UserProfileWindowViewModel; + +namespace System.Application.UI.Fragments +{ + [Authorize] + internal sealed class BindPhoneNumberFragment : BaseFragment, TextView.IOnEditorActionListener + { + protected override int? LayoutResource => Resource.Layout.fragment_bind_phone_number; + + public new BindPhoneNumberWindowViewModel ViewModel => base.ViewModel!.BindPhoneNumberVM; + + public override void OnCreateView(View view) + { + base.OnCreateView(view); + + binding!.tbPhoneNumber.TextChanged += (_, _) + => ViewModel.PhoneNumber = binding!.tbPhoneNumber.Text; + binding!.tbSmsCode.TextChanged += (_, _) + => ViewModel.SmsCode = binding!.tbSmsCode.Text; + + OnCreateViewAsync(); + + // https://developer.android.google.cn/reference/android/widget/TextView.html#protected-methods + binding!.tbPhoneNumber.SetRawInputType(InputTypes.ClassPhone); + binding!.tbPhoneNumber.SetDigitsKeyListener(); + binding!.tbPhoneNumber.SetMaxLength(ModelValidatorLengths.PhoneNumber); + binding!.tbPhoneNumber.ImeOptions = ImeAction.Next; + binding!.tbPhoneNumber.SetOnEditorActionListener(this); + + binding!.tbSmsCode.SetRawInputType(InputTypes.ClassNumber | InputTypes.NumberVariationNormal); + binding!.tbSmsCode.SetDigitsKeyListener(); + binding!.tbSmsCode.SetMaxLength(ModelValidatorLengths.SMS_CAPTCHA); + binding!.tbSmsCode.ImeOptions = ImeAction.Done; + binding!.tbSmsCode.SetOnEditorActionListener(this); + + R.Subscribe(() => + { + if (binding == null) return; + binding.tbPhoneNumber.Hint = AppResources.User_Phone; + binding!.tbPhoneNumber.SetImeActionLabel(AppResources.NextStep, binding!.tbPhoneNumber.ImeOptions); + binding.tbSmsCode.Hint = AppResources.User_SMSCode; + binding.tbSmsCode.SetImeActionLabel(AppResources.Btn_Text_Complete, binding!.tbSmsCode.ImeOptions); + binding.btnDone.Text = AppResources.Btn_Text_Complete; + if (!ViewModel!.IsUnTimeLimit) + { + binding.btnSendSms.Text = AppResources.User_GetSMSCode; + } + }).AddTo(this); + ViewModel!.WhenAnyValue(x => x.IsLoading).SubscribeInMainThread(value => + { + if (binding == null) return; + binding.loading.Visibility = value ? ViewStates.Visible : ViewStates.Gone; + binding.group_show_when_loading_false.Visibility = !value ? ViewStates.Visible : ViewStates.Gone; + }).AddTo(this); + ViewModel!.WhenAnyValue(x => x.IsUnTimeLimit).SubscribeInMainThread(value => + { + if (binding == null) return; + var enabled = !value; + if (binding.btnSendSms.Enabled != enabled) + { + binding.btnSendSms.Enabled = enabled; + } + }).AddTo(this); + ViewModel!.WhenAnyValue(x => x.BtnSendSmsCodeText).SubscribeInMainThread(value => + { + if (binding == null) return; + binding.btnSendSms.Text = value; + }).AddTo(this); + + SetOnClickListener( + binding.btnSendSms, + binding.btnDone); + + ViewModel!.TbPhoneNumberFocus = () => + { + if (binding == null) return; + binding.tbPhoneNumber.RequestFocus(); + }; + + ViewModel!.TbSmsCodeFocus = () => + { + if (binding == null) return; + binding.tbSmsCode.RequestFocus(); + }; + } + + async void OnCreateViewAsync() + { + binding!.tbPhoneNumber.Text = await ITelephonyService.GetAutoFillPhoneNumberAsync(binding!.tbPhoneNumber.Text); + } + + protected override bool OnClick(View view) + { + if (view.Id == Resource.Id.btnSendSms) + { + ViewModel!.SendSms(); + return true; + } + else if (view.Id == Resource.Id.btnDone) + { + ViewModel!.Submit(); + return true; + } + + return base.OnClick(view); + } + + bool TextView.IOnEditorActionListener.OnEditorAction(TextView? view, ImeAction actionId, KeyEvent? e) + { + if (view != null && binding != null && ((e != null && e.Action == KeyEventActions.Down && e.KeyCode == Keycode.Enter) || e == null)) + { + if (view.Id == Resource.Id.tbPhoneNumber) + { + OnClick(binding.btnSendSms); + binding.tbSmsCode.RequestFocus(); + return true; + } + else if (view.Id == Resource.Id.tbSmsCode) + { + OnClick(binding.btnDone); + return true; + } + } + return false; + } + } +} diff --git a/src/ST.Client.Android/UI/Fragments/UserProfile/ChangePhoneNumberFragment.cs b/src/ST.Client.Android/UI/Fragments/UserProfile/ChangePhoneNumberFragment.cs new file mode 100644 index 00000000000..d1f918452cf --- /dev/null +++ b/src/ST.Client.Android/UI/Fragments/UserProfile/ChangePhoneNumberFragment.cs @@ -0,0 +1,183 @@ +using Android.Text; +using Android.Views; +using Android.Views.InputMethods; +using Android.Widget; +using Binding; +using ReactiveUI; +using System.Application.Services; +using System.Application.UI.Resx; +using System.Application.UI.ViewModels; +using System.Collections.Generic; +using static System.Application.UI.ViewModels.UserProfileWindowViewModel; + +namespace System.Application.UI.Fragments +{ + [Authorize] + internal sealed class ChangePhoneNumberFragment : BaseFragment, TextView.IOnEditorActionListener + { + protected override int? LayoutResource => Resource.Layout.fragment_change_bind_phone_number; + + public new ChangeBindPhoneNumberWindowViewModel ViewModel => base.ViewModel!.ChangeBindPhoneNumberVM; + + public override void OnCreateView(View view) + { + base.OnCreateView(view); + + binding!.tbPhoneNumber.Text = UserService.Current.PhoneNumber; + + binding!.tbNewPhoneNumber.TextChanged += (_, _) + => ViewModel.PhoneNumber = binding!.tbNewPhoneNumber.Text; + binding!.tbSmsCode.TextChanged += (_, _) + => ViewModel.SmsCodeValidation = binding!.tbSmsCode.Text; + binding!.tbNewSmsCode.TextChanged += (_, _) + => ViewModel.SmsCodeNew = binding!.tbNewSmsCode.Text; + + OnCreateViewAsync(); + + // https://developer.android.google.cn/reference/android/widget/TextView.html#protected-methods + binding!.tbNewPhoneNumber.SetRawInputType(InputTypes.ClassPhone); + binding!.tbNewPhoneNumber.SetDigitsKeyListener(); + binding!.tbNewPhoneNumber.SetMaxLength(ModelValidatorLengths.PhoneNumber); + binding!.tbNewPhoneNumber.ImeOptions = ImeAction.Next; + binding!.tbNewPhoneNumber.SetOnEditorActionListener(this); + + binding!.tbSmsCode.SetRawInputType(InputTypes.ClassNumber | InputTypes.NumberVariationNormal); + binding!.tbSmsCode.SetDigitsKeyListener(); + binding!.tbSmsCode.SetMaxLength(ModelValidatorLengths.SMS_CAPTCHA); + binding!.tbSmsCode.ImeOptions = ImeAction.Done; + binding!.tbSmsCode.SetOnEditorActionListener(this); + + binding!.tbNewSmsCode.SetRawInputType(InputTypes.ClassNumber | InputTypes.NumberVariationNormal); + binding!.tbNewSmsCode.SetDigitsKeyListener(); + binding!.tbNewSmsCode.SetMaxLength(ModelValidatorLengths.SMS_CAPTCHA); + binding!.tbNewSmsCode.ImeOptions = ImeAction.Done; + binding!.tbNewSmsCode.SetOnEditorActionListener(this); + + R.Subscribe(() => + { + if (binding == null) return; + binding.tbPhoneNumber.Hint = AppResources.User_Phone; + + binding.tbNewPhoneNumber.Hint = AppResources.User_NewPhone; + binding.tbNewPhoneNumber.SetImeActionLabel(AppResources.NextStep, binding!.tbNewPhoneNumber.ImeOptions); + + binding.tbSmsCode.Hint = AppResources.User_SMSCode; + binding.tbSmsCode.SetImeActionLabel(AppResources.NextStep, binding!.tbSmsCode.ImeOptions); + + binding.tbNewSmsCode.Hint = AppResources.User_SMSCode; + binding.tbNewSmsCode.SetImeActionLabel(AppResources.Btn_Text_Complete, binding!.tbSmsCode.ImeOptions); + }).AddTo(this); + + ViewModel!.WhenAnyValue(x => x.IsLoading).SubscribeInMainThread(value => + { + if (binding == null) return; + binding.loading.Visibility = value ? ViewStates.Visible : ViewStates.Gone; + binding.group_show_when_loading_false.Visibility = !value ? ViewStates.Visible : ViewStates.Gone; + }).AddTo(this); + + ViewModel!.WhenAnyValue(x => x.IsUnTimeLimitValidation).SubscribeInMainThread(value => + { + if (binding == null) return; + var enabled = !value; + if (binding.btnSendSms.Enabled != enabled) + { + binding.btnSendSms.Enabled = enabled; + } + }).AddTo(this); + ViewModel!.WhenAnyValue(x => x.BtnSendSmsCodeTextValidation).SubscribeInMainThread(value => + { + if (binding == null) return; + binding.btnSendSms.Text = value; + }).AddTo(this); + + ViewModel!.WhenAnyValue(x => x.IsUnTimeLimitNew).SubscribeInMainThread(value => + { + if (binding == null) return; + var enabled = !value; + if (binding.btnNewSendSms.Enabled != enabled) + { + binding.btnNewSendSms.Enabled = enabled; + } + }).AddTo(this); + ViewModel!.WhenAnyValue(x => x.BtnSendSmsCodeTextNew).SubscribeInMainThread(value => + { + if (binding == null) return; + binding.btnNewSendSms.Text = value; + }).AddTo(this); + + ViewModel!.WhenAnyValue(x => x.BtnSubmitText).SubscribeInMainThread(value => + { + if (binding == null) return; + binding.btnDone.Text = value; + }).AddTo(this); + + ViewModel!.WhenAnyValue(x => x.CurrentStepIsValidation).SubscribeInMainThread(value => + { + if (binding == null) return; + binding.tbSmsCode.Enabled = value; + binding.tbNewPhoneNumber.Enabled = value; + }).AddTo(this); + + SetOnClickListener( + binding.btnSendSms, + binding.btnNewSendSms, + binding.btnDone); + + ViewModel.TbSmsCodeFocusValidation = () => + { + if (binding == null) return; + binding.tbSmsCode.RequestFocus(); + }; + + ViewModel.TbSmsCodeFocusNew = () => + { + if (binding == null) return; + binding.tbNewSmsCode.RequestFocus(); + }; + } + + async void OnCreateViewAsync() + { + var value = await ITelephonyService.GetAutoFillPhoneNumberAsync(binding!.tbPhoneNumber.Text); + if (value != IUserManager.Instance.GetCurrentUser()?.PhoneNumber) + { + binding!.tbNewPhoneNumber.Text = value; + } + } + + protected override bool OnClick(View view) + { + if (view.Id == Resource.Id.btnSendSms || view.Id == Resource.Id.btnNewSendSms) + { + ViewModel!.SendSms(); + return true; + } + else if (view.Id == Resource.Id.btnDone) + { + ViewModel!.Submit(); + return true; + } + + return base.OnClick(view); + } + + bool TextView.IOnEditorActionListener.OnEditorAction(TextView? view, ImeAction actionId, KeyEvent? e) + { + if (view != null && binding != null && ((e != null && e.Action == KeyEventActions.Down && e.KeyCode == Keycode.Enter) || e == null)) + { + if (view.Id == Resource.Id.tbNewPhoneNumber || view.Id == Resource.Id.tbNewSmsCode) + { + OnClick(binding.btnDone); + return true; + } + else if (view.Id == Resource.Id.tbSmsCode) + { + OnClick(binding.btnSendSms); + binding.tbNewPhoneNumber.RequestFocus(); + return true; + } + } + return false; + } + } +} diff --git a/src/ST.Client.Android/UI/Fragments/UserProfile/UserBasicInfoFragment.cs b/src/ST.Client.Android/UI/Fragments/UserProfile/UserBasicInfoFragment.cs index 4ac6bb2f218..b4d7542a273 100644 --- a/src/ST.Client.Android/UI/Fragments/UserProfile/UserBasicInfoFragment.cs +++ b/src/ST.Client.Android/UI/Fragments/UserProfile/UserBasicInfoFragment.cs @@ -12,6 +12,7 @@ using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; +using System.Application.UI.Activities; namespace System.Application.UI.Fragments { @@ -276,14 +277,18 @@ protected override bool OnClick(View view) { if (view.Id == Resource.Id.btnModifyPhoneNumber) { - if (UserService.Current.HasPhoneNumber) + if (RequireActivity() is UserProfileActivity userProfileActivity) { - ViewModel.OnBtnChangeBindPhoneNumberClick.Invoke(); - } - else - { - ViewModel.OnBtnBindPhoneNumberClick.Invoke(); + userProfileActivity.GoToSubPage(UserProfileWindowViewModel.SubPageType.ChangeOrBindPhoneNumber); } + //if (UserService.Current.HasPhoneNumber) + //{ + // ViewModel.OnBtnChangeBindPhoneNumberClick.Invoke(); + //} + //else + //{ + // ViewModel.OnBtnBindPhoneNumberClick.Invoke(); + //} return true; } else if (view.Id == Resource.Id.clickBirthDate) diff --git a/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/layout/fragment_bind_phone_number.xml b/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/layout/fragment_bind_phone_number.xml new file mode 100644 index 00000000000..8205a5a1bb3 --- /dev/null +++ b/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/layout/fragment_bind_phone_number.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/layout/fragment_bind_phone_number_content.xml b/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/layout/fragment_bind_phone_number_content.xml new file mode 100644 index 00000000000..a6bfc4020c7 --- /dev/null +++ b/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/layout/fragment_bind_phone_number_content.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/layout/fragment_change_bind_phone_number.xml b/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/layout/fragment_change_bind_phone_number.xml new file mode 100644 index 00000000000..2d00827a443 --- /dev/null +++ b/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/layout/fragment_change_bind_phone_number.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/layout/fragment_change_bind_phone_number_content.xml b/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/layout/fragment_change_bind_phone_number_content.xml new file mode 100644 index 00000000000..a32736119ed --- /dev/null +++ b/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/layout/fragment_change_bind_phone_number_content.xml @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/ST.Client/CustomWindow.cs b/src/ST.Client/CustomWindow.cs index 76ed9fa25c0..067f792873e 100644 --- a/src/ST.Client/CustomWindow.cs +++ b/src/ST.Client/CustomWindow.cs @@ -23,9 +23,11 @@ public enum CustomWindow EditAppInfo, IdleApp, ShareManage, + [Obsolete] ChangeBindPhoneNumber, UserProfile, NewVersion, + [Obsolete] BindPhoneNumber, ASF_AddBot, SteamShutdown, diff --git a/src/ST.Client/UI/ViewModels/Windows/BindPhoneNumberWindowViewModel.cs b/src/ST.Client/UI/ViewModels/Windows/BindPhoneNumberWindowViewModel.cs index dc291f8173c..54ddb8bfdf0 100644 --- a/src/ST.Client/UI/ViewModels/Windows/BindPhoneNumberWindowViewModel.cs +++ b/src/ST.Client/UI/ViewModels/Windows/BindPhoneNumberWindowViewModel.cs @@ -123,4 +123,10 @@ public void RemoveAllDelegate() i.RemoveAllDelegate(); } } + + partial class UserProfileWindowViewModel + { + readonly Lazy mBindPhoneNumberVM = new(() => new BindPhoneNumberWindowViewModel()); + public BindPhoneNumberWindowViewModel BindPhoneNumberVM => mBindPhoneNumberVM.Value; + } } diff --git a/src/ST.Client/UI/ViewModels/Windows/ChangeBindPhoneNumberWindowViewModel.cs b/src/ST.Client/UI/ViewModels/Windows/ChangeBindPhoneNumberWindowViewModel.cs index 05bdfa67f18..cc8601504e2 100644 --- a/src/ST.Client/UI/ViewModels/Windows/ChangeBindPhoneNumberWindowViewModel.cs +++ b/src/ST.Client/UI/ViewModels/Windows/ChangeBindPhoneNumberWindowViewModel.cs @@ -359,4 +359,10 @@ public void RemoveAllDelegate() } } } + + partial class UserProfileWindowViewModel + { + readonly Lazy mChangeBindPhoneNumberVM = new(() => new ChangeBindPhoneNumberWindowViewModel()); + public ChangeBindPhoneNumberWindowViewModel ChangeBindPhoneNumberVM => mChangeBindPhoneNumberVM.Value; + } } diff --git a/src/ST.Client/UI/ViewModels/Windows/UserProfileWindowViewModel.Mobile.cs b/src/ST.Client/UI/ViewModels/Windows/UserProfileWindowViewModel.Mobile.cs index 099e4af4239..ff0cf6e2528 100644 --- a/src/ST.Client/UI/ViewModels/Windows/UserProfileWindowViewModel.Mobile.cs +++ b/src/ST.Client/UI/ViewModels/Windows/UserProfileWindowViewModel.Mobile.cs @@ -38,5 +38,12 @@ public void OnBindOrUnbundleFastLoginClick(FastLoginChannel channel) OnUnbundleFastLoginClick.Invoke(channel.ToString()); } } + + public enum SubPageType : ushort + { + UserBasicInfo, + UserAccountBind, + ChangeOrBindPhoneNumber, + } } } \ No newline at end of file