diff --git a/src/Android/Android.csproj b/src/Android/Android.csproj index 71b0b448b..b1bab252d 100644 --- a/src/Android/Android.csproj +++ b/src/Android/Android.csproj @@ -126,16 +126,8 @@ - - - - - - - - diff --git a/src/Android/Renderers/BoxedView/BoxedViewRecyclerAdapter.cs b/src/Android/Renderers/BoxedView/BoxedViewRecyclerAdapter.cs deleted file mode 100644 index d5f3559b8..000000000 --- a/src/Android/Renderers/BoxedView/BoxedViewRecyclerAdapter.cs +++ /dev/null @@ -1,526 +0,0 @@ -using Android.Content; -using Android.Runtime; -using Android.Support.V7.Widget; -using Android.Text; -using Android.Views; -using Android.Widget; -using Bit.App.Controls.BoxedView; -using System; -using System.Collections.Generic; -using System.Linq; -using Xamarin.Forms; -using Xamarin.Forms.Platform.Android; -using AView = Android.Views.View; - -namespace Bit.Droid.Renderers.BoxedView -{ - [Preserve(AllMembers = true)] - public class BoxedViewRecyclerAdapter : RecyclerView.Adapter, AView.IOnClickListener - { - private const int ViewTypeHeader = 0; - private const int ViewTypeFooter = 1; - - private Dictionary _viewTypes; - private List _cellCaches; - - internal List CellCaches - { - get - { - if(_cellCaches == null) - { - FillCache(); - } - return _cellCaches; - } - } - - // Item click. correspond to AdapterView.IOnItemClickListener - private int _selectedIndex = -1; - private AView _preSelectedCell = null; - - Context _context; - App.Controls.BoxedView.BoxedView _boxedView; - RecyclerView _recyclerView; - - List _viewHolders = new List(); - - public BoxedViewRecyclerAdapter(Context context, App.Controls.BoxedView.BoxedView boxedView, - RecyclerView recyclerView) - { - _context = context; - _boxedView = boxedView; - _recyclerView = recyclerView; - _boxedView.ModelChanged += BoxedView_ModelChanged; - } - - private float MinRowHeight => _context.ToPixels(44); - - public override int ItemCount => CellCaches.Count; - - public override long GetItemId(int position) - { - return position; - } - - public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) - { - ViewHolder viewHolder; - switch(viewType) - { - case ViewTypeHeader: - viewHolder = new HeaderViewHolder( - LayoutInflater.FromContext(_context).Inflate(Resource.Layout.HeaderCell, parent, false), - _boxedView); - break; - case ViewTypeFooter: - viewHolder = new FooterViewHolder( - LayoutInflater.FromContext(_context).Inflate(Resource.Layout.FooterCell, parent, false), - _boxedView); - break; - default: - viewHolder = new ContentViewHolder( - LayoutInflater.FromContext(_context).Inflate(Resource.Layout.ContentCell, parent, false)); - viewHolder.ItemView.SetOnClickListener(this); - break; - } - _viewHolders.Add(viewHolder); - return viewHolder; - } - - public void OnClick(AView view) - { - var position = _recyclerView.GetChildAdapterPosition(view); - - // TODO: It is desirable that the forms side has Selected property and reflects it. - // But do it at a later as iOS side doesn't have that process. - DeselectRow(); - - var cell = view.FindViewById(Resource.Id.ContentCellBody).GetChildAt(0) as BaseCellView; - if(cell == null || !CellCaches[position].Cell.IsEnabled) - { - // If FormsCell IsEnable is false, does nothing. - return; - } - - _boxedView.Model.RowSelected(CellCaches[position].Cell); - cell.RowSelected(this, position); - } - - public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position) - { - var cellInfo = CellCaches[position]; - switch(holder.ItemViewType) - { - case ViewTypeHeader: - BindHeaderView((HeaderViewHolder)holder, (TextCell)cellInfo.Cell); - break; - case ViewTypeFooter: - BindFooterView((FooterViewHolder)holder, (TextCell)cellInfo.Cell); - break; - default: - BindContentView((ContentViewHolder)holder, cellInfo.Cell, position); - break; - } - } - - public override int GetItemViewType(int position) - { - var cellInfo = CellCaches[position]; - if(cellInfo.IsHeader) - { - return ViewTypeHeader; - } - else if(cellInfo.IsFooter) - { - return ViewTypeFooter; - } - else - { - return _viewTypes[cellInfo.Cell.GetType()]; - } - } - - public void DeselectRow() - { - if(_preSelectedCell != null) - { - _preSelectedCell.Selected = false; - _preSelectedCell = null; - } - _selectedIndex = -1; - } - - public void SelectedRow(AView cell, int position) - { - _preSelectedCell = cell; - _selectedIndex = position; - cell.Selected = true; - } - - protected override void Dispose(bool disposing) - { - if(disposing) - { - _boxedView.ModelChanged -= BoxedView_ModelChanged; - _cellCaches?.Clear(); - _cellCaches = null; - _boxedView = null; - _viewTypes = null; - foreach(var holder in _viewHolders) - { - holder.Dispose(); - } - _viewHolders.Clear(); - _viewHolders = null; - } - base.Dispose(disposing); - } - - private void BoxedView_ModelChanged(object sender, EventArgs e) - { - if(_recyclerView != null) - { - _cellCaches = null; - NotifyDataSetChanged(); - } - } - - private void BindHeaderView(HeaderViewHolder holder, TextCell formsCell) - { - var view = holder.ItemView; - - // Judging cell height - int cellHeight = (int)_context.ToPixels(44); - var individualHeight = formsCell.Height; - - if(individualHeight > 0d) - { - cellHeight = (int)_context.ToPixels(individualHeight); - } - else if(_boxedView.HeaderHeight > -1) - { - cellHeight = (int)_context.ToPixels(_boxedView.HeaderHeight); - } - - view.SetMinimumHeight(cellHeight); - view.LayoutParameters.Height = cellHeight; - - holder.TextView.SetPadding( - (int)view.Context.ToPixels(_boxedView.HeaderPadding.Left), - (int)view.Context.ToPixels(_boxedView.HeaderPadding.Top), - (int)view.Context.ToPixels(_boxedView.HeaderPadding.Right), - (int)view.Context.ToPixels(_boxedView.HeaderPadding.Bottom)); - - holder.TextView.Gravity = _boxedView.HeaderTextVerticalAlign.ToAndroidVertical() | GravityFlags.Left; - holder.TextView.TextAlignment = Android.Views.TextAlignment.Gravity; - holder.TextView.SetTextSize(Android.Util.ComplexUnitType.Sp, (float)_boxedView.HeaderFontSize); - holder.TextView.SetBackgroundColor(_boxedView.HeaderBackgroundColor.ToAndroid()); - holder.TextView.SetMaxLines(1); - holder.TextView.SetMinLines(1); - holder.TextView.SetTypeface(null, Android.Graphics.TypefaceStyle.Bold); - holder.TextView.Ellipsize = TextUtils.TruncateAt.End; - - if(_boxedView.HeaderTextColor != Color.Default) - { - holder.TextView.SetTextColor(_boxedView.HeaderTextColor.ToAndroid()); - } - - // Border setting - if(_boxedView.ShowSectionTopBottomBorder) - { - holder.Border.SetBackgroundColor(_boxedView.SeparatorColor.ToAndroid()); - } - else - { - holder.Border.SetBackgroundColor(Android.Graphics.Color.Transparent); - } - - // Update text - holder.TextView.Text = formsCell.Text; - } - - private void BindFooterView(FooterViewHolder holder, TextCell formsCell) - { - var view = holder.ItemView; - - // Footer visible setting - if(string.IsNullOrEmpty(formsCell.Text)) - { - //if text is empty, hidden (height 0) - holder.TextView.Visibility = ViewStates.Gone; - view.Visibility = ViewStates.Gone; - } - else - { - holder.TextView.Visibility = ViewStates.Visible; - view.Visibility = ViewStates.Visible; - } - - holder.TextView.SetPadding( - (int)view.Context.ToPixels(_boxedView.FooterPadding.Left), - (int)view.Context.ToPixels(_boxedView.FooterPadding.Top), - (int)view.Context.ToPixels(_boxedView.FooterPadding.Right), - (int)view.Context.ToPixels(_boxedView.FooterPadding.Bottom)); - - holder.TextView.SetTextSize(Android.Util.ComplexUnitType.Sp, (float)_boxedView.FooterFontSize); - holder.TextView.SetBackgroundColor(_boxedView.FooterBackgroundColor.ToAndroid()); - if(_boxedView.FooterTextColor != Color.Default) - { - holder.TextView.SetTextColor(_boxedView.FooterTextColor.ToAndroid()); - } - - // Update text - holder.TextView.Text = formsCell.Text; - } - - private void BindContentView(ContentViewHolder holder, Cell formsCell, int position) - { - AView nativeCell = null; - AView layout = holder.ItemView; - - holder.SectionIndex = CellCaches[position].SectionIndex; - holder.RowIndex = CellCaches[position].RowIndex; - - nativeCell = holder.Body.GetChildAt(0); - if(nativeCell != null) - { - holder.Body.RemoveViewAt(0); - } - - nativeCell = CellFactory.GetCell(formsCell, nativeCell, _recyclerView, _context, _boxedView); - - if(position == _selectedIndex) - { - DeselectRow(); - nativeCell.Selected = true; - _preSelectedCell = nativeCell; - } - - var minHeight = (int)Math.Max(_context.ToPixels(_boxedView.RowHeight), MinRowHeight); - - // It is necessary to set both - layout.SetMinimumHeight(minHeight); - nativeCell.SetMinimumHeight(minHeight); - - if(!_boxedView.HasUnevenRows) - { - // If not Uneven, set the larger one of RowHeight and MinRowHeight. - layout.LayoutParameters.Height = minHeight; - } - else if(formsCell.Height > -1) - { - // If the cell itself was specified height, set it. - layout.SetMinimumHeight((int)_context.ToPixels(formsCell.Height)); - layout.LayoutParameters.Height = (int)_context.ToPixels(formsCell.Height); - } - else if(formsCell is ViewCell viewCell) - { - // If used a viewcell, calculate the size and layout it. - var size = viewCell.View.Measure(_boxedView.Width, double.PositiveInfinity); - viewCell.View.Layout(new Rectangle(0, 0, size.Request.Width, size.Request.Height)); - layout.LayoutParameters.Height = (int)_context.ToPixels(size.Request.Height); - } - else - { - layout.LayoutParameters.Height = -2; // wrap_content - } - - if(!CellCaches[position].IsLastCell || _boxedView.ShowSectionTopBottomBorder) - { - holder.Border.SetBackgroundColor(_boxedView.SeparatorColor.ToAndroid()); - } - else - { - holder.Border.SetBackgroundColor(Android.Graphics.Color.Transparent); - } - - holder.Body.AddView(nativeCell, 0); - } - - private void FillCache() - { - var model = _boxedView.Model; - int sectionCount = model.GetSectionCount(); - - var newCellCaches = new List(); - for(var sectionIndex = 0; sectionIndex < sectionCount; sectionIndex++) - { - var sectionTitle = model.GetSectionTitle(sectionIndex); - var sectionRowCount = model.GetRowCount(sectionIndex); - - Cell headerCell = new TextCell { Text = sectionTitle, Height = model.GetHeaderHeight(sectionIndex) }; - headerCell.Parent = _boxedView; - - newCellCaches.Add(new CellCache - { - Cell = headerCell, - IsHeader = true, - SectionIndex = sectionIndex, - }); - - for(int i = 0; i < sectionRowCount; i++) - { - newCellCaches.Add(new CellCache - { - Cell = model.GetCell(sectionIndex, i), - IsLastCell = i == sectionRowCount - 1, - SectionIndex = sectionIndex, - RowIndex = i - }); - } - - var footerCell = new TextCell { Text = model.GetFooterText(sectionIndex) }; - footerCell.Parent = _boxedView; - - newCellCaches.Add(new CellCache - { - Cell = footerCell, - IsFooter = true, - SectionIndex = sectionIndex, - }); - } - - _cellCaches = newCellCaches; - - if(_viewTypes == null) - { - _viewTypes = _cellCaches - .Select(x => x.Cell.GetType()) - .Distinct() - .Select((x, idx) => new { x, index = idx }) - .ToDictionary(key => key.x, val => val.index + 2); - } - else - { - var idx = _viewTypes.Values.Max() + 1; - foreach(var t in _cellCaches.Select(x => x.Cell.GetType()).Distinct().Except(_viewTypes.Keys).ToList()) - { - _viewTypes.Add(t, idx++); - } - } - } - - public void CellMoved(int fromPos, int toPos) - { - var tmp = CellCaches[fromPos]; - CellCaches.RemoveAt(fromPos); - CellCaches.Insert(toPos, tmp); - } - - [Preserve(AllMembers = true)] - internal class CellCache - { - public Cell Cell { get; set; } - public bool IsHeader { get; set; } = false; - public bool IsFooter { get; set; } = false; - public bool IsLastCell { get; set; } = false; - public int SectionIndex { get; set; } - public int RowIndex { get; set; } - } - } - - [Preserve(AllMembers = true)] - internal class ViewHolder : RecyclerView.ViewHolder - { - public ViewHolder(AView view) - : base(view) { } - - protected override void Dispose(bool disposing) - { - if(disposing) - { - ItemView?.Dispose(); - ItemView = null; - } - base.Dispose(disposing); - } - } - - [Preserve(AllMembers = true)] - internal class HeaderViewHolder : ViewHolder - { - public HeaderViewHolder(AView view, App.Controls.BoxedView.BoxedView boxedView) - : base(view) - { - TextView = view.FindViewById(Resource.Id.HeaderCellText); - Border = view.FindViewById(Resource.Id.HeaderCellBorder); - } - - public TextView TextView { get; private set; } - public LinearLayout Border { get; private set; } - - protected override void Dispose(bool disposing) - { - if(disposing) - { - TextView?.Dispose(); - TextView = null; - Border?.Dispose(); - Border = null; - } - base.Dispose(disposing); - } - } - - [Preserve(AllMembers = true)] - internal class FooterViewHolder : ViewHolder - { - public TextView TextView { get; private set; } - - public FooterViewHolder(AView view, App.Controls.BoxedView.BoxedView boxedView) - : base(view) - { - TextView = view.FindViewById(Resource.Id.FooterCellText); - } - - protected override void Dispose(bool disposing) - { - if(disposing) - { - TextView?.Dispose(); - TextView = null; - } - base.Dispose(disposing); - } - } - - [Preserve(AllMembers = true)] - internal class ContentViewHolder : ViewHolder - { - public LinearLayout Body { get; private set; } - public AView Border { get; private set; } - public int SectionIndex { get; set; } - public int RowIndex { get; set; } - - public ContentViewHolder(AView view) - : base(view) - { - Body = view.FindViewById(Resource.Id.ContentCellBody); - Border = view.FindViewById(Resource.Id.ContentCellBorder); - } - - protected override void Dispose(bool disposing) - { - if(disposing) - { - var nativeCell = Body.GetChildAt(0); - if(nativeCell is INativeElementView nativeElementView) - { - // If a ViewCell is used, it stops the ViewCellContainer from executing the dispose method. - // Because if the AiForms.Effects is used and a ViewCellContainer is disposed, it crashes. - if(!(nativeElementView.Element is ViewCell)) - { - nativeCell?.Dispose(); - } - } - Border?.Dispose(); - Border = null; - Body?.Dispose(); - Body = null; - ItemView.SetOnClickListener(null); - } - base.Dispose(disposing); - } - } -} diff --git a/src/Android/Renderers/BoxedView/BoxedViewRenderer.cs b/src/Android/Renderers/BoxedView/BoxedViewRenderer.cs deleted file mode 100644 index d13f11bdd..000000000 --- a/src/Android/Renderers/BoxedView/BoxedViewRenderer.cs +++ /dev/null @@ -1,196 +0,0 @@ -using Android.Content; -using Android.Runtime; -using Android.Support.V7.Widget; -using Android.Support.V7.Widget.Helper; -using Android.Views; -using Bit.App.Controls.BoxedView; -using Bit.Droid.Renderers.BoxedView; -using System; -using System.ComponentModel; -using Xamarin.Forms; -using Xamarin.Forms.Platform.Android; - -[assembly: ExportRenderer(typeof(BoxedView), typeof(BoxedViewRenderer))] -namespace Bit.Droid.Renderers.BoxedView -{ - [Preserve(AllMembers = true)] - public class BoxedViewRenderer : ViewRenderer - { - private Page _parentPage; - private LinearLayoutManager _layoutManager; - private ItemTouchHelper _itemTouchhelper; - private BoxedViewRecyclerAdapter _adapter; - private BoxedViewSimpleCallback _simpleCallback; - - public BoxedViewRenderer(Context context) - : base(context) - { - AutoPackage = false; - } - - protected override void OnElementChanged(ElementChangedEventArgs e) - { - base.OnElementChanged(e); - if(e.NewElement != null) - { - var recyclerView = new RecyclerView(Context); - _layoutManager = new LinearLayoutManager(Context); - recyclerView.SetLayoutManager(_layoutManager); - - SetNativeControl(recyclerView); - - Control.Focusable = false; - Control.DescendantFocusability = DescendantFocusability.AfterDescendants; - - UpdateBackgroundColor(); - UpdateRowHeight(); - - _adapter = new BoxedViewRecyclerAdapter(Context, e.NewElement, recyclerView); - Control.SetAdapter(_adapter); - - _simpleCallback = new BoxedViewSimpleCallback( - e.NewElement, ItemTouchHelper.Up | ItemTouchHelper.Down, 0); - _itemTouchhelper = new ItemTouchHelper(_simpleCallback); - _itemTouchhelper.AttachToRecyclerView(Control); - - Element elm = Element; - while(elm != null) - { - elm = elm.Parent; - if(elm is Page) - { - break; - } - } - - _parentPage = elm as Page; - _parentPage.Appearing += ParentPageAppearing; - } - } - - private void ParentPageAppearing(object sender, EventArgs e) - { - Device.BeginInvokeOnMainThread(() => _adapter.DeselectRow()); - } - - protected override void OnLayout(bool changed, int left, int top, int right, int bottom) - { - base.OnLayout(changed, left, top, right, bottom); - if(!changed) - { - return; - } - - var startPos = _layoutManager.FindFirstCompletelyVisibleItemPosition(); - var endPos = _layoutManager.FindLastCompletelyVisibleItemPosition(); - - var totalH = 0; - for(var i = startPos; i <= endPos; i++) - { - var child = _layoutManager.GetChildAt(i); - if(child == null) - { - return; - } - - totalH += _layoutManager.GetChildAt(i).Height; - } - Element.VisibleContentHeight = Context.FromPixels(Math.Min(totalH, Control.Height)); - } - - protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) - { - base.OnElementPropertyChanged(sender, e); - if(e.PropertyName == App.Controls.BoxedView.BoxedView.SeparatorColorProperty.PropertyName) - { - _adapter.NotifyDataSetChanged(); - } - else if(e.PropertyName == App.Controls.BoxedView.BoxedView.BackgroundColorProperty.PropertyName) - { - UpdateBackgroundColor(); - } - else if(e.PropertyName == TableView.RowHeightProperty.PropertyName) - { - UpdateRowHeight(); - } - else if(e.PropertyName == App.Controls.BoxedView.BoxedView.SelectedColorProperty.PropertyName) - { - //_adapter.NotifyDataSetChanged(); - } - else if(e.PropertyName == App.Controls.BoxedView.BoxedView.ShowSectionTopBottomBorderProperty.PropertyName) - { - _adapter.NotifyDataSetChanged(); - } - else if(e.PropertyName == TableView.HasUnevenRowsProperty.PropertyName) - { - _adapter.NotifyDataSetChanged(); - } - else if(e.PropertyName == App.Controls.BoxedView.BoxedView.ScrollToTopProperty.PropertyName) - { - UpdateScrollToTop(); - } - else if(e.PropertyName == App.Controls.BoxedView.BoxedView.ScrollToBottomProperty.PropertyName) - { - UpdateScrollToBottom(); - } - } - - private void UpdateRowHeight() - { - if(Element.RowHeight == -1) - { - Element.RowHeight = 60; - } - else - { - _adapter?.NotifyDataSetChanged(); - } - } - - private void UpdateScrollToTop() - { - if(Element.ScrollToTop) - { - _layoutManager.ScrollToPosition(0); - Element.ScrollToTop = false; - } - } - - private void UpdateScrollToBottom() - { - if(Element.ScrollToBottom) - { - if(_adapter != null) - { - _layoutManager.ScrollToPosition(_adapter.ItemCount - 1); - } - Element.ScrollToBottom = false; - } - } - - protected new void UpdateBackgroundColor() - { - if(Element.BackgroundColor != Color.Default) - { - Control.SetBackgroundColor(Element.BackgroundColor.ToAndroid()); - } - } - - protected override void Dispose(bool disposing) - { - if(disposing) - { - _parentPage.Appearing -= ParentPageAppearing; - _adapter?.Dispose(); - _adapter = null; - _layoutManager?.Dispose(); - _layoutManager = null; - _simpleCallback?.Dispose(); - _simpleCallback = null; - _itemTouchhelper?.Dispose(); - _itemTouchhelper = null; - } - base.Dispose(disposing); - } - } -} diff --git a/src/Android/Renderers/BoxedView/BoxedViewSimpleCallback.cs b/src/Android/Renderers/BoxedView/BoxedViewSimpleCallback.cs deleted file mode 100644 index e94f7ed06..000000000 --- a/src/Android/Renderers/BoxedView/BoxedViewSimpleCallback.cs +++ /dev/null @@ -1,104 +0,0 @@ -using Android.Runtime; -using Android.Support.V7.Widget; -using Android.Support.V7.Widget.Helper; -using System; - -namespace Bit.Droid.Renderers.BoxedView -{ - [Preserve(AllMembers = true)] - public class BoxedViewSimpleCallback : ItemTouchHelper.SimpleCallback - { - private App.Controls.BoxedView.BoxedView _boxedView; - private int _offset = 0; - - public BoxedViewSimpleCallback(App.Controls.BoxedView.BoxedView boxedView, int dragDirs, int swipeDirs) - : base(dragDirs, swipeDirs) - { - _boxedView = boxedView; - } - - public override bool OnMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, - RecyclerView.ViewHolder target) - { - if(!(viewHolder is ContentViewHolder fromContentHolder)) - { - return false; - } - if(!(target is ContentViewHolder toContentHolder)) - { - return false; - } - if(fromContentHolder.SectionIndex != toContentHolder.SectionIndex) - { - return false; - } - var section = _boxedView.Model.GetSection(fromContentHolder.SectionIndex); - if(section == null || !section.UseDragSort) - { - return false; - } - - var fromPos = viewHolder.AdapterPosition; - var toPos = target.AdapterPosition; - _offset += toPos - fromPos; - var settingsAdapter = recyclerView.GetAdapter() as BoxedViewRecyclerAdapter; - settingsAdapter.NotifyItemMoved(fromPos, toPos); // rows update - settingsAdapter.CellMoved(fromPos, toPos); // caches update - return true; - } - - public override void ClearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) - { - base.ClearView(recyclerView, viewHolder); - if(!(viewHolder is ContentViewHolder contentHolder)) - { - return; - } - - var section = _boxedView.Model.GetSection(contentHolder.SectionIndex); - var pos = contentHolder.RowIndex; - if(section.ItemsSource == null) - { - var tmp = section[pos]; - section.RemoveAt(pos); - section.Insert(pos + _offset, tmp); - } - else if(section.ItemsSource != null) - { - // must update DataSource at this timing. - var tmp = section.ItemsSource[pos]; - section.ItemsSource.RemoveAt(pos); - section.ItemsSource.Insert(pos + _offset, tmp); - } - _offset = 0; - } - - public override int GetDragDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) - { - if(!(viewHolder is ContentViewHolder contentHolder)) - { - return 0; - } - var section = _boxedView.Model.GetSection(contentHolder.SectionIndex); - if(section == null || !section.UseDragSort) - { - return 0; - } - return base.GetDragDirs(recyclerView, viewHolder); - } - - public override void OnSwiped(RecyclerView.ViewHolder viewHolder, int direction) - { - throw new NotImplementedException(); - } - - protected override void Dispose(bool disposing) - { - if(disposing) - { - _boxedView = null; - } - base.Dispose(disposing); - } - } -} diff --git a/src/Android/Renderers/BoxedView/Cells/BaseCellRenderer.cs b/src/Android/Renderers/BoxedView/Cells/BaseCellRenderer.cs deleted file mode 100644 index 2a8c57343..000000000 --- a/src/Android/Renderers/BoxedView/Cells/BaseCellRenderer.cs +++ /dev/null @@ -1,75 +0,0 @@ -using Android.Content; -using Android.Runtime; -using Android.Views; -using Bit.App.Controls.BoxedView; -using System; -using System.Linq; -using System.Linq.Expressions; -using System.Reflection; -using Xamarin.Forms.Platform.Android; - -namespace Bit.Droid.Renderers.BoxedView -{ - [Preserve(AllMembers = true)] - public class BaseCellRenderer : CellRenderer where TNativeCell : BaseCellView - { - protected override View GetCellCore(Xamarin.Forms.Cell item, View convertView, ViewGroup parent, - Context context) - { - if(!(convertView is TNativeCell nativeCell)) - { - nativeCell = InstanceCreator.Create(context, item); - } - ClearPropertyChanged(nativeCell); - nativeCell.Cell = item; - SetUpPropertyChanged(nativeCell); - nativeCell.UpdateCell(); - return nativeCell; - } - - protected void SetUpPropertyChanged(BaseCellView nativeCell) - { - var formsCell = nativeCell.Cell as BaseCell; - formsCell.PropertyChanged += nativeCell.CellPropertyChanged; - if(formsCell.Parent is App.Controls.BoxedView.BoxedView parentElement) - { - parentElement.PropertyChanged += nativeCell.ParentPropertyChanged; - var section = parentElement.Model.GetSection(BoxedModel.GetPath(formsCell).Item1); - if(section != null) - { - formsCell.Section = section; - formsCell.Section.PropertyChanged += nativeCell.SectionPropertyChanged; - } - } - } - - private void ClearPropertyChanged(BaseCellView nativeCell) - { - var formsCell = nativeCell.Cell as BaseCell; - formsCell.PropertyChanged -= nativeCell.CellPropertyChanged; - if(formsCell.Parent is App.Controls.BoxedView.BoxedView parentElement) - { - parentElement.PropertyChanged -= nativeCell.ParentPropertyChanged; - if(formsCell.Section != null) - { - formsCell.Section.PropertyChanged -= nativeCell.SectionPropertyChanged; - } - } - } - - internal static class InstanceCreator - { - public static Func Create { get; } = CreateInstance(); - - private static Func CreateInstance() - { - var argsTypes = new[] { typeof(T1), typeof(T2) }; - var constructor = typeof(TInstance).GetConstructor( - BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, - Type.DefaultBinder, argsTypes, null); - var args = argsTypes.Select(Expression.Parameter).ToArray(); - return Expression.Lambda>(Expression.New(constructor, args), args).Compile(); - } - } - } -} diff --git a/src/Android/Renderers/BoxedView/Cells/BaseCellView.cs b/src/Android/Renderers/BoxedView/Cells/BaseCellView.cs deleted file mode 100644 index 1db2aa249..000000000 --- a/src/Android/Renderers/BoxedView/Cells/BaseCellView.cs +++ /dev/null @@ -1,373 +0,0 @@ -using Android.Content; -using Android.Graphics.Drawables; -using Android.Runtime; -using Android.Util; -using Android.Views; -using Android.Widget; -using Bit.App.Controls.BoxedView; -using System; -using System.ComponentModel; -using System.Threading; -using Xamarin.Forms; -using Xamarin.Forms.Platform.Android; -using ARelativeLayout = Android.Widget.RelativeLayout; - -namespace Bit.Droid.Renderers.BoxedView -{ - [Preserve(AllMembers = true)] - public class BaseCellView : ARelativeLayout, INativeElementView - { - private bool _debugWithColors = false; - private CancellationTokenSource _iconTokenSource; - private Android.Graphics.Color _defaultTextColor; - private ColorDrawable _backgroundColor; - private ColorDrawable _selectedColor; - private RippleDrawable _ripple; - private float _defaultFontSize; - - protected Context _Context; - - public BaseCellView(Context context, Cell cell) - : base(context) - { - _Context = context; - Cell = cell; - CreateContentView(); - } - - public Cell Cell { get; set; } - public Element Element => Cell; - protected BaseCell CellBase => Cell as BaseCell; - public App.Controls.BoxedView.BoxedView CellParent => Cell.Parent as App.Controls.BoxedView.BoxedView; - public TextView CellTitle { get; set; } - public LinearLayout CellTitleContent { get; set; } - public LinearLayout CellContent { get; set; } - public LinearLayout CellButtonContent { get; set; } - public Android.Widget.ImageButton CellButton1 { get; set; } - public Android.Widget.ImageButton CellButton2 { get; set; } - public Android.Widget.ImageButton CellButton3 { get; set; } - public LinearLayout CellAccessory { get; set; } - - private void CreateContentView() - { - var contentView = (_Context as FormsAppCompatActivity) - .LayoutInflater - .Inflate(Resource.Layout.CellBaseView, this, true); - - contentView.LayoutParameters = new ViewGroup.LayoutParams(-1, -1); - - CellTitle = contentView.FindViewById(Resource.Id.CellTitle); - CellContent = contentView.FindViewById(Resource.Id.CellContent); - CellTitleContent = contentView.FindViewById(Resource.Id.CellTitleContent); - CellButtonContent = contentView.FindViewById(Resource.Id.CellButtonContent); - CellButton1 = contentView.FindViewById(Resource.Id.CellButton1); - CellButton1.Click += CellButton1_Click; - CellButton2 = contentView.FindViewById(Resource.Id.CellButton2); - CellButton2.Click += CellButton2_Click; - CellButton3 = contentView.FindViewById(Resource.Id.CellButton3); - CellButton3.Click += CellButton3_Click; - CellAccessory = contentView.FindViewById(Resource.Id.CellAccessory); - - _backgroundColor = new ColorDrawable(); - _selectedColor = new ColorDrawable(Android.Graphics.Color.Argb(125, 180, 180, 180)); - - var sel = new StateListDrawable(); - - sel.AddState(new int[] { Android.Resource.Attribute.StateSelected }, _selectedColor); - sel.AddState(new int[] { -Android.Resource.Attribute.StateSelected }, _backgroundColor); - sel.SetExitFadeDuration(250); - sel.SetEnterFadeDuration(250); - - var rippleColor = Android.Graphics.Color.Rgb(180, 180, 180); - if(CellParent.SelectedColor != Color.Default) - { - rippleColor = CellParent.SelectedColor.ToAndroid(); - } - _ripple = RendererUtils.CreateRipple(rippleColor, sel); - Background = _ripple; - - _defaultTextColor = new Android.Graphics.Color(CellTitle.CurrentTextColor); - _defaultFontSize = CellTitle.TextSize; - - if(_debugWithColors) - { - contentView.Background = _Context.GetDrawable(Android.Resource.Color.HoloGreenLight); - CellContent.Background = _Context.GetDrawable(Android.Resource.Color.HoloOrangeLight); - CellButtonContent.Background = _Context.GetDrawable(Android.Resource.Color.HoloOrangeDark); - CellTitle.Background = _Context.GetDrawable(Android.Resource.Color.HoloBlueLight); - } - } - - public virtual void CellPropertyChanged(object sender, PropertyChangedEventArgs e) - { - if(e.PropertyName == BaseCell.TitleProperty.PropertyName) - { - UpdateTitleText(); - } - else if(e.PropertyName == BaseCell.TitleColorProperty.PropertyName) - { - UpdateTitleColor(); - } - else if(e.PropertyName == BaseCell.TitleFontSizeProperty.PropertyName) - { - UpdateTitleFontSize(); - } - else if(e.PropertyName == BaseCell.BackgroundColorProperty.PropertyName) - { - UpdateBackgroundColor(); - } - else if(e.PropertyName == Cell.IsEnabledProperty.PropertyName) - { - UpdateIsEnabled(); - } - else if(e.PropertyName == BaseCell.Button1IconProperty.PropertyName) - { - UpdateButtonIcon(CellButton1, CellBase.Button1Icon); - } - else if(e.PropertyName == BaseCell.Button2IconProperty.PropertyName) - { - UpdateButtonIcon(CellButton2, CellBase.Button2Icon); - } - else if(e.PropertyName == BaseCell.Button3IconProperty.PropertyName) - { - UpdateButtonIcon(CellButton3, CellBase.Button3Icon); - } - } - - public virtual void ParentPropertyChanged(object sender, PropertyChangedEventArgs e) - { - // Avoid running the vain process when popping a page. - if((sender as BindableObject)?.BindingContext == null) - { - return; - } - - if(e.PropertyName == App.Controls.BoxedView.BoxedView.CellTitleColorProperty.PropertyName) - { - UpdateTitleColor(); - } - else if(e.PropertyName == App.Controls.BoxedView.BoxedView.CellTitleFontSizeProperty.PropertyName) - { - UpdateWithForceLayout(UpdateTitleFontSize); - } - else if(e.PropertyName == App.Controls.BoxedView.BoxedView.CellBackgroundColorProperty.PropertyName) - { - UpdateBackgroundColor(); - } - else if(e.PropertyName == App.Controls.BoxedView.BoxedView.SelectedColorProperty.PropertyName) - { - UpdateWithForceLayout(UpdateSelectedColor); - } - } - - public virtual void SectionPropertyChanged(object sender, PropertyChangedEventArgs e) - { } - - public virtual void RowSelected(BoxedViewRecyclerAdapter adapter, int position) - { } - - protected void UpdateWithForceLayout(Action updateAction) - { - updateAction(); - Invalidate(); - } - - public virtual void UpdateCell() - { - UpdateButtonIcon(CellButton1, CellBase.Button1Icon); - UpdateButtonIcon(CellButton2, CellBase.Button2Icon); - UpdateButtonIcon(CellButton3, CellBase.Button3Icon); - UpdateBackgroundColor(); - UpdateSelectedColor(); - UpdateTitleText(); - UpdateTitleColor(); - UpdateTitleFontSize(); - - UpdateIsEnabled(); - - Invalidate(); - } - - private void UpdateButtonIcon(Android.Widget.ImageButton cellButton, string icon) - { - if(string.IsNullOrWhiteSpace(icon)) - { - cellButton.Visibility = ViewStates.Gone; - } - else - { - cellButton.SetImageDrawable(_Context.GetDrawable(icon)); - cellButton.SetImageDrawable(_Context.GetDrawable(icon)); - cellButton.Visibility = ViewStates.Visible; - } - } - - private void CellButton1_Click(object sender, EventArgs e) - { - if(CellBase.Button1Command?.CanExecute(CellBase.Button1CommandParameter) ?? false) - { - CellBase.Button1Command.Execute(CellBase.Button1CommandParameter); - } - } - - private void CellButton2_Click(object sender, EventArgs e) - { - if(CellBase.Button2Command?.CanExecute(CellBase.Button2CommandParameter) ?? false) - { - CellBase.Button2Command.Execute(CellBase.Button2CommandParameter); - } - } - - private void CellButton3_Click(object sender, EventArgs e) - { - if(CellBase.Button3Command?.CanExecute(CellBase.Button3CommandParameter) ?? false) - { - CellBase.Button3Command.Execute(CellBase.Button3CommandParameter); - } - } - - private void UpdateBackgroundColor() - { - Selected = false; - if(CellBase.BackgroundColor != Color.Default) - { - _backgroundColor.Color = CellBase.BackgroundColor.ToAndroid(); - } - else if(CellParent != null && CellParent.CellBackgroundColor != Color.Default) - { - _backgroundColor.Color = CellParent.CellBackgroundColor.ToAndroid(); - } - else - { - _backgroundColor.Color = Android.Graphics.Color.Transparent; - } - } - - private void UpdateSelectedColor() - { - if(CellParent != null && CellParent.SelectedColor != Color.Default) - { - _selectedColor.Color = CellParent.SelectedColor.MultiplyAlpha(0.5).ToAndroid(); - _ripple.SetColor(RendererUtils.GetPressedColorSelector(CellParent.SelectedColor.ToAndroid())); - } - else - { - _selectedColor.Color = Android.Graphics.Color.Argb(125, 180, 180, 180); - _ripple.SetColor(RendererUtils.GetPressedColorSelector(Android.Graphics.Color.Rgb(180, 180, 180))); - } - } - - private void UpdateTitleText() - { - CellTitle.Text = CellBase.Title; - // Hide TextView right padding when TextView.Text empty. - CellTitle.Visibility = string.IsNullOrEmpty(CellTitle.Text) ? ViewStates.Gone : ViewStates.Visible; - } - - private void UpdateTitleColor() - { - if(CellBase.TitleColor != Color.Default) - { - CellTitle.SetTextColor(CellBase.TitleColor.ToAndroid()); - } - else if(CellParent != null && CellParent.CellTitleColor != Color.Default) - { - CellTitle.SetTextColor(CellParent.CellTitleColor.ToAndroid()); - } - else - { - CellTitle.SetTextColor(_defaultTextColor); - } - } - - private void UpdateTitleFontSize() - { - if(CellBase.TitleFontSize > 0) - { - CellTitle.SetTextSize(ComplexUnitType.Sp, (float)CellBase.TitleFontSize); - } - else if(CellParent != null) - { - CellTitle.SetTextSize(ComplexUnitType.Sp, (float)CellParent.CellTitleFontSize); - } - else - { - CellTitle.SetTextSize(ComplexUnitType.Sp, _defaultFontSize); - } - } - - protected virtual void UpdateIsEnabled() - { - SetEnabledAppearance(CellBase.IsEnabled); - } - - protected virtual void SetEnabledAppearance(bool isEnabled) - { - if(isEnabled) - { - Focusable = false; - DescendantFocusability = DescendantFocusability.AfterDescendants; - CellTitle.Alpha = 1f; - } - else - { - // not to invoke a ripple effect and not to selected - Focusable = true; - DescendantFocusability = DescendantFocusability.BlockDescendants; - // to turn like disabled - CellTitle.Alpha = 0.3f; - } - } - - protected override void Dispose(bool disposing) - { - if(disposing) - { - CellBase.PropertyChanged -= CellPropertyChanged; - CellParent.PropertyChanged -= ParentPropertyChanged; - CellButton1.Click -= CellButton1_Click; - CellButton2.Click -= CellButton2_Click; - CellButton3.Click -= CellButton3_Click; - - if(CellBase.Section != null) - { - CellBase.Section.PropertyChanged -= SectionPropertyChanged; - CellBase.Section = null; - } - - CellTitle?.Dispose(); - CellTitle = null; - CellTitleContent?.Dispose(); - CellTitleContent = null; - CellAccessory?.Dispose(); - CellAccessory = null; - CellButton1?.Dispose(); - CellButton1 = null; - CellButton2?.Dispose(); - CellButton2 = null; - CellButton3?.Dispose(); - CellButton3 = null; - CellButtonContent?.Dispose(); - CellButtonContent = null; - CellContent?.Dispose(); - CellContent = null; - Cell = null; - - _iconTokenSource?.Dispose(); - _iconTokenSource = null; - _Context = null; - - _backgroundColor?.Dispose(); - _backgroundColor = null; - _selectedColor?.Dispose(); - _selectedColor = null; - _ripple?.Dispose(); - _ripple = null; - - Background?.Dispose(); - Background = null; - } - base.Dispose(disposing); - } - } -} diff --git a/src/Android/Renderers/BoxedView/Cells/EntryCellRenderer.cs b/src/Android/Renderers/BoxedView/Cells/EntryCellRenderer.cs deleted file mode 100644 index 45123f091..000000000 --- a/src/Android/Renderers/BoxedView/Cells/EntryCellRenderer.cs +++ /dev/null @@ -1,282 +0,0 @@ -using Android.Content; -using Android.OS; -using Android.Runtime; -using Android.Text; -using Android.Text.Method; -using Android.Views; -using Android.Views.InputMethods; -using Android.Widget; -using Java.Lang; -using System; -using System.ComponentModel; -using Xamarin.Forms; -using Xamarin.Forms.Platform.Android; - -[assembly: ExportRenderer(typeof(Bit.App.Controls.BoxedView.EntryCell), - typeof(Bit.Droid.Renderers.BoxedView.EntryCellRenderer))] -namespace Bit.Droid.Renderers.BoxedView -{ - [Preserve(AllMembers = true)] - public class EntryCellRenderer : BaseCellRenderer - { } - - [Preserve(AllMembers = true)] - public class EntryCellView : BaseCellView, ITextWatcher, Android.Views.View.IOnFocusChangeListener, - TextView.IOnEditorActionListener - { - private bool _debugWithColors = false; - private CustomEditText _editText; - - public EntryCellView(Context context, Cell cell) - : base(context, cell) - { - _editText = new CustomEditText(context) - { - Focusable = true, - ImeOptions = ImeAction.Done, - OnFocusChangeListener = this, - Ellipsize = TextUtils.TruncateAt.End, - ClearFocusAction = DoneEdit, - Background = _Context.GetDrawable(Android.Resource.Color.Transparent) - }; - _editText.SetPadding(0, 0, 0, 0); - _editText.SetOnEditorActionListener(this); - _editText.SetSingleLine(true); - _editText.InputType |= InputTypes.TextFlagNoSuggestions; // Disabled spell check - - Click += EntryCellView_Click; - - using(var lParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MatchParent, - ViewGroup.LayoutParams.WrapContent)) - { - CellContent.AddView(_editText, lParams); - } - - if(_debugWithColors) - { - _editText.Background = _Context.GetDrawable(Android.Resource.Color.HoloRedLight); - } - } - - App.Controls.BoxedView.EntryCell _EntryCell => Cell as App.Controls.BoxedView.EntryCell; - - public override void UpdateCell() - { - UpdateValueText(); - UpdateValueTextColor(); - UpdateValueTextFontSize(); - UpdateKeyboard(); - UpdatePlaceholder(); - UpdateTextAlignment(); - UpdateIsPassword(); - base.UpdateCell(); - } - - public override void CellPropertyChanged(object sender, PropertyChangedEventArgs e) - { - base.CellPropertyChanged(sender, e); - if(e.PropertyName == App.Controls.BoxedView.EntryCell.ValueTextProperty.PropertyName) - { - UpdateValueText(); - } - else if(e.PropertyName == App.Controls.BoxedView.EntryCell.ValueTextFontSizeProperty.PropertyName) - { - UpdateWithForceLayout(UpdateValueTextFontSize); - } - else if(e.PropertyName == App.Controls.BoxedView.EntryCell.ValueTextColorProperty.PropertyName) - { - UpdateWithForceLayout(UpdateValueTextColor); - } - else if(e.PropertyName == App.Controls.BoxedView.EntryCell.KeyboardProperty.PropertyName) - { - UpdateKeyboard(); - } - else if(e.PropertyName == App.Controls.BoxedView.EntryCell.PlaceholderProperty.PropertyName) - { - UpdatePlaceholder(); - } - else if(e.PropertyName == App.Controls.BoxedView.EntryCell.TextAlignmentProperty.PropertyName) - { - UpdateTextAlignment(); - } - else if(e.PropertyName == App.Controls.BoxedView.EntryCell.IsPasswordProperty.PropertyName) - { - UpdateIsPassword(); - } - } - - public override void ParentPropertyChanged(object sender, PropertyChangedEventArgs e) - { - base.ParentPropertyChanged(sender, e); - if(e.PropertyName == App.Controls.BoxedView.BoxedView.CellValueTextColorProperty.PropertyName) - { - UpdateValueTextColor(); - } - else if(e.PropertyName == App.Controls.BoxedView.BoxedView.CellValueTextFontSizeProperty.PropertyName) - { - UpdateWithForceLayout(UpdateValueTextFontSize); - } - } - - protected override void Dispose(bool disposing) - { - if(disposing) - { - Click -= EntryCellView_Click; - _editText.RemoveFromParent(); - _editText.SetOnEditorActionListener(null); - _editText.RemoveTextChangedListener(this); - _editText.OnFocusChangeListener = null; - _editText.ClearFocusAction = null; - _editText.Dispose(); - _editText = null; - } - base.Dispose(disposing); - } - - private void EntryCellView_Click(object sender, EventArgs e) - { - _editText.RequestFocus(); - ShowKeyboard(_editText); - } - - private void UpdateValueText() - { - _editText.RemoveTextChangedListener(this); - if(_editText.Text != _EntryCell.ValueText) - { - _editText.Text = _EntryCell.ValueText; - } - _editText.AddTextChangedListener(this); - } - - private void UpdateValueTextFontSize() - { - if(_EntryCell.ValueTextFontSize > 0) - { - _editText.SetTextSize(Android.Util.ComplexUnitType.Sp, (float)_EntryCell.ValueTextFontSize); - } - else if(CellParent != null) - { - _editText.SetTextSize(Android.Util.ComplexUnitType.Sp, (float)CellParent.CellValueTextFontSize); - } - } - - private void UpdateValueTextColor() - { - if(_EntryCell.ValueTextColor != Color.Default) - { - _editText.SetTextColor(_EntryCell.ValueTextColor.ToAndroid()); - } - else if(CellParent != null && CellParent.CellValueTextColor != Color.Default) - { - _editText.SetTextColor(CellParent.CellValueTextColor.ToAndroid()); - } - } - - private void UpdateKeyboard() - { - _editText.InputType = _EntryCell.Keyboard.ToInputType() | InputTypes.TextFlagNoSuggestions; - } - - private void UpdateIsPassword() - { - _editText.TransformationMethod = _EntryCell.IsPassword ? new PasswordTransformationMethod() : null; - } - - private void UpdatePlaceholder() - { - _editText.Hint = _EntryCell.Placeholder; - _editText.SetHintTextColor(Android.Graphics.Color.Rgb(210, 210, 210)); - } - - private void UpdateTextAlignment() - { - _editText.Gravity = _EntryCell.TextAlignment.ToAndroidHorizontal(); - } - - private void DoneEdit() - { - var entryCell = (IEntryCellController)Cell; - entryCell.SendCompleted(); - _editText.ClearFocus(); - ClearFocus(); - } - - private void HideKeyboard(Android.Views.View inputView) - { - using(var inputMethodManager = (InputMethodManager)_Context.GetSystemService(Context.InputMethodService)) - { - IBinder windowToken = inputView.WindowToken; - if(windowToken != null) - { - inputMethodManager.HideSoftInputFromWindow(windowToken, HideSoftInputFlags.None); - } - } - } - - private void ShowKeyboard(Android.Views.View inputView) - { - using(var inputMethodManager = (InputMethodManager)_Context.GetSystemService(Context.InputMethodService)) - { - inputMethodManager.ShowSoftInput(inputView, ShowFlags.Forced); - inputMethodManager.ToggleSoftInput(ShowFlags.Forced, HideSoftInputFlags.ImplicitOnly); - } - } - - bool TextView.IOnEditorActionListener.OnEditorAction(TextView v, ImeAction actionId, KeyEvent e) - { - if(actionId == ImeAction.Done || (actionId == ImeAction.ImeNull && e.KeyCode == Keycode.Enter)) - { - HideKeyboard(v); - DoneEdit(); - } - return true; - } - - void ITextWatcher.AfterTextChanged(IEditable s) - { } - - void ITextWatcher.BeforeTextChanged(ICharSequence s, int start, int count, int after) - { } - - void ITextWatcher.OnTextChanged(ICharSequence s, int start, int before, int count) - { - _EntryCell.ValueText = s?.ToString(); - } - - void IOnFocusChangeListener.OnFocusChange(Android.Views.View v, bool hasFocus) - { - if(hasFocus) - { - // Show underline when on focus. - _editText.Background.Alpha = 100; - } - else - { - // Hide underline - _editText.Background.Alpha = 0; - } - } - } - - [Preserve(AllMembers = true)] - internal class CustomEditText : EditText - { - public CustomEditText(Context context) - : base(context) - { } - - public Action ClearFocusAction { get; set; } - - public override bool OnKeyPreIme(Keycode keyCode, KeyEvent e) - { - if(keyCode == Keycode.Back && e.Action == KeyEventActions.Up) - { - ClearFocus(); - ClearFocusAction?.Invoke(); - } - return base.OnKeyPreIme(keyCode, e); - } - } -} diff --git a/src/Android/Renderers/BoxedView/Cells/LabelCellRenderer.cs b/src/Android/Renderers/BoxedView/Cells/LabelCellRenderer.cs deleted file mode 100644 index cdd080cb9..000000000 --- a/src/Android/Renderers/BoxedView/Cells/LabelCellRenderer.cs +++ /dev/null @@ -1,127 +0,0 @@ -using Android.Content; -using Android.Runtime; -using Android.Text; -using Android.Views; -using Android.Widget; -using Bit.App.Controls.BoxedView; -using Bit.Droid.Renderers.BoxedView; -using System.ComponentModel; -using Xamarin.Forms; -using Xamarin.Forms.Platform.Android; - -[assembly: ExportRenderer(typeof(LabelCell), typeof(LabelCellRenderer))] -namespace Bit.Droid.Renderers.BoxedView -{ - [Preserve(AllMembers = true)] - public class LabelCellRenderer : BaseCellRenderer - { } - - [Preserve(AllMembers = true)] - public class LabelCellView : BaseCellView - { - private bool _debugWithColors = false; - private TextView _valueLabel; - - public LabelCellView(Context context, Cell cell) - : base(context, cell) - { - _valueLabel = new TextView(context) - { - Ellipsize = TextUtils.TruncateAt.End, - Gravity = GravityFlags.Left, - }; - _valueLabel.SetSingleLine(true); - - using(var lParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WrapContent, - ViewGroup.LayoutParams.WrapContent)) - { - CellContent.AddView(_valueLabel, lParams); - } - - if(_debugWithColors) - { - _valueLabel.Background = _Context.GetDrawable(Android.Resource.Color.HoloRedLight); - } - } - - private LabelCell LabelCell => Cell as LabelCell; - - public override void CellPropertyChanged(object sender, PropertyChangedEventArgs e) - { - base.CellPropertyChanged(sender, e); - if(e.PropertyName == LabelCell.ValueTextProperty.PropertyName) - { - UpdateValueText(); - } - else if(e.PropertyName == LabelCell.ValueTextFontSizeProperty.PropertyName) - { - UpdateValueTextFontSize(); - } - else if(e.PropertyName == LabelCell.ValueTextColorProperty.PropertyName) - { - UpdateValueTextColor(); - } - } - - public override void ParentPropertyChanged(object sender, PropertyChangedEventArgs e) - { - base.ParentPropertyChanged(sender, e); - if(e.PropertyName == App.Controls.BoxedView.BoxedView.CellValueTextColorProperty.PropertyName) - { - UpdateValueTextColor(); - } - else if(e.PropertyName == App.Controls.BoxedView.BoxedView.CellValueTextFontSizeProperty.PropertyName) - { - UpdateValueTextFontSize(); - } - } - - public override void UpdateCell() - { - base.UpdateCell(); - UpdateValueText(); - UpdateValueTextColor(); - UpdateValueTextFontSize(); - } - - protected void UpdateValueText() - { - _valueLabel.Text = LabelCell.ValueText; - } - - private void UpdateValueTextFontSize() - { - if(LabelCell.ValueTextFontSize > 0) - { - _valueLabel.SetTextSize(Android.Util.ComplexUnitType.Sp, (float)LabelCell.ValueTextFontSize); - } - else if(CellParent != null) - { - _valueLabel.SetTextSize(Android.Util.ComplexUnitType.Sp, (float)CellParent.CellValueTextFontSize); - } - Invalidate(); - } - - private void UpdateValueTextColor() - { - if(LabelCell.ValueTextColor != Color.Default) - { - _valueLabel.SetTextColor(LabelCell.ValueTextColor.ToAndroid()); - } - else if(CellParent != null && CellParent.CellValueTextColor != Color.Default) - { - _valueLabel.SetTextColor(CellParent.CellValueTextColor.ToAndroid()); - } - } - - protected override void Dispose(bool disposing) - { - if(disposing) - { - _valueLabel?.Dispose(); - _valueLabel = null; - } - base.Dispose(disposing); - } - } -} diff --git a/src/Android/Renderers/RendererUtils.cs b/src/Android/Renderers/RendererUtils.cs deleted file mode 100644 index 249032922..000000000 --- a/src/Android/Renderers/RendererUtils.cs +++ /dev/null @@ -1,79 +0,0 @@ -using Android.Content.Res; -using Android.Graphics.Drawables; -using Android.Views; -using Xamarin.Forms; - -namespace Bit.Droid.Renderers -{ - [Android.Runtime.Preserve(AllMembers = true)] - public static class RendererUtils - { - public static GravityFlags ToAndroidVertical(this LayoutAlignment formsAlignment) - { - switch(formsAlignment) - { - case LayoutAlignment.Start: - return GravityFlags.Top; - case LayoutAlignment.Center: - return GravityFlags.CenterVertical; - case LayoutAlignment.End: - return GravityFlags.Bottom; - default: - return GravityFlags.FillHorizontal; - } - } - - public static GravityFlags ToAndroidHorizontal(this LayoutAlignment formsAlignment) - { - switch(formsAlignment) - { - case LayoutAlignment.Start: - return GravityFlags.Start; - case LayoutAlignment.Center: - return GravityFlags.CenterHorizontal; - case LayoutAlignment.End: - return GravityFlags.End; - default: - return GravityFlags.FillVertical; - } - } - - public static GravityFlags ToAndroidHorizontal(this Xamarin.Forms.TextAlignment formsAlignment) - { - switch(formsAlignment) - { - case Xamarin.Forms.TextAlignment.Start: - return GravityFlags.Left | GravityFlags.CenterVertical; - case Xamarin.Forms.TextAlignment.Center: - return GravityFlags.Center | GravityFlags.CenterVertical; - case Xamarin.Forms.TextAlignment.End: - return GravityFlags.Right | GravityFlags.CenterVertical; - default: - return GravityFlags.Left | GravityFlags.CenterVertical; - } - } - - public static RippleDrawable CreateRipple(Android.Graphics.Color color, Drawable background = null) - { - if(background == null) - { - var mask = new ColorDrawable(Android.Graphics.Color.White); - return new RippleDrawable(GetPressedColorSelector(color), null, mask); - } - return new RippleDrawable(GetPressedColorSelector(color), background, null); - } - - public static ColorStateList GetPressedColorSelector(int pressedColor) - { - return new ColorStateList( - new int[][] - { - new int[]{} - }, - new int[] - { - pressedColor, - }); - } - } -}