diff --git a/src/Android/Android.csproj b/src/Android/Android.csproj index 0bf005337..d08158be9 100644 --- a/src/Android/Android.csproj +++ b/src/Android/Android.csproj @@ -197,6 +197,7 @@ + @@ -235,6 +236,21 @@ + + + + + + + + + + + + + + + diff --git a/src/Android/Controls/ExtendedTextCellRenderer.cs b/src/Android/Controls/ExtendedTextCellRenderer.cs new file mode 100644 index 000000000..845b3f090 --- /dev/null +++ b/src/Android/Controls/ExtendedTextCellRenderer.cs @@ -0,0 +1,40 @@ +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(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 = base.GetCellCore(item, convertView, parent, context); + + var cell = (ExtendedTextCell)item; + + View.SetBackgroundColor(cell.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/Android/Resources/Resource.Designer.cs b/src/Android/Resources/Resource.Designer.cs index c60b1c81d..13a3115f5 100644 --- a/src/Android/Resources/Resource.Designer.cs +++ b/src/Android/Resources/Resource.Designer.cs @@ -2042,271 +2042,274 @@ namespace Bit.Android public const int design_snackbar_background = 2130837580; // aapt resource value: 0x7f02004d - public const int ic_audiotrack = 2130837581; + public const int fa_folder_open = 2130837581; // aapt resource value: 0x7f02004e - public const int ic_audiotrack_light = 2130837582; + public const int ic_audiotrack = 2130837582; // aapt resource value: 0x7f02004f - public const int ic_bluetooth_grey = 2130837583; + public const int ic_audiotrack_light = 2130837583; // aapt resource value: 0x7f020050 - public const int ic_bluetooth_white = 2130837584; + public const int ic_bluetooth_grey = 2130837584; // aapt resource value: 0x7f020051 - public const int ic_cast_dark = 2130837585; + public const int ic_bluetooth_white = 2130837585; // aapt resource value: 0x7f020052 - public const int ic_cast_disabled_light = 2130837586; + public const int ic_cast_dark = 2130837586; // aapt resource value: 0x7f020053 - public const int ic_cast_grey = 2130837587; + public const int ic_cast_disabled_light = 2130837587; // aapt resource value: 0x7f020054 - public const int ic_cast_light = 2130837588; + public const int ic_cast_grey = 2130837588; // aapt resource value: 0x7f020055 - public const int ic_cast_off_light = 2130837589; + public const int ic_cast_light = 2130837589; // aapt resource value: 0x7f020056 - public const int ic_cast_on_0_light = 2130837590; + public const int ic_cast_off_light = 2130837590; // aapt resource value: 0x7f020057 - public const int ic_cast_on_1_light = 2130837591; + public const int ic_cast_on_0_light = 2130837591; // aapt resource value: 0x7f020058 - public const int ic_cast_on_2_light = 2130837592; + public const int ic_cast_on_1_light = 2130837592; // aapt resource value: 0x7f020059 - public const int ic_cast_on_light = 2130837593; + public const int ic_cast_on_2_light = 2130837593; // aapt resource value: 0x7f02005a - public const int ic_cast_white = 2130837594; + public const int ic_cast_on_light = 2130837594; // aapt resource value: 0x7f02005b - public const int ic_close_dark = 2130837595; + public const int ic_cast_white = 2130837595; // aapt resource value: 0x7f02005c - public const int ic_close_light = 2130837596; + public const int ic_close_dark = 2130837596; // aapt resource value: 0x7f02005d - public const int ic_collapse = 2130837597; + public const int ic_close_light = 2130837597; // aapt resource value: 0x7f02005e - public const int ic_collapse_00000 = 2130837598; + public const int ic_collapse = 2130837598; // aapt resource value: 0x7f02005f - public const int ic_collapse_00001 = 2130837599; + public const int ic_collapse_00000 = 2130837599; // aapt resource value: 0x7f020060 - public const int ic_collapse_00002 = 2130837600; + public const int ic_collapse_00001 = 2130837600; // aapt resource value: 0x7f020061 - public const int ic_collapse_00003 = 2130837601; + public const int ic_collapse_00002 = 2130837601; // aapt resource value: 0x7f020062 - public const int ic_collapse_00004 = 2130837602; + public const int ic_collapse_00003 = 2130837602; // aapt resource value: 0x7f020063 - public const int ic_collapse_00005 = 2130837603; + public const int ic_collapse_00004 = 2130837603; // aapt resource value: 0x7f020064 - public const int ic_collapse_00006 = 2130837604; + public const int ic_collapse_00005 = 2130837604; // aapt resource value: 0x7f020065 - public const int ic_collapse_00007 = 2130837605; + public const int ic_collapse_00006 = 2130837605; // aapt resource value: 0x7f020066 - public const int ic_collapse_00008 = 2130837606; + public const int ic_collapse_00007 = 2130837606; // aapt resource value: 0x7f020067 - public const int ic_collapse_00009 = 2130837607; + public const int ic_collapse_00008 = 2130837607; // aapt resource value: 0x7f020068 - public const int ic_collapse_00010 = 2130837608; + public const int ic_collapse_00009 = 2130837608; // aapt resource value: 0x7f020069 - public const int ic_collapse_00011 = 2130837609; + public const int ic_collapse_00010 = 2130837609; // aapt resource value: 0x7f02006a - public const int ic_collapse_00012 = 2130837610; + public const int ic_collapse_00011 = 2130837610; // aapt resource value: 0x7f02006b - public const int ic_collapse_00013 = 2130837611; + public const int ic_collapse_00012 = 2130837611; // aapt resource value: 0x7f02006c - public const int ic_collapse_00014 = 2130837612; + public const int ic_collapse_00013 = 2130837612; // aapt resource value: 0x7f02006d - public const int ic_collapse_00015 = 2130837613; + public const int ic_collapse_00014 = 2130837613; // aapt resource value: 0x7f02006e - public const int ic_errorstatus = 2130837614; + public const int ic_collapse_00015 = 2130837614; // aapt resource value: 0x7f02006f - public const int ic_expand = 2130837615; + public const int ic_errorstatus = 2130837615; // aapt resource value: 0x7f020070 - public const int ic_expand_00000 = 2130837616; + public const int ic_expand = 2130837616; // aapt resource value: 0x7f020071 - public const int ic_expand_00001 = 2130837617; + public const int ic_expand_00000 = 2130837617; // aapt resource value: 0x7f020072 - public const int ic_expand_00002 = 2130837618; + public const int ic_expand_00001 = 2130837618; // aapt resource value: 0x7f020073 - public const int ic_expand_00003 = 2130837619; + public const int ic_expand_00002 = 2130837619; // aapt resource value: 0x7f020074 - public const int ic_expand_00004 = 2130837620; + public const int ic_expand_00003 = 2130837620; // aapt resource value: 0x7f020075 - public const int ic_expand_00005 = 2130837621; + public const int ic_expand_00004 = 2130837621; // aapt resource value: 0x7f020076 - public const int ic_expand_00006 = 2130837622; + public const int ic_expand_00005 = 2130837622; // aapt resource value: 0x7f020077 - public const int ic_expand_00007 = 2130837623; + public const int ic_expand_00006 = 2130837623; // aapt resource value: 0x7f020078 - public const int ic_expand_00008 = 2130837624; + public const int ic_expand_00007 = 2130837624; // aapt resource value: 0x7f020079 - public const int ic_expand_00009 = 2130837625; + public const int ic_expand_00008 = 2130837625; // aapt resource value: 0x7f02007a - public const int ic_expand_00010 = 2130837626; + public const int ic_expand_00009 = 2130837626; // aapt resource value: 0x7f02007b - public const int ic_expand_00011 = 2130837627; + public const int ic_expand_00010 = 2130837627; // aapt resource value: 0x7f02007c - public const int ic_expand_00012 = 2130837628; + public const int ic_expand_00011 = 2130837628; // aapt resource value: 0x7f02007d - public const int ic_expand_00013 = 2130837629; + public const int ic_expand_00012 = 2130837629; // aapt resource value: 0x7f02007e - public const int ic_expand_00014 = 2130837630; + public const int ic_expand_00013 = 2130837630; // aapt resource value: 0x7f02007f - public const int ic_expand_00015 = 2130837631; + public const int ic_expand_00014 = 2130837631; // aapt resource value: 0x7f020080 - public const int ic_media_pause = 2130837632; + public const int ic_expand_00015 = 2130837632; // aapt resource value: 0x7f020081 - public const int ic_media_play = 2130837633; + public const int ic_media_pause = 2130837633; // aapt resource value: 0x7f020082 - public const int ic_media_route_disabled_mono_dark = 2130837634; + public const int ic_media_play = 2130837634; // aapt resource value: 0x7f020083 - public const int ic_media_route_off_mono_dark = 2130837635; + public const int ic_media_route_disabled_mono_dark = 2130837635; // aapt resource value: 0x7f020084 - public const int ic_media_route_on_0_mono_dark = 2130837636; + public const int ic_media_route_off_mono_dark = 2130837636; // aapt resource value: 0x7f020085 - public const int ic_media_route_on_1_mono_dark = 2130837637; + public const int ic_media_route_on_0_mono_dark = 2130837637; // aapt resource value: 0x7f020086 - public const int ic_media_route_on_2_mono_dark = 2130837638; + public const int ic_media_route_on_1_mono_dark = 2130837638; // aapt resource value: 0x7f020087 - public const int ic_media_route_on_mono_dark = 2130837639; + public const int ic_media_route_on_2_mono_dark = 2130837639; // aapt resource value: 0x7f020088 - public const int ic_pause_dark = 2130837640; + public const int ic_media_route_on_mono_dark = 2130837640; // aapt resource value: 0x7f020089 - public const int ic_pause_light = 2130837641; + public const int ic_pause_dark = 2130837641; // aapt resource value: 0x7f02008a - public const int ic_play_dark = 2130837642; + public const int ic_pause_light = 2130837642; // aapt resource value: 0x7f02008b - public const int ic_play_light = 2130837643; + public const int ic_play_dark = 2130837643; // aapt resource value: 0x7f02008c - public const int ic_speaker_dark = 2130837644; + public const int ic_play_light = 2130837644; // aapt resource value: 0x7f02008d - public const int ic_speaker_group_dark = 2130837645; + public const int ic_speaker_dark = 2130837645; // aapt resource value: 0x7f02008e - public const int ic_speaker_group_light = 2130837646; + public const int ic_speaker_group_dark = 2130837646; // aapt resource value: 0x7f02008f - public const int ic_speaker_light = 2130837647; + public const int ic_speaker_group_light = 2130837647; // aapt resource value: 0x7f020090 - public const int ic_successstatus = 2130837648; + public const int ic_speaker_light = 2130837648; // aapt resource value: 0x7f020091 - public const int ic_tv_dark = 2130837649; + public const int ic_successstatus = 2130837649; // aapt resource value: 0x7f020092 - public const int ic_tv_light = 2130837650; + public const int ic_tv_dark = 2130837650; // aapt resource value: 0x7f020093 - public const int icon = 2130837651; + public const int ic_tv_light = 2130837651; // aapt resource value: 0x7f020094 - public const int mr_dialog_material_background_dark = 2130837652; + public const int icon = 2130837652; // aapt resource value: 0x7f020095 - public const int mr_dialog_material_background_light = 2130837653; + public const int mr_dialog_material_background_dark = 2130837653; // aapt resource value: 0x7f020096 - public const int mr_ic_audiotrack_light = 2130837654; + public const int mr_dialog_material_background_light = 2130837654; // aapt resource value: 0x7f020097 - public const int mr_ic_cast_dark = 2130837655; + public const int mr_ic_audiotrack_light = 2130837655; // aapt resource value: 0x7f020098 - public const int mr_ic_cast_light = 2130837656; + public const int mr_ic_cast_dark = 2130837656; // aapt resource value: 0x7f020099 - public const int mr_ic_close_dark = 2130837657; + public const int mr_ic_cast_light = 2130837657; // aapt resource value: 0x7f02009a - public const int mr_ic_close_light = 2130837658; + public const int mr_ic_close_dark = 2130837658; // aapt resource value: 0x7f02009b - public const int mr_ic_media_route_connecting_mono_dark = 2130837659; + public const int mr_ic_close_light = 2130837659; // aapt resource value: 0x7f02009c - public const int mr_ic_media_route_connecting_mono_light = 2130837660; + public const int mr_ic_media_route_connecting_mono_dark = 2130837660; // aapt resource value: 0x7f02009d - public const int mr_ic_media_route_mono_dark = 2130837661; + public const int mr_ic_media_route_connecting_mono_light = 2130837661; // aapt resource value: 0x7f02009e - public const int mr_ic_media_route_mono_light = 2130837662; + public const int mr_ic_media_route_mono_dark = 2130837662; // aapt resource value: 0x7f02009f - public const int mr_ic_pause_dark = 2130837663; + public const int mr_ic_media_route_mono_light = 2130837663; // aapt resource value: 0x7f0200a0 - public const int mr_ic_pause_light = 2130837664; + public const int mr_ic_pause_dark = 2130837664; // aapt resource value: 0x7f0200a1 - public const int mr_ic_play_dark = 2130837665; + public const int mr_ic_pause_light = 2130837665; // aapt resource value: 0x7f0200a2 - public const int mr_ic_play_light = 2130837666; - - // aapt resource value: 0x7f0200a5 - public const int notification_template_icon_bg = 2130837669; + public const int mr_ic_play_dark = 2130837666; // aapt resource value: 0x7f0200a3 - public const int roundedbg = 2130837667; + public const int mr_ic_play_light = 2130837667; + + // aapt resource value: 0x7f0200a6 + public const int notification_template_icon_bg = 2130837670; // aapt resource value: 0x7f0200a4 - public const int roundedbgdark = 2130837668; + public const int roundedbg = 2130837668; + + // aapt resource value: 0x7f0200a5 + public const int roundedbgdark = 2130837669; static Drawable() { diff --git a/src/Android/Resources/drawable-hdpi/fa_folder_open.png b/src/Android/Resources/drawable-hdpi/fa_folder_open.png new file mode 100644 index 000000000..f4ff84fe9 Binary files /dev/null and b/src/Android/Resources/drawable-hdpi/fa_folder_open.png differ diff --git a/src/iOS/Resources/fa-folder-open.png b/src/Android/Resources/drawable-mdpi/fa_folder_open.png similarity index 100% rename from src/iOS/Resources/fa-folder-open.png rename to src/Android/Resources/drawable-mdpi/fa_folder_open.png diff --git a/src/iOS/Resources/fa-folder-open@2x.png b/src/Android/Resources/drawable-xhdpi/fa_folder_open.png similarity index 100% rename from src/iOS/Resources/fa-folder-open@2x.png rename to src/Android/Resources/drawable-xhdpi/fa_folder_open.png diff --git a/src/iOS/Resources/fa-folder-open@3x.png b/src/Android/Resources/drawable-xxhdpi/fa_folder_open.png similarity index 100% rename from src/iOS/Resources/fa-folder-open@3x.png rename to src/Android/Resources/drawable-xxhdpi/fa_folder_open.png diff --git a/src/Android/Resources/drawable/fa_folder_open.png b/src/Android/Resources/drawable/fa_folder_open.png new file mode 100644 index 000000000..f4ff84fe9 Binary files /dev/null and b/src/Android/Resources/drawable/fa_folder_open.png differ diff --git a/src/App/App.csproj b/src/App/App.csproj index ab30c1057..954548d10 100644 --- a/src/App/App.csproj +++ b/src/App/App.csproj @@ -53,6 +53,7 @@ + diff --git a/src/App/Controls/ExtendedTextCell.cs b/src/App/Controls/ExtendedTextCell.cs new file mode 100644 index 000000000..938859b38 --- /dev/null +++ b/src/App/Controls/ExtendedTextCell.cs @@ -0,0 +1,17 @@ +using System; +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); + + public Color BackgroundColor + { + get { return (Color)GetValue(BackgroundColorProperty); } + set { SetValue(BackgroundColorProperty, value); } + } + } +} diff --git a/src/App/Pages/VaultListPage.cs b/src/App/Pages/VaultListPage.cs index ac686d6d9..7b3458a09 100644 --- a/src/App/Pages/VaultListPage.cs +++ b/src/App/Pages/VaultListPage.cs @@ -40,7 +40,7 @@ namespace Bit.App.Pages IsGroupingEnabled = true, ItemsSource = Folders, HasUnevenRows = true, - SeparatorColor = Color.FromHex("E0E0E0") + SeparatorColor = Color.FromHex("d2d6de") }; listView.GroupDisplayBinding = new Binding("Name"); listView.GroupHeaderTemplate = new DataTemplate(() => new VaultListHeaderViewCell(this)); @@ -162,7 +162,7 @@ namespace Bit.App.Pages } } - private class VaultListViewCell : TextCell + private class VaultListViewCell : ExtendedTextCell { public VaultListViewCell(VaultListPage page) { @@ -181,6 +181,7 @@ namespace Bit.App.Pages TextColor = Color.FromHex("333333"); DetailColor = Color.FromHex("777777"); + BackgroundColor = Color.White; } } @@ -190,15 +191,16 @@ namespace Bit.App.Pages { var image = new Image { - Source = ImageSource.FromFile("fa-folder-open.png"), - Margin = new Thickness(16, 8, 0, 8) + Source = "fa_folder_open.png", + Margin = new Thickness(16, 0, 0, 0), + VerticalOptions = LayoutOptions.CenterAndExpand }; var label = new Label { - FontSize = 14, TextColor = Color.FromHex("777777"), - VerticalTextAlignment = TextAlignment.Center + VerticalTextAlignment = TextAlignment.Center, + VerticalOptions = LayoutOptions.CenterAndExpand }; label.SetBinding(Label.TextProperty, s => s.Name); @@ -206,25 +208,28 @@ namespace Bit.App.Pages var stackLayout = new StackLayout { Orientation = StackOrientation.Horizontal, - BackgroundColor = Color.FromHex("ecf0f5") + VerticalOptions = LayoutOptions.CenterAndExpand }; stackLayout.Children.Add(image); stackLayout.Children.Add(label); - var borderStackLayout = new StackLayout + var borderedStackLayout = new StackLayout { - Spacing = 0 + Spacing = 0, + BackgroundColor = Color.FromHex("ecf0f5"), + HorizontalOptions = LayoutOptions.FillAndExpand }; - var borderBoxTop = new BoxView { BackgroundColor = Color.FromHex("d2d6de"), HeightRequest = 0.5 }; - var borderBoxBottom = new BoxView { BackgroundColor = Color.FromHex("d2d6de"), HeightRequest = 0.5 }; - borderStackLayout.Children.Add(borderBoxTop); - borderStackLayout.Children.Add(stackLayout); - borderStackLayout.Children.Add(borderBoxBottom); + borderedStackLayout.Children.Add(new BoxView { BackgroundColor = Color.FromHex("d2d6de"), HeightRequest = 0.5, VerticalOptions = LayoutOptions.Start }); + borderedStackLayout.Children.Add(stackLayout); + if(Device.OS == TargetPlatform.iOS) + { + borderedStackLayout.Children.Add(new BoxView { BackgroundColor = Color.FromHex("d2d6de"), HeightRequest = 0.5, VerticalOptions = LayoutOptions.End }); + } - View = borderStackLayout; - Height = 30; + View = borderedStackLayout; + Height = 40; } } } diff --git a/src/iOS/Resources/fa_folder_open.png b/src/iOS/Resources/fa_folder_open.png new file mode 100644 index 000000000..52583578f Binary files /dev/null and b/src/iOS/Resources/fa_folder_open.png differ diff --git a/src/iOS/Resources/fa_folder_open@2x.png b/src/iOS/Resources/fa_folder_open@2x.png new file mode 100644 index 000000000..38c3cbeee Binary files /dev/null and b/src/iOS/Resources/fa_folder_open@2x.png differ diff --git a/src/iOS/Resources/fa_folder_open@3x.png b/src/iOS/Resources/fa_folder_open@3x.png new file mode 100644 index 000000000..34c69f4c2 Binary files /dev/null and b/src/iOS/Resources/fa_folder_open@3x.png differ diff --git a/src/iOS/iOS.csproj b/src/iOS/iOS.csproj index 7d06f8e57..416edd2d7 100644 --- a/src/iOS/iOS.csproj +++ b/src/iOS/iOS.csproj @@ -331,13 +331,13 @@ - + - + - +