Skip to content

Commit

Permalink
fix 889
Browse files Browse the repository at this point in the history
Android 网络加速,二级列表 UI XML
  • Loading branch information
AigioL committed Jan 13, 2022
1 parent bb17cde commit ef1971a
Show file tree
Hide file tree
Showing 31 changed files with 670 additions and 59 deletions.
8 changes: 7 additions & 1 deletion src/Common.ClientLib.Droid/Extensions/ContextExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using Android.Content;
using Android.Content;
using Android.Graphics.Drawables;
using Android.Runtime;
using AndroidX.Annotations;
Expand Down Expand Up @@ -60,5 +60,11 @@ public static int GetColorCompat(this Context context, [ColorRes] int id)
/// <returns></returns>
public static Drawable GetDrawableCompat(this Context context, [DrawableRes] int id)
=> ContextCompat.GetDrawable(context, id);

public static int GetDimensionPixelSize(this Context context, [IdRes] int resId)
{
var value = context.Resources!.GetDimensionPixelSize(resId);
return value;
}
}
}
157 changes: 157 additions & 0 deletions src/ST.Client.Android/Extensions/RecycleViewExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
using Android.Content;
using Android.Graphics;
using Android.Graphics.Drawables;
using AndroidX.Annotations;
using AndroidX.RecyclerView.Widget;
using System.Application;

// ReSharper disable once CheckNamespace
namespace System
{
/// <summary>
/// 对 <see cref="RecyclerView"/> 类的扩展函数集
/// </summary>
public static class RecycleViewExtensions
{
/// <summary>
/// 设置使用线性布局管理列表,默认纵向,使用 <see cref="LinearLayoutManager2"/>
/// </summary>
/// <param name="recycleView"></param>
/// <param name="orientation"></param>
/// <param name="reverseLayout"></param>
public static void SetLinearLayoutManager(this RecyclerView recycleView, int orientation = LinearLayoutManager.Vertical, bool reverseLayout = false)
{
var layout = new LinearLayoutManager2(recycleView.Context!, orientation, reverseLayout);
recycleView.SetLayoutManager(layout);
}

/// <summary>
/// 添加纵向列表组项间距,使用 <see cref="VerticalGroupItemDecoration(int)"/>
/// </summary>
/// <param name="recycleView"></param>
/// <param name="height"></param>
public static void AddVerticalGroupItemDecoration(this RecyclerView recycleView, int height)
{
VerticalGroupItemDecoration itemDecoration = new(height);
recycleView.AddItemDecoration(itemDecoration);
}

/// <summary>
/// 添加纵向列表组项间距,使用 <see cref="VerticalGroupItemDecoration(int)"/>
/// </summary>
/// <param name="recycleView"></param>
/// <param name="heightResId"></param>
public static void AddVerticalGroupItemDecorationIdRes(this RecyclerView recycleView, [IdRes] int heightResId)
{
var height = recycleView.Context!.GetDimensionPixelSize(heightResId);
recycleView.AddVerticalGroupItemDecoration(height);
}

/// <summary>
/// 添加纵向列表项间距,使用 <see cref="VerticalItemDecoration(int)"/>
/// </summary>
/// <param name="recycleView"></param>
/// <param name="height"></param>
public static void AddVerticalItemDecoration(this RecyclerView recycleView, int height)
{
VerticalItemDecoration itemDecoration = new(height);
recycleView.AddItemDecoration(itemDecoration);
}

/// <summary>
/// 添加纵向列表项间距,使用 <see cref="VerticalItemDecoration(int)"/>
/// </summary>
/// <param name="recycleView"></param>
/// <param name="heightResId"></param>
public static void AddVerticalItemDecorationIdRes(this RecyclerView recycleView, [IdRes] int heightResId)
{
var height = recycleView.Context!.GetDimensionPixelSize(heightResId);
recycleView.AddVerticalItemDecoration(height);
}

/// <summary>
/// 添加纵向列表项间距,使用 <see cref="VerticalItemDecoration2(int, int, bool)"/>
/// </summary>
/// <param name="recycleView"></param>
/// <param name="height"></param>
/// <param name="paddingBottom"></param>
/// <param name="noTop"></param>
public static void AddVerticalItemDecoration(this RecyclerView recycleView, int height, int paddingBottom, bool noTop = false)
{
VerticalItemDecoration2 itemDecoration = new(height, paddingBottom, noTop);
recycleView.AddItemDecoration(itemDecoration);
}

/// <summary>
/// 添加纵向列表项间距,使用 <see cref="VerticalItemDecoration2.Get(Context, int, int, bool)"/>
/// </summary>
/// <param name="recycleView"></param>
/// <param name="heightResId"></param>
/// <param name="paddingBottomResId"></param>
/// <param name="noTop"></param>
public static void AddVerticalItemDecorationIdRes(this RecyclerView recycleView, [IdRes] int heightResId, [IdRes] int paddingBottomResId = default, bool noTop = false)
{
var itemDecoration = VerticalItemDecoration2.Get(recycleView.Context!, heightResId, paddingBottomResId, noTop);
recycleView.AddItemDecoration(itemDecoration);
}

/// <summary>
/// 添加分割线,由 <see cref="Drawable"/> 绘制
/// </summary>
/// <param name="recycleView"></param>
/// <param name="drawable"></param>
/// <param name="orientation"></param>
public static void AddDividerItemDecoration(this RecyclerView recycleView, Drawable drawable, int orientation = DividerItemDecoration.Vertical)
{
DividerItemDecoration itemDecoration = new(recycleView.Context!, orientation);
itemDecoration.Drawable = drawable;
recycleView.AddItemDecoration(itemDecoration);
}

/// <summary>
/// 添加分割线,由 <see cref="Color"/> 绘制
/// </summary>
/// <param name="recycleView"></param>
/// <param name="color"></param>
/// <param name="size"></param>
/// <param name="orientation"></param>
public static void AddDividerItemDecoration(this RecyclerView recycleView, int colorArgb, int size = 1, int orientation = DividerItemDecoration.Vertical)
{
GradientDrawable shape = new();
shape.SetColor(colorArgb);
if (orientation == DividerItemDecoration.Vertical)
{
shape.SetSize(0, size);
}
else if (orientation == DividerItemDecoration.Horizontal)
{
shape.SetSize(size, 0);
}
recycleView.AddDividerItemDecoration(shape, orientation);
}

/// <summary>
/// 添加分割线,由 <see cref="Color"/> 绘制
/// </summary>
/// <param name="recycleView"></param>
/// <param name="colorResId"></param>
/// <param name="size"></param>
/// <param name="orientation"></param>
public static void AddDividerItemDecorationIdRes(this RecyclerView recycleView, [IdRes] int colorResId, int size = 1, int orientation = DividerItemDecoration.Vertical)
{
var colorArgb = recycleView.Context!.GetColorCompat(colorResId);
recycleView.AddDividerItemDecoration(colorArgb, size, orientation);
}

/// <summary>
/// 添加分割线
/// </summary>
/// <param name="recycleView"></param>
/// <param name="orientation"></param>
public static void AddDividerItemDecorationIdRes(this RecyclerView recycleView, int orientation = DividerItemDecoration.Vertical)
{
var colorResId = Resource.Color.bg_divider;
recycleView.AddDividerItemDecorationIdRes(colorResId, orientation: orientation);
}
}
}
22 changes: 22 additions & 0 deletions src/ST.Client.Android/ST.Client.Android.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,9 @@

<!--ST.Tools.AndroidResourceLink-->
<ItemGroup>
<AndroidResource Include="..\ST.Client.Mobile.Droid.Design\ui\src\main\res\animator\animation_keyboard_arrow_rotation.xml">
<Link>Resources\animator\animation_keyboard_arrow_rotation.xml</Link>
</AndroidResource>
<AndroidResource Include="..\ST.Client.Mobile.Droid.Design\ui\src\main\res\drawable\baseline_account_box_black_24.xml">
<Link>Resources\drawable\baseline_account_box_black_24.xml</Link>
</AndroidResource>
Expand Down Expand Up @@ -306,6 +309,9 @@
<AndroidResource Include="..\ST.Client.Mobile.Droid.Design\ui\src\main\res\drawable\bg_checkbox_indeterminate.xml">
<Link>Resources\drawable\bg_checkbox_indeterminate.xml</Link>
</AndroidResource>
<AndroidResource Include="..\ST.Client.Mobile.Droid.Design\ui\src\main\res\drawable\bg_divider_with_padding.xml">
<Link>Resources\drawable\bg_divider_with_padding.xml</Link>
</AndroidResource>
<AndroidResource Include="..\ST.Client.Mobile.Droid.Design\ui\src\main\res\drawable\bg_textbox.xml">
<Link>Resources\drawable\bg_textbox.xml</Link>
</AndroidResource>
Expand All @@ -327,12 +333,24 @@
<AndroidResource Include="..\ST.Client.Mobile.Droid.Design\ui\src\main\res\drawable\icon_xbox_24.xml">
<Link>Resources\drawable\icon_xbox_24.xml</Link>
</AndroidResource>
<AndroidResource Include="..\ST.Client.Mobile.Droid.Design\ui\src\main\res\drawable\ic_animated_keyboard_arrow_down_24.xml">
<Link>Resources\drawable\ic_animated_keyboard_arrow_down_24.xml</Link>
</AndroidResource>
<AndroidResource Include="..\ST.Client.Mobile.Droid.Design\ui\src\main\res\drawable\ic_animated_keyboard_arrow_up_24.xml">
<Link>Resources\drawable\ic_animated_keyboard_arrow_up_24.xml</Link>
</AndroidResource>
<AndroidResource Include="..\ST.Client.Mobile.Droid.Design\ui\src\main\res\drawable\ic_baseline_add_circle_outline_24.xml">
<Link>Resources\drawable\ic_baseline_add_circle_outline_24.xml</Link>
</AndroidResource>
<AndroidResource Include="..\ST.Client.Mobile.Droid.Design\ui\src\main\res\drawable\ic_baseline_double_arrow_24.xml">
<Link>Resources\drawable\ic_baseline_double_arrow_24.xml</Link>
</AndroidResource>
<AndroidResource Include="..\ST.Client.Mobile.Droid.Design\ui\src\main\res\drawable\ic_baseline_keyboard_arrow_down_24.xml">
<Link>Resources\drawable\ic_baseline_keyboard_arrow_down_24.xml</Link>
</AndroidResource>
<AndroidResource Include="..\ST.Client.Mobile.Droid.Design\ui\src\main\res\drawable\ic_baseline_keyboard_arrow_up_24.xml">
<Link>Resources\drawable\ic_baseline_keyboard_arrow_up_24.xml</Link>
</AndroidResource>
<AndroidResource Include="..\ST.Client.Mobile.Droid.Design\ui\src\main\res\drawable\ic_baseline_open_in_new_24.xml">
<Link>Resources\drawable\ic_baseline_open_in_new_24.xml</Link>
</AndroidResource>
Expand Down Expand Up @@ -537,6 +555,9 @@
<AndroidBoundLayout Include="..\ST.Client.Mobile.Droid.Design\ui\src\main\res\layout\fragment_settings.xml">
<Link>Resources\layout\fragment_settings.xml</Link>
</AndroidBoundLayout>
<AndroidBoundLayout Include="..\ST.Client.Mobile.Droid.Design\ui\src\main\res\layout\layout_card_accelerate_project.xml">
<Link>Resources\layout\layout_card_accelerate_project.xml</Link>
</AndroidBoundLayout>
<AndroidBoundLayout Include="..\ST.Client.Mobile.Droid.Design\ui\src\main\res\layout\layout_card_accelerate_project_group.xml">
<Link>Resources\layout\layout_card_accelerate_project_group.xml</Link>
</AndroidBoundLayout>
Expand Down Expand Up @@ -720,5 +741,6 @@






3 changes: 1 addition & 2 deletions src/ST.Client.Android/UI/Activities/ExplorerActivity.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,7 @@ protected override void OnCreate2(Bundle? savedInstanceState)

var adapter = new ExplorerAdapter(ViewModel!);
adapter.ItemClick += (_, e) => ViewModel!.OnItemClick(e.Current);
var layout = new LinearLayoutManager2(this, LinearLayoutManager.Vertical, false);
binding.rvExplorer.SetLayoutManager(layout);
binding.rvExplorer.SetLinearLayoutManager();
binding.rvExplorer.SetAdapter(adapter);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -272,9 +272,8 @@ protected override void OnCreate2(Bundle? savedInstanceState)
if (e.Current.IsOperate != 0) return;
e.Current.NotChecked = !e.Current.NotChecked;
};
var layout = new LinearLayoutManager2(this, LinearLayoutManager.Vertical, false);
binding!.rvConfirmations.SetLayoutManager(layout);
binding.rvConfirmations.AddItemDecoration(VerticalItemDecoration2.Get(this, Resource.Dimension.activity_vertical_margin, Resource.Dimension.tab_height, noTop: true));
binding!.rvConfirmations.SetLinearLayoutManager();
binding.rvConfirmations.AddVerticalItemDecorationIdRes(Resource.Dimension.activity_vertical_margin, Resource.Dimension.tab_height, noTop: true);
binding.rvConfirmations.SetAdapter(adapter);

//var actionItems = Enum2.GetAll<ActionItem>().Where(x => x != ActionItem.Refresh);
Expand Down
42 changes: 42 additions & 0 deletions src/ST.Client.Android/UI/Adapters/AccelerateProjectAdapter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
using Android.Views;
using Binding;
using ReactiveUI;
using System.Application.UI.Resx;
using System.Application.UI.ViewModels;
using TViewHolder = System.Application.UI.Adapters.AccelerateProjectViewHolder;
using TViewModel = System.Application.Models.AccelerateProjectDTO;
using static System.Application.UI.Resx.AppResources;
using System.Application.Services;
using System.Collections.Generic;
using DynamicData;

namespace System.Application.UI.Adapters
{
internal sealed class AccelerateProjectAdapter : BaseReactiveRecycleViewAdapter<TViewHolder, TViewModel>
{
public AccelerateProjectAdapter(IList<TViewModel> viewModels, ISourceList<TViewModel> sourceList) : base(viewModels, sourceList)
{

}

public override int? GetLayoutResource(int viewType)
{
return Resource.Layout.layout_card_accelerate_project;
}
}

internal sealed class AccelerateProjectViewHolder : BaseReactiveViewHolder<TViewModel>
{
readonly layout_card_accelerate_project binding;

public AccelerateProjectViewHolder(View itemView) : base(itemView)
{
binding = new(itemView);
}

public override void OnBind()
{
base.OnBind();
}
}
}
3 changes: 1 addition & 2 deletions src/ST.Client.Android/UI/Controllers/AboutController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -123,8 +123,7 @@ await Browser2.OpenAsync(string.Format(
break;
}
};
var layout = new LinearLayoutManager2(Context, LinearLayoutManager.Vertical, false);
binding.rvPreferenceButtons.SetLayoutManager(layout);
binding.rvPreferenceButtons.SetLinearLayoutManager();
binding.rvPreferenceButtons.AddItemDecoration(new PreferenceButtonItemDecoration(Context, Resource.Dimension.preference_buttons_space_min));
binding.rvPreferenceButtons.SetAdapter(adapter);

Expand Down
6 changes: 2 additions & 4 deletions src/ST.Client.Android/UI/Fragments/CommunityFixFragment.cs
Original file line number Diff line number Diff line change
Expand Up @@ -107,16 +107,14 @@ void SetScriptsEnableContentText(StringBuilder? s = null)
binding!.tvScriptsEnableContent.Text = s.ToString();
}

var ctx = RequireContext();
var adapter = new AccelerateProjectGroupAdapter();
adapter.ItemClick += (_, e) =>
{
var value = e.Current.ThreeStateEnable;
e.Current.ThreeStateEnable = value == null || !value.Value;
};
var layout = new LinearLayoutManager2(ctx, LinearLayoutManager.Vertical, false);
binding!.rvAccelerateProjectGroup.SetLayoutManager(layout);
binding.rvAccelerateProjectGroup.AddItemDecoration(VerticalItemDecoration2.Get(ctx, Resource.Dimension.activity_vertical_margin, Resource.Dimension.fab_height_with_margin_top_bottom));
binding!.rvAccelerateProjectGroup.SetLinearLayoutManager();
binding.rvAccelerateProjectGroup.AddVerticalItemDecorationIdRes(Resource.Dimension.activity_vertical_margin, Resource.Dimension.fab_height_with_margin_top_bottom);
binding.rvAccelerateProjectGroup.SetAdapter(adapter);

binding.swipeRefreshLayout.InitDefaultStyles();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,8 @@ public override void OnCreateView(View view)
break;
}
};
var layout = new LinearLayoutManager2(Context, LinearLayoutManager.Vertical, false);
binding.rvFastLoginChannels.SetLayoutManager(layout);
binding.rvFastLoginChannels.AddItemDecoration(new VerticalItemDecoration(Context.Resources!.GetDimensionPixelSize(Resource.Dimension.fast_login_or_register_margin_subtract_compat_padding)));
binding.rvFastLoginChannels.SetLinearLayoutManager();
binding.rvFastLoginChannels.AddVerticalItemDecorationIdRes(Resource.Dimension.fast_login_or_register_margin_subtract_compat_padding);
binding.rvFastLoginChannels.SetAdapter(adapter);

if (Activity is AppCompatActivity activity)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,9 +118,8 @@ void OnAuthenticatorsChanged(bool isAuthenticatorsEmpty, bool isFirstActivation)
{
AuthDetailActivity.StartActivity(Activity, e.Current.Id);
};
var layout = new LinearLayoutManager2(Context, LinearLayoutManager.Vertical, false);
binding!.rvAuthenticators.SetLayoutManager(layout);
binding.rvAuthenticators.AddItemDecoration(VerticalItemDecoration2.Get(Context, Resource.Dimension.activity_vertical_margin/*, Resource.Dimension.fab_full_height*/));
binding!.rvAuthenticators.SetLinearLayoutManager();
binding.rvAuthenticators.AddVerticalItemDecorationIdRes(Resource.Dimension.activity_vertical_margin/*, Resource.Dimension.fab_full_height*/);
binding.rvAuthenticators.SetAdapter(adapter);

//var actionItems = Enum2.GetAll<ActionItem>();
Expand Down
5 changes: 2 additions & 3 deletions src/ST.Client.Android/UI/Fragments/MyFragment.cs
Original file line number Diff line number Diff line change
Expand Up @@ -84,9 +84,8 @@ PreferenceButton.BindPhoneNumber or
};
if (activityType != null) this.StartActivity(activityType);
};
var layout = new LinearLayoutManager2(Context, LinearLayoutManager.Vertical, false);
binding.rvPreferenceButtons.SetLayoutManager(layout);
binding.rvPreferenceButtons.AddItemDecoration(new VerticalGroupItemDecoration(binding.rvPreferenceButtons.PaddingTop));
binding.rvPreferenceButtons.SetLinearLayoutManager();
binding.rvPreferenceButtons.AddVerticalGroupItemDecoration(binding.rvPreferenceButtons.PaddingTop);
binding.rvPreferenceButtons.SetAdapter(adapter);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using Android.Graphics;
using Android.Views;
using AndroidX.Annotations;
using System;
using System.Application.UI.Adapters;

// ReSharper disable once CheckNamespace
Expand Down Expand Up @@ -52,10 +53,10 @@ public VerticalItemDecoration2(int height, int paddingBottom, bool noTop = false
this.noTop = noTop;
}

public static VerticalItemDecoration2 Get(Context context, [IdRes] int heightResId, [IdRes] int paddingBottomResId = default, bool noTop = default)
public static VerticalItemDecoration2 Get(Context context, [IdRes] int heightResId, [IdRes] int paddingBottomResId = default, bool noTop = false)
{
var height = context.Resources!.GetDimensionPixelSize(heightResId);
var paddingBottom = paddingBottomResId != default ? context.Resources!.GetDimensionPixelSize(paddingBottomResId) : default;
var height = context.GetDimensionPixelSize(heightResId);
var paddingBottom = paddingBottomResId != default ? context.GetDimensionPixelSize(paddingBottomResId) : default;
return new(height, paddingBottom, noTop);
}

Expand Down
Loading

0 comments on commit ef1971a

Please sign in to comment.