mirror of
https://github.com/bitwarden/mobile.git
synced 2024-06-27 10:44:49 +02:00
2e8824ce05
* Account Switching (#1720) * Account switching * WIP * wip * wip * updates to send test logic * fixed Send tests * fixes for theme handling on account switching and re-adding existing account * switch fixes * fixes * fixes * cleanup * vault timeout fixes * account list status enhancements * logout fixes and token handling improvements * merge latest (#1727) * remove duplicate dependency * fix for initial login token storage paradox (#1730) * Fix avatar color update toolbar item issue on iOS for account switching (#1735) * Updated account switching menu UI (#1733) * updated account switching menu UI * additional changes * add key suffix to constant * GetFirstLetters method tweaks * Fix crash on account switching when logging out when having more than user at a time (#1740) * single account migration to multi-account on app update (#1741) * Account Switching Tap to dismiss (#1743) * Added tap to dismiss on the Account switching overlay and improved a bit the code * Fix account switching overlay background transparent on the proper place * Fixed transparent background and the shadow on the account switching overlay * Fix iOS top space on Account switching list overlay after modal (#1746) * Fix top space added to Account switching list overlay after closing modal * Fix top space added to Account switching list overlay after closing modal on lock, login and home views just in case we add modals in the future there as well * Usability: dismiss account list on certain events (#1748) * dismiss account list on certain events * use new FireAndForget method for back button logic * Create and use Account Switching overlay control (#1753) * Added Account switching overlay control and its own ViewModel and refactored accordingly * Fix account switching Accounts list binding update * Implemented dismiss account switching overlay when changing tabs and when selecting the same tab. Also updated the deprecated listener on CustomTabbedRenderer on Android (#1755) * Overriden Equals on AvatarImageSource so it doesn't get set multiple times when it's the same image thus producing blinking on tab chaged (#1756) * Usability improvements for logout on vault timeout (#1781) * accountswitching fixes (#1784) * Fix for invalid PIN lock state when switching accounts (#1792) * fix for pin lock flow * named tuple values and updated async * clear send service cache on account switch (#1796) * Global theme and account removal (#1793) * Global theme and account removal * remove redundant call to hide account list overlay * cleanup and additional tweaks * add try/catch to remove account dialog flow Co-authored-by: Federico Maccaroni <fedemkr@gmail.com>
199 lines
8.0 KiB
C#
199 lines
8.0 KiB
C#
using System;
|
|
using System.Linq;
|
|
using Bit.iOS.Extension.Models;
|
|
using Foundation;
|
|
using UIKit;
|
|
using Bit.iOS.Core.Utilities;
|
|
using Bit.iOS.Core;
|
|
using MobileCoreServices;
|
|
using Bit.iOS.Core.Controllers;
|
|
using Bit.App.Resources;
|
|
using Bit.iOS.Core.Views;
|
|
|
|
namespace Bit.iOS.Extension
|
|
{
|
|
public partial class LoginListViewController : ExtendedUITableViewController
|
|
{
|
|
public LoginListViewController(IntPtr handle)
|
|
: base(handle)
|
|
{
|
|
DismissModalAction = Cancel;
|
|
}
|
|
|
|
public Context Context { get; set; }
|
|
public LoadingViewController LoadingController { get; set; }
|
|
|
|
public async override void ViewDidLoad()
|
|
{
|
|
base.ViewDidLoad();
|
|
AddBarButton.TintColor = ThemeHelpers.NavBarTextColor;
|
|
CancelBarButton.TintColor = ThemeHelpers.NavBarTextColor;
|
|
NavItem.Title = AppResources.Items;
|
|
if (!CanAutoFill())
|
|
{
|
|
CancelBarButton.Title = AppResources.Close;
|
|
}
|
|
else
|
|
{
|
|
CancelBarButton.Title = AppResources.Cancel;
|
|
}
|
|
TableView.RowHeight = UITableView.AutomaticDimension;
|
|
TableView.EstimatedRowHeight = 44;
|
|
TableView.Source = new TableSource(this);
|
|
await ((TableSource)TableView.Source).LoadItemsAsync();
|
|
}
|
|
|
|
public bool CanAutoFill()
|
|
{
|
|
if (Context.ProviderType != Constants.UTTypeAppExtensionFillBrowserAction
|
|
&& Context.ProviderType != Constants.UTTypeAppExtensionFillWebViewAction
|
|
&& Context.ProviderType != UTType.PropertyList
|
|
&& Context.ProviderType != Constants.UTTypeAppExtensionUrl)
|
|
{
|
|
return true;
|
|
}
|
|
return Context.Details?.HasPasswordField ?? false;
|
|
|
|
}
|
|
|
|
partial void CancelBarButton_Activated(UIBarButtonItem sender)
|
|
{
|
|
Cancel();
|
|
}
|
|
|
|
private void Cancel()
|
|
{
|
|
LoadingController.CompleteRequest(null, null);
|
|
}
|
|
|
|
partial void AddBarButton_Activated(UIBarButtonItem sender)
|
|
{
|
|
PerformSegue("loginAddSegue", this);
|
|
}
|
|
|
|
public override void PrepareForSegue(UIStoryboardSegue segue, NSObject sender)
|
|
{
|
|
if (segue.DestinationViewController is UINavigationController navController)
|
|
{
|
|
if (navController.TopViewController is LoginAddViewController addLoginController)
|
|
{
|
|
addLoginController.Context = Context;
|
|
addLoginController.LoginListController = this;
|
|
segue.DestinationViewController.PresentationController.Delegate =
|
|
new CustomPresentationControllerDelegate(addLoginController.DismissModalAction);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void DismissModal()
|
|
{
|
|
DismissViewController(true, async () =>
|
|
{
|
|
await ((TableSource)TableView.Source).LoadItemsAsync();
|
|
TableView.ReloadData();
|
|
});
|
|
}
|
|
|
|
public class TableSource : ExtensionTableSource
|
|
{
|
|
private LoginListViewController _controller;
|
|
|
|
public TableSource(LoginListViewController controller)
|
|
: base(controller.Context, controller)
|
|
{
|
|
_controller = controller;
|
|
}
|
|
|
|
public override void RowSelected(UITableView tableView, NSIndexPath indexPath)
|
|
{
|
|
tableView.DeselectRow(indexPath, true);
|
|
tableView.EndEditing(true);
|
|
|
|
if (Items == null || Items.Count() == 0)
|
|
{
|
|
_controller.PerformSegue("loginAddSegue", this);
|
|
return;
|
|
}
|
|
|
|
var item = Items.ElementAt(indexPath.Row);
|
|
if (item == null)
|
|
{
|
|
_controller.LoadingController.CompleteRequest(null, null);
|
|
return;
|
|
}
|
|
|
|
if (_controller.CanAutoFill() && !string.IsNullOrWhiteSpace(item.Password))
|
|
{
|
|
string totp = null;
|
|
var disableTotpCopy = _stateService.GetDisableAutoTotpCopyAsync().GetAwaiter().GetResult();
|
|
if (!disableTotpCopy.GetValueOrDefault(false))
|
|
{
|
|
totp = GetTotpAsync(item).GetAwaiter().GetResult();
|
|
}
|
|
_controller.LoadingController.CompleteUsernamePasswordRequest(
|
|
item.Id, item.Username, item.Password, item.Fields, totp);
|
|
}
|
|
else if (!string.IsNullOrWhiteSpace(item.Username) || !string.IsNullOrWhiteSpace(item.Password) ||
|
|
!string.IsNullOrWhiteSpace(item.Totp))
|
|
{
|
|
var sheet = Dialogs.CreateActionSheet(item.Name, _controller);
|
|
if (!string.IsNullOrWhiteSpace(item.Username))
|
|
{
|
|
sheet.AddAction(UIAlertAction.Create(AppResources.CopyUsername, UIAlertActionStyle.Default, a =>
|
|
{
|
|
UIPasteboard clipboard = UIPasteboard.General;
|
|
clipboard.String = item.Username;
|
|
var alert = Dialogs.CreateMessageAlert(AppResources.CopyUsername);
|
|
_controller.PresentViewController(alert, true, () =>
|
|
{
|
|
_controller.DismissViewController(true, null);
|
|
});
|
|
}));
|
|
}
|
|
if (!string.IsNullOrWhiteSpace(item.Password))
|
|
{
|
|
sheet.AddAction(UIAlertAction.Create(AppResources.CopyPassword, UIAlertActionStyle.Default, a =>
|
|
{
|
|
UIPasteboard clipboard = UIPasteboard.General;
|
|
clipboard.String = item.Password;
|
|
var alert = Dialogs.CreateMessageAlert(
|
|
string.Format(AppResources.ValueHasBeenCopied, AppResources.Password));
|
|
_controller.PresentViewController(alert, true, () =>
|
|
{
|
|
_controller.DismissViewController(true, null);
|
|
});
|
|
}));
|
|
}
|
|
if (!string.IsNullOrWhiteSpace(item.Totp))
|
|
{
|
|
sheet.AddAction(UIAlertAction.Create(AppResources.CopyTotp, UIAlertActionStyle.Default,
|
|
async a =>
|
|
{
|
|
var totp = await GetTotpAsync(item);
|
|
if (string.IsNullOrWhiteSpace(totp))
|
|
{
|
|
return;
|
|
}
|
|
UIPasteboard clipboard = UIPasteboard.General;
|
|
clipboard.String = totp;
|
|
var alert = Dialogs.CreateMessageAlert(
|
|
string.Format(AppResources.ValueHasBeenCopied, AppResources.VerificationCodeTotp));
|
|
_controller.PresentViewController(alert, true, () =>
|
|
{
|
|
_controller.DismissViewController(true, null);
|
|
});
|
|
}));
|
|
}
|
|
sheet.AddAction(UIAlertAction.Create(AppResources.Cancel, UIAlertActionStyle.Cancel, null));
|
|
_controller.PresentViewController(sheet, true, null);
|
|
}
|
|
else
|
|
{
|
|
var alert = Dialogs.CreateAlert(null, AppResources.NoUsernamePasswordConfigured, AppResources.Ok);
|
|
_controller.PresentViewController(alert, true, null);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|