From 0139aa65cddc0fdb5288ad86bbdb6ca1c8b43a07 Mon Sep 17 00:00:00 2001 From: Aigio Liu Date: Fri, 18 Jun 2021 12:46:52 +0800 Subject: [PATCH] Upgrade to .NET 6.0.100-preview.5.21302.13 --- .github/workflows/dotnet.yml | 2 +- global.json | 2 +- .../ReactiveUI/IReadOnlyViewFor.cs | 8 +++ src/ST.Client.Desktop/UI/Resx/R.cs | 20 ++++-- .../LoginOrRegisterWindowViewModel.shared.cs | 7 +- .../res/layout/activity_login_or_register.xml | 1 + .../fragment_login_and_register_by_fast.xml | 6 +- ...n_and_register_by_phone_number_content.xml | 4 ++ .../ui/src/main/res/values-night/colors.xml | 1 + .../ui/src/main/res/values/colors.xml | 1 + .../ui/src/main/res/values/themes.xml | 5 ++ .../HyperlinkClickableSpan.cs | 27 +++++++ .../ST.Client.Mobile.Droid.csproj | 2 +- .../UI/Activities/LoginOrRegisterActivity.cs | 72 ++++++++++++++++++- .../UI/Activities/MainActivity.cs | 16 ++--- .../UI/Base/BaseActivity.cs | 3 +- .../UI/Base/BaseFragment.cs | 39 +++++++++- .../UI/Base/BaseViewHolder.cs | 4 +- .../UI/Base/Features/NavController.cs | 44 +++++++++--- .../Fragments/FastLoginOrRegisterFragment.cs | 35 ++++++++- .../UI/Fragments/MyFragment.cs | 16 ----- .../UI/ViewModels/MyPageViewModel.cs | 4 +- 22 files changed, 256 insertions(+), 63 deletions(-) create mode 100644 src/Common.ClientLib/ReactiveUI/IReadOnlyViewFor.cs create mode 100644 src/ST.Client.Mobile.Droid/Android.Text.Style/HyperlinkClickableSpan.cs diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 471f6ef25ad..0793333f789 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -21,7 +21,7 @@ jobs: - name: Setup .NET 6 uses: actions/setup-dotnet@v1 with: - dotnet-version: 6.0.100-preview.4.21255.9 + dotnet-version: 6.0.100-preview.5.21302.13 - name: Checkout repository uses: actions/checkout@v2 diff --git a/global.json b/global.json index 2faf4b04d53..61f45b6e07f 100644 --- a/global.json +++ b/global.json @@ -3,6 +3,6 @@ "MSBuild.Sdk.Extras": "3.0.22" }, "sdk": { - "version": "6.0.100-preview.4.21255.9" + "version": "6.0.100-preview.5.21302.13" } } diff --git a/src/Common.ClientLib/ReactiveUI/IReadOnlyViewFor.cs b/src/Common.ClientLib/ReactiveUI/IReadOnlyViewFor.cs new file mode 100644 index 00000000000..6cc08fcd22a --- /dev/null +++ b/src/Common.ClientLib/ReactiveUI/IReadOnlyViewFor.cs @@ -0,0 +1,8 @@ +// ReSharper disable once CheckNamespace +namespace ReactiveUI +{ + public interface IReadOnlyViewFor where T : class + { + T? ViewModel { get; } + } +} \ No newline at end of file diff --git a/src/ST.Client.Desktop/UI/Resx/R.cs b/src/ST.Client.Desktop/UI/Resx/R.cs index 16868528c15..af28678dd5b 100644 --- a/src/ST.Client.Desktop/UI/Resx/R.cs +++ b/src/ST.Client.Desktop/UI/Resx/R.cs @@ -1,31 +1,32 @@ using ReactiveUI; using System.Application.Services; using System.Collections.Generic; -using System.Drawing; -using System.Drawing.Text; using System.Globalization; using System.Linq; using System.Reactive.Linq; -using System.Text.RegularExpressions; +#if __MOBILE__ +using R_Res_TYPE = System.Byte; +#else +using R_Res_TYPE = System.Application.UI.Resx.AppResources; +#endif namespace System.Application.UI.Resx { public sealed class R : ReactiveObject { - public static R Current { get; } + public static R Current { get; } = new(); public static readonly IReadOnlyCollection> Languages; public static readonly Dictionary SteamLanguages; static readonly Lazy>> mFonts = new(() => IFontManager.Instance.GetFonts()); public static IReadOnlyCollection> Fonts => mFonts.Value; - public AppResources Res { get; set; } = new AppResources(); + public R_Res_TYPE Res { get; set; } = new(); public static CultureInfo DefaultCurrentUICulture { get; } static R() { - Current = new R(); DefaultCurrentUICulture = CultureInfo.CurrentUICulture; Languages = new Dictionary(StringComparer.OrdinalIgnoreCase) { @@ -82,7 +83,12 @@ public static void ChangeLanguage(string? cultureName) CultureInfo.DefaultThreadCurrentCulture = AppResources.Culture; mAcceptLanguage = GetAcceptLanguageCore(); mLanguage = GetLanguageCore(); - Current.Res = new AppResources(); + Current.Res = +#if __MOBILE__ + ++Current.Res; +#else + new AppResources(); +#endif Current.RaisePropertyChanged(nameof(Res)); } diff --git a/src/ST.Client.Desktop/UI/ViewModels/Windows/LoginOrRegisterWindowViewModel.shared.cs b/src/ST.Client.Desktop/UI/ViewModels/Windows/LoginOrRegisterWindowViewModel.shared.cs index 0d5f8991a2a..462138b2dd1 100644 --- a/src/ST.Client.Desktop/UI/ViewModels/Windows/LoginOrRegisterWindowViewModel.shared.cs +++ b/src/ST.Client.Desktop/UI/ViewModels/Windows/LoginOrRegisterWindowViewModel.shared.cs @@ -191,15 +191,18 @@ async Task SendSmsAsync() public ICommand OpenHyperlink { get; } + public const string Agreement = "Agreement"; + public const string Privacy = "Privacy"; + void OpenHyperlink_(string parameter) { if (string.IsNullOrWhiteSpace(parameter)) return; switch (parameter) { - case "Agreement": + case Agreement: parameter = "https://steampp.net/AgreementBox"; break; - case "Privacy": + case Privacy: parameter = "https://steampp.net/PrivacyBox"; break; } diff --git a/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/layout/activity_login_or_register.xml b/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/layout/activity_login_or_register.xml index 7df91db2749..439c42b6cfc 100644 --- a/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/layout/activity_login_or_register.xml +++ b/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/layout/activity_login_or_register.xml @@ -6,6 +6,7 @@ android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="match_parent" android:layout_height="match_parent" + android:background="@color/grey_window_background" app:defaultNavHost="true" app:navGraph="@navigation/nav_graph_login_or_register" xamarin:managedType="AndroidX.Fragment.App.FragmentContainerView"> diff --git a/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/layout/fragment_login_and_register_by_fast.xml b/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/layout/fragment_login_and_register_by_fast.xml index a93438276de..d0bc144ad3a 100644 --- a/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/layout/fragment_login_and_register_by_fast.xml +++ b/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/layout/fragment_login_and_register_by_fast.xml @@ -4,8 +4,7 @@ xmlns:xamarin="http://schemas.xamarin.com/android/xamarin/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:background="@color/grey_window_background"> + android:layout_gravity="center_vertical"> diff --git a/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/layout/fragment_login_and_register_by_phone_number_content.xml b/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/layout/fragment_login_and_register_by_phone_number_content.xml index ef806754ad8..2b95bab0b95 100644 --- a/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/layout/fragment_login_and_register_by_phone_number_content.xml +++ b/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/layout/fragment_login_and_register_by_phone_number_content.xml @@ -90,8 +90,12 @@ android:layout_marginStart="@dimen/fast_login_or_register_margin" android:layout_marginTop="@dimen/fast_login_or_register_margin" android:layout_marginEnd="@dimen/fast_login_or_register_margin" + android:clickable="true" + android:focusable="true" + android:gravity="center_horizontal" android:textAlignment="center" android:textColor="@color/text_primary" + android:textColorLink="@color/text_link" android:textSize="14sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/values-night/colors.xml b/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/values-night/colors.xml index 8a7c5306123..1d826bc992c 100644 --- a/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/values-night/colors.xml +++ b/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/values-night/colors.xml @@ -4,4 +4,5 @@ #FF000000 #f2f2f7 #979797 + #0089ff diff --git a/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/values/colors.xml b/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/values/colors.xml index 7c90d3c115a..7ef45410e3b 100644 --- a/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/values/colors.xml +++ b/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/values/colors.xml @@ -13,4 +13,5 @@ #F9F9F9 #333333 #666666 + #007ffc diff --git a/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/values/themes.xml b/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/values/themes.xml index da35573cac7..f5933eda44b 100644 --- a/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/values/themes.xml +++ b/src/ST.Client.Mobile.Droid.Design/ui/src/main/res/values/themes.xml @@ -25,4 +25,9 @@ diff --git a/src/ST.Client.Mobile.Droid/Android.Text.Style/HyperlinkClickableSpan.cs b/src/ST.Client.Mobile.Droid/Android.Text.Style/HyperlinkClickableSpan.cs new file mode 100644 index 00000000000..39c9eb2fb06 --- /dev/null +++ b/src/ST.Client.Mobile.Droid/Android.Text.Style/HyperlinkClickableSpan.cs @@ -0,0 +1,27 @@ +using Android.Views; +using System; +using Color = Android.Graphics.Color; + +// ReSharper disable once CheckNamespace +namespace Android.Text.Style +{ + public sealed class HyperlinkClickableSpan : ClickableSpan + { + readonly Action onClick; + readonly bool underlineText; + + public HyperlinkClickableSpan(Action onClick, bool underlineText = false) + { + this.onClick = onClick; + this.underlineText = underlineText; + } + + public override void OnClick(View widget) => onClick(widget); + + public override void UpdateDrawState(TextPaint ds) + { + ds.Color = new Color(ds.LinkColor); + ds.UnderlineText = underlineText; + } + } +} \ No newline at end of file diff --git a/src/ST.Client.Mobile.Droid/ST.Client.Mobile.Droid.csproj b/src/ST.Client.Mobile.Droid/ST.Client.Mobile.Droid.csproj index 19c20054017..e290ac61fbc 100644 --- a/src/ST.Client.Mobile.Droid/ST.Client.Mobile.Droid.csproj +++ b/src/ST.Client.Mobile.Droid/ST.Client.Mobile.Droid.csproj @@ -1,4 +1,4 @@ - + MonoAndroid11.0 diff --git a/src/ST.Client.Mobile.Droid/UI/Activities/LoginOrRegisterActivity.cs b/src/ST.Client.Mobile.Droid/UI/Activities/LoginOrRegisterActivity.cs index 00335edf198..fb435775eda 100644 --- a/src/ST.Client.Mobile.Droid/UI/Activities/LoginOrRegisterActivity.cs +++ b/src/ST.Client.Mobile.Droid/UI/Activities/LoginOrRegisterActivity.cs @@ -3,28 +3,64 @@ using Android.Content.PM; using Android.OS; using Android.Runtime; -using AndroidX.Navigation; +using Android.Text; +using Android.Text.Style; using AndroidX.Navigation.Fragment; using AndroidX.Navigation.UI; +using Binding; using Microsoft.Identity.Client; +using ReactiveUI; +using System.Application.Mvvm; +using System.Application.UI.Resx; +using System.Application.UI.ViewModels; +using System.Collections.Generic; +using System.Reactive.Disposables; +using System.Text; +using JObject = Java.Lang.Object; namespace System.Application.UI.Activities { [Register(JavaPackageConstants.Activities + nameof(LoginOrRegisterActivity))] - [Activity(Theme = "@style/MainTheme", + [Activity(Theme = "@style/MainTheme.NoActionBar", LaunchMode = LaunchMode.SingleTask, ConfigurationChanges = ManifestConstants.ConfigurationChanges)] - internal sealed class LoginOrRegisterActivity : BaseActivity + internal sealed class LoginOrRegisterActivity : BaseActivity, IDisposableHolder { + readonly CompositeDisposable disposables = new(); + ICollection IDisposableHolder.CompositeDisposable => disposables; + protected override int? LayoutResource => Resource.Layout.activity_login_or_register; + //static readonly Dictionary> title_strings = new() + //{ + // { Resource.Id.navigation_login_or_register_fast, () => AppResources.LoginAndRegister }, + // { Resource.Id.navigation_login_or_register_phone_number, () => AppResources.User_PhoneLogin }, + //}; + protected override void OnCreate(Bundle? savedInstanceState) { base.OnCreate(savedInstanceState); + ViewModel = new(); + ViewModel.AddTo(this); + var appBarConfiguration = new AppBarConfiguration.Builder(Resource.Id.navigation_login_or_register_fast).Build(); navController = ((NavHostFragment)SupportFragmentManager.FindFragmentById(Resource.Id.nav_host_fragment)).NavController; NavigationUI.SetupActionBarWithNavController(this, navController, appBarConfiguration); + + //R.Current.WhenAnyValue(x => x.Res).Subscribe(_ => + //{ + // var currentDestinationId = navController.CurrentDestination.Id; + // foreach (var item in title_strings) + // { + // var title = item.Value(); + // this.SetNavigationGraphTitle(item.Key, title); + // if (currentDestinationId == item.Key && ActionBar != null) + // { + // ActionBar.Title = title; + // } + // } + //}).AddTo(this); } protected override void OnActivityResult(int requestCode, Result resultCode, Intent? data) @@ -34,5 +70,35 @@ protected override void OnActivityResult(int requestCode, Result resultCode, Int // Return control to MSAL AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs(requestCode, resultCode, data); } + + public static SpannableString CreateAgreementAndPrivacy(LoginOrRegisterPageViewModel viewModel) + { + int length; + var linkTextIndexs = new List<(JObject what, int start, int end, SpanTypes flags)>(); + StringBuilder str = new(AppResources.User_RegisterAgreed); + str.Append(" "); + length = str.Length; + str.Append(AppResources.User_Agreement); + linkTextIndexs.Add((new HyperlinkClickableSpan(_ => + { + viewModel.OpenHyperlink.Invoke(LoginOrRegisterPageViewModel.Agreement); + }), length, str.Length, SpanTypes.ExclusiveExclusive)); + str.Append(" "); + str.Append(AppResources.And); + str.Append(" "); + length = str.Length; + str.Append(AppResources.User_Privacy); + linkTextIndexs.Add((new HyperlinkClickableSpan(_ => + { + viewModel.OpenHyperlink.Invoke(LoginOrRegisterPageViewModel.Privacy); + }), length, str.Length, SpanTypes.ExclusiveExclusive)); + + SpannableString spannable = new(str.ToString()); + foreach (var (what, start, end, flags) in linkTextIndexs) + { + spannable.SetSpan(what, start, end, flags); + } + return spannable; + } } } \ No newline at end of file diff --git a/src/ST.Client.Mobile.Droid/UI/Activities/MainActivity.cs b/src/ST.Client.Mobile.Droid/UI/Activities/MainActivity.cs index 6a1512c7aaf..610ea76f287 100644 --- a/src/ST.Client.Mobile.Droid/UI/Activities/MainActivity.cs +++ b/src/ST.Client.Mobile.Droid/UI/Activities/MainActivity.cs @@ -18,7 +18,7 @@ namespace System.Application.UI.Activities [Activity(Theme = "@style/MainTheme", LaunchMode = LaunchMode.SingleTask, ConfigurationChanges = ManifestConstants.ConfigurationChanges)] - internal sealed class MainActivity : BaseActivity, IDisposableHolder + internal sealed class MainActivity : BaseActivity, IDisposableHolder, IReadOnlyViewFor { readonly CompositeDisposable disposables = new(); ICollection IDisposableHolder.CompositeDisposable => disposables; @@ -29,6 +29,8 @@ internal sealed class MainActivity : BaseActivity, IDisposableHol public MyPageViewModel MyPageViewModel { get; } = new(); + MyPageViewModel? IReadOnlyViewFor.ViewModel => MyPageViewModel; + void SetBottomNavigationMenuTitle(int resId, ICharSequence value) { if (binding == null) return; @@ -38,25 +40,19 @@ void SetBottomNavigationMenuTitle(int resId, ICharSequence value) menuItem.SetTitle(value); } - void SetNavigationGraphTitle(int resId, ICharSequence value) - { - if (navController == null) return; - var navNode = navController.Graph.FindNode(resId); - if (navNode == null) return; - navNode.LabelFormatted = value; - } - void SetSubPageTitle(int resId, string value) { var value_ = value.ToJavaString(); SetBottomNavigationMenuTitle(resId, value_); - SetNavigationGraphTitle(resId, value_); + this.SetNavigationGraphTitle(resId, value_); } protected override void OnCreate(Bundle? savedInstanceState) { base.OnCreate(savedInstanceState); + MyPageViewModel.AddTo(this); + var appBarConfiguration = new AppBarConfiguration.Builder( Resource.Id.navigation_local_auth, Resource.Id.navigation_community_fix, diff --git a/src/ST.Client.Mobile.Droid/UI/Base/BaseActivity.cs b/src/ST.Client.Mobile.Droid/UI/Base/BaseActivity.cs index f4c12f4cf36..8cca7dfc09e 100644 --- a/src/ST.Client.Mobile.Droid/UI/Base/BaseActivity.cs +++ b/src/ST.Client.Mobile.Droid/UI/Base/BaseActivity.cs @@ -3,6 +3,7 @@ using Android.Runtime; using Android.Views; using AndroidX.AppCompat.App; +using ReactiveUI; using ReactiveUI.AndroidX; using System.Application.UI.ViewModels; using XEPlatform = Xamarin.Essentials.Platform; @@ -80,7 +81,7 @@ protected override void OnDestroy() /// /// /// - public abstract partial class BaseActivity : ReactiveAppCompatActivity where TViewBinding : class + public abstract partial class BaseActivity : ReactiveAppCompatActivity, IReadOnlyViewFor where TViewBinding : class where TViewModel : ViewModelBase { protected override void OnCreate(Bundle? savedInstanceState) diff --git a/src/ST.Client.Mobile.Droid/UI/Base/BaseFragment.cs b/src/ST.Client.Mobile.Droid/UI/Base/BaseFragment.cs index c645cb5af6a..f61167f4754 100644 --- a/src/ST.Client.Mobile.Droid/UI/Base/BaseFragment.cs +++ b/src/ST.Client.Mobile.Droid/UI/Base/BaseFragment.cs @@ -1,8 +1,8 @@ -using Android.Content; using Android.OS; using Android.Views; -using AndroidX.Fragment.App; using ReactiveUI.AndroidX; +using System.Application; +using System.Application.Mvvm; using System.Application.UI.ViewModels; using Fragment = AndroidX.Fragment.App.Fragment; @@ -64,7 +64,7 @@ public override void OnDestroyView() /// /// /// - public abstract partial class BaseFragment : ReactiveFragment + public abstract partial class BaseFragment : ReactiveFragment, ReactiveUI.IReadOnlyViewFor where TViewBinding : class where TViewModel : ViewModelBase { @@ -73,6 +73,7 @@ public override View OnCreateView(LayoutInflater inflater, ViewGroup container, var view = BaseFragment.CreateView(LayoutResource, inflater, container); if (view == null) return base.OnCreateView(inflater, container, savedInstanceState); + ViewModel = this.GetViewModel(); OnCreateView(view); return view; } @@ -84,4 +85,36 @@ public override void OnDestroyView() binding = null; } } +} + +// ReSharper disable once CheckNamespace +namespace System +{ + public static partial class BaseUIExtensions + { + public static TViewModel GetViewModel(this Fragment fragment) + where TViewModel : class, IDisposable + { + if (fragment.Activity is ReactiveUI.IReadOnlyViewFor rvf && rvf.ViewModel != null) + { + return rvf.ViewModel; + } + + if (fragment.Activity is ReactiveUI.IViewFor vf && vf.ViewModel != null) + { + return vf.ViewModel; + } + + if (fragment is IDisposableHolder dh) + { + TViewModel r = Activator.CreateInstance(); + r.AddTo(dh); + return r; + } + else + { + throw new InvalidOperationException("fragment must implement IDisposableHolder."); + } + } + } } \ No newline at end of file diff --git a/src/ST.Client.Mobile.Droid/UI/Base/BaseViewHolder.cs b/src/ST.Client.Mobile.Droid/UI/Base/BaseViewHolder.cs index cfdb9703de5..8ed2989f4b4 100644 --- a/src/ST.Client.Mobile.Droid/UI/Base/BaseViewHolder.cs +++ b/src/ST.Client.Mobile.Droid/UI/Base/BaseViewHolder.cs @@ -53,11 +53,11 @@ public BaseViewHolder(View itemView) : base(itemView) /// /// /// - public abstract partial class BaseReactiveViewHolder : ReactiveRecyclerViewViewHolder, IDisposableHolder + public abstract partial class BaseReactiveViewHolder : ReactiveRecyclerViewViewHolder, IDisposableHolder, IReadOnlyViewFor where TViewModel : class, IReactiveObject { CompositeDisposable? disposables; - ICollection IDisposableHolder.CompositeDisposable => disposables; + ICollection IDisposableHolder.CompositeDisposable => disposables!; public BaseReactiveViewHolder(View itemView) : base(itemView) { diff --git a/src/ST.Client.Mobile.Droid/UI/Base/Features/NavController.cs b/src/ST.Client.Mobile.Droid/UI/Base/Features/NavController.cs index 2df608da634..72a58697506 100644 --- a/src/ST.Client.Mobile.Droid/UI/Base/Features/NavController.cs +++ b/src/ST.Client.Mobile.Droid/UI/Base/Features/NavController.cs @@ -1,6 +1,7 @@ using Android.Views; using AndroidX.Navigation; using System.Application.UI.Activities.Internals; +using CharSequence = Java.Lang.ICharSequence; using Fragment = AndroidX.Fragment.App.Fragment; // ReSharper disable once CheckNamespace @@ -19,8 +20,21 @@ partial class BaseActivity : IHostNavController NavController? IHostNavController.NavController => navController; } +} + +// ReSharper disable once CheckNamespace +namespace System.Application.UI.Activities.Internals +{ + public interface IHostNavController + { + NavController? NavController { get; } + } +} - public static partial class BaseActivityExtensions +// ReSharper disable once CheckNamespace +namespace System +{ + public static partial class BaseUIExtensions { public static NavController? GetNavController(this Fragment fragment, View? view = null) { @@ -35,14 +49,26 @@ public static partial class BaseActivityExtensions } return navController; } - } -} -// ReSharper disable once CheckNamespace -namespace System.Application.UI.Activities.Internals -{ - public interface IHostNavController - { - NavController? NavController { get; } + static NavDestination? FindNode(this IHostNavController host, int resId) + { + if (host.NavController == null) return null; + var navNode = host.NavController.Graph.FindNode(resId); + return navNode; + } + + public static void SetNavigationGraphTitle(this IHostNavController host, int resId, CharSequence value) + { + var navNode = host.FindNode(resId); + if (navNode == null) return; + navNode.LabelFormatted = value; + } + + public static void SetNavigationGraphTitle(this IHostNavController host, int resId, string value) + { + var navNode = host.FindNode(resId); + if (navNode == null) return; + navNode.Label = value; + } } } \ No newline at end of file diff --git a/src/ST.Client.Mobile.Droid/UI/Fragments/FastLoginOrRegisterFragment.cs b/src/ST.Client.Mobile.Droid/UI/Fragments/FastLoginOrRegisterFragment.cs index 3df39a006a2..1aa3c5ddf52 100644 --- a/src/ST.Client.Mobile.Droid/UI/Fragments/FastLoginOrRegisterFragment.cs +++ b/src/ST.Client.Mobile.Droid/UI/Fragments/FastLoginOrRegisterFragment.cs @@ -1,16 +1,45 @@ using Android.Runtime; +using Android.Views; +using AndroidX.AppCompat.App; using Binding; +using ReactiveUI; +using System.Application.Mvvm; using System.Application.UI.Activities; -using AndroidX.Navigation; -using Android.Views; +using System.Application.UI.Resx; +using System.Application.UI.ViewModels; +using System.Collections.Generic; +using System.Reactive.Disposables; namespace System.Application.UI.Fragments { [Register(JavaPackageConstants.Fragments + nameof(FastLoginOrRegisterFragment))] - internal sealed class FastLoginOrRegisterFragment : BaseFragment + internal sealed class FastLoginOrRegisterFragment : BaseFragment, IDisposableHolder { + readonly CompositeDisposable disposables = new(); + ICollection IDisposableHolder.CompositeDisposable => disposables; + protected override int? LayoutResource => Resource.Layout.fragment_login_and_register_by_fast; + public override void OnCreateView(View view) + { + base.OnCreateView(view); + + if (Activity is AppCompatActivity activity) + { + activity.SetSupportActionBar(binding!.toolbar); + } + + R.Current.WhenAnyValue(x => x.Res).Subscribe(_ => + { + if (binding != null) + { + binding.toolbar.Title = AppResources.LoginAndRegister; + binding.tvTip.Text = AppResources.User_FastLoginTip; + binding.tvAgreementAndPrivacy.TextFormatted = LoginOrRegisterActivity.CreateAgreementAndPrivacy(ViewModel!); + } + }).AddTo(this); + } + void GoToUsePhoneNumberPage(View? view) { var navController = this.GetNavController(view); diff --git a/src/ST.Client.Mobile.Droid/UI/Fragments/MyFragment.cs b/src/ST.Client.Mobile.Droid/UI/Fragments/MyFragment.cs index 8dfd4eb877e..7beb286a502 100644 --- a/src/ST.Client.Mobile.Droid/UI/Fragments/MyFragment.cs +++ b/src/ST.Client.Mobile.Droid/UI/Fragments/MyFragment.cs @@ -16,7 +16,6 @@ namespace System.Application.UI.Fragments [Register(JavaPackageConstants.Fragments + nameof(MyFragment))] internal sealed class MyFragment : BaseFragment, IDisposableHolder { - bool disposeViewModel; readonly CompositeDisposable disposables = new(); ICollection IDisposableHolder.CompositeDisposable => disposables; @@ -26,16 +25,6 @@ public override void OnCreateView(View view) { base.OnCreateView(view); - if (Activity is MainActivity mainActivity) - { - ViewModel = mainActivity.MyPageViewModel; - } - else - { - ViewModel = new(); - disposeViewModel = true; - } - ViewModel.WhenAnyValue(x => x.NickName).Subscribe(value => { if (binding == null) return; @@ -68,11 +57,6 @@ public override void OnDestroyView() { base.OnDestroyView(); disposables.Dispose(); - if (ViewModel != null) - { - if (disposeViewModel) ViewModel.Dispose(); - ViewModel = null; - } } protected override bool OnClick(View view) diff --git a/src/ST.Client.Mobile/UI/ViewModels/MyPageViewModel.cs b/src/ST.Client.Mobile/UI/ViewModels/MyPageViewModel.cs index b755b379597..7802ad50a01 100644 --- a/src/ST.Client.Mobile/UI/ViewModels/MyPageViewModel.cs +++ b/src/ST.Client.Mobile/UI/ViewModels/MyPageViewModel.cs @@ -28,7 +28,7 @@ public MyPageViewModel() if (value == null) { nickNameNullValLangChangeSubscribe?.RemoveTo(this); - nickNameNullValLangChangeSubscribe = R.Current.WhenAnyValue(x => x) + nickNameNullValLangChangeSubscribe = R.Current.WhenAnyValue(x => x.Res) .Subscribe(_ => { // 未登录时显示的文本,多语言绑定 @@ -226,7 +226,7 @@ public ResIcon Icon /// PreferenceButtonViewModel OnBind(IDisposableHolder vm) { - disposable = R.Current.WhenAnyValue(x => x).Subscribe(_ => + disposable = R.Current.WhenAnyValue(x => x.Res).Subscribe(_ => { Title = GetTitleById(id); });