diff --git a/src/App/App.csproj b/src/App/App.csproj index 38ec682a8..4336da617 100644 --- a/src/App/App.csproj +++ b/src/App/App.csproj @@ -45,7 +45,6 @@ - diff --git a/src/App/Controls/BottomBorderEntry.cs b/src/App/Controls/BottomBorderEntry.cs deleted file mode 100644 index 279bf344e..000000000 --- a/src/App/Controls/BottomBorderEntry.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Xamarin.Forms; - -namespace Bit.App.Controls -{ - public class BottomBorderEntry : ExtendedEntry - { - public BottomBorderEntry() - { - HasBorder = HasOnlyBottomBorder = true; - BottomBorderColor = Color.FromHex("d2d6de"); - } - } -} diff --git a/src/App/Controls/ExtendedPicker.cs b/src/App/Controls/ExtendedPicker.cs index 15ca80227..e78840638 100644 --- a/src/App/Controls/ExtendedPicker.cs +++ b/src/App/Controls/ExtendedPicker.cs @@ -8,28 +8,10 @@ namespace Bit.App.Controls public static readonly BindableProperty HasBorderProperty = BindableProperty.Create(nameof(HasBorder), typeof(bool), typeof(ExtendedEntry), true); - public static readonly BindableProperty HasOnlyBottomBorderProperty = - BindableProperty.Create(nameof(HasOnlyBottomBorder), typeof(bool), typeof(ExtendedEntry), false); - - public static readonly BindableProperty BottomBorderColorProperty = - BindableProperty.Create(nameof(BottomBorderColor), typeof(Color), typeof(ExtendedEntry), Color.Default); - public bool HasBorder { get { return (bool)GetValue(HasBorderProperty); } set { SetValue(HasBorderProperty, value); } } - - public bool HasOnlyBottomBorder - { - get { return (bool)GetValue(HasOnlyBottomBorderProperty); } - set { SetValue(HasOnlyBottomBorderProperty, value); } - } - - public Color BottomBorderColor - { - get { return (Color)GetValue(BottomBorderColorProperty); } - set { SetValue(BottomBorderColorProperty, value); } - } } } diff --git a/src/App/Pages/SettingsPage.cs b/src/App/Pages/SettingsPage.cs index be3cca332..9daacdc81 100644 --- a/src/App/Pages/SettingsPage.cs +++ b/src/App/Pages/SettingsPage.cs @@ -19,27 +19,12 @@ namespace Bit.App.Pages private void Init() { - var foldersLayout = new StackLayout { Orientation = StackOrientation.Horizontal }; - foldersLayout.Children.Add(new Label - { - Text = "Folders", - HorizontalOptions = LayoutOptions.StartAndExpand, - VerticalOptions = LayoutOptions.Center, - Margin = new Thickness(10, 0, 0, 0) - }); - foldersLayout.Children.Add(new Image - { - Source = ImageSource.FromFile("ion-chevron-right.png"), - Opacity = 0.3, - HorizontalOptions = LayoutOptions.End, - VerticalOptions = LayoutOptions.Center, - Margin = new Thickness(0, 0, 10, 0) - }); - var foldersCell = new ViewCell { View = foldersLayout }; + var foldersCell = new TextCell { Text = "Folders" }; foldersCell.Tapped += FoldersCell_Tapped; var table = new TableView { + Intent = TableIntent.Menu, Root = new TableRoot { new TableSection("Manage Folders") diff --git a/src/App/Pages/SyncPage.cs b/src/App/Pages/SyncPage.cs index f96a05a71..c0ff9dd14 100644 --- a/src/App/Pages/SyncPage.cs +++ b/src/App/Pages/SyncPage.cs @@ -30,25 +30,25 @@ namespace Bit.App.Pages var syncButton = new Button { Text = "Sync Vault", - Command = new Command( async () => await SyncAsync() ) + Command = new Command(async () => await SyncAsync()) }; var stackLayout = new StackLayout { }; - stackLayout.Children.Add( syncButton ); - stackLayout.Children.Add( new ExtendedEntry + stackLayout.Children.Add(syncButton); + stackLayout.Children.Add(new ExtendedEntry { BottomBorderColor = Color.Black, HasBorder = true, HasOnlyBottomBorder = true, Placeholder = "Some placeholder", PlaceholderColor = Color.Red - } ); + }); Title = "Sync"; Content = stackLayout; Icon = "fa-refresh"; - if( !_connectivity.IsConnected ) + if(!_connectivity.IsConnected) { AlertNoConnection(); } @@ -56,28 +56,28 @@ namespace Bit.App.Pages public async Task SyncAsync() { - if( !_connectivity.IsConnected ) + if(!_connectivity.IsConnected) { AlertNoConnection(); return; } - _userDialogs.ShowLoading( "Syncing...", MaskType.Black ); + _userDialogs.ShowLoading("Syncing...", MaskType.Black); var succeeded = await _syncService.SyncAsync(); _userDialogs.HideLoading(); - if( succeeded ) + if(succeeded) { - _userDialogs.SuccessToast( "Syncing complete." ); + _userDialogs.SuccessToast("Syncing complete."); } else { - _userDialogs.ErrorToast( "Syncing failed." ); + _userDialogs.ErrorToast("Syncing failed."); } } public void AlertNoConnection() { - DisplayAlert( AppResources.InternetConnectionRequiredTitle, AppResources.InternetConnectionRequiredMessage, AppResources.Ok ); + DisplayAlert(AppResources.InternetConnectionRequiredTitle, AppResources.InternetConnectionRequiredMessage, AppResources.Ok); } } } diff --git a/src/App/Pages/VaultAddSitePage.cs b/src/App/Pages/VaultAddSitePage.cs index 10c6692dd..c4b851c0a 100644 --- a/src/App/Pages/VaultAddSitePage.cs +++ b/src/App/Pages/VaultAddSitePage.cs @@ -30,94 +30,130 @@ namespace Bit.App.Pages private void Init() { - var folders = _folderService.GetAllAsync().GetAwaiter().GetResult().OrderBy( f => f.Name?.Decrypt() ); + var folders = _folderService.GetAllAsync().GetAwaiter().GetResult().OrderBy(f => f.Name?.Decrypt()); - var uriEntry = new BottomBorderEntry { Keyboard = Keyboard.Url }; - var nameEntry = new BottomBorderEntry(); - var folderPicker = new ExtendedPicker - { - Title = AppResources.Folder, - BottomBorderColor = Color.FromHex( "d2d6de" ), - HasOnlyBottomBorder = true - }; - folderPicker.Items.Add( AppResources.FolderNone ); + var uriEntry = new ExtendedEntry { Keyboard = Keyboard.Url, HasBorder = false }; + var nameEntry = new ExtendedEntry { HasBorder = false }; + var folderPicker = new ExtendedPicker { Title = AppResources.Folder, HasBorder = false }; + folderPicker.Items.Add(AppResources.FolderNone); folderPicker.SelectedIndex = 0; - foreach( var folder in folders ) + foreach(var folder in folders) { - folderPicker.Items.Add( folder.Name.Decrypt() ); + folderPicker.Items.Add(folder.Name.Decrypt()); } - var usernameEntry = new BottomBorderEntry(); - var passwordEntry = new BottomBorderEntry { IsPassword = true }; + var usernameEntry = new ExtendedEntry { HasBorder = false }; + var passwordEntry = new ExtendedEntry { IsPassword = true, HasBorder = false }; var notesEditor = new Editor { HeightRequest = 75 }; - var stackLayout = new StackLayout { Padding = new Thickness( 15 ) }; - stackLayout.Children.Add( new EntryLabel { Text = AppResources.URI } ); - stackLayout.Children.Add( uriEntry ); - stackLayout.Children.Add( new EntryLabel { Text = AppResources.Name, Margin = new Thickness( 0, 15, 0, 0 ) } ); - stackLayout.Children.Add( nameEntry ); - stackLayout.Children.Add( new EntryLabel { Text = AppResources.Folder, Margin = new Thickness( 0, 15, 0, 0 ) } ); - stackLayout.Children.Add( folderPicker ); - stackLayout.Children.Add( new EntryLabel { Text = AppResources.Username, Margin = new Thickness( 0, 15, 0, 0 ) } ); - stackLayout.Children.Add( usernameEntry ); - stackLayout.Children.Add( new EntryLabel { Text = AppResources.Password, Margin = new Thickness( 0, 15, 0, 0 ) } ); - stackLayout.Children.Add( passwordEntry ); - stackLayout.Children.Add( new EntryLabel { Text = AppResources.Notes, Margin = new Thickness( 0, 15, 0, 0 ) } ); - stackLayout.Children.Add( notesEditor ); + var uriStackLayout = new FormEntryStackLayout(); + uriStackLayout.Children.Add(new EntryLabel { Text = AppResources.URI }); + uriStackLayout.Children.Add(uriEntry); + var uriCell = new ViewCell(); + uriCell.View = uriStackLayout; + + var nameStackLayout = new FormEntryStackLayout(); + nameStackLayout.Children.Add(new EntryLabel { Text = AppResources.Name }); + nameStackLayout.Children.Add(nameEntry); + var nameCell = new ViewCell(); + nameCell.View = nameStackLayout; + + var folderStackLayout = new FormEntryStackLayout(); + folderStackLayout.Children.Add(new EntryLabel { Text = AppResources.Folder }); + folderStackLayout.Children.Add(folderPicker); + var folderCell = new ViewCell(); + folderCell.View = folderStackLayout; + + var usernameStackLayout = new FormEntryStackLayout(); + usernameStackLayout.Children.Add(new EntryLabel { Text = AppResources.Username }); + usernameStackLayout.Children.Add(usernameEntry); + var usernameCell = new ViewCell(); + usernameCell.View = usernameStackLayout; + + var passwordStackLayout = new FormEntryStackLayout(); + passwordStackLayout.Children.Add(new EntryLabel { Text = AppResources.Password }); + passwordStackLayout.Children.Add(passwordEntry); + var passwordCell = new ViewCell(); + passwordCell.View = passwordStackLayout; + + var notesStackLayout = new FormEntryStackLayout(); + notesStackLayout.Children.Add(new EntryLabel { Text = AppResources.Notes }); + notesStackLayout.Children.Add(notesEditor); + var notesCell = new ViewCell(); + notesCell.View = notesStackLayout; + + var table = new TableView + { + Intent = TableIntent.Form, + RowHeight = 65, + HasUnevenRows = true, + Root = new TableRoot + { + new TableSection + { + uriCell, + nameCell, + folderCell, + usernameCell, + passwordCell, + notesCell + } + } + }; var scrollView = new ScrollView { - Content = stackLayout, + Content = table, Orientation = ScrollOrientation.Vertical }; - var saveToolBarItem = new ToolbarItem( AppResources.Save, null, async () => - { - if( !_connectivity.IsConnected ) - { - AlertNoConnection(); - return; - } + var saveToolBarItem = new ToolbarItem(AppResources.Save, null, async () => + { + if(!_connectivity.IsConnected) + { + AlertNoConnection(); + return; + } - if( string.IsNullOrWhiteSpace( uriEntry.Text ) ) - { - await DisplayAlert( AppResources.AnErrorHasOccurred, string.Format( AppResources.ValidationFieldRequired, AppResources.URI ), AppResources.Ok ); - return; - } + if(string.IsNullOrWhiteSpace(uriEntry.Text)) + { + await DisplayAlert(AppResources.AnErrorHasOccurred, string.Format(AppResources.ValidationFieldRequired, AppResources.URI), AppResources.Ok); + return; + } - if( string.IsNullOrWhiteSpace( nameEntry.Text ) ) - { - await DisplayAlert( AppResources.AnErrorHasOccurred, string.Format( AppResources.ValidationFieldRequired, AppResources.Name ), AppResources.Ok ); - return; - } + if(string.IsNullOrWhiteSpace(nameEntry.Text)) + { + await DisplayAlert(AppResources.AnErrorHasOccurred, string.Format(AppResources.ValidationFieldRequired, AppResources.Name), AppResources.Ok); + return; + } - var site = new Site - { - Uri = uriEntry.Text.Encrypt(), - Name = nameEntry.Text.Encrypt(), - Username = usernameEntry.Text?.Encrypt(), - Password = passwordEntry.Text?.Encrypt(), - Notes = notesEditor.Text?.Encrypt(), - }; + var site = new Site + { + Uri = uriEntry.Text.Encrypt(), + Name = nameEntry.Text.Encrypt(), + Username = usernameEntry.Text?.Encrypt(), + Password = passwordEntry.Text?.Encrypt(), + Notes = notesEditor.Text?.Encrypt(), + }; - if( folderPicker.SelectedIndex > 0 ) - { - site.FolderId = folders.ElementAt( folderPicker.SelectedIndex - 1 ).Id; - } + if(folderPicker.SelectedIndex > 0) + { + site.FolderId = folders.ElementAt(folderPicker.SelectedIndex - 1).Id; + } - var saveTask = _siteService.SaveAsync( site ); - _userDialogs.ShowLoading( "Saving...", MaskType.Black ); - await saveTask; + var saveTask = _siteService.SaveAsync(site); + _userDialogs.ShowLoading("Saving...", MaskType.Black); + await saveTask; - _userDialogs.HideLoading(); - await Navigation.PopAsync(); - _userDialogs.SuccessToast( nameEntry.Text, "New site created." ); - }, ToolbarItemOrder.Default, 0 ); + _userDialogs.HideLoading(); + await Navigation.PopAsync(); + _userDialogs.SuccessToast(nameEntry.Text, "New site created."); + }, ToolbarItemOrder.Default, 0); Title = AppResources.AddSite; Content = scrollView; - ToolbarItems.Add( saveToolBarItem ); + ToolbarItems.Add(saveToolBarItem); - if( !_connectivity.IsConnected ) + if(!_connectivity.IsConnected) { AlertNoConnection(); } @@ -125,7 +161,15 @@ namespace Bit.App.Pages private void AlertNoConnection() { - DisplayAlert( AppResources.InternetConnectionRequiredTitle, AppResources.InternetConnectionRequiredMessage, AppResources.Ok ); + DisplayAlert(AppResources.InternetConnectionRequiredTitle, AppResources.InternetConnectionRequiredMessage, AppResources.Ok); + } + + private class FormEntryStackLayout : StackLayout + { + public FormEntryStackLayout() + { + Padding = new Thickness(15, 15, 15, 0); + } } } } diff --git a/src/App/Pages/VaultViewSitePage.cs b/src/App/Pages/VaultViewSitePage.cs index a39044e6b..2fd33e4c0 100644 --- a/src/App/Pages/VaultViewSitePage.cs +++ b/src/App/Pages/VaultViewSitePage.cs @@ -132,6 +132,8 @@ namespace Bit.App.Pages } Model.Update(site); + + base.OnAppearing(); } private void Copy(string copyText, string alertLabel) diff --git a/src/App/Repositories/Repository.cs b/src/App/Repositories/Repository.cs index b6a7146b6..4f5799e0b 100644 --- a/src/App/Repositories/Repository.cs +++ b/src/App/Repositories/Repository.cs @@ -8,7 +8,7 @@ using SQLite; namespace Bit.App.Repositories { public abstract class Repository : IRepository - where TId : IEquatable + where TId : IEquatable where T : class, IDataObject, new() { public Repository(ISqlService sqlService) diff --git a/src/iOS.Extension/ActionViewController.designer.cs b/src/iOS.Extension/ActionViewController.designer.cs index fcca0cbd9..0292e4c52 100644 --- a/src/iOS.Extension/ActionViewController.designer.cs +++ b/src/iOS.Extension/ActionViewController.designer.cs @@ -8,7 +8,7 @@ using Foundation; namespace Bit.iOS.Extension { - [Register("ActionViewController")] + [Register("ActionViewController")] partial class ActionViewController { [Outlet] diff --git a/src/iOS/Controls/ExtendedPickerRenderer.cs b/src/iOS/Controls/ExtendedPickerRenderer.cs index 8879c4674..09251dba4 100644 --- a/src/iOS/Controls/ExtendedPickerRenderer.cs +++ b/src/iOS/Controls/ExtendedPickerRenderer.cs @@ -2,13 +2,11 @@ using System.ComponentModel; using Bit.App.Controls; using Bit.iOS.Controls; -using CoreAnimation; -using CoreGraphics; using UIKit; using Xamarin.Forms; using Xamarin.Forms.Platform.iOS; -[assembly: ExportRenderer(typeof(ExtendedPicker), typeof( ExtendedPickerRenderer ) )] +[assembly: ExportRenderer(typeof(ExtendedPicker), typeof(ExtendedPickerRenderer))] namespace Bit.iOS.Controls { public class ExtendedPickerRenderer : PickerRenderer @@ -30,35 +28,15 @@ namespace Bit.iOS.Controls var view = (ExtendedPicker)Element; - if(e.PropertyName == ExtendedPicker.HasBorderProperty.PropertyName - || e.PropertyName == ExtendedPicker.HasOnlyBottomBorderProperty.PropertyName - || e.PropertyName == ExtendedPicker.BottomBorderColorProperty.PropertyName) + if(e.PropertyName == ExtendedPicker.HasBorderProperty.PropertyName) { SetBorder(view); } } - private void SetBorder( ExtendedPicker view ) + private void SetBorder(ExtendedPicker view) { - if(view.HasOnlyBottomBorder) - { - var borderLayer = new CALayer(); - borderLayer.MasksToBounds = true; - borderLayer.Frame = new CGRect( 0f, Frame.Height / 2, Frame.Width * 2, 1f ); - borderLayer.BorderColor = view.BottomBorderColor.ToCGColor(); - borderLayer.BorderWidth = 1f; - - Control.Layer.AddSublayer( borderLayer ); - Control.BorderStyle = UITextBorderStyle.None; - } - else if(view.HasBorder) - { - Control.BorderStyle = UITextBorderStyle.RoundedRect; - } - else - { - Control.BorderStyle = UITextBorderStyle.None; - } + Control.BorderStyle = view.HasBorder ? UITextBorderStyle.RoundedRect : UITextBorderStyle.None; } } } diff --git a/src/iOS/Controls/ExtendedTabbedPageRenderer.cs b/src/iOS/Controls/ExtendedTabbedPageRenderer.cs index ef064d3fa..b099d6311 100644 --- a/src/iOS/Controls/ExtendedTabbedPageRenderer.cs +++ b/src/iOS/Controls/ExtendedTabbedPageRenderer.cs @@ -7,7 +7,7 @@ using Xamarin.Forms.Platform.iOS; [assembly: ExportRenderer(typeof(ExtendedTabbedPage), typeof(ExtendedTabbedPageRenderer))] namespace Bit.iOS.Controls { - public class ExtendedTabbedPageRenderer: TabbedRenderer + public class ExtendedTabbedPageRenderer : TabbedRenderer { protected override void OnElementChanged(VisualElementChangedEventArgs e) {