diff --git a/src/Android/Android.csproj b/src/Android/Android.csproj index d08158be9..5d37b12e0 100644 --- a/src/Android/Android.csproj +++ b/src/Android/Android.csproj @@ -197,6 +197,7 @@ + diff --git a/src/Android/Controls/ExtendedTextCellRenderer.cs b/src/Android/Controls/ExtendedTextCellRenderer.cs index 845b3f090..51dfd375f 100644 --- a/src/Android/Controls/ExtendedTextCellRenderer.cs +++ b/src/Android/Controls/ExtendedTextCellRenderer.cs @@ -6,6 +6,7 @@ using Bit.App.Controls; using Xamarin.Forms; using Xamarin.Forms.Platform.Android; using AView = Android.Views.View; +using Android.Widget; [assembly: ExportRenderer(typeof(ExtendedTextCell), typeof(ExtendedTextCellRenderer))] namespace Bit.Android.Controls @@ -16,11 +17,29 @@ namespace Bit.Android.Controls protected override AView GetCellCore(Cell item, AView convertView, ViewGroup parent, Context context) { - var View = base.GetCellCore(item, convertView, parent, context); + var View = (BaseCellView)base.GetCellCore(item, convertView, parent, context); + var extendedCell = (ExtendedTextCell)item; - var cell = (ExtendedTextCell)item; + if(View != null) + { + View.SetBackgroundColor(extendedCell.BackgroundColor.ToAndroid()); - View.SetBackgroundColor(cell.BackgroundColor.ToAndroid()); + if(extendedCell.ShowDisclousure) + { + // TODO: different image + var resourceId = Resource.Drawable.fa_folder_open; + if(!string.IsNullOrWhiteSpace(extendedCell.DisclousureImage)) + { + var fileName = System.IO.Path.GetFileNameWithoutExtension(extendedCell.DisclousureImage); + resourceId = context.Resources.GetIdentifier(fileName, "drawable", context.PackageName); + } + + var image = new ImageView(context); + image.SetImageResource(resourceId); + image.SetPadding(0, 0, 30, 0); + View.SetAccessoryView(image); + } + } return View; } @@ -35,6 +54,8 @@ namespace Bit.Android.Controls { View.SetBackgroundColor(cell.BackgroundColor.ToAndroid()); } + + // TODO: other properties } } } diff --git a/src/Android/Controls/ExtendedViewCellRenderer.cs b/src/Android/Controls/ExtendedViewCellRenderer.cs new file mode 100644 index 000000000..0126f29e3 --- /dev/null +++ b/src/Android/Controls/ExtendedViewCellRenderer.cs @@ -0,0 +1,42 @@ +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; + +[assembly: ExportRenderer(typeof(ExtendedViewCell), typeof(ExtendedViewCellRenderer))] +namespace Bit.Android.Controls +{ + public class ExtendedViewCellRenderer : ViewCellRenderer + { + protected AView View { get; private set; } + + protected override AView GetCellCore(Cell item, AView convertView, ViewGroup parent, Context context) + { + var View = base.GetCellCore(item, convertView, parent, context); + var extendedCell = (ExtendedViewCell)item; + + if(View != null) + { + View.SetBackgroundColor(extendedCell.BackgroundColor.ToAndroid()); + } + + 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()); + } + } + } +} diff --git a/src/App/App.csproj b/src/App/App.csproj index 954548d10..66b694b9e 100644 --- a/src/App/App.csproj +++ b/src/App/App.csproj @@ -52,6 +52,7 @@ + diff --git a/src/App/Controls/ExtendedTextCell.cs b/src/App/Controls/ExtendedTextCell.cs index 938859b38..83baf743a 100644 --- a/src/App/Controls/ExtendedTextCell.cs +++ b/src/App/Controls/ExtendedTextCell.cs @@ -1,17 +1,34 @@ -using System; -using Xamarin.Forms; +using Xamarin.Forms; namespace Bit.App.Controls { public class ExtendedTextCell : TextCell { public static readonly BindableProperty BackgroundColorProperty = - BindableProperty.Create(nameof(BackgroundColor), typeof(Color), typeof(ExtendedTextCell), Color.Transparent); + BindableProperty.Create(nameof(BackgroundColor), typeof(Color), typeof(ExtendedTextCell), Color.White); + + public static readonly BindableProperty ShowDisclousureProperty = + BindableProperty.Create(nameof(DisclousureImage), typeof(bool), typeof(ExtendedTextCell), false); + + public static readonly BindableProperty DisclousureImageProperty = + BindableProperty.Create(nameof(DisclousureImage), typeof(string), typeof(ExtendedTextCell), string.Empty); public Color BackgroundColor { get { return (Color)GetValue(BackgroundColorProperty); } set { SetValue(BackgroundColorProperty, value); } } + + public bool ShowDisclousure + { + get { return (bool)GetValue(ShowDisclousureProperty); } + set { SetValue(ShowDisclousureProperty, value); } + } + + public string DisclousureImage + { + get { return (string)GetValue(DisclousureImageProperty); } + set { SetValue(DisclousureImageProperty, value); } + } } } diff --git a/src/App/Controls/ExtendedViewCell.cs b/src/App/Controls/ExtendedViewCell.cs new file mode 100644 index 000000000..bfbe43703 --- /dev/null +++ b/src/App/Controls/ExtendedViewCell.cs @@ -0,0 +1,16 @@ +using Xamarin.Forms; + +namespace Bit.App.Controls +{ + public class ExtendedViewCell : ViewCell + { + public static readonly BindableProperty BackgroundColorProperty = + BindableProperty.Create(nameof(BackgroundColor), typeof(Color), typeof(ExtendedTextCell), Color.White); + + public Color BackgroundColor + { + get { return (Color)GetValue(BackgroundColorProperty); } + set { SetValue(BackgroundColorProperty, value); } + } + } +} diff --git a/src/App/Controls/FormEditorCell.cs b/src/App/Controls/FormEditorCell.cs index 6f70839ee..52eb890f1 100644 --- a/src/App/Controls/FormEditorCell.cs +++ b/src/App/Controls/FormEditorCell.cs @@ -3,7 +3,7 @@ using Xamarin.Forms; namespace Bit.App.Controls { - public class FormEditorCell : ViewCell + public class FormEditorCell : ExtendedViewCell { public FormEditorCell(Keyboard entryKeyboard = null, double? height = null) { @@ -20,8 +20,7 @@ namespace Bit.App.Controls var stackLayout = new StackLayout { - Padding = new Thickness(15), - BackgroundColor = Color.White + Padding = new Thickness(15) }; stackLayout.Children.Add(Editor); diff --git a/src/App/Controls/FormEntryCell.cs b/src/App/Controls/FormEntryCell.cs index 25c81dee8..73e6ffed3 100644 --- a/src/App/Controls/FormEntryCell.cs +++ b/src/App/Controls/FormEntryCell.cs @@ -1,9 +1,8 @@ -using System; -using Xamarin.Forms; +using Xamarin.Forms; namespace Bit.App.Controls { - public class FormEntryCell : ViewCell + public class FormEntryCell : ExtendedViewCell { public FormEntryCell(string labelText, Keyboard entryKeyboard = null, bool IsPassword = false) { @@ -25,8 +24,7 @@ namespace Bit.App.Controls var stackLayout = new StackLayout { - Padding = new Thickness(15), - BackgroundColor = Color.White + Padding = new Thickness(15) }; stackLayout.Children.Add(Label); diff --git a/src/App/Controls/FormPickerCell.cs b/src/App/Controls/FormPickerCell.cs index 6d280883c..d5e65c815 100644 --- a/src/App/Controls/FormPickerCell.cs +++ b/src/App/Controls/FormPickerCell.cs @@ -4,7 +4,7 @@ using Xamarin.Forms; namespace Bit.App.Controls { - public class FormPickerCell : ViewCell + public class FormPickerCell : ExtendedViewCell { public FormPickerCell(string labelText, string[] pickerItems) { @@ -31,8 +31,7 @@ namespace Bit.App.Controls var stackLayout = new StackLayout { - Padding = new Thickness(15), - BackgroundColor = Color.White + Padding = new Thickness(15) }; stackLayout.Children.Add(Label); diff --git a/src/App/Controls/LabeledValueCell.cs b/src/App/Controls/LabeledValueCell.cs index 3af649a8d..d7db9eba6 100644 --- a/src/App/Controls/LabeledValueCell.cs +++ b/src/App/Controls/LabeledValueCell.cs @@ -1,13 +1,8 @@ -using Acr.UserDialogs; -using Bit.App.Abstractions; -using Bit.App.Resources; -using System; -using Xamarin.Forms; -using XLabs.Ioc; +using Xamarin.Forms; namespace Bit.App.Controls { - public class LabeledValueCell : ViewCell + public class LabeledValueCell : ExtendedViewCell { public LabeledValueCell( string labelText = null, @@ -18,7 +13,6 @@ namespace Bit.App.Controls var containerStackLayout = new StackLayout { Padding = new Thickness(15), - BackgroundColor = Color.White, Orientation = StackOrientation.Horizontal }; diff --git a/src/App/Pages/SettingsPage.cs b/src/App/Pages/SettingsPage.cs index 933f68534..1ef4b3a89 100644 --- a/src/App/Pages/SettingsPage.cs +++ b/src/App/Pages/SettingsPage.cs @@ -20,7 +20,7 @@ namespace Bit.App.Pages private void Init() { - var foldersCell = new TextCell { Text = "Folders" }; + var foldersCell = new ExtendedTextCell { Text = "Folders", ShowDisclousure = true }; foldersCell.Tapped += FoldersCell_Tapped; var table = new ExtendedTableView diff --git a/src/iOS/Controls/ExtendedTextCellRenderer.cs b/src/iOS/Controls/ExtendedTextCellRenderer.cs new file mode 100644 index 000000000..57102c379 --- /dev/null +++ b/src/iOS/Controls/ExtendedTextCellRenderer.cs @@ -0,0 +1,45 @@ +using Bit.App.Controls; +using Bit.iOS.Controls; +using UIKit; +using Xamarin.Forms; +using Xamarin.Forms.Platform.iOS; +using CoreGraphics; + +[assembly: ExportRenderer(typeof(ExtendedTextCell), typeof(ExtendedTextCellRenderer))] +namespace Bit.iOS.Controls +{ + public class ExtendedTextCellRenderer : TextCellRenderer + { + public override UITableViewCell GetCell(Cell item, UITableViewCell reusableCell, UITableView tv) + { + var extendedCell = (ExtendedTextCell)item; + var cell = base.GetCell(item, reusableCell, tv); + + if(cell != null) + { + cell.BackgroundColor = extendedCell.BackgroundColor.ToUIColor(); + if(extendedCell.ShowDisclousure) + { + cell.Accessory = UITableViewCellAccessory.DisclosureIndicator; + if(!string.IsNullOrEmpty(extendedCell.DisclousureImage)) + { + var detailDisclosureButton = UIButton.FromType(UIButtonType.Custom); + detailDisclosureButton.SetImage(UIImage.FromBundle(extendedCell.DisclousureImage), UIControlState.Normal); + detailDisclosureButton.SetImage(UIImage.FromBundle(extendedCell.DisclousureImage), UIControlState.Selected); + + detailDisclosureButton.Frame = new CGRect(0f, 0f, 30f, 30f); + detailDisclosureButton.TouchUpInside += (sender, e) => + { + var index = tv.IndexPathForCell(cell); + tv.SelectRow(index, true, UITableViewScrollPosition.None); + tv.Source.AccessoryButtonTapped(tv, index); + }; + cell.AccessoryView = detailDisclosureButton; + } + } + } + + return cell; + } + } +} diff --git a/src/iOS/Controls/ExtendedViewCellRenderer.cs b/src/iOS/Controls/ExtendedViewCellRenderer.cs new file mode 100644 index 000000000..ca0de6408 --- /dev/null +++ b/src/iOS/Controls/ExtendedViewCellRenderer.cs @@ -0,0 +1,25 @@ +using Bit.App.Controls; +using Bit.iOS.Controls; +using UIKit; +using Xamarin.Forms; +using Xamarin.Forms.Platform.iOS; + +[assembly: ExportRenderer(typeof(ExtendedViewCell), typeof(ExtendedViewCellRenderer))] +namespace Bit.iOS.Controls +{ + public class ExtendedViewCellRenderer : ViewCellRenderer + { + public override UITableViewCell GetCell(Cell item, UITableViewCell reusableCell, UITableView tv) + { + var extendedCell = (ExtendedViewCell)item; + var cell = base.GetCell(item, reusableCell, tv); + + if(cell != null) + { + cell.BackgroundColor = extendedCell.BackgroundColor.ToUIColor(); + } + + return cell; + } + } +} diff --git a/src/iOS/iOS.csproj b/src/iOS/iOS.csproj index 416edd2d7..2039723f7 100644 --- a/src/iOS/iOS.csproj +++ b/src/iOS/iOS.csproj @@ -102,6 +102,8 @@ + +