using AndroidX.AppCompat.App;
using AndroidX.AppCompat.Widget;
using System.Application.UI.Internals;
using System.Common;
using Fragment = AndroidX.Fragment.App.Fragment;
namespace System.Application.UI.Internals
{
///
/// UI - 工具栏
///
internal interface IToolbar : IFindViewById
{
///
/// 当前页面是否有
///
bool HasToolbar { get; }
///
/// 设置默认 (与 参数互斥)
///
string? DefaultActionBarTitleString { get; }
///
/// 设置默认 (与 参数互斥)
///
int? DefaultActionBarTitleResource { get; }
///
/// 在页面上查找到的 缓存字段
///
Toolbar? ToolbarCache { get; set; }
///
/// 当前活动的
///
Toolbar Toolbar { get; }
///
/// 可重写在页面上查找
///
///
Toolbar? FindToolbar();
///
/// 绑定工具栏
///
void BindingToolbar();
string GetString(int resId);
///
public static void BindingToolbar(IToolbar t)
{
if (!t.HasToolbar) return;
string? defaultActionBarTitleString = t.DefaultActionBarTitleString;
int? defaultActionBarTitleResource = t.DefaultActionBarTitleResource;
AppCompatActivity? activity = t is AppCompatActivity a ? a : null;
Fragment? fragment = t is Fragment f ? f : null;
if (fragment != null && fragment.Activity is IToolbar t2 && t2.HasToolbar)
{
if (string.IsNullOrEmpty(defaultActionBarTitleString))
{
defaultActionBarTitleString = t2.DefaultActionBarTitleString;
}
else if (!defaultActionBarTitleResource.HasValue)
{
defaultActionBarTitleResource = t2.DefaultActionBarTitleResource;
}
}
var hasTitleString = !string.IsNullOrEmpty(defaultActionBarTitleString);
var hasTitleResource = defaultActionBarTitleResource.HasValue;
if (hasTitleString || hasTitleResource)
{
t.ToolbarCache = t.FindToolbar() ?? t.FindViewById(R.id.toolbar);
if (t.ToolbarCache != null)
{
string? title = null;
if (hasTitleString)
{
title = defaultActionBarTitleString;
}
else if (hasTitleResource)
{
#pragma warning disable CS8629 // 可为 null 的值类型可为 null。
var resId = defaultActionBarTitleResource.Value;
#pragma warning restore CS8629 // 可为 null 的值类型可为 null。
title = t.GetString(resId);
}
Action? navigationClick = null;
if (activity != null)
{
activity.SetSupportActionBar(t.ToolbarCache);
var actionBar = activity.SupportActionBar;
actionBar.SetDisplayHomeAsUpEnabled(true);
actionBar.SetHomeButtonEnabled(true);
if (title != null) actionBar.Title = title;
navigationClick = activity.OnBackPressed;
}
else if (fragment != null)
{
navigationClick = () => fragment.Activity?.OnBackPressed();
}
if (navigationClick != null)
{
t.ToolbarCache.NavigationClick += (_, _) => navigationClick();
}
}
}
}
///
public static Toolbar GetToolbar(IToolbar t)
=> t.ToolbarCache ?? throw new ArgumentNullException(nameof(ToolbarCache));
}
}
namespace System.Application.UI.Activities
{
partial class BaseActivity : IToolbar
{
///
protected virtual bool HasToolbar { get; }
bool IToolbar.HasToolbar => HasToolbar;
///
protected virtual string? DefaultActionBarTitleString { get; }
string? IToolbar.DefaultActionBarTitleString => DefaultActionBarTitleString;
///
protected virtual int? DefaultActionBarTitleResource { get; }
int? IToolbar.DefaultActionBarTitleResource => DefaultActionBarTitleResource;
///
Toolbar? toolbar;
Toolbar? IToolbar.ToolbarCache { get => toolbar; set => toolbar = value; }
///
protected Toolbar Toolbar => IToolbar.GetToolbar(this);
Toolbar IToolbar.Toolbar => Toolbar;
///
protected virtual Toolbar? FindToolbar() => null;
Toolbar? IToolbar.FindToolbar() => FindToolbar();
///
protected virtual void BindingToolbar() => IToolbar.BindingToolbar(this);
void IToolbar.BindingToolbar() => BindingToolbar();
}
}
namespace System.Application.UI.Fragments
{
partial class BaseFragment : IToolbar
{
///
protected virtual bool HasToolbar { get; }
bool IToolbar.HasToolbar => HasToolbar;
///
protected virtual string? DefaultActionBarTitleString { get; }
string? IToolbar.DefaultActionBarTitleString => DefaultActionBarTitleString;
///
protected virtual int? DefaultActionBarTitleResource { get; }
int? IToolbar.DefaultActionBarTitleResource => DefaultActionBarTitleResource;
///
Toolbar? toolbar;
Toolbar? IToolbar.ToolbarCache { get => toolbar; set => toolbar = value; }
///
protected Toolbar Toolbar => IToolbar.GetToolbar(this);
Toolbar IToolbar.Toolbar => Toolbar;
///
protected virtual Toolbar? FindToolbar() => null;
Toolbar? IToolbar.FindToolbar() => FindToolbar();
///
protected virtual void BindingToolbar() => IToolbar.BindingToolbar(this);
void IToolbar.BindingToolbar() => BindingToolbar();
}
}