mirror of
https://github.com/bitwarden/mobile
synced 2025-12-13 23:03:23 +00:00
156 lines
5.3 KiB
C#
156 lines
5.3 KiB
C#
using Android.Content;
|
|
using System.ComponentModel;
|
|
using Android.Views;
|
|
using Bit.Android.Controls;
|
|
using Bit.App.Controls;
|
|
using Xamarin.Forms;
|
|
using Xamarin.Forms.Platform.Android;
|
|
using AView = Android.Views.View;
|
|
using Android.Widget;
|
|
using Android.Text;
|
|
|
|
[assembly: ExportRenderer(typeof(ExtendedTextCell), typeof(ExtendedTextCellRenderer))]
|
|
namespace Bit.Android.Controls
|
|
{
|
|
public class ExtendedTextCellRenderer : TextCellRenderer
|
|
{
|
|
protected AView View { get; private set; }
|
|
|
|
protected override AView GetCellCore(Cell item, AView convertView, ViewGroup parent, Context context)
|
|
{
|
|
var View = (BaseCellView)base.GetCellCore(item, convertView, parent, context);
|
|
var extendedCell = (ExtendedTextCell)item;
|
|
|
|
if(View != null)
|
|
{
|
|
if(extendedCell.BackgroundColor != Color.White)
|
|
{
|
|
View.SetBackgroundColor(extendedCell.BackgroundColor.ToAndroid());
|
|
}
|
|
else
|
|
{
|
|
View.SetBackgroundResource(Resource.Drawable.list_selector);
|
|
}
|
|
|
|
if(extendedCell.ShowDisclousure)
|
|
{
|
|
var resourceId = Resource.Drawable.ion_chevron_right;
|
|
if(!string.IsNullOrWhiteSpace(extendedCell.DisclousureImage))
|
|
{
|
|
var fileName = System.IO.Path.GetFileNameWithoutExtension(extendedCell.DisclousureImage);
|
|
resourceId = context.Resources.GetIdentifier(fileName, "drawable", context.PackageName);
|
|
}
|
|
|
|
var image = new DisclosureImage(context, extendedCell);
|
|
image.SetImageResource(resourceId);
|
|
image.SetPadding(10, 10, 30, 10);
|
|
View.SetAccessoryView(image);
|
|
}
|
|
|
|
if(View.ChildCount > 1)
|
|
{
|
|
var layout = View.GetChildAt(1) as LinearLayout;
|
|
if(layout != null)
|
|
{
|
|
if(layout.ChildCount > 0)
|
|
{
|
|
var textView = layout.GetChildAt(0) as TextView;
|
|
if(textView != null)
|
|
{
|
|
textView.TextSize = (float)Device.GetNamedSize(NamedSize.Medium, typeof(Label));
|
|
}
|
|
}
|
|
|
|
if(layout.ChildCount > 1)
|
|
{
|
|
var detailView = layout.GetChildAt(1) as TextView;
|
|
if(detailView != null)
|
|
{
|
|
UpdateLineBreakMode(detailView, extendedCell.DetailLineBreakMode);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return View;
|
|
}
|
|
|
|
protected override void OnCellPropertyChanged(object sender, PropertyChangedEventArgs args)
|
|
{
|
|
base.OnCellPropertyChanged(sender, args);
|
|
|
|
var cell = (ExtendedTextCell)Cell;
|
|
|
|
if(args.PropertyName == ExtendedTextCell.BackgroundColorProperty.PropertyName)
|
|
{
|
|
View.SetBackgroundColor(cell.BackgroundColor.ToAndroid());
|
|
}
|
|
|
|
// TODO: other properties
|
|
}
|
|
|
|
private void UpdateLineBreakMode(TextView view, LineBreakMode lineBreakMode)
|
|
{
|
|
if(view == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
switch(lineBreakMode)
|
|
{
|
|
case LineBreakMode.NoWrap:
|
|
view.SetSingleLine(true);
|
|
view.Ellipsize = null;
|
|
break;
|
|
case LineBreakMode.WordWrap:
|
|
view.SetSingleLine(false);
|
|
view.Ellipsize = null;
|
|
view.SetMaxLines(100);
|
|
break;
|
|
case LineBreakMode.CharacterWrap:
|
|
view.SetSingleLine(false);
|
|
view.Ellipsize = null;
|
|
view.SetMaxLines(100);
|
|
break;
|
|
case LineBreakMode.HeadTruncation:
|
|
view.SetSingleLine(true);
|
|
view.Ellipsize = TextUtils.TruncateAt.Start;
|
|
break;
|
|
case LineBreakMode.TailTruncation:
|
|
view.SetSingleLine(true);
|
|
view.Ellipsize = TextUtils.TruncateAt.End;
|
|
break;
|
|
case LineBreakMode.MiddleTruncation:
|
|
view.SetSingleLine(true);
|
|
view.Ellipsize = TextUtils.TruncateAt.Middle;
|
|
break;
|
|
}
|
|
}
|
|
|
|
private class DisclosureImage : ImageView
|
|
{
|
|
private ExtendedTextCell _cell;
|
|
|
|
public DisclosureImage(Context context, ExtendedTextCell cell) : base(context)
|
|
{
|
|
_cell = cell;
|
|
}
|
|
|
|
public override bool OnTouchEvent(MotionEvent e)
|
|
{
|
|
switch(e.Action)
|
|
{
|
|
case MotionEventActions.Up:
|
|
_cell.OnDisclousureTapped();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|