mirror of
https://github.com/bitwarden/mobile.git
synced 2025-02-20 01:51:26 +01:00
Reactor rename Sites => Logins
This commit is contained in:
parent
a176542114
commit
991afb7722
@ -33,7 +33,7 @@ namespace Bit.Android
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// TODO: lookup site
|
// TODO: lookup login
|
||||||
LastReceivedCredentials = new Credentials { User = "username", Password = "12345678", Url = _lastQueriedUrl };
|
LastReceivedCredentials = new Credentials { User = "username", Password = "12345678", Url = _lastQueriedUrl };
|
||||||
}
|
}
|
||||||
catch(Exception e)
|
catch(Exception e)
|
||||||
|
@ -196,7 +196,7 @@ namespace Bit.Android
|
|||||||
.RegisterType<IKeyDerivationService, BouncyCastleKeyDerivationService>(new ContainerControlledLifetimeManager())
|
.RegisterType<IKeyDerivationService, BouncyCastleKeyDerivationService>(new ContainerControlledLifetimeManager())
|
||||||
.RegisterType<IAuthService, AuthService>(new ContainerControlledLifetimeManager())
|
.RegisterType<IAuthService, AuthService>(new ContainerControlledLifetimeManager())
|
||||||
.RegisterType<IFolderService, FolderService>(new ContainerControlledLifetimeManager())
|
.RegisterType<IFolderService, FolderService>(new ContainerControlledLifetimeManager())
|
||||||
.RegisterType<ISiteService, SiteService>(new ContainerControlledLifetimeManager())
|
.RegisterType<ILoginService, LoginService>(new ContainerControlledLifetimeManager())
|
||||||
.RegisterType<ISyncService, SyncService>(new ContainerControlledLifetimeManager())
|
.RegisterType<ISyncService, SyncService>(new ContainerControlledLifetimeManager())
|
||||||
.RegisterType<IClipboardService, ClipboardService>(new ContainerControlledLifetimeManager())
|
.RegisterType<IClipboardService, ClipboardService>(new ContainerControlledLifetimeManager())
|
||||||
.RegisterType<IPushNotificationListener, PushNotificationListener>(new ContainerControlledLifetimeManager())
|
.RegisterType<IPushNotificationListener, PushNotificationListener>(new ContainerControlledLifetimeManager())
|
||||||
@ -213,8 +213,8 @@ namespace Bit.Android
|
|||||||
// Repositories
|
// Repositories
|
||||||
.RegisterType<IFolderRepository, FolderRepository>(new ContainerControlledLifetimeManager())
|
.RegisterType<IFolderRepository, FolderRepository>(new ContainerControlledLifetimeManager())
|
||||||
.RegisterType<IFolderApiRepository, FolderApiRepository>(new ContainerControlledLifetimeManager())
|
.RegisterType<IFolderApiRepository, FolderApiRepository>(new ContainerControlledLifetimeManager())
|
||||||
.RegisterType<ISiteRepository, SiteRepository>(new ContainerControlledLifetimeManager())
|
.RegisterType<ILoginRepository, LoginRepository>(new ContainerControlledLifetimeManager())
|
||||||
.RegisterType<ISiteApiRepository, SiteApiRepository>(new ContainerControlledLifetimeManager())
|
.RegisterType<ILoginApiRepository, LoginApiRepository>(new ContainerControlledLifetimeManager())
|
||||||
.RegisterType<IAuthApiRepository, AuthApiRepository>(new ContainerControlledLifetimeManager())
|
.RegisterType<IAuthApiRepository, AuthApiRepository>(new ContainerControlledLifetimeManager())
|
||||||
.RegisterType<IDeviceApiRepository, DeviceApiRepository>(new ContainerControlledLifetimeManager())
|
.RegisterType<IDeviceApiRepository, DeviceApiRepository>(new ContainerControlledLifetimeManager())
|
||||||
.RegisterType<IAccountsApiRepository, AccountsApiRepository>(new ContainerControlledLifetimeManager())
|
.RegisterType<IAccountsApiRepository, AccountsApiRepository>(new ContainerControlledLifetimeManager())
|
||||||
|
@ -8,6 +8,6 @@ namespace Bit.App.Abstractions
|
|||||||
public interface IFolderRepository : IRepository<FolderData, string>
|
public interface IFolderRepository : IRepository<FolderData, string>
|
||||||
{
|
{
|
||||||
Task<IEnumerable<FolderData>> GetAllByUserIdAsync(string userId);
|
Task<IEnumerable<FolderData>> GetAllByUserIdAsync(string userId);
|
||||||
Task DeleteWithSiteUpdateAsync(string id, DateTime revisionDate);
|
Task DeleteWithLoginUpdateAsync(string id, DateTime revisionDate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@ using Bit.App.Models.Api;
|
|||||||
|
|
||||||
namespace Bit.App.Abstractions
|
namespace Bit.App.Abstractions
|
||||||
{
|
{
|
||||||
public interface ISiteApiRepository : IApiRepository<SiteRequest, SiteResponse, string>
|
public interface ILoginApiRepository : IApiRepository<LoginRequest, LoginResponse, string>
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -5,9 +5,9 @@ using Bit.App.Models.Data;
|
|||||||
|
|
||||||
namespace Bit.App.Abstractions
|
namespace Bit.App.Abstractions
|
||||||
{
|
{
|
||||||
public interface ISiteRepository : IRepository<SiteData, string>
|
public interface ILoginRepository : IRepository<LoginData, string>
|
||||||
{
|
{
|
||||||
Task<IEnumerable<SiteData>> GetAllByUserIdAsync(string userId);
|
Task<IEnumerable<LoginData>> GetAllByUserIdAsync(string userId);
|
||||||
Task<IEnumerable<SiteData>> GetAllByUserIdAsync(string userId, bool favorite);
|
Task<IEnumerable<LoginData>> GetAllByUserIdAsync(string userId, bool favorite);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,12 +5,12 @@ using Bit.App.Models.Api;
|
|||||||
|
|
||||||
namespace Bit.App.Abstractions
|
namespace Bit.App.Abstractions
|
||||||
{
|
{
|
||||||
public interface ISiteService
|
public interface ILoginService
|
||||||
{
|
{
|
||||||
Task<Site> GetByIdAsync(string id);
|
Task<Login> GetByIdAsync(string id);
|
||||||
Task<IEnumerable<Site>> GetAllAsync();
|
Task<IEnumerable<Login>> GetAllAsync();
|
||||||
Task<IEnumerable<Site>> GetAllAsync(bool favorites);
|
Task<IEnumerable<Login>> GetAllAsync(bool favorites);
|
||||||
Task<ApiResult<SiteResponse>> SaveAsync(Site site);
|
Task<ApiResult<LoginResponse>> SaveAsync(Login login);
|
||||||
Task<ApiResult> DeleteAsync(string id);
|
Task<ApiResult> DeleteAsync(string id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,7 @@ namespace Bit.App.Abstractions
|
|||||||
bool SyncInProgress { get; }
|
bool SyncInProgress { get; }
|
||||||
Task<bool> SyncAsync(string id);
|
Task<bool> SyncAsync(string id);
|
||||||
Task<bool> SyncDeleteFolderAsync(string id, DateTime revisionDate);
|
Task<bool> SyncDeleteFolderAsync(string id, DateTime revisionDate);
|
||||||
Task<bool> SyncDeleteSiteAsync(string id);
|
Task<bool> SyncDeleteLoginAsync(string id);
|
||||||
Task<bool> FullSyncAsync();
|
Task<bool> FullSyncAsync();
|
||||||
Task<bool> IncrementalSyncAsync(TimeSpan syncThreshold);
|
Task<bool> IncrementalSyncAsync(TimeSpan syncThreshold);
|
||||||
Task<bool> IncrementalSyncAsync();
|
Task<bool> IncrementalSyncAsync();
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
public enum CipherType : short
|
public enum CipherType : short
|
||||||
{
|
{
|
||||||
Folder = 0,
|
Folder = 0,
|
||||||
Site = 1
|
Login = 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
{
|
{
|
||||||
SyncCipherUpdate = 0,
|
SyncCipherUpdate = 0,
|
||||||
SyncCipherCreate = 1,
|
SyncCipherCreate = 1,
|
||||||
SyncSiteDelete = 2,
|
SyncLoginDelete = 2,
|
||||||
SyncFolderDelete = 3,
|
SyncFolderDelete = 3,
|
||||||
SyncCiphers = 4
|
SyncCiphers = 4
|
||||||
}
|
}
|
||||||
|
@ -1,16 +1,16 @@
|
|||||||
namespace Bit.App.Models.Api
|
namespace Bit.App.Models.Api
|
||||||
{
|
{
|
||||||
public class SiteRequest
|
public class LoginRequest
|
||||||
{
|
{
|
||||||
public SiteRequest(Site site)
|
public LoginRequest(Login login)
|
||||||
{
|
{
|
||||||
FolderId = site.FolderId;
|
FolderId = login.FolderId;
|
||||||
Name = site.Name?.EncryptedString;
|
Name = login.Name?.EncryptedString;
|
||||||
Uri = site.Uri?.EncryptedString;
|
Uri = login.Uri?.EncryptedString;
|
||||||
Username = site.Username?.EncryptedString;
|
Username = login.Username?.EncryptedString;
|
||||||
Password = site.Password?.EncryptedString;
|
Password = login.Password?.EncryptedString;
|
||||||
Notes = site.Notes?.EncryptedString;
|
Notes = login.Notes?.EncryptedString;
|
||||||
Favorite = site.Favorite;
|
Favorite = login.Favorite;
|
||||||
}
|
}
|
||||||
|
|
||||||
public string FolderId { get; set; }
|
public string FolderId { get; set; }
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
namespace Bit.App.Models.Api
|
namespace Bit.App.Models.Api
|
||||||
{
|
{
|
||||||
public class SiteResponse
|
public class LoginResponse
|
||||||
{
|
{
|
||||||
public string Id { get; set; }
|
public string Id { get; set; }
|
||||||
public string FolderId { get; set; }
|
public string FolderId { get; set; }
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
namespace Bit.App.Models.Api
|
namespace Bit.App.Models.Api
|
||||||
{
|
{
|
||||||
public class SiteDataModel
|
public class LoginDataModel
|
||||||
{
|
{
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
public string Uri { get; set; }
|
public string Uri { get; set; }
|
||||||
|
@ -33,7 +33,7 @@ namespace Bit.App.Models.Data
|
|||||||
throw new ArgumentException(nameof(cipher.Type));
|
throw new ArgumentException(nameof(cipher.Type));
|
||||||
}
|
}
|
||||||
|
|
||||||
var data = cipher.Data.ToObject<SiteDataModel>();
|
var data = cipher.Data.ToObject<LoginDataModel>();
|
||||||
|
|
||||||
Id = cipher.Id;
|
Id = cipher.Id;
|
||||||
UserId = userId;
|
UserId = userId;
|
||||||
|
@ -6,46 +6,46 @@ using Bit.App.Models.Api;
|
|||||||
namespace Bit.App.Models.Data
|
namespace Bit.App.Models.Data
|
||||||
{
|
{
|
||||||
[Table("Site")]
|
[Table("Site")]
|
||||||
public class SiteData : IDataObject<string>
|
public class LoginData : IDataObject<string>
|
||||||
{
|
{
|
||||||
public SiteData()
|
public LoginData()
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
public SiteData(Site site, string userId)
|
public LoginData(Login login, string userId)
|
||||||
{
|
{
|
||||||
Id = site.Id;
|
Id = login.Id;
|
||||||
FolderId = site.FolderId;
|
FolderId = login.FolderId;
|
||||||
UserId = userId;
|
UserId = userId;
|
||||||
Name = site.Name?.EncryptedString;
|
Name = login.Name?.EncryptedString;
|
||||||
Uri = site.Uri?.EncryptedString;
|
Uri = login.Uri?.EncryptedString;
|
||||||
Username = site.Username?.EncryptedString;
|
Username = login.Username?.EncryptedString;
|
||||||
Password = site.Password?.EncryptedString;
|
Password = login.Password?.EncryptedString;
|
||||||
Notes = site.Notes?.EncryptedString;
|
Notes = login.Notes?.EncryptedString;
|
||||||
Favorite = site.Favorite;
|
Favorite = login.Favorite;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SiteData(SiteResponse site, string userId)
|
public LoginData(LoginResponse login, string userId)
|
||||||
{
|
{
|
||||||
Id = site.Id;
|
Id = login.Id;
|
||||||
FolderId = site.FolderId;
|
FolderId = login.FolderId;
|
||||||
UserId = userId;
|
UserId = userId;
|
||||||
Name = site.Name;
|
Name = login.Name;
|
||||||
Uri = site.Uri;
|
Uri = login.Uri;
|
||||||
Username = site.Username;
|
Username = login.Username;
|
||||||
Password = site.Password;
|
Password = login.Password;
|
||||||
Notes = site.Notes;
|
Notes = login.Notes;
|
||||||
Favorite = site.Favorite;
|
Favorite = login.Favorite;
|
||||||
RevisionDateTime = site.RevisionDate;
|
RevisionDateTime = login.RevisionDate;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SiteData(CipherResponse cipher, string userId)
|
public LoginData(CipherResponse cipher, string userId)
|
||||||
{
|
{
|
||||||
if(cipher.Type != Enums.CipherType.Site)
|
if(cipher.Type != Enums.CipherType.Login)
|
||||||
{
|
{
|
||||||
throw new ArgumentException(nameof(cipher.Type));
|
throw new ArgumentException(nameof(cipher.Type));
|
||||||
}
|
}
|
||||||
|
|
||||||
var data = cipher.Data.ToObject<SiteDataModel>();
|
var data = cipher.Data.ToObject<LoginDataModel>();
|
||||||
|
|
||||||
Id = cipher.Id;
|
Id = cipher.Id;
|
||||||
FolderId = cipher.FolderId;
|
FolderId = cipher.FolderId;
|
||||||
@ -72,9 +72,9 @@ namespace Bit.App.Models.Data
|
|||||||
public bool Favorite { get; set; }
|
public bool Favorite { get; set; }
|
||||||
public DateTime RevisionDateTime { get; set; } = DateTime.UtcNow;
|
public DateTime RevisionDateTime { get; set; } = DateTime.UtcNow;
|
||||||
|
|
||||||
public Site ToSite()
|
public Login ToLogin()
|
||||||
{
|
{
|
||||||
return new Site(this);
|
return new Login(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,16 +6,16 @@ namespace Bit.App.Models.Page
|
|||||||
{
|
{
|
||||||
public class VaultListPageModel
|
public class VaultListPageModel
|
||||||
{
|
{
|
||||||
public class Site
|
public class Login
|
||||||
{
|
{
|
||||||
public Site(Models.Site site)
|
public Login(Models.Login login)
|
||||||
{
|
{
|
||||||
Id = site.Id;
|
Id = login.Id;
|
||||||
FolderId = site.FolderId;
|
FolderId = login.FolderId;
|
||||||
Name = site.Name?.Decrypt();
|
Name = login.Name?.Decrypt();
|
||||||
Username = site.Username?.Decrypt() ?? " ";
|
Username = login.Username?.Decrypt() ?? " ";
|
||||||
Password = new Lazy<string>(() => site.Password?.Decrypt());
|
Password = new Lazy<string>(() => login.Password?.Decrypt());
|
||||||
Uri = new Lazy<string>(() => site.Uri?.Decrypt());
|
Uri = new Lazy<string>(() => login.Uri?.Decrypt());
|
||||||
}
|
}
|
||||||
|
|
||||||
public string Id { get; set; }
|
public string Id { get; set; }
|
||||||
@ -26,7 +26,7 @@ namespace Bit.App.Models.Page
|
|||||||
public Lazy<string> Uri { get; set; }
|
public Lazy<string> Uri { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class Folder : List<Site>
|
public class Folder : List<Login>
|
||||||
{
|
{
|
||||||
public Folder(Models.Folder folder)
|
public Folder(Models.Folder folder)
|
||||||
{
|
{
|
||||||
@ -34,9 +34,9 @@ namespace Bit.App.Models.Page
|
|||||||
Name = folder.Name?.Decrypt();
|
Name = folder.Name?.Decrypt();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Folder(List<Site> sites)
|
public Folder(List<Login> logins)
|
||||||
{
|
{
|
||||||
AddRange(sites);
|
AddRange(logins);
|
||||||
}
|
}
|
||||||
|
|
||||||
public string Id { get; set; }
|
public string Id { get; set; }
|
||||||
|
@ -5,7 +5,7 @@ using Xamarin.Forms;
|
|||||||
|
|
||||||
namespace Bit.App.Models.Page
|
namespace Bit.App.Models.Page
|
||||||
{
|
{
|
||||||
public class VaultViewSitePageModel : INotifyPropertyChanged
|
public class VaultViewLoginPageModel : INotifyPropertyChanged
|
||||||
{
|
{
|
||||||
private string _name;
|
private string _name;
|
||||||
private string _username;
|
private string _username;
|
||||||
@ -15,7 +15,7 @@ namespace Bit.App.Models.Page
|
|||||||
private bool _revealPassword;
|
private bool _revealPassword;
|
||||||
private string _uriHost;
|
private string _uriHost;
|
||||||
|
|
||||||
public VaultViewSitePageModel() { }
|
public VaultViewLoginPageModel() { }
|
||||||
|
|
||||||
public event PropertyChangedEventHandler PropertyChanged;
|
public event PropertyChangedEventHandler PropertyChanged;
|
||||||
|
|
||||||
@ -176,13 +176,13 @@ namespace Bit.App.Models.Page
|
|||||||
public string ShowHideText => RevealPassword ? AppResources.Hide : AppResources.Show;
|
public string ShowHideText => RevealPassword ? AppResources.Hide : AppResources.Show;
|
||||||
public ImageSource ShowHideImage => RevealPassword ? ImageSource.FromFile("eye_slash") : ImageSource.FromFile("eye");
|
public ImageSource ShowHideImage => RevealPassword ? ImageSource.FromFile("eye_slash") : ImageSource.FromFile("eye");
|
||||||
|
|
||||||
public void Update(Site site)
|
public void Update(Login login)
|
||||||
{
|
{
|
||||||
Name = site.Name?.Decrypt();
|
Name = login.Name?.Decrypt();
|
||||||
Username = site.Username?.Decrypt();
|
Username = login.Username?.Decrypt();
|
||||||
Password = site.Password?.Decrypt();
|
Password = login.Password?.Decrypt();
|
||||||
Uri = site.Uri?.Decrypt();
|
Uri = login.Uri?.Decrypt();
|
||||||
Notes = site.Notes?.Decrypt();
|
Notes = login.Notes?.Decrypt();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,12 +3,12 @@ using Bit.App.Models.Data;
|
|||||||
|
|
||||||
namespace Bit.App.Models
|
namespace Bit.App.Models
|
||||||
{
|
{
|
||||||
public class Site : Cipher
|
public class Login : Cipher
|
||||||
{
|
{
|
||||||
public Site()
|
public Login()
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
public Site(SiteData data)
|
public Login(LoginData data)
|
||||||
{
|
{
|
||||||
Id = data.Id;
|
Id = data.Id;
|
||||||
FolderId = data.FolderId;
|
FolderId = data.FolderId;
|
||||||
@ -20,7 +20,7 @@ namespace Bit.App.Models
|
|||||||
Favorite = data.Favorite;
|
Favorite = data.Favorite;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Site(SiteResponse response)
|
public Login(LoginResponse response)
|
||||||
{
|
{
|
||||||
Id = response.Id;
|
Id = response.Id;
|
||||||
FolderId = response.FolderId;
|
FolderId = response.FolderId;
|
||||||
@ -39,14 +39,14 @@ namespace Bit.App.Models
|
|||||||
public CipherString Notes { get; set; }
|
public CipherString Notes { get; set; }
|
||||||
public bool Favorite { get; set; }
|
public bool Favorite { get; set; }
|
||||||
|
|
||||||
public SiteRequest ToSiteRequest()
|
public LoginRequest ToLoginRequest()
|
||||||
{
|
{
|
||||||
return new SiteRequest(this);
|
return new LoginRequest(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public SiteData ToSiteData(string userId)
|
public LoginData ToLoginData(string userId)
|
||||||
{
|
{
|
||||||
return new SiteData(this, userId);
|
return new LoginData(this, userId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,8 +12,8 @@ namespace Bit.App.Pages
|
|||||||
TintColor = Color.FromHex("3c8dbc");
|
TintColor = Color.FromHex("3c8dbc");
|
||||||
|
|
||||||
var settingsNavigation = new ExtendedNavigationPage(new SettingsPage());
|
var settingsNavigation = new ExtendedNavigationPage(new SettingsPage());
|
||||||
var favoritesNavigation = new ExtendedNavigationPage(new VaultListSitesPage(true));
|
var favoritesNavigation = new ExtendedNavigationPage(new VaultListLoginsPage(true));
|
||||||
var vaultNavigation = new ExtendedNavigationPage(new VaultListSitesPage(false));
|
var vaultNavigation = new ExtendedNavigationPage(new VaultListLoginsPage(false));
|
||||||
var toolsNavigation = new ExtendedNavigationPage(new ToolsPage());
|
var toolsNavigation = new ExtendedNavigationPage(new ToolsPage());
|
||||||
|
|
||||||
favoritesNavigation.Title = AppResources.Favorites;
|
favoritesNavigation.Title = AppResources.Favorites;
|
||||||
|
@ -133,7 +133,7 @@ namespace Bit.App.Pages
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Validate the delete operation. ex. Cannot delete a folder that has sites in it?
|
// TODO: Validate the delete operation. ex. Cannot delete a folder that has logins in it?
|
||||||
|
|
||||||
if(!await _userDialogs.ConfirmAsync(AppResources.DoYouReallyWantToDelete, null, AppResources.Yes, AppResources.No))
|
if(!await _userDialogs.ConfirmAsync(AppResources.DoYouReallyWantToDelete, null, AppResources.Yes, AppResources.No))
|
||||||
{
|
{
|
||||||
|
@ -13,20 +13,20 @@ using Plugin.Settings.Abstractions;
|
|||||||
|
|
||||||
namespace Bit.App.Pages
|
namespace Bit.App.Pages
|
||||||
{
|
{
|
||||||
public class VaultAddSitePage : ExtendedContentPage
|
public class VaultAddLoginPage : ExtendedContentPage
|
||||||
{
|
{
|
||||||
private const string AddedSiteAlertKey = "addedSiteAlert";
|
private const string AddedLoginAlertKey = "addedSiteAlert";
|
||||||
|
|
||||||
private readonly ISiteService _siteService;
|
private readonly ILoginService _loginService;
|
||||||
private readonly IFolderService _folderService;
|
private readonly IFolderService _folderService;
|
||||||
private readonly IUserDialogs _userDialogs;
|
private readonly IUserDialogs _userDialogs;
|
||||||
private readonly IConnectivity _connectivity;
|
private readonly IConnectivity _connectivity;
|
||||||
private readonly IGoogleAnalyticsService _googleAnalyticsService;
|
private readonly IGoogleAnalyticsService _googleAnalyticsService;
|
||||||
private readonly ISettings _settings;
|
private readonly ISettings _settings;
|
||||||
|
|
||||||
public VaultAddSitePage()
|
public VaultAddLoginPage()
|
||||||
{
|
{
|
||||||
_siteService = Resolver.Resolve<ISiteService>();
|
_loginService = Resolver.Resolve<ILoginService>();
|
||||||
_folderService = Resolver.Resolve<IFolderService>();
|
_folderService = Resolver.Resolve<IFolderService>();
|
||||||
_userDialogs = Resolver.Resolve<IUserDialogs>();
|
_userDialogs = Resolver.Resolve<IUserDialogs>();
|
||||||
_connectivity = Resolver.Resolve<IConnectivity>();
|
_connectivity = Resolver.Resolve<IConnectivity>();
|
||||||
@ -81,7 +81,7 @@ namespace Bit.App.Pages
|
|||||||
HasUnevenRows = true,
|
HasUnevenRows = true,
|
||||||
Root = new TableRoot
|
Root = new TableRoot
|
||||||
{
|
{
|
||||||
new TableSection(AppResources.SiteInformation)
|
new TableSection(AppResources.LoginInformation)
|
||||||
{
|
{
|
||||||
nameCell,
|
nameCell,
|
||||||
uriCell,
|
uriCell,
|
||||||
@ -126,7 +126,7 @@ namespace Bit.App.Pages
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var site = new Site
|
var login = new Login
|
||||||
{
|
{
|
||||||
Uri = uriCell.Entry.Text?.Encrypt(),
|
Uri = uriCell.Entry.Text?.Encrypt(),
|
||||||
Name = nameCell.Entry.Text?.Encrypt(),
|
Name = nameCell.Entry.Text?.Encrypt(),
|
||||||
@ -138,18 +138,18 @@ namespace Bit.App.Pages
|
|||||||
|
|
||||||
if(folderCell.Picker.SelectedIndex > 0)
|
if(folderCell.Picker.SelectedIndex > 0)
|
||||||
{
|
{
|
||||||
site.FolderId = folders.ElementAt(folderCell.Picker.SelectedIndex - 1).Id;
|
login.FolderId = folders.ElementAt(folderCell.Picker.SelectedIndex - 1).Id;
|
||||||
}
|
}
|
||||||
|
|
||||||
_userDialogs.ShowLoading(AppResources.Saving, MaskType.Black);
|
_userDialogs.ShowLoading(AppResources.Saving, MaskType.Black);
|
||||||
var saveTask = await _siteService.SaveAsync(site);
|
var saveTask = await _loginService.SaveAsync(login);
|
||||||
|
|
||||||
_userDialogs.HideLoading();
|
_userDialogs.HideLoading();
|
||||||
if(saveTask.Succeeded)
|
if(saveTask.Succeeded)
|
||||||
{
|
{
|
||||||
await Navigation.PopForDeviceAsync();
|
await Navigation.PopForDeviceAsync();
|
||||||
_userDialogs.Toast(AppResources.NewSiteCreated);
|
_userDialogs.Toast(AppResources.NewLoginCreated);
|
||||||
_googleAnalyticsService.TrackAppEvent("CreatedSite");
|
_googleAnalyticsService.TrackAppEvent("CreatedLogin");
|
||||||
}
|
}
|
||||||
else if(saveTask.Errors.Count() > 0)
|
else if(saveTask.Errors.Count() > 0)
|
||||||
{
|
{
|
||||||
@ -161,7 +161,7 @@ namespace Bit.App.Pages
|
|||||||
}
|
}
|
||||||
}, ToolbarItemOrder.Default, 0);
|
}, ToolbarItemOrder.Default, 0);
|
||||||
|
|
||||||
Title = AppResources.AddSite;
|
Title = AppResources.AddLogin;
|
||||||
Content = table;
|
Content = table;
|
||||||
ToolbarItems.Add(saveToolBarItem);
|
ToolbarItems.Add(saveToolBarItem);
|
||||||
if(Device.OS == TargetPlatform.iOS)
|
if(Device.OS == TargetPlatform.iOS)
|
||||||
@ -178,9 +178,9 @@ namespace Bit.App.Pages
|
|||||||
AlertNoConnection();
|
AlertNoConnection();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(Device.OS == TargetPlatform.iOS && !_settings.GetValueOrDefault(AddedSiteAlertKey, false))
|
if(Device.OS == TargetPlatform.iOS && !_settings.GetValueOrDefault(AddedLoginAlertKey, false))
|
||||||
{
|
{
|
||||||
_settings.AddOrUpdateValue(AddedSiteAlertKey, true);
|
_settings.AddOrUpdateValue(AddedLoginAlertKey, true);
|
||||||
DisplayAlert(AppResources.BitwardenAppExtension, AppResources.BitwardenAppExtensionAlert, AppResources.Ok);
|
DisplayAlert(AppResources.BitwardenAppExtension, AppResources.BitwardenAppExtensionAlert, AppResources.Ok);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,19 +11,19 @@ using XLabs.Ioc;
|
|||||||
|
|
||||||
namespace Bit.App.Pages
|
namespace Bit.App.Pages
|
||||||
{
|
{
|
||||||
public class VaultEditSitePage : ExtendedContentPage
|
public class VaultEditLoginPage : ExtendedContentPage
|
||||||
{
|
{
|
||||||
private readonly string _siteId;
|
private readonly string _loginId;
|
||||||
private readonly ISiteService _siteService;
|
private readonly ILoginService _loginService;
|
||||||
private readonly IFolderService _folderService;
|
private readonly IFolderService _folderService;
|
||||||
private readonly IUserDialogs _userDialogs;
|
private readonly IUserDialogs _userDialogs;
|
||||||
private readonly IConnectivity _connectivity;
|
private readonly IConnectivity _connectivity;
|
||||||
private readonly IGoogleAnalyticsService _googleAnalyticsService;
|
private readonly IGoogleAnalyticsService _googleAnalyticsService;
|
||||||
|
|
||||||
public VaultEditSitePage(string siteId)
|
public VaultEditLoginPage(string loginId)
|
||||||
{
|
{
|
||||||
_siteId = siteId;
|
_loginId = loginId;
|
||||||
_siteService = Resolver.Resolve<ISiteService>();
|
_loginService = Resolver.Resolve<ILoginService>();
|
||||||
_folderService = Resolver.Resolve<IFolderService>();
|
_folderService = Resolver.Resolve<IFolderService>();
|
||||||
_userDialogs = Resolver.Resolve<IUserDialogs>();
|
_userDialogs = Resolver.Resolve<IUserDialogs>();
|
||||||
_connectivity = Resolver.Resolve<IConnectivity>();
|
_connectivity = Resolver.Resolve<IConnectivity>();
|
||||||
@ -36,19 +36,19 @@ namespace Bit.App.Pages
|
|||||||
|
|
||||||
private void Init()
|
private void Init()
|
||||||
{
|
{
|
||||||
var site = _siteService.GetByIdAsync(_siteId).GetAwaiter().GetResult();
|
var login = _loginService.GetByIdAsync(_loginId).GetAwaiter().GetResult();
|
||||||
if(site == null)
|
if(login == null)
|
||||||
{
|
{
|
||||||
// TODO: handle error. navigate back? should never happen...
|
// TODO: handle error. navigate back? should never happen...
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var notesCell = new FormEditorCell(height: 90);
|
var notesCell = new FormEditorCell(height: 90);
|
||||||
notesCell.Editor.Text = site.Notes?.Decrypt();
|
notesCell.Editor.Text = login.Notes?.Decrypt();
|
||||||
|
|
||||||
PasswordCell = new FormEntryCell(AppResources.Password, isPassword: true, nextElement: notesCell.Editor,
|
PasswordCell = new FormEntryCell(AppResources.Password, isPassword: true, nextElement: notesCell.Editor,
|
||||||
useButton: true);
|
useButton: true);
|
||||||
PasswordCell.Entry.Text = site.Password?.Decrypt();
|
PasswordCell.Entry.Text = login.Password?.Decrypt();
|
||||||
PasswordCell.Button.Image = "eye";
|
PasswordCell.Button.Image = "eye";
|
||||||
PasswordCell.Button.Clicked += PasswordButton_Clicked;
|
PasswordCell.Button.Clicked += PasswordButton_Clicked;
|
||||||
PasswordCell.Entry.DisableAutocapitalize = true;
|
PasswordCell.Entry.DisableAutocapitalize = true;
|
||||||
@ -56,14 +56,14 @@ namespace Bit.App.Pages
|
|||||||
PasswordCell.Entry.FontFamily = Device.OnPlatform(iOS: "Courier", Android: "monospace", WinPhone: "Courier");
|
PasswordCell.Entry.FontFamily = Device.OnPlatform(iOS: "Courier", Android: "monospace", WinPhone: "Courier");
|
||||||
|
|
||||||
var usernameCell = new FormEntryCell(AppResources.Username, nextElement: PasswordCell.Entry);
|
var usernameCell = new FormEntryCell(AppResources.Username, nextElement: PasswordCell.Entry);
|
||||||
usernameCell.Entry.Text = site.Username?.Decrypt();
|
usernameCell.Entry.Text = login.Username?.Decrypt();
|
||||||
usernameCell.Entry.DisableAutocapitalize = true;
|
usernameCell.Entry.DisableAutocapitalize = true;
|
||||||
usernameCell.Entry.Autocorrect = false;
|
usernameCell.Entry.Autocorrect = false;
|
||||||
|
|
||||||
var uriCell = new FormEntryCell(AppResources.URI, Keyboard.Url, nextElement: usernameCell.Entry);
|
var uriCell = new FormEntryCell(AppResources.URI, Keyboard.Url, nextElement: usernameCell.Entry);
|
||||||
uriCell.Entry.Text = site.Uri?.Decrypt();
|
uriCell.Entry.Text = login.Uri?.Decrypt();
|
||||||
var nameCell = new FormEntryCell(AppResources.Name, nextElement: uriCell.Entry);
|
var nameCell = new FormEntryCell(AppResources.Name, nextElement: uriCell.Entry);
|
||||||
nameCell.Entry.Text = site.Name?.Decrypt();
|
nameCell.Entry.Text = login.Name?.Decrypt();
|
||||||
|
|
||||||
var generateCell = new ExtendedTextCell
|
var generateCell = new ExtendedTextCell
|
||||||
{
|
{
|
||||||
@ -80,7 +80,7 @@ namespace Bit.App.Pages
|
|||||||
foreach(var folder in folders)
|
foreach(var folder in folders)
|
||||||
{
|
{
|
||||||
i++;
|
i++;
|
||||||
if(folder.Id == site.FolderId)
|
if(folder.Id == login.FolderId)
|
||||||
{
|
{
|
||||||
selectedIndex = i;
|
selectedIndex = i;
|
||||||
}
|
}
|
||||||
@ -93,7 +93,7 @@ namespace Bit.App.Pages
|
|||||||
var favoriteCell = new ExtendedSwitchCell
|
var favoriteCell = new ExtendedSwitchCell
|
||||||
{
|
{
|
||||||
Text = AppResources.Favorite,
|
Text = AppResources.Favorite,
|
||||||
On = site.Favorite
|
On = login.Favorite
|
||||||
};
|
};
|
||||||
|
|
||||||
var deleteCell = new ExtendedTextCell { Text = AppResources.Delete, TextColor = Color.Red };
|
var deleteCell = new ExtendedTextCell { Text = AppResources.Delete, TextColor = Color.Red };
|
||||||
@ -106,7 +106,7 @@ namespace Bit.App.Pages
|
|||||||
HasUnevenRows = true,
|
HasUnevenRows = true,
|
||||||
Root = new TableRoot
|
Root = new TableRoot
|
||||||
{
|
{
|
||||||
new TableSection(AppResources.SiteInformation)
|
new TableSection(AppResources.LoginInformation)
|
||||||
{
|
{
|
||||||
nameCell,
|
nameCell,
|
||||||
uriCell,
|
uriCell,
|
||||||
@ -155,32 +155,32 @@ namespace Bit.App.Pages
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
site.Uri = uriCell.Entry.Text?.Encrypt();
|
login.Uri = uriCell.Entry.Text?.Encrypt();
|
||||||
site.Name = nameCell.Entry.Text?.Encrypt();
|
login.Name = nameCell.Entry.Text?.Encrypt();
|
||||||
site.Username = usernameCell.Entry.Text?.Encrypt();
|
login.Username = usernameCell.Entry.Text?.Encrypt();
|
||||||
site.Password = PasswordCell.Entry.Text?.Encrypt();
|
login.Password = PasswordCell.Entry.Text?.Encrypt();
|
||||||
site.Notes = notesCell.Editor.Text?.Encrypt();
|
login.Notes = notesCell.Editor.Text?.Encrypt();
|
||||||
site.Favorite = favoriteCell.On;
|
login.Favorite = favoriteCell.On;
|
||||||
|
|
||||||
if(folderCell.Picker.SelectedIndex > 0)
|
if(folderCell.Picker.SelectedIndex > 0)
|
||||||
{
|
{
|
||||||
site.FolderId = folders.ElementAt(folderCell.Picker.SelectedIndex - 1).Id;
|
login.FolderId = folders.ElementAt(folderCell.Picker.SelectedIndex - 1).Id;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
site.FolderId = null;
|
login.FolderId = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
_userDialogs.ShowLoading(AppResources.Saving, MaskType.Black);
|
_userDialogs.ShowLoading(AppResources.Saving, MaskType.Black);
|
||||||
var saveTask = await _siteService.SaveAsync(site);
|
var saveTask = await _loginService.SaveAsync(login);
|
||||||
|
|
||||||
_userDialogs.HideLoading();
|
_userDialogs.HideLoading();
|
||||||
|
|
||||||
if(saveTask.Succeeded)
|
if(saveTask.Succeeded)
|
||||||
{
|
{
|
||||||
await Navigation.PopForDeviceAsync();
|
await Navigation.PopForDeviceAsync();
|
||||||
_userDialogs.Toast(AppResources.SiteUpdated);
|
_userDialogs.Toast(AppResources.LoginUpdated);
|
||||||
_googleAnalyticsService.TrackAppEvent("EditedSite");
|
_googleAnalyticsService.TrackAppEvent("EditeLogin");
|
||||||
}
|
}
|
||||||
else if(saveTask.Errors.Count() > 0)
|
else if(saveTask.Errors.Count() > 0)
|
||||||
{
|
{
|
||||||
@ -192,7 +192,7 @@ namespace Bit.App.Pages
|
|||||||
}
|
}
|
||||||
}, ToolbarItemOrder.Default, 0);
|
}, ToolbarItemOrder.Default, 0);
|
||||||
|
|
||||||
Title = AppResources.EditSite;
|
Title = AppResources.EditLogin;
|
||||||
Content = table;
|
Content = table;
|
||||||
ToolbarItems.Add(saveToolBarItem);
|
ToolbarItems.Add(saveToolBarItem);
|
||||||
if(Device.OS == TargetPlatform.iOS)
|
if(Device.OS == TargetPlatform.iOS)
|
||||||
@ -246,14 +246,14 @@ namespace Bit.App.Pages
|
|||||||
}
|
}
|
||||||
|
|
||||||
_userDialogs.ShowLoading(AppResources.Deleting, MaskType.Black);
|
_userDialogs.ShowLoading(AppResources.Deleting, MaskType.Black);
|
||||||
var deleteTask = await _siteService.DeleteAsync(_siteId);
|
var deleteTask = await _loginService.DeleteAsync(_loginId);
|
||||||
_userDialogs.HideLoading();
|
_userDialogs.HideLoading();
|
||||||
|
|
||||||
if(deleteTask.Succeeded)
|
if(deleteTask.Succeeded)
|
||||||
{
|
{
|
||||||
await Navigation.PopForDeviceAsync();
|
await Navigation.PopForDeviceAsync();
|
||||||
_userDialogs.Toast(AppResources.SiteDeleted);
|
_userDialogs.Toast(AppResources.LoginDeleted);
|
||||||
_googleAnalyticsService.TrackAppEvent("DeletedSite");
|
_googleAnalyticsService.TrackAppEvent("DeletedLogin");
|
||||||
}
|
}
|
||||||
else if(deleteTask.Errors.Count() > 0)
|
else if(deleteTask.Errors.Count() > 0)
|
||||||
{
|
{
|
||||||
|
@ -17,10 +17,10 @@ using System.Threading;
|
|||||||
|
|
||||||
namespace Bit.App.Pages
|
namespace Bit.App.Pages
|
||||||
{
|
{
|
||||||
public class VaultListSitesPage : ExtendedContentPage
|
public class VaultListLoginsPage : ExtendedContentPage
|
||||||
{
|
{
|
||||||
private readonly IFolderService _folderService;
|
private readonly IFolderService _folderService;
|
||||||
private readonly ISiteService _siteService;
|
private readonly ILoginService _loginService;
|
||||||
private readonly IUserDialogs _userDialogs;
|
private readonly IUserDialogs _userDialogs;
|
||||||
private readonly IConnectivity _connectivity;
|
private readonly IConnectivity _connectivity;
|
||||||
private readonly IClipboardService _clipboardService;
|
private readonly IClipboardService _clipboardService;
|
||||||
@ -32,12 +32,12 @@ namespace Bit.App.Pages
|
|||||||
private bool _loadExistingData;
|
private bool _loadExistingData;
|
||||||
private CancellationTokenSource _filterResultsCancellationTokenSource;
|
private CancellationTokenSource _filterResultsCancellationTokenSource;
|
||||||
|
|
||||||
public VaultListSitesPage(bool favorites)
|
public VaultListLoginsPage(bool favorites)
|
||||||
: base(true)
|
: base(true)
|
||||||
{
|
{
|
||||||
_favorites = favorites;
|
_favorites = favorites;
|
||||||
_folderService = Resolver.Resolve<IFolderService>();
|
_folderService = Resolver.Resolve<IFolderService>();
|
||||||
_siteService = Resolver.Resolve<ISiteService>();
|
_loginService = Resolver.Resolve<ILoginService>();
|
||||||
_connectivity = Resolver.Resolve<IConnectivity>();
|
_connectivity = Resolver.Resolve<IConnectivity>();
|
||||||
_userDialogs = Resolver.Resolve<IUserDialogs>();
|
_userDialogs = Resolver.Resolve<IUserDialogs>();
|
||||||
_clipboardService = Resolver.Resolve<IClipboardService>();
|
_clipboardService = Resolver.Resolve<IClipboardService>();
|
||||||
@ -55,7 +55,7 @@ namespace Bit.App.Pages
|
|||||||
public ExtendedObservableCollection<VaultListPageModel.Folder> PresentationFolders { get; private set; }
|
public ExtendedObservableCollection<VaultListPageModel.Folder> PresentationFolders { get; private set; }
|
||||||
= new ExtendedObservableCollection<VaultListPageModel.Folder>();
|
= new ExtendedObservableCollection<VaultListPageModel.Folder>();
|
||||||
public ListView ListView { get; set; }
|
public ListView ListView { get; set; }
|
||||||
public VaultListPageModel.Site[] Sites { get; set; } = new VaultListPageModel.Site[] { };
|
public VaultListPageModel.Login[] Logins { get; set; } = new VaultListPageModel.Login[] { };
|
||||||
public VaultListPageModel.Folder[] Folders { get; set; } = new VaultListPageModel.Folder[] { };
|
public VaultListPageModel.Folder[] Folders { get; set; } = new VaultListPageModel.Folder[] { };
|
||||||
public SearchBar Search { get; set; }
|
public SearchBar Search { get; set; }
|
||||||
public StackLayout NoDataStackLayout { get; set; }
|
public StackLayout NoDataStackLayout { get; set; }
|
||||||
@ -74,7 +74,7 @@ namespace Bit.App.Pages
|
|||||||
|
|
||||||
if(!_favorites)
|
if(!_favorites)
|
||||||
{
|
{
|
||||||
ToolbarItems.Add(new AddSiteToolBarItem(this));
|
ToolbarItems.Add(new AddLoginToolBarItem(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
ListView = new ListView(ListViewCachingStrategy.RecycleElement)
|
ListView = new ListView(ListViewCachingStrategy.RecycleElement)
|
||||||
@ -91,7 +91,7 @@ namespace Bit.App.Pages
|
|||||||
ListView.RowHeight = -1;
|
ListView.RowHeight = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ListView.ItemSelected += SiteSelected;
|
ListView.ItemSelected += LoginSelected;
|
||||||
|
|
||||||
Search = new SearchBar
|
Search = new SearchBar
|
||||||
{
|
{
|
||||||
@ -117,7 +117,7 @@ namespace Bit.App.Pages
|
|||||||
|
|
||||||
var noDataLabel = new Label
|
var noDataLabel = new Label
|
||||||
{
|
{
|
||||||
Text = _favorites ? AppResources.NoFavorites : AppResources.NoSites,
|
Text = _favorites ? AppResources.NoFavorites : AppResources.NoLogins,
|
||||||
HorizontalTextAlignment = TextAlignment.Center,
|
HorizontalTextAlignment = TextAlignment.Center,
|
||||||
FontSize = Device.GetNamedSize(NamedSize.Small, typeof(Label)),
|
FontSize = Device.GetNamedSize(NamedSize.Small, typeof(Label)),
|
||||||
Style = (Style)Application.Current.Resources["text-muted"]
|
Style = (Style)Application.Current.Resources["text-muted"]
|
||||||
@ -133,14 +133,14 @@ namespace Bit.App.Pages
|
|||||||
|
|
||||||
if(!_favorites)
|
if(!_favorites)
|
||||||
{
|
{
|
||||||
var addSiteButton = new ExtendedButton
|
var addLoginButton = new ExtendedButton
|
||||||
{
|
{
|
||||||
Text = AppResources.AddASite,
|
Text = AppResources.AddALogin,
|
||||||
Command = new Command(() => AddSite()),
|
Command = new Command(() => AddLogin()),
|
||||||
Style = (Style)Application.Current.Resources["btn-primaryAccent"]
|
Style = (Style)Application.Current.Resources["btn-primaryAccent"]
|
||||||
};
|
};
|
||||||
|
|
||||||
NoDataStackLayout.Children.Add(addSiteButton);
|
NoDataStackLayout.Children.Add(addLoginButton);
|
||||||
}
|
}
|
||||||
|
|
||||||
LoadingIndicator = new ActivityIndicator
|
LoadingIndicator = new ActivityIndicator
|
||||||
@ -206,18 +206,18 @@ namespace Bit.App.Pages
|
|||||||
|
|
||||||
if(string.IsNullOrWhiteSpace(searchFilter))
|
if(string.IsNullOrWhiteSpace(searchFilter))
|
||||||
{
|
{
|
||||||
LoadFolders(Sites, ct);
|
LoadFolders(Logins, ct);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
searchFilter = searchFilter.ToLower();
|
searchFilter = searchFilter.ToLower();
|
||||||
var filteredSites = Sites
|
var filteredLogins = Logins
|
||||||
.Where(s => s.Name.ToLower().Contains(searchFilter) || s.Username.ToLower().Contains(searchFilter))
|
.Where(s => s.Name.ToLower().Contains(searchFilter) || s.Username.ToLower().Contains(searchFilter))
|
||||||
.TakeWhile(s => !ct.IsCancellationRequested)
|
.TakeWhile(s => !ct.IsCancellationRequested)
|
||||||
.ToArray();
|
.ToArray();
|
||||||
|
|
||||||
ct.ThrowIfCancellationRequested();
|
ct.ThrowIfCancellationRequested();
|
||||||
LoadFolders(filteredSites, ct);
|
LoadFolders(filteredLogins, ct);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -289,19 +289,19 @@ namespace Bit.App.Pages
|
|||||||
Task.Run(async () =>
|
Task.Run(async () =>
|
||||||
{
|
{
|
||||||
var foldersTask = _folderService.GetAllAsync();
|
var foldersTask = _folderService.GetAllAsync();
|
||||||
var sitesTask = _favorites ? _siteService.GetAllAsync(true) : _siteService.GetAllAsync();
|
var loginsTask = _favorites ? _loginService.GetAllAsync(true) : _loginService.GetAllAsync();
|
||||||
await Task.WhenAll(foldersTask, sitesTask);
|
await Task.WhenAll(foldersTask, loginsTask);
|
||||||
|
|
||||||
var folders = await foldersTask;
|
var folders = await foldersTask;
|
||||||
var sites = await sitesTask;
|
var logins = await loginsTask;
|
||||||
|
|
||||||
Folders = folders
|
Folders = folders
|
||||||
.Select(f => new VaultListPageModel.Folder(f))
|
.Select(f => new VaultListPageModel.Folder(f))
|
||||||
.OrderBy(s => s.Name)
|
.OrderBy(s => s.Name)
|
||||||
.ToArray();
|
.ToArray();
|
||||||
|
|
||||||
Sites = sites
|
Logins = logins
|
||||||
.Select(s => new VaultListPageModel.Site(s))
|
.Select(s => new VaultListPageModel.Login(s))
|
||||||
.OrderBy(s => s.Name)
|
.OrderBy(s => s.Name)
|
||||||
.ThenBy(s => s.Username)
|
.ThenBy(s => s.Username)
|
||||||
.ToArray();
|
.ToArray();
|
||||||
@ -316,7 +316,7 @@ namespace Bit.App.Pages
|
|||||||
return cts;
|
return cts;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void LoadFolders(VaultListPageModel.Site[] sites, CancellationToken ct)
|
private void LoadFolders(VaultListPageModel.Login[] logins, CancellationToken ct)
|
||||||
{
|
{
|
||||||
var folders = new List<VaultListPageModel.Folder>(Folders);
|
var folders = new List<VaultListPageModel.Folder>(Folders);
|
||||||
|
|
||||||
@ -327,16 +327,16 @@ namespace Bit.App.Pages
|
|||||||
folder.Clear();
|
folder.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
var sitesToAdd = sites
|
var loginsToAdd = logins
|
||||||
.Where(s => s.FolderId == folder.Id)
|
.Where(s => s.FolderId == folder.Id)
|
||||||
.TakeWhile(s => !ct.IsCancellationRequested)
|
.TakeWhile(s => !ct.IsCancellationRequested)
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
ct.ThrowIfCancellationRequested();
|
ct.ThrowIfCancellationRequested();
|
||||||
folder.AddRange(sitesToAdd);
|
folder.AddRange(loginsToAdd);
|
||||||
}
|
}
|
||||||
|
|
||||||
var noneToAdd = sites
|
var noneToAdd = logins
|
||||||
.Where(s => s.FolderId == null)
|
.Where(s => s.FolderId == null)
|
||||||
.TakeWhile(s => !ct.IsCancellationRequested)
|
.TakeWhile(s => !ct.IsCancellationRequested)
|
||||||
.ToList();
|
.ToList();
|
||||||
@ -359,53 +359,53 @@ namespace Bit.App.Pages
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void SiteSelected(object sender, SelectedItemChangedEventArgs e)
|
private async void LoginSelected(object sender, SelectedItemChangedEventArgs e)
|
||||||
{
|
{
|
||||||
var site = e.SelectedItem as VaultListPageModel.Site;
|
var login = e.SelectedItem as VaultListPageModel.Login;
|
||||||
var page = new VaultViewSitePage(site.Id);
|
var page = new VaultViewLoginPage(login.Id);
|
||||||
await Navigation.PushForDeviceAsync(page);
|
await Navigation.PushForDeviceAsync(page);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void MoreClickedAsync(VaultListPageModel.Site site)
|
private async void MoreClickedAsync(VaultListPageModel.Login login)
|
||||||
{
|
{
|
||||||
var buttons = new List<string> { AppResources.View, AppResources.Edit };
|
var buttons = new List<string> { AppResources.View, AppResources.Edit };
|
||||||
if(!string.IsNullOrWhiteSpace(site.Password.Value))
|
if(!string.IsNullOrWhiteSpace(login.Password.Value))
|
||||||
{
|
{
|
||||||
buttons.Add(AppResources.CopyPassword);
|
buttons.Add(AppResources.CopyPassword);
|
||||||
}
|
}
|
||||||
if(!string.IsNullOrWhiteSpace(site.Username))
|
if(!string.IsNullOrWhiteSpace(login.Username))
|
||||||
{
|
{
|
||||||
buttons.Add(AppResources.CopyUsername);
|
buttons.Add(AppResources.CopyUsername);
|
||||||
}
|
}
|
||||||
if(!string.IsNullOrWhiteSpace(site.Uri.Value) && (site.Uri.Value.StartsWith("http://")
|
if(!string.IsNullOrWhiteSpace(login.Uri.Value) && (login.Uri.Value.StartsWith("http://")
|
||||||
|| site.Uri.Value.StartsWith("https://")))
|
|| login.Uri.Value.StartsWith("https://")))
|
||||||
{
|
{
|
||||||
buttons.Add(AppResources.GoToWebsite);
|
buttons.Add(AppResources.GoToWebsite);
|
||||||
}
|
}
|
||||||
|
|
||||||
var selection = await DisplayActionSheet(site.Name, AppResources.Cancel, null, buttons.ToArray());
|
var selection = await DisplayActionSheet(login.Name, AppResources.Cancel, null, buttons.ToArray());
|
||||||
|
|
||||||
if(selection == AppResources.View)
|
if(selection == AppResources.View)
|
||||||
{
|
{
|
||||||
var page = new VaultViewSitePage(site.Id);
|
var page = new VaultViewLoginPage(login.Id);
|
||||||
await Navigation.PushForDeviceAsync(page);
|
await Navigation.PushForDeviceAsync(page);
|
||||||
}
|
}
|
||||||
else if(selection == AppResources.Edit)
|
else if(selection == AppResources.Edit)
|
||||||
{
|
{
|
||||||
var page = new VaultEditSitePage(site.Id);
|
var page = new VaultEditLoginPage(login.Id);
|
||||||
await Navigation.PushForDeviceAsync(page);
|
await Navigation.PushForDeviceAsync(page);
|
||||||
}
|
}
|
||||||
else if(selection == AppResources.CopyPassword)
|
else if(selection == AppResources.CopyPassword)
|
||||||
{
|
{
|
||||||
Copy(site.Password.Value, AppResources.Password);
|
Copy(login.Password.Value, AppResources.Password);
|
||||||
}
|
}
|
||||||
else if(selection == AppResources.CopyUsername)
|
else if(selection == AppResources.CopyUsername)
|
||||||
{
|
{
|
||||||
Copy(site.Username, AppResources.Username);
|
Copy(login.Username, AppResources.Username);
|
||||||
}
|
}
|
||||||
else if(selection == AppResources.GoToWebsite)
|
else if(selection == AppResources.GoToWebsite)
|
||||||
{
|
{
|
||||||
Device.OpenUri(new Uri(site.Uri.Value));
|
Device.OpenUri(new Uri(login.Uri.Value));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -415,17 +415,17 @@ namespace Bit.App.Pages
|
|||||||
_userDialogs.Toast(string.Format(AppResources.ValueHasBeenCopied, alertLabel));
|
_userDialogs.Toast(string.Format(AppResources.ValueHasBeenCopied, alertLabel));
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void AddSite()
|
private async void AddLogin()
|
||||||
{
|
{
|
||||||
var page = new VaultAddSitePage();
|
var page = new VaultAddLoginPage();
|
||||||
await Navigation.PushForDeviceAsync(page);
|
await Navigation.PushForDeviceAsync(page);
|
||||||
}
|
}
|
||||||
|
|
||||||
private class AddSiteToolBarItem : ToolbarItem
|
private class AddLoginToolBarItem : ToolbarItem
|
||||||
{
|
{
|
||||||
private readonly VaultListSitesPage _page;
|
private readonly VaultListLoginsPage _page;
|
||||||
|
|
||||||
public AddSiteToolBarItem(VaultListSitesPage page)
|
public AddLoginToolBarItem(VaultListLoginsPage page)
|
||||||
{
|
{
|
||||||
_page = page;
|
_page = page;
|
||||||
Text = AppResources.Add;
|
Text = AppResources.Add;
|
||||||
@ -435,24 +435,24 @@ namespace Bit.App.Pages
|
|||||||
|
|
||||||
private void ClickedItem(object sender, EventArgs e)
|
private void ClickedItem(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
_page.AddSite();
|
_page.AddLogin();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class VaultListViewCell : LabeledDetailCell
|
private class VaultListViewCell : LabeledDetailCell
|
||||||
{
|
{
|
||||||
private VaultListSitesPage _page;
|
private VaultListLoginsPage _page;
|
||||||
|
|
||||||
public static readonly BindableProperty SiteParameterProperty = BindableProperty.Create(nameof(SiteParameter),
|
public static readonly BindableProperty LoginParameterProperty = BindableProperty.Create(nameof(LoginParameter),
|
||||||
typeof(VaultListPageModel.Site), typeof(VaultListViewCell), null);
|
typeof(VaultListPageModel.Login), typeof(VaultListViewCell), null);
|
||||||
|
|
||||||
public VaultListViewCell(VaultListSitesPage page)
|
public VaultListViewCell(VaultListLoginsPage page)
|
||||||
{
|
{
|
||||||
_page = page;
|
_page = page;
|
||||||
|
|
||||||
SetBinding(SiteParameterProperty, new Binding("."));
|
SetBinding(LoginParameterProperty, new Binding("."));
|
||||||
Label.SetBinding<VaultListPageModel.Site>(Label.TextProperty, s => s.Name);
|
Label.SetBinding<VaultListPageModel.Login>(Label.TextProperty, s => s.Name);
|
||||||
Detail.SetBinding<VaultListPageModel.Site>(Label.TextProperty, s => s.Username);
|
Detail.SetBinding<VaultListPageModel.Login>(Label.TextProperty, s => s.Username);
|
||||||
|
|
||||||
Button.Image = "more";
|
Button.Image = "more";
|
||||||
Button.Command = new Command(() => ShowMore());
|
Button.Command = new Command(() => ShowMore());
|
||||||
@ -461,21 +461,21 @@ namespace Bit.App.Pages
|
|||||||
BackgroundColor = Color.White;
|
BackgroundColor = Color.White;
|
||||||
}
|
}
|
||||||
|
|
||||||
public VaultListPageModel.Site SiteParameter
|
public VaultListPageModel.Login LoginParameter
|
||||||
{
|
{
|
||||||
get { return GetValue(SiteParameterProperty) as VaultListPageModel.Site; }
|
get { return GetValue(LoginParameterProperty) as VaultListPageModel.Login; }
|
||||||
set { SetValue(SiteParameterProperty, value); }
|
set { SetValue(LoginParameterProperty, value); }
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ShowMore()
|
private void ShowMore()
|
||||||
{
|
{
|
||||||
_page.MoreClickedAsync(SiteParameter);
|
_page.MoreClickedAsync(LoginParameter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class VaultListHeaderViewCell : ExtendedViewCell
|
private class VaultListHeaderViewCell : ExtendedViewCell
|
||||||
{
|
{
|
||||||
public VaultListHeaderViewCell(VaultListSitesPage page)
|
public VaultListHeaderViewCell(VaultListLoginsPage page)
|
||||||
{
|
{
|
||||||
var image = new Image
|
var image = new Image
|
||||||
{
|
{
|
||||||
|
@ -9,26 +9,26 @@ using XLabs.Ioc;
|
|||||||
|
|
||||||
namespace Bit.App.Pages
|
namespace Bit.App.Pages
|
||||||
{
|
{
|
||||||
public class VaultViewSitePage : ExtendedContentPage
|
public class VaultViewLoginPage : ExtendedContentPage
|
||||||
{
|
{
|
||||||
private readonly string _siteId;
|
private readonly string _loginId;
|
||||||
private readonly ISiteService _siteService;
|
private readonly ILoginService _loginService;
|
||||||
private readonly IUserDialogs _userDialogs;
|
private readonly IUserDialogs _userDialogs;
|
||||||
private readonly IClipboardService _clipboardService;
|
private readonly IClipboardService _clipboardService;
|
||||||
|
|
||||||
public VaultViewSitePage(string siteId)
|
public VaultViewLoginPage(string loginId)
|
||||||
{
|
{
|
||||||
_siteId = siteId;
|
_loginId = loginId;
|
||||||
_siteService = Resolver.Resolve<ISiteService>();
|
_loginService = Resolver.Resolve<ILoginService>();
|
||||||
_userDialogs = Resolver.Resolve<IUserDialogs>();
|
_userDialogs = Resolver.Resolve<IUserDialogs>();
|
||||||
_clipboardService = Resolver.Resolve<IClipboardService>();
|
_clipboardService = Resolver.Resolve<IClipboardService>();
|
||||||
|
|
||||||
Init();
|
Init();
|
||||||
}
|
}
|
||||||
|
|
||||||
private VaultViewSitePageModel Model { get; set; } = new VaultViewSitePageModel();
|
private VaultViewLoginPageModel Model { get; set; } = new VaultViewLoginPageModel();
|
||||||
private ExtendedTableView Table { get; set; }
|
private ExtendedTableView Table { get; set; }
|
||||||
private TableSection SiteInformationSection { get; set; }
|
private TableSection LoginInformationSection { get; set; }
|
||||||
private TableSection NotesSection { get; set; }
|
private TableSection NotesSection { get; set; }
|
||||||
public LabeledValueCell UsernameCell { get; set; }
|
public LabeledValueCell UsernameCell { get; set; }
|
||||||
public LabeledValueCell PasswordCell { get; set; }
|
public LabeledValueCell PasswordCell { get; set; }
|
||||||
@ -36,7 +36,7 @@ namespace Bit.App.Pages
|
|||||||
|
|
||||||
private void Init()
|
private void Init()
|
||||||
{
|
{
|
||||||
ToolbarItems.Add(new EditSiteToolBarItem(this, _siteId));
|
ToolbarItems.Add(new EditLoginToolBarItem(this, _loginId));
|
||||||
if(Device.OS == TargetPlatform.iOS)
|
if(Device.OS == TargetPlatform.iOS)
|
||||||
{
|
{
|
||||||
ToolbarItems.Add(new DismissModalToolBarItem(this));
|
ToolbarItems.Add(new DismissModalToolBarItem(this));
|
||||||
@ -44,20 +44,20 @@ namespace Bit.App.Pages
|
|||||||
|
|
||||||
// Name
|
// Name
|
||||||
var nameCell = new LabeledValueCell(AppResources.Name);
|
var nameCell = new LabeledValueCell(AppResources.Name);
|
||||||
nameCell.Value.SetBinding<VaultViewSitePageModel>(Label.TextProperty, s => s.Name);
|
nameCell.Value.SetBinding<VaultViewLoginPageModel>(Label.TextProperty, s => s.Name);
|
||||||
|
|
||||||
// Username
|
// Username
|
||||||
UsernameCell = new LabeledValueCell(AppResources.Username, button1Text: AppResources.Copy);
|
UsernameCell = new LabeledValueCell(AppResources.Username, button1Text: AppResources.Copy);
|
||||||
UsernameCell.Value.SetBinding<VaultViewSitePageModel>(Label.TextProperty, s => s.Username);
|
UsernameCell.Value.SetBinding<VaultViewLoginPageModel>(Label.TextProperty, s => s.Username);
|
||||||
UsernameCell.Value.SetBinding<VaultViewSitePageModel>(Label.FontSizeProperty, s => s.UsernameFontSize);
|
UsernameCell.Value.SetBinding<VaultViewLoginPageModel>(Label.FontSizeProperty, s => s.UsernameFontSize);
|
||||||
UsernameCell.Button1.Command = new Command(() => Copy(Model.Username, AppResources.Username));
|
UsernameCell.Button1.Command = new Command(() => Copy(Model.Username, AppResources.Username));
|
||||||
|
|
||||||
// Password
|
// Password
|
||||||
PasswordCell = new LabeledValueCell(AppResources.Password, button1Text: string.Empty,
|
PasswordCell = new LabeledValueCell(AppResources.Password, button1Text: string.Empty,
|
||||||
button2Text: AppResources.Copy);
|
button2Text: AppResources.Copy);
|
||||||
PasswordCell.Value.SetBinding<VaultViewSitePageModel>(Label.TextProperty, s => s.MaskedPassword);
|
PasswordCell.Value.SetBinding<VaultViewLoginPageModel>(Label.TextProperty, s => s.MaskedPassword);
|
||||||
PasswordCell.Value.SetBinding<VaultViewSitePageModel>(Label.FontSizeProperty, s => s.PasswordFontSize);
|
PasswordCell.Value.SetBinding<VaultViewLoginPageModel>(Label.FontSizeProperty, s => s.PasswordFontSize);
|
||||||
PasswordCell.Button1.SetBinding<VaultViewSitePageModel>(Button.ImageProperty, s => s.ShowHideImage);
|
PasswordCell.Button1.SetBinding<VaultViewLoginPageModel>(Button.ImageProperty, s => s.ShowHideImage);
|
||||||
if(Device.OS == TargetPlatform.iOS)
|
if(Device.OS == TargetPlatform.iOS)
|
||||||
{
|
{
|
||||||
PasswordCell.Button1.Margin = new Thickness(10, 0);
|
PasswordCell.Button1.Margin = new Thickness(10, 0);
|
||||||
@ -68,16 +68,16 @@ namespace Bit.App.Pages
|
|||||||
|
|
||||||
// URI
|
// URI
|
||||||
UriCell = new LabeledValueCell(AppResources.Website, button1Text: AppResources.Launch);
|
UriCell = new LabeledValueCell(AppResources.Website, button1Text: AppResources.Launch);
|
||||||
UriCell.Value.SetBinding<VaultViewSitePageModel>(Label.TextProperty, s => s.UriHost);
|
UriCell.Value.SetBinding<VaultViewLoginPageModel>(Label.TextProperty, s => s.UriHost);
|
||||||
UriCell.Button1.SetBinding<VaultViewSitePageModel>(IsVisibleProperty, s => s.ShowLaunch);
|
UriCell.Button1.SetBinding<VaultViewLoginPageModel>(IsVisibleProperty, s => s.ShowLaunch);
|
||||||
UriCell.Button1.Command = new Command(() => Device.OpenUri(new Uri(Model.Uri)));
|
UriCell.Button1.Command = new Command(() => Device.OpenUri(new Uri(Model.Uri)));
|
||||||
|
|
||||||
// Notes
|
// Notes
|
||||||
var notesCell = new LabeledValueCell();
|
var notesCell = new LabeledValueCell();
|
||||||
notesCell.Value.SetBinding<VaultViewSitePageModel>(Label.TextProperty, s => s.Notes);
|
notesCell.Value.SetBinding<VaultViewLoginPageModel>(Label.TextProperty, s => s.Notes);
|
||||||
notesCell.Value.LineBreakMode = LineBreakMode.WordWrap;
|
notesCell.Value.LineBreakMode = LineBreakMode.WordWrap;
|
||||||
|
|
||||||
SiteInformationSection = new TableSection(AppResources.SiteInformation)
|
LoginInformationSection = new TableSection(AppResources.LoginInformation)
|
||||||
{
|
{
|
||||||
nameCell
|
nameCell
|
||||||
};
|
};
|
||||||
@ -95,7 +95,7 @@ namespace Bit.App.Pages
|
|||||||
EnableSelection = false,
|
EnableSelection = false,
|
||||||
Root = new TableRoot
|
Root = new TableRoot
|
||||||
{
|
{
|
||||||
SiteInformationSection,
|
LoginInformationSection,
|
||||||
NotesSection
|
NotesSection
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -114,47 +114,47 @@ namespace Bit.App.Pages
|
|||||||
UriCell.Button1.WidthRequest = 75;
|
UriCell.Button1.WidthRequest = 75;
|
||||||
}
|
}
|
||||||
|
|
||||||
Title = AppResources.ViewSite;
|
Title = AppResources.ViewLogin;
|
||||||
Content = Table;
|
Content = Table;
|
||||||
BindingContext = Model;
|
BindingContext = Model;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async override void OnAppearing()
|
protected async override void OnAppearing()
|
||||||
{
|
{
|
||||||
var site = await _siteService.GetByIdAsync(_siteId);
|
var login = await _loginService.GetByIdAsync(_loginId);
|
||||||
if(site == null)
|
if(login == null)
|
||||||
{
|
{
|
||||||
await Navigation.PopForDeviceAsync();
|
await Navigation.PopForDeviceAsync();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Model.Update(site);
|
Model.Update(login);
|
||||||
|
|
||||||
if(!Model.ShowUri)
|
if(!Model.ShowUri)
|
||||||
{
|
{
|
||||||
SiteInformationSection.Remove(UriCell);
|
LoginInformationSection.Remove(UriCell);
|
||||||
}
|
}
|
||||||
else if(!SiteInformationSection.Contains(UriCell))
|
else if(!LoginInformationSection.Contains(UriCell))
|
||||||
{
|
{
|
||||||
SiteInformationSection.Add(UriCell);
|
LoginInformationSection.Add(UriCell);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!Model.ShowUsername)
|
if(!Model.ShowUsername)
|
||||||
{
|
{
|
||||||
SiteInformationSection.Remove(UsernameCell);
|
LoginInformationSection.Remove(UsernameCell);
|
||||||
}
|
}
|
||||||
else if(!SiteInformationSection.Contains(UsernameCell))
|
else if(!LoginInformationSection.Contains(UsernameCell))
|
||||||
{
|
{
|
||||||
SiteInformationSection.Add(UsernameCell);
|
LoginInformationSection.Add(UsernameCell);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!Model.ShowPassword)
|
if(!Model.ShowPassword)
|
||||||
{
|
{
|
||||||
SiteInformationSection.Remove(PasswordCell);
|
LoginInformationSection.Remove(PasswordCell);
|
||||||
}
|
}
|
||||||
else if(!SiteInformationSection.Contains(PasswordCell))
|
else if(!LoginInformationSection.Contains(PasswordCell))
|
||||||
{
|
{
|
||||||
SiteInformationSection.Add(PasswordCell);
|
LoginInformationSection.Add(PasswordCell);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!Model.ShowNotes)
|
if(!Model.ShowNotes)
|
||||||
@ -175,22 +175,22 @@ namespace Bit.App.Pages
|
|||||||
_userDialogs.Toast(string.Format(AppResources.ValueHasBeenCopied, alertLabel));
|
_userDialogs.Toast(string.Format(AppResources.ValueHasBeenCopied, alertLabel));
|
||||||
}
|
}
|
||||||
|
|
||||||
private class EditSiteToolBarItem : ToolbarItem
|
private class EditLoginToolBarItem : ToolbarItem
|
||||||
{
|
{
|
||||||
private readonly VaultViewSitePage _page;
|
private readonly VaultViewLoginPage _page;
|
||||||
private readonly string _siteId;
|
private readonly string _loginId;
|
||||||
|
|
||||||
public EditSiteToolBarItem(VaultViewSitePage page, string siteId)
|
public EditLoginToolBarItem(VaultViewLoginPage page, string loginId)
|
||||||
{
|
{
|
||||||
_page = page;
|
_page = page;
|
||||||
_siteId = siteId;
|
_loginId = loginId;
|
||||||
Text = AppResources.Edit;
|
Text = AppResources.Edit;
|
||||||
Clicked += ClickedItem;
|
Clicked += ClickedItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void ClickedItem(object sender, EventArgs e)
|
private async void ClickedItem(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
var page = new VaultEditSitePage(_siteId);
|
var page = new VaultEditLoginPage(_loginId);
|
||||||
await _page.Navigation.PushForDeviceAsync(page);
|
await _page.Navigation.PushForDeviceAsync(page);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,11 +22,11 @@ namespace Bit.App.Repositories
|
|||||||
public override Task DeleteAsync(string id)
|
public override Task DeleteAsync(string id)
|
||||||
{
|
{
|
||||||
var now = DateTime.UtcNow;
|
var now = DateTime.UtcNow;
|
||||||
DeleteWithSiteUpdateAsync(id, now);
|
DeleteWithLoginUpdateAsync(id, now);
|
||||||
return Task.FromResult(0);
|
return Task.FromResult(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task DeleteWithSiteUpdateAsync(string id, DateTime revisionDate)
|
public Task DeleteWithLoginUpdateAsync(string id, DateTime revisionDate)
|
||||||
{
|
{
|
||||||
Connection.RunInTransaction(() =>
|
Connection.RunInTransaction(() =>
|
||||||
{
|
{
|
||||||
|
@ -9,9 +9,9 @@ using Plugin.Connectivity.Abstractions;
|
|||||||
|
|
||||||
namespace Bit.App.Repositories
|
namespace Bit.App.Repositories
|
||||||
{
|
{
|
||||||
public class SiteApiRepository : ApiRepository<SiteRequest, SiteResponse, string>, ISiteApiRepository
|
public class LoginApiRepository : ApiRepository<LoginRequest, LoginResponse, string>, ILoginApiRepository
|
||||||
{
|
{
|
||||||
public SiteApiRepository(
|
public LoginApiRepository(
|
||||||
IConnectivity connectivity,
|
IConnectivity connectivity,
|
||||||
IHttpService httpService)
|
IHttpService httpService)
|
||||||
: base(connectivity, httpService)
|
: base(connectivity, httpService)
|
||||||
|
@ -7,22 +7,23 @@ using Bit.App.Models.Data;
|
|||||||
|
|
||||||
namespace Bit.App.Repositories
|
namespace Bit.App.Repositories
|
||||||
{
|
{
|
||||||
public class SiteRepository : Repository<SiteData, string>, ISiteRepository
|
public class LoginRepository : Repository<LoginData, string>, ILoginRepository
|
||||||
{
|
{
|
||||||
public SiteRepository(ISqlService sqlService)
|
public LoginRepository(ISqlService sqlService)
|
||||||
: base(sqlService)
|
: base(sqlService)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
public Task<IEnumerable<SiteData>> GetAllByUserIdAsync(string userId)
|
public Task<IEnumerable<LoginData>> GetAllByUserIdAsync(string userId)
|
||||||
{
|
{
|
||||||
var sites = Connection.Table<SiteData>().Where(f => f.UserId == userId).Cast<SiteData>();
|
var logins = Connection.Table<LoginData>().Where(f => f.UserId == userId).Cast<LoginData>();
|
||||||
return Task.FromResult(sites);
|
return Task.FromResult(logins);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<IEnumerable<SiteData>> GetAllByUserIdAsync(string userId, bool favorite)
|
public Task<IEnumerable<LoginData>> GetAllByUserIdAsync(string userId, bool favorite)
|
||||||
{
|
{
|
||||||
var sites = Connection.Table<SiteData>().Where(f => f.UserId == userId && f.Favorite == favorite).Cast<SiteData>();
|
var logins = Connection.Table<LoginData>().Where(f => f.UserId == userId && f.Favorite == favorite)
|
||||||
return Task.FromResult(sites);
|
.Cast<LoginData>();
|
||||||
|
return Task.FromResult(logins);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
136
src/App/Resources/AppResources.Designer.cs
generated
136
src/App/Resources/AppResources.Designer.cs
generated
@ -98,11 +98,11 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Add a Site.
|
/// Looks up a localized string similar to Add a Login.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string AddASite {
|
public static string AddALogin {
|
||||||
get {
|
get {
|
||||||
return ResourceManager.GetString("AddASite", resourceCulture);
|
return ResourceManager.GetString("AddALogin", resourceCulture);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -116,11 +116,11 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Add Site.
|
/// Looks up a localized string similar to Add Login.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string AddSite {
|
public static string AddLogin {
|
||||||
get {
|
get {
|
||||||
return ResourceManager.GetString("AddSite", resourceCulture);
|
return ResourceManager.GetString("AddLogin", resourceCulture);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -197,7 +197,7 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to The easiest way to add new sites to your vault is from the bitwarden App Extension. Learn more about using the bitwarden App Extension by navigating to the "Tools" screen..
|
/// Looks up a localized string similar to The easiest way to add new logins to your vault is from the bitwarden App Extension. Learn more about using the bitwarden App Extension by navigating to the "Tools" screen..
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string BitwardenAppExtensionAlert {
|
public static string BitwardenAppExtensionAlert {
|
||||||
get {
|
get {
|
||||||
@ -440,11 +440,11 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Edit Site.
|
/// Looks up a localized string similar to Edit Login.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string EditSite {
|
public static string EditLogin {
|
||||||
get {
|
get {
|
||||||
return ResourceManager.GetString("EditSite", resourceCulture);
|
return ResourceManager.GetString("EditLogin", resourceCulture);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -961,6 +961,33 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Login has been deleted..
|
||||||
|
/// </summary>
|
||||||
|
public static string LoginDeleted {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("LoginDeleted", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Login Information.
|
||||||
|
/// </summary>
|
||||||
|
public static string LoginInformation {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("LoginInformation", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to No Name.
|
||||||
|
/// </summary>
|
||||||
|
public static string LoginNoName {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("LoginNoName", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Login.
|
/// Looks up a localized string similar to Login.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -979,6 +1006,24 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Logins.
|
||||||
|
/// </summary>
|
||||||
|
public static string Logins {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("Logins", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Looks up a localized string similar to Login updated..
|
||||||
|
/// </summary>
|
||||||
|
public static string LoginUpdated {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("LoginUpdated", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Log Out.
|
/// Looks up a localized string similar to Log Out.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -1142,11 +1187,11 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to New site created..
|
/// Looks up a localized string similar to New login created..
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string NewSiteCreated {
|
public static string NewLoginCreated {
|
||||||
get {
|
get {
|
||||||
return ResourceManager.GetString("NewSiteCreated", resourceCulture);
|
return ResourceManager.GetString("NewLoginCreated", resourceCulture);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1169,20 +1214,20 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to There are no sites in your vault..
|
/// Looks up a localized string similar to There are no logins in your vault..
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string NoSites {
|
public static string NoLogins {
|
||||||
get {
|
get {
|
||||||
return ResourceManager.GetString("NoSites", resourceCulture);
|
return ResourceManager.GetString("NoLogins", resourceCulture);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to There are no sites in your vault for this website. Tap to add one..
|
/// Looks up a localized string similar to There are no logins in your vault for this website. Tap to add one..
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string NoSitesTap {
|
public static string NoLoginsTap {
|
||||||
get {
|
get {
|
||||||
return ResourceManager.GetString("NoSitesTap", resourceCulture);
|
return ResourceManager.GetString("NoLoginsTap", resourceCulture);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1196,7 +1241,7 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to This site does not have a username or password configured..
|
/// Looks up a localized string similar to This login does not have a username or password configured..
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string NoUsernamePasswordConfigured {
|
public static string NoUsernamePasswordConfigured {
|
||||||
get {
|
get {
|
||||||
@ -1456,51 +1501,6 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to Site has been deleted..
|
|
||||||
/// </summary>
|
|
||||||
public static string SiteDeleted {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("SiteDeleted", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to Site Information.
|
|
||||||
/// </summary>
|
|
||||||
public static string SiteInformation {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("SiteInformation", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to No Name.
|
|
||||||
/// </summary>
|
|
||||||
public static string SiteNoName {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("SiteNoName", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to Sites.
|
|
||||||
/// </summary>
|
|
||||||
public static string Sites {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("Sites", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Looks up a localized string similar to Site updated..
|
|
||||||
/// </summary>
|
|
||||||
public static string SiteUpdated {
|
|
||||||
get {
|
|
||||||
return ResourceManager.GetString("SiteUpdated", resourceCulture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to Submit.
|
/// Looks up a localized string similar to Submit.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -1745,11 +1745,11 @@ namespace Bit.App.Resources {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Looks up a localized string similar to View Site.
|
/// Looks up a localized string similar to View Login.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string ViewSite {
|
public static string ViewLogin {
|
||||||
get {
|
get {
|
||||||
return ResourceManager.GetString("ViewSite", resourceCulture);
|
return ResourceManager.GetString("ViewLogin", resourceCulture);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -127,9 +127,9 @@
|
|||||||
<data name="AddFolder" xml:space="preserve">
|
<data name="AddFolder" xml:space="preserve">
|
||||||
<value>Ajouter dossier</value>
|
<value>Ajouter dossier</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AddSite" xml:space="preserve">
|
<data name="AddLogin" xml:space="preserve">
|
||||||
<value>Ajouter site</value>
|
<value>Ajouter site</value>
|
||||||
<comment>The title for the add site page.</comment>
|
<comment>The title for the add login page.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="AnErrorHasOccurred" xml:space="preserve">
|
<data name="AnErrorHasOccurred" xml:space="preserve">
|
||||||
<value>Une erreur est survenue.</value>
|
<value>Une erreur est survenue.</value>
|
||||||
@ -153,11 +153,11 @@
|
|||||||
</data>
|
</data>
|
||||||
<data name="CopyPassword" xml:space="preserve">
|
<data name="CopyPassword" xml:space="preserve">
|
||||||
<value>Copier mot de passe</value>
|
<value>Copier mot de passe</value>
|
||||||
<comment>The button text that allows a user to copy the site's password to their clipboard.</comment>
|
<comment>The button text that allows a user to copy the login's password to their clipboard.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="CopyUsername" xml:space="preserve">
|
<data name="CopyUsername" xml:space="preserve">
|
||||||
<value>Copier nom d'utilisateur</value>
|
<value>Copier nom d'utilisateur</value>
|
||||||
<comment>The button text that allows a user to copy the site's username to their clipboard.</comment>
|
<comment>The button text that allows a user to copy the login's username to their clipboard.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Credits" xml:space="preserve">
|
<data name="Credits" xml:space="preserve">
|
||||||
<value>Remerciements</value>
|
<value>Remerciements</value>
|
||||||
@ -223,7 +223,7 @@
|
|||||||
</data>
|
</data>
|
||||||
<data name="FolderNone" xml:space="preserve">
|
<data name="FolderNone" xml:space="preserve">
|
||||||
<value>(aucun)</value>
|
<value>(aucun)</value>
|
||||||
<comment>Sites that have no folder specified go in this special "catch-all" folder.</comment>
|
<comment>Logins that have no folder specified go in this special "catch-all" folder.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Folders" xml:space="preserve">
|
<data name="Folders" xml:space="preserve">
|
||||||
<value>Dossiers</value>
|
<value>Dossiers</value>
|
||||||
@ -322,13 +322,13 @@
|
|||||||
<value>Afficher</value>
|
<value>Afficher</value>
|
||||||
<comment>Reveal a hidden value (password).</comment>
|
<comment>Reveal a hidden value (password).</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="SiteDeleted" xml:space="preserve">
|
<data name="LoginDeleted" xml:space="preserve">
|
||||||
<value>Le site a été supprimé.</value>
|
<value>Le site a été supprimé.</value>
|
||||||
<comment>Confirmation message after successfully deleting a site.</comment>
|
<comment>Confirmation message after successfully deleting a login.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="SiteNoName" xml:space="preserve">
|
<data name="LoginNoName" xml:space="preserve">
|
||||||
<value>Aucun nom</value>
|
<value>Aucun nom</value>
|
||||||
<comment>Title text to display when there is no name given for a site.</comment>
|
<comment>Title text to display when there is no name given for a login.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Submit" xml:space="preserve">
|
<data name="Submit" xml:space="preserve">
|
||||||
<value>Soumettre</value>
|
<value>Soumettre</value>
|
||||||
@ -397,7 +397,7 @@
|
|||||||
<data name="AccountCreated" xml:space="preserve">
|
<data name="AccountCreated" xml:space="preserve">
|
||||||
<value>Votre nouveau compte a été créé ! Vous pouvez maintenant vous identifier.</value>
|
<value>Votre nouveau compte a été créé ! Vous pouvez maintenant vous identifier.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AddASite" xml:space="preserve">
|
<data name="AddALogin" xml:space="preserve">
|
||||||
<value>Ajouter un site</value>
|
<value>Ajouter un site</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AppExtension" xml:space="preserve">
|
<data name="AppExtension" xml:space="preserve">
|
||||||
@ -467,7 +467,7 @@
|
|||||||
<data name="CurrentSession" xml:space="preserve">
|
<data name="CurrentSession" xml:space="preserve">
|
||||||
<value>Session actuelle</value>
|
<value>Session actuelle</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EditSite" xml:space="preserve">
|
<data name="EditLogin" xml:space="preserve">
|
||||||
<value>Modifier Site</value>
|
<value>Modifier Site</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnableAutomaticSyncing" xml:space="preserve">
|
<data name="EnableAutomaticSyncing" xml:space="preserve">
|
||||||
@ -603,16 +603,16 @@
|
|||||||
<data name="Never" xml:space="preserve">
|
<data name="Never" xml:space="preserve">
|
||||||
<value>Jamais</value>
|
<value>Jamais</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NewSiteCreated" xml:space="preserve">
|
<data name="NewLoginCreated" xml:space="preserve">
|
||||||
<value>Nouveau site créé.</value>
|
<value>Nouveau site créé.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NoFavorites" xml:space="preserve">
|
<data name="NoFavorites" xml:space="preserve">
|
||||||
<value>Aucun favori dans votre coffre.</value>
|
<value>Aucun favori dans votre coffre.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NoSites" xml:space="preserve">
|
<data name="NoLogins" xml:space="preserve">
|
||||||
<value>Aucun site dans votre coffre.</value>
|
<value>Aucun site dans votre coffre.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NoSitesTap" xml:space="preserve">
|
<data name="NoLoginsTap" xml:space="preserve">
|
||||||
<value>Aucun site dans votre coffre pour ce site web. Appuyez pour en ajouter un.</value>
|
<value>Aucun site dans votre coffre pour ce site web. Appuyez pour en ajouter un.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NoUsernamePasswordConfigured" xml:space="preserve">
|
<data name="NoUsernamePasswordConfigured" xml:space="preserve">
|
||||||
@ -686,10 +686,10 @@
|
|||||||
<data name="SetPINDirection" xml:space="preserve">
|
<data name="SetPINDirection" xml:space="preserve">
|
||||||
<value>Saisissez un code PIN à 4 chiffres pour déverrouiller l'application.</value>
|
<value>Saisissez un code PIN à 4 chiffres pour déverrouiller l'application.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SiteInformation" xml:space="preserve">
|
<data name="LoginInformation" xml:space="preserve">
|
||||||
<value>Informations sur le site</value>
|
<value>Informations sur le site</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SiteUpdated" xml:space="preserve">
|
<data name="LoginUpdated" xml:space="preserve">
|
||||||
<value>Site mis à jour.</value>
|
<value>Site mis à jour.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Submitting" xml:space="preserve">
|
<data name="Submitting" xml:space="preserve">
|
||||||
@ -732,7 +732,7 @@
|
|||||||
<data name="VerificationCode" xml:space="preserve">
|
<data name="VerificationCode" xml:space="preserve">
|
||||||
<value>Code de vérification</value>
|
<value>Code de vérification</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ViewSite" xml:space="preserve">
|
<data name="ViewLogin" xml:space="preserve">
|
||||||
<value>Voir le site</value>
|
<value>Voir le site</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="WebVault" xml:space="preserve">
|
<data name="WebVault" xml:space="preserve">
|
||||||
@ -744,7 +744,7 @@
|
|||||||
<data name="Lost2FAApp" xml:space="preserve">
|
<data name="Lost2FAApp" xml:space="preserve">
|
||||||
<value>Application d'authentification perdue ?</value>
|
<value>Application d'authentification perdue ?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Sites" xml:space="preserve">
|
<data name="Logins" xml:space="preserve">
|
||||||
<value>Sites</value>
|
<value>Sites</value>
|
||||||
<comment>Screen title</comment>
|
<comment>Screen title</comment>
|
||||||
</data>
|
</data>
|
||||||
|
@ -127,9 +127,9 @@
|
|||||||
<data name="AddFolder" xml:space="preserve">
|
<data name="AddFolder" xml:space="preserve">
|
||||||
<value>Add Folder</value>
|
<value>Add Folder</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AddSite" xml:space="preserve">
|
<data name="AddLogin" xml:space="preserve">
|
||||||
<value>Add Site</value>
|
<value>Add Login</value>
|
||||||
<comment>The title for the add site page.</comment>
|
<comment>The title for the add login page.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="AnErrorHasOccurred" xml:space="preserve">
|
<data name="AnErrorHasOccurred" xml:space="preserve">
|
||||||
<value>An error has occurred.</value>
|
<value>An error has occurred.</value>
|
||||||
@ -153,11 +153,11 @@
|
|||||||
</data>
|
</data>
|
||||||
<data name="CopyPassword" xml:space="preserve">
|
<data name="CopyPassword" xml:space="preserve">
|
||||||
<value>Copy Password</value>
|
<value>Copy Password</value>
|
||||||
<comment>The button text that allows a user to copy the site's password to their clipboard.</comment>
|
<comment>The button text that allows a user to copy the login's password to their clipboard.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="CopyUsername" xml:space="preserve">
|
<data name="CopyUsername" xml:space="preserve">
|
||||||
<value>Copy Username</value>
|
<value>Copy Username</value>
|
||||||
<comment>The button text that allows a user to copy the site's username to their clipboard.</comment>
|
<comment>The button text that allows a user to copy the login's username to their clipboard.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Credits" xml:space="preserve">
|
<data name="Credits" xml:space="preserve">
|
||||||
<value>Credits</value>
|
<value>Credits</value>
|
||||||
@ -223,7 +223,7 @@
|
|||||||
</data>
|
</data>
|
||||||
<data name="FolderNone" xml:space="preserve">
|
<data name="FolderNone" xml:space="preserve">
|
||||||
<value>(none)</value>
|
<value>(none)</value>
|
||||||
<comment>Sites that have no folder specified go in this special "catch-all" folder.</comment>
|
<comment>Logins that have no folder specified go in this special "catch-all" folder.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Folders" xml:space="preserve">
|
<data name="Folders" xml:space="preserve">
|
||||||
<value>Folders</value>
|
<value>Folders</value>
|
||||||
@ -322,13 +322,13 @@
|
|||||||
<value>Show</value>
|
<value>Show</value>
|
||||||
<comment>Reveal a hidden value (password).</comment>
|
<comment>Reveal a hidden value (password).</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="SiteDeleted" xml:space="preserve">
|
<data name="LoginDeleted" xml:space="preserve">
|
||||||
<value>Site has been deleted.</value>
|
<value>Login has been deleted.</value>
|
||||||
<comment>Confirmation message after successfully deleting a site.</comment>
|
<comment>Confirmation message after successfully deleting a login.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="SiteNoName" xml:space="preserve">
|
<data name="LoginNoName" xml:space="preserve">
|
||||||
<value>No Name</value>
|
<value>No Name</value>
|
||||||
<comment>Title text to display when there is no name given for a site.</comment>
|
<comment>Title text to display when there is no name given for a login.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Submit" xml:space="preserve">
|
<data name="Submit" xml:space="preserve">
|
||||||
<value>Submit</value>
|
<value>Submit</value>
|
||||||
@ -397,8 +397,8 @@
|
|||||||
<data name="AccountCreated" xml:space="preserve">
|
<data name="AccountCreated" xml:space="preserve">
|
||||||
<value>Your new account has been created! You may now log in.</value>
|
<value>Your new account has been created! You may now log in.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AddASite" xml:space="preserve">
|
<data name="AddALogin" xml:space="preserve">
|
||||||
<value>Add a Site</value>
|
<value>Add a Login</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AppExtension" xml:space="preserve">
|
<data name="AppExtension" xml:space="preserve">
|
||||||
<value>App Extension</value>
|
<value>App Extension</value>
|
||||||
@ -416,7 +416,7 @@
|
|||||||
<value>bitwarden App Extension</value>
|
<value>bitwarden App Extension</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BitwardenAppExtensionAlert" xml:space="preserve">
|
<data name="BitwardenAppExtensionAlert" xml:space="preserve">
|
||||||
<value>The easiest way to add new sites to your vault is from the bitwarden App Extension. Learn more about using the bitwarden App Extension by navigating to the "Tools" screen.</value>
|
<value>The easiest way to add new logins to your vault is from the bitwarden App Extension. Learn more about using the bitwarden App Extension by navigating to the "Tools" screen.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="BitwardenAppExtensionDescription" xml:space="preserve">
|
<data name="BitwardenAppExtensionDescription" xml:space="preserve">
|
||||||
<value>Use bitwarden in Safari and other apps to auto-fill your logins.</value>
|
<value>Use bitwarden in Safari and other apps to auto-fill your logins.</value>
|
||||||
@ -467,8 +467,8 @@
|
|||||||
<data name="CurrentSession" xml:space="preserve">
|
<data name="CurrentSession" xml:space="preserve">
|
||||||
<value>Current Session</value>
|
<value>Current Session</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EditSite" xml:space="preserve">
|
<data name="EditLogin" xml:space="preserve">
|
||||||
<value>Edit Site</value>
|
<value>Edit Login</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnableAutomaticSyncing" xml:space="preserve">
|
<data name="EnableAutomaticSyncing" xml:space="preserve">
|
||||||
<value>Enable Automatic Syncing</value>
|
<value>Enable Automatic Syncing</value>
|
||||||
@ -603,20 +603,20 @@
|
|||||||
<data name="Never" xml:space="preserve">
|
<data name="Never" xml:space="preserve">
|
||||||
<value>Never</value>
|
<value>Never</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NewSiteCreated" xml:space="preserve">
|
<data name="NewLoginCreated" xml:space="preserve">
|
||||||
<value>New site created.</value>
|
<value>New login created.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NoFavorites" xml:space="preserve">
|
<data name="NoFavorites" xml:space="preserve">
|
||||||
<value>There are no favorites in your vault.</value>
|
<value>There are no favorites in your vault.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NoSites" xml:space="preserve">
|
<data name="NoLogins" xml:space="preserve">
|
||||||
<value>There are no sites in your vault.</value>
|
<value>There are no logins in your vault.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NoSitesTap" xml:space="preserve">
|
<data name="NoLoginsTap" xml:space="preserve">
|
||||||
<value>There are no sites in your vault for this website. Tap to add one.</value>
|
<value>There are no logins in your vault for this website. Tap to add one.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NoUsernamePasswordConfigured" xml:space="preserve">
|
<data name="NoUsernamePasswordConfigured" xml:space="preserve">
|
||||||
<value>This site does not have a username or password configured.</value>
|
<value>This login does not have a username or password configured.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="OkGotIt" xml:space="preserve">
|
<data name="OkGotIt" xml:space="preserve">
|
||||||
<value>Ok, got it!</value>
|
<value>Ok, got it!</value>
|
||||||
@ -686,11 +686,11 @@
|
|||||||
<data name="SetPINDirection" xml:space="preserve">
|
<data name="SetPINDirection" xml:space="preserve">
|
||||||
<value>Enter a 4 digit PIN code to unlock the app with.</value>
|
<value>Enter a 4 digit PIN code to unlock the app with.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SiteInformation" xml:space="preserve">
|
<data name="LoginInformation" xml:space="preserve">
|
||||||
<value>Site Information</value>
|
<value>Login Information</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SiteUpdated" xml:space="preserve">
|
<data name="LoginUpdated" xml:space="preserve">
|
||||||
<value>Site updated.</value>
|
<value>Login updated.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Submitting" xml:space="preserve">
|
<data name="Submitting" xml:space="preserve">
|
||||||
<value>Submitting...</value>
|
<value>Submitting...</value>
|
||||||
@ -732,8 +732,8 @@
|
|||||||
<data name="VerificationCode" xml:space="preserve">
|
<data name="VerificationCode" xml:space="preserve">
|
||||||
<value>Verification Code</value>
|
<value>Verification Code</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ViewSite" xml:space="preserve">
|
<data name="ViewLogin" xml:space="preserve">
|
||||||
<value>View Site</value>
|
<value>View Login</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="WebVault" xml:space="preserve">
|
<data name="WebVault" xml:space="preserve">
|
||||||
<value>bitwarden Web Vault</value>
|
<value>bitwarden Web Vault</value>
|
||||||
@ -744,8 +744,8 @@
|
|||||||
<data name="Lost2FAApp" xml:space="preserve">
|
<data name="Lost2FAApp" xml:space="preserve">
|
||||||
<value>Lost authenticator app?</value>
|
<value>Lost authenticator app?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Sites" xml:space="preserve">
|
<data name="Logins" xml:space="preserve">
|
||||||
<value>Sites</value>
|
<value>Logins</value>
|
||||||
<comment>Screen title</comment>
|
<comment>Screen title</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="ExtensionActivated" xml:space="preserve">
|
<data name="ExtensionActivated" xml:space="preserve">
|
||||||
|
@ -127,9 +127,9 @@
|
|||||||
<data name="AddFolder" xml:space="preserve">
|
<data name="AddFolder" xml:space="preserve">
|
||||||
<value>Skapa mapp</value>
|
<value>Skapa mapp</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AddSite" xml:space="preserve">
|
<data name="AddLogin" xml:space="preserve">
|
||||||
<value>Lägg till inloggning</value>
|
<value>Lägg till inloggning</value>
|
||||||
<comment>The title for the add site page.</comment>
|
<comment>The title for the add login page.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="AnErrorHasOccurred" xml:space="preserve">
|
<data name="AnErrorHasOccurred" xml:space="preserve">
|
||||||
<value>Ett fel har inträffat.</value>
|
<value>Ett fel har inträffat.</value>
|
||||||
@ -153,11 +153,11 @@
|
|||||||
</data>
|
</data>
|
||||||
<data name="CopyPassword" xml:space="preserve">
|
<data name="CopyPassword" xml:space="preserve">
|
||||||
<value>Kopiera lösenord</value>
|
<value>Kopiera lösenord</value>
|
||||||
<comment>The button text that allows a user to copy the site's password to their clipboard.</comment>
|
<comment>The button text that allows a user to copy the login's password to their clipboard.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="CopyUsername" xml:space="preserve">
|
<data name="CopyUsername" xml:space="preserve">
|
||||||
<value>Kopiera användarnamn</value>
|
<value>Kopiera användarnamn</value>
|
||||||
<comment>The button text that allows a user to copy the site's username to their clipboard.</comment>
|
<comment>The button text that allows a user to copy the login's username to their clipboard.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Credits" xml:space="preserve">
|
<data name="Credits" xml:space="preserve">
|
||||||
<value>Tillskrivningar</value>
|
<value>Tillskrivningar</value>
|
||||||
@ -229,7 +229,7 @@
|
|||||||
</data>
|
</data>
|
||||||
<data name="FolderNone" xml:space="preserve">
|
<data name="FolderNone" xml:space="preserve">
|
||||||
<value>(ingen)</value>
|
<value>(ingen)</value>
|
||||||
<comment>Sites that have no folder specified go in this special "catch-all" folder.</comment>
|
<comment>Logins that have no folder specified go in this special "catch-all" folder.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Folders" xml:space="preserve">
|
<data name="Folders" xml:space="preserve">
|
||||||
<value>Mappar</value>
|
<value>Mappar</value>
|
||||||
@ -334,13 +334,13 @@
|
|||||||
<value>Visa</value>
|
<value>Visa</value>
|
||||||
<comment>Reveal a hidden value (password).</comment>
|
<comment>Reveal a hidden value (password).</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="SiteDeleted" xml:space="preserve">
|
<data name="LoginDeleted" xml:space="preserve">
|
||||||
<value>Tog bort inloggning.</value>
|
<value>Tog bort inloggning.</value>
|
||||||
<comment>Confirmation message after successfully deleting a site.</comment>
|
<comment>Confirmation message after successfully deleting a login.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="SiteNoName" xml:space="preserve">
|
<data name="LoginNoName" xml:space="preserve">
|
||||||
<value>Inget namn</value>
|
<value>Inget namn</value>
|
||||||
<comment>Title text to display when there is no name given for a site.</comment>
|
<comment>Title text to display when there is no name given for a login.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Submit" xml:space="preserve">
|
<data name="Submit" xml:space="preserve">
|
||||||
<value>Skicka</value>
|
<value>Skicka</value>
|
||||||
@ -414,7 +414,7 @@
|
|||||||
<data name="AccountCreated" xml:space="preserve">
|
<data name="AccountCreated" xml:space="preserve">
|
||||||
<value>Ditt nya konto har blivit skapat! Du kan nu logga in.</value>
|
<value>Ditt nya konto har blivit skapat! Du kan nu logga in.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AddASite" xml:space="preserve">
|
<data name="AddALogin" xml:space="preserve">
|
||||||
<value>Lägg till en inloggning</value>
|
<value>Lägg till en inloggning</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AppExtension" xml:space="preserve">
|
<data name="AppExtension" xml:space="preserve">
|
||||||
@ -489,7 +489,7 @@
|
|||||||
<value>Nuvarande session</value>
|
<value>Nuvarande session</value>
|
||||||
<comment>Current Session</comment>
|
<comment>Current Session</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="EditSite" xml:space="preserve">
|
<data name="EditLogin" xml:space="preserve">
|
||||||
<value>Ändra inloggning</value>
|
<value>Ändra inloggning</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnableAutomaticSyncing" xml:space="preserve">
|
<data name="EnableAutomaticSyncing" xml:space="preserve">
|
||||||
@ -651,25 +651,25 @@
|
|||||||
<data name="Never" xml:space="preserve">
|
<data name="Never" xml:space="preserve">
|
||||||
<value>Aldrig</value>
|
<value>Aldrig</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NewSiteCreated" xml:space="preserve">
|
<data name="NewLoginCreated" xml:space="preserve">
|
||||||
<value>Ny inlogging skapad.</value>
|
<value>Ny inlogging skapad.</value>
|
||||||
<comment>New site created.</comment>
|
<comment>New login created.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="NoFavorites" xml:space="preserve">
|
<data name="NoFavorites" xml:space="preserve">
|
||||||
<value>Det finns inga favoriter i ditt valv.</value>
|
<value>Det finns inga favoriter i ditt valv.</value>
|
||||||
<comment>There are no favorites in your vault.</comment>
|
<comment>There are no favorites in your vault.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="NoSites" xml:space="preserve">
|
<data name="NoLogins" xml:space="preserve">
|
||||||
<value>Det finns inga inloggningar i ditt valv.</value>
|
<value>Det finns inga inloggningar i ditt valv.</value>
|
||||||
<comment>There are no sites in your vault.</comment>
|
<comment>There are no logins in your vault.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="NoSitesTap" xml:space="preserve">
|
<data name="NoLoginsTap" xml:space="preserve">
|
||||||
<value>Det finns inga inloggningar i ditt valv för den här webbplatsen. Tryck för att skapa en.</value>
|
<value>Det finns inga inloggningar i ditt valv för den här webbplatsen. Tryck för att skapa en.</value>
|
||||||
<comment>There are no sites in your vault for this website. Tap to add one.</comment>
|
<comment>There are no logins in your vault for this website. Tap to add one.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="NoUsernamePasswordConfigured" xml:space="preserve">
|
<data name="NoUsernamePasswordConfigured" xml:space="preserve">
|
||||||
<value>Den här inloggningen har inte ett användarnamn eller lösenord inskrivet.</value>
|
<value>Den här inloggningen har inte ett användarnamn eller lösenord inskrivet.</value>
|
||||||
<comment>This site does not have a username or password configured.</comment>
|
<comment>This login does not have a username or password configured.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="OkGotIt" xml:space="preserve">
|
<data name="OkGotIt" xml:space="preserve">
|
||||||
<value>Ok, fattar!</value>
|
<value>Ok, fattar!</value>
|
||||||
@ -753,11 +753,11 @@
|
|||||||
<value>Skriv in en fyrsiffrig PIN-kod som du låser upp appen med.</value>
|
<value>Skriv in en fyrsiffrig PIN-kod som du låser upp appen med.</value>
|
||||||
<comment>Enter a 4 digit PIN code to unlock the app with.</comment>
|
<comment>Enter a 4 digit PIN code to unlock the app with.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="SiteInformation" xml:space="preserve">
|
<data name="LoginInformation" xml:space="preserve">
|
||||||
<value>Inloggningsinformation</value>
|
<value>Inloggningsinformation</value>
|
||||||
<comment>Site Information</comment>
|
<comment>Login Information</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="SiteUpdated" xml:space="preserve">
|
<data name="LoginUpdated" xml:space="preserve">
|
||||||
<value>Inloggning uppdaterad.</value>
|
<value>Inloggning uppdaterad.</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Submitting" xml:space="preserve">
|
<data name="Submitting" xml:space="preserve">
|
||||||
@ -804,7 +804,7 @@
|
|||||||
<value>Verifieringskod</value>
|
<value>Verifieringskod</value>
|
||||||
<comment>Verification Code</comment>
|
<comment>Verification Code</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="ViewSite" xml:space="preserve">
|
<data name="ViewLogin" xml:space="preserve">
|
||||||
<value>Visa inloggning</value>
|
<value>Visa inloggning</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="WebVault" xml:space="preserve">
|
<data name="WebVault" xml:space="preserve">
|
||||||
@ -817,7 +817,7 @@
|
|||||||
<data name="Lost2FAApp" xml:space="preserve">
|
<data name="Lost2FAApp" xml:space="preserve">
|
||||||
<value>Förlorat autentiseringsapp?</value>
|
<value>Förlorat autentiseringsapp?</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Sites" xml:space="preserve">
|
<data name="Logins" xml:space="preserve">
|
||||||
<value>Inloggningar</value>
|
<value>Inloggningar</value>
|
||||||
<comment>Screen title</comment>
|
<comment>Screen title</comment>
|
||||||
</data>
|
</data>
|
||||||
|
@ -127,9 +127,9 @@
|
|||||||
<data name="AddFolder" xml:space="preserve">
|
<data name="AddFolder" xml:space="preserve">
|
||||||
<value>添加文件夹</value>
|
<value>添加文件夹</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AddSite" xml:space="preserve">
|
<data name="AddLogin" xml:space="preserve">
|
||||||
<value>添加网站</value>
|
<value>添加网站</value>
|
||||||
<comment>The title for the add site page.</comment>
|
<comment>The title for the add login page.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="AnErrorHasOccurred" xml:space="preserve">
|
<data name="AnErrorHasOccurred" xml:space="preserve">
|
||||||
<value>发生错误。</value>
|
<value>发生错误。</value>
|
||||||
@ -153,11 +153,11 @@
|
|||||||
</data>
|
</data>
|
||||||
<data name="CopyPassword" xml:space="preserve">
|
<data name="CopyPassword" xml:space="preserve">
|
||||||
<value>复制密码</value>
|
<value>复制密码</value>
|
||||||
<comment>The button text that allows a user to copy the site's password to their clipboard.</comment>
|
<comment>The button text that allows a user to copy the login's password to their clipboard.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="CopyUsername" xml:space="preserve">
|
<data name="CopyUsername" xml:space="preserve">
|
||||||
<value>复制用户名</value>
|
<value>复制用户名</value>
|
||||||
<comment>The button text that allows a user to copy the site's username to their clipboard.</comment>
|
<comment>The button text that allows a user to copy the login's username to their clipboard.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Credits" xml:space="preserve">
|
<data name="Credits" xml:space="preserve">
|
||||||
<value>Credits</value>
|
<value>Credits</value>
|
||||||
@ -223,7 +223,7 @@
|
|||||||
</data>
|
</data>
|
||||||
<data name="FolderNone" xml:space="preserve">
|
<data name="FolderNone" xml:space="preserve">
|
||||||
<value>(无)</value>
|
<value>(无)</value>
|
||||||
<comment>Sites that have no folder specified go in this special "catch-all" folder.</comment>
|
<comment>Logins that have no folder specified go in this special "catch-all" folder.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Folders" xml:space="preserve">
|
<data name="Folders" xml:space="preserve">
|
||||||
<value>文件夹</value>
|
<value>文件夹</value>
|
||||||
@ -322,13 +322,13 @@
|
|||||||
<value>显示</value>
|
<value>显示</value>
|
||||||
<comment>Reveal a hidden value (password).</comment>
|
<comment>Reveal a hidden value (password).</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="SiteDeleted" xml:space="preserve">
|
<data name="LoginDeleted" xml:space="preserve">
|
||||||
<value>网站已被删除。</value>
|
<value>网站已被删除。</value>
|
||||||
<comment>Confirmation message after successfully deleting a site.</comment>
|
<comment>Confirmation message after successfully deleting a login.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="SiteNoName" xml:space="preserve">
|
<data name="LoginNoName" xml:space="preserve">
|
||||||
<value>无名</value>
|
<value>无名</value>
|
||||||
<comment>Title text to display when there is no name given for a site.</comment>
|
<comment>Title text to display when there is no name given for a login.</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="Submit" xml:space="preserve">
|
<data name="Submit" xml:space="preserve">
|
||||||
<value>提交</value>
|
<value>提交</value>
|
||||||
@ -397,7 +397,7 @@
|
|||||||
<data name="AccountCreated" xml:space="preserve">
|
<data name="AccountCreated" xml:space="preserve">
|
||||||
<value>已经为您创建账号!您可以登录了。</value>
|
<value>已经为您创建账号!您可以登录了。</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AddASite" xml:space="preserve">
|
<data name="AddALogin" xml:space="preserve">
|
||||||
<value>添加网站</value>
|
<value>添加网站</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="AppExtension" xml:space="preserve">
|
<data name="AppExtension" xml:space="preserve">
|
||||||
@ -467,7 +467,7 @@
|
|||||||
<data name="CurrentSession" xml:space="preserve">
|
<data name="CurrentSession" xml:space="preserve">
|
||||||
<value>当前会话</value>
|
<value>当前会话</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EditSite" xml:space="preserve">
|
<data name="EditLogin" xml:space="preserve">
|
||||||
<value>编辑网站</value>
|
<value>编辑网站</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="EnableAutomaticSyncing" xml:space="preserve">
|
<data name="EnableAutomaticSyncing" xml:space="preserve">
|
||||||
@ -603,16 +603,16 @@
|
|||||||
<data name="Never" xml:space="preserve">
|
<data name="Never" xml:space="preserve">
|
||||||
<value>从不</value>
|
<value>从不</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NewSiteCreated" xml:space="preserve">
|
<data name="NewLoginCreated" xml:space="preserve">
|
||||||
<value>以创建新网站。</value>
|
<value>以创建新网站。</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NoFavorites" xml:space="preserve">
|
<data name="NoFavorites" xml:space="preserve">
|
||||||
<value>你没有收藏任何网站。</value>
|
<value>你没有收藏任何网站。</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NoSites" xml:space="preserve">
|
<data name="NoLogins" xml:space="preserve">
|
||||||
<value>您的密码库里没有网站。</value>
|
<value>您的密码库里没有网站。</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NoSitesTap" xml:space="preserve">
|
<data name="NoLoginsTap" xml:space="preserve">
|
||||||
<value>您的密码库里没有此网站的登录信息。请添加一个。</value>
|
<value>您的密码库里没有此网站的登录信息。请添加一个。</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="NoUsernamePasswordConfigured" xml:space="preserve">
|
<data name="NoUsernamePasswordConfigured" xml:space="preserve">
|
||||||
@ -686,10 +686,10 @@
|
|||||||
<data name="SetPINDirection" xml:space="preserve">
|
<data name="SetPINDirection" xml:space="preserve">
|
||||||
<value>输入一个 4 位的 PIN 码来解锁应用。</value>
|
<value>输入一个 4 位的 PIN 码来解锁应用。</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SiteInformation" xml:space="preserve">
|
<data name="LoginInformation" xml:space="preserve">
|
||||||
<value>网站信息</value>
|
<value>网站信息</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="SiteUpdated" xml:space="preserve">
|
<data name="LoginUpdated" xml:space="preserve">
|
||||||
<value>网站已更新。</value>
|
<value>网站已更新。</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="Submitting" xml:space="preserve">
|
<data name="Submitting" xml:space="preserve">
|
||||||
@ -732,7 +732,7 @@
|
|||||||
<data name="VerificationCode" xml:space="preserve">
|
<data name="VerificationCode" xml:space="preserve">
|
||||||
<value>验证码</value>
|
<value>验证码</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="ViewSite" xml:space="preserve">
|
<data name="ViewLogin" xml:space="preserve">
|
||||||
<value>查看网站</value>
|
<value>查看网站</value>
|
||||||
</data>
|
</data>
|
||||||
<data name="WebVault" xml:space="preserve">
|
<data name="WebVault" xml:space="preserve">
|
||||||
|
@ -17,7 +17,7 @@ namespace Bit.App.Services
|
|||||||
public void CreateTables()
|
public void CreateTables()
|
||||||
{
|
{
|
||||||
_connection.CreateTable<FolderData>();
|
_connection.CreateTable<FolderData>();
|
||||||
_connection.CreateTable<SiteData>();
|
_connection.CreateTable<LoginData>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -74,13 +74,13 @@ namespace Bit.App.Services
|
|||||||
}
|
}
|
||||||
_syncService.SyncDeleteFolderAsync(folderDeleteMessage.Id, folderDeleteMessage.RevisionDate);
|
_syncService.SyncDeleteFolderAsync(folderDeleteMessage.Id, folderDeleteMessage.RevisionDate);
|
||||||
break;
|
break;
|
||||||
case Enums.PushType.SyncSiteDelete:
|
case Enums.PushType.SyncLoginDelete:
|
||||||
var siteDeleteMessage = values.ToObject<SyncCipherPushNotification>();
|
var loginDeleteMessage = values.ToObject<SyncCipherPushNotification>();
|
||||||
if(siteDeleteMessage.UserId != _authService.UserId)
|
if(loginDeleteMessage.UserId != _authService.UserId)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
_syncService.SyncDeleteSiteAsync(siteDeleteMessage.Id);
|
_syncService.SyncDeleteLoginAsync(loginDeleteMessage.Id);
|
||||||
break;
|
break;
|
||||||
case Enums.PushType.SyncCiphers:
|
case Enums.PushType.SyncCiphers:
|
||||||
var cipherMessage = values.ToObject<SyncCiphersPushNotification>();
|
var cipherMessage = values.ToObject<SyncCiphersPushNotification>();
|
||||||
|
@ -10,73 +10,73 @@ using Xamarin.Forms;
|
|||||||
|
|
||||||
namespace Bit.App.Services
|
namespace Bit.App.Services
|
||||||
{
|
{
|
||||||
public class SiteService : ISiteService
|
public class LoginService : ILoginService
|
||||||
{
|
{
|
||||||
private readonly ISiteRepository _siteRepository;
|
private readonly ILoginRepository _loginRepository;
|
||||||
private readonly IAuthService _authService;
|
private readonly IAuthService _authService;
|
||||||
private readonly ISiteApiRepository _siteApiRepository;
|
private readonly ILoginApiRepository _loginApiRepository;
|
||||||
|
|
||||||
public SiteService(
|
public LoginService(
|
||||||
ISiteRepository siteRepository,
|
ILoginRepository loginRepository,
|
||||||
IAuthService authService,
|
IAuthService authService,
|
||||||
ISiteApiRepository siteApiRepository)
|
ILoginApiRepository loginApiRepository)
|
||||||
{
|
{
|
||||||
_siteRepository = siteRepository;
|
_loginRepository = loginRepository;
|
||||||
_authService = authService;
|
_authService = authService;
|
||||||
_siteApiRepository = siteApiRepository;
|
_loginApiRepository = loginApiRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<Site> GetByIdAsync(string id)
|
public async Task<Login> GetByIdAsync(string id)
|
||||||
{
|
{
|
||||||
var data = await _siteRepository.GetByIdAsync(id);
|
var data = await _loginRepository.GetByIdAsync(id);
|
||||||
if(data == null || data.UserId != _authService.UserId)
|
if(data == null || data.UserId != _authService.UserId)
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
var site = new Site(data);
|
var login = new Login(data);
|
||||||
return site;
|
return login;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IEnumerable<Site>> GetAllAsync()
|
public async Task<IEnumerable<Login>> GetAllAsync()
|
||||||
{
|
{
|
||||||
var data = await _siteRepository.GetAllByUserIdAsync(_authService.UserId);
|
var data = await _loginRepository.GetAllByUserIdAsync(_authService.UserId);
|
||||||
var sites = data.Select(f => new Site(f));
|
var logins = data.Select(f => new Login(f));
|
||||||
return sites;
|
return logins;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IEnumerable<Site>> GetAllAsync(bool favorites)
|
public async Task<IEnumerable<Login>> GetAllAsync(bool favorites)
|
||||||
{
|
{
|
||||||
var data = await _siteRepository.GetAllByUserIdAsync(_authService.UserId, favorites);
|
var data = await _loginRepository.GetAllByUserIdAsync(_authService.UserId, favorites);
|
||||||
var sites = data.Select(f => new Site(f));
|
var logins = data.Select(f => new Login(f));
|
||||||
return sites;
|
return logins;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<ApiResult<SiteResponse>> SaveAsync(Site site)
|
public async Task<ApiResult<LoginResponse>> SaveAsync(Login login)
|
||||||
{
|
{
|
||||||
ApiResult<SiteResponse> response = null;
|
ApiResult<LoginResponse> response = null;
|
||||||
var request = new SiteRequest(site);
|
var request = new LoginRequest(login);
|
||||||
|
|
||||||
if(site.Id == null)
|
if(login.Id == null)
|
||||||
{
|
{
|
||||||
response = await _siteApiRepository.PostAsync(request);
|
response = await _loginApiRepository.PostAsync(request);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
response = await _siteApiRepository.PutAsync(site.Id, request);
|
response = await _loginApiRepository.PutAsync(login.Id, request);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(response.Succeeded)
|
if(response.Succeeded)
|
||||||
{
|
{
|
||||||
var data = new SiteData(response.Result, _authService.UserId);
|
var data = new LoginData(response.Result, _authService.UserId);
|
||||||
if(site.Id == null)
|
if(login.Id == null)
|
||||||
{
|
{
|
||||||
await _siteRepository.InsertAsync(data);
|
await _loginRepository.InsertAsync(data);
|
||||||
site.Id = data.Id;
|
login.Id = data.Id;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
await _siteRepository.UpdateAsync(data);
|
await _loginRepository.UpdateAsync(data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(response.StatusCode == System.Net.HttpStatusCode.Forbidden
|
else if(response.StatusCode == System.Net.HttpStatusCode.Forbidden
|
||||||
@ -90,10 +90,10 @@ namespace Bit.App.Services
|
|||||||
|
|
||||||
public async Task<ApiResult> DeleteAsync(string id)
|
public async Task<ApiResult> DeleteAsync(string id)
|
||||||
{
|
{
|
||||||
var response = await _siteApiRepository.DeleteAsync(id);
|
var response = await _loginApiRepository.DeleteAsync(id);
|
||||||
if(response.Succeeded)
|
if(response.Succeeded)
|
||||||
{
|
{
|
||||||
await _siteRepository.DeleteAsync(id);
|
await _loginRepository.DeleteAsync(id);
|
||||||
}
|
}
|
||||||
else if(response.StatusCode == System.Net.HttpStatusCode.Forbidden
|
else if(response.StatusCode == System.Net.HttpStatusCode.Forbidden
|
||||||
|| response.StatusCode == System.Net.HttpStatusCode.Unauthorized)
|
|| response.StatusCode == System.Net.HttpStatusCode.Unauthorized)
|
||||||
|
@ -14,26 +14,26 @@ namespace Bit.App.Services
|
|||||||
{
|
{
|
||||||
private readonly ICipherApiRepository _cipherApiRepository;
|
private readonly ICipherApiRepository _cipherApiRepository;
|
||||||
private readonly IFolderApiRepository _folderApiRepository;
|
private readonly IFolderApiRepository _folderApiRepository;
|
||||||
private readonly ISiteApiRepository _siteApiRepository;
|
private readonly ILoginApiRepository _loginApiRepository;
|
||||||
private readonly IFolderRepository _folderRepository;
|
private readonly IFolderRepository _folderRepository;
|
||||||
private readonly ISiteRepository _siteRepository;
|
private readonly ILoginRepository _loginRepository;
|
||||||
private readonly IAuthService _authService;
|
private readonly IAuthService _authService;
|
||||||
private readonly ISettings _settings;
|
private readonly ISettings _settings;
|
||||||
|
|
||||||
public SyncService(
|
public SyncService(
|
||||||
ICipherApiRepository cipherApiRepository,
|
ICipherApiRepository cipherApiRepository,
|
||||||
IFolderApiRepository folderApiRepository,
|
IFolderApiRepository folderApiRepository,
|
||||||
ISiteApiRepository siteApiRepository,
|
ILoginApiRepository loginApiRepository,
|
||||||
IFolderRepository folderRepository,
|
IFolderRepository folderRepository,
|
||||||
ISiteRepository siteRepository,
|
ILoginRepository loginRepository,
|
||||||
IAuthService authService,
|
IAuthService authService,
|
||||||
ISettings settings)
|
ISettings settings)
|
||||||
{
|
{
|
||||||
_cipherApiRepository = cipherApiRepository;
|
_cipherApiRepository = cipherApiRepository;
|
||||||
_folderApiRepository = folderApiRepository;
|
_folderApiRepository = folderApiRepository;
|
||||||
_siteApiRepository = siteApiRepository;
|
_loginApiRepository = loginApiRepository;
|
||||||
_folderRepository = folderRepository;
|
_folderRepository = folderRepository;
|
||||||
_siteRepository = siteRepository;
|
_loginRepository = loginRepository;
|
||||||
_authService = authService;
|
_authService = authService;
|
||||||
_settings = settings;
|
_settings = settings;
|
||||||
}
|
}
|
||||||
@ -77,16 +77,16 @@ namespace Bit.App.Services
|
|||||||
await _folderRepository.UpdateAsync(folderData).ConfigureAwait(false);
|
await _folderRepository.UpdateAsync(folderData).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Enums.CipherType.Site:
|
case Enums.CipherType.Login:
|
||||||
var siteData = new SiteData(cipher.Result, _authService.UserId);
|
var loginData = new LoginData(cipher.Result, _authService.UserId);
|
||||||
var existingLocalSite = _siteRepository.GetByIdAsync(id);
|
var existingLocalLogin = _loginRepository.GetByIdAsync(id);
|
||||||
if(existingLocalSite == null)
|
if(existingLocalLogin == null)
|
||||||
{
|
{
|
||||||
await _siteRepository.InsertAsync(siteData).ConfigureAwait(false);
|
await _loginRepository.InsertAsync(loginData).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
await _siteRepository.UpdateAsync(siteData).ConfigureAwait(false);
|
await _loginRepository.UpdateAsync(loginData).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -107,12 +107,12 @@ namespace Bit.App.Services
|
|||||||
|
|
||||||
SyncStarted();
|
SyncStarted();
|
||||||
|
|
||||||
await _folderRepository.DeleteWithSiteUpdateAsync(id, revisionDate).ConfigureAwait(false);
|
await _folderRepository.DeleteWithLoginUpdateAsync(id, revisionDate).ConfigureAwait(false);
|
||||||
SyncCompleted(true);
|
SyncCompleted(true);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<bool> SyncDeleteSiteAsync(string id)
|
public async Task<bool> SyncDeleteLoginAsync(string id)
|
||||||
{
|
{
|
||||||
if(!_authService.IsAuthenticated)
|
if(!_authService.IsAuthenticated)
|
||||||
{
|
{
|
||||||
@ -121,7 +121,7 @@ namespace Bit.App.Services
|
|||||||
|
|
||||||
SyncStarted();
|
SyncStarted();
|
||||||
|
|
||||||
await _siteRepository.DeleteAsync(id).ConfigureAwait(false);
|
await _loginRepository.DeleteAsync(id).ConfigureAwait(false);
|
||||||
SyncCompleted(true);
|
SyncCompleted(true);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -150,14 +150,14 @@ namespace Bit.App.Services
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
var sites = ciphers.Result.Data.Where(c => c.Type == Enums.CipherType.Site).ToDictionary(s => s.Id);
|
var logins = ciphers.Result.Data.Where(c => c.Type == Enums.CipherType.Login).ToDictionary(s => s.Id);
|
||||||
var folders = ciphers.Result.Data.Where(c => c.Type == Enums.CipherType.Folder).ToDictionary(f => f.Id);
|
var folders = ciphers.Result.Data.Where(c => c.Type == Enums.CipherType.Folder).ToDictionary(f => f.Id);
|
||||||
|
|
||||||
var siteTask = SyncSitesAsync(sites, true);
|
var loginTask = SyncLoginsAsync(logins, true);
|
||||||
var folderTask = SyncFoldersAsync(folders, true);
|
var folderTask = SyncFoldersAsync(folders, true);
|
||||||
await Task.WhenAll(siteTask, folderTask).ConfigureAwait(false);
|
await Task.WhenAll(loginTask, folderTask).ConfigureAwait(false);
|
||||||
|
|
||||||
if(folderTask.Exception != null || siteTask.Exception != null)
|
if(folderTask.Exception != null || loginTask.Exception != null)
|
||||||
{
|
{
|
||||||
SyncCompleted(false);
|
SyncCompleted(false);
|
||||||
return false;
|
return false;
|
||||||
@ -209,15 +209,15 @@ namespace Bit.App.Services
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
var sites = ciphers.Result.Revised.Where(c => c.Type == Enums.CipherType.Site).ToDictionary(s => s.Id);
|
var logins = ciphers.Result.Revised.Where(c => c.Type == Enums.CipherType.Login).ToDictionary(s => s.Id);
|
||||||
var folders = ciphers.Result.Revised.Where(c => c.Type == Enums.CipherType.Folder).ToDictionary(f => f.Id);
|
var folders = ciphers.Result.Revised.Where(c => c.Type == Enums.CipherType.Folder).ToDictionary(f => f.Id);
|
||||||
|
|
||||||
var siteTask = SyncSitesAsync(sites, false);
|
var loginTask = SyncLoginsAsync(logins, false);
|
||||||
var folderTask = SyncFoldersAsync(folders, false);
|
var folderTask = SyncFoldersAsync(folders, false);
|
||||||
var deleteTask = DeleteCiphersAsync(ciphers.Result.Deleted);
|
var deleteTask = DeleteCiphersAsync(ciphers.Result.Deleted);
|
||||||
|
|
||||||
await Task.WhenAll(siteTask, folderTask, deleteTask).ConfigureAwait(false);
|
await Task.WhenAll(loginTask, folderTask, deleteTask).ConfigureAwait(false);
|
||||||
if(folderTask.Exception != null || siteTask.Exception != null || deleteTask.Exception != null)
|
if(folderTask.Exception != null || loginTask.Exception != null || deleteTask.Exception != null)
|
||||||
{
|
{
|
||||||
SyncCompleted(false);
|
SyncCompleted(false);
|
||||||
return false;
|
return false;
|
||||||
@ -269,33 +269,33 @@ namespace Bit.App.Services
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task SyncSitesAsync(IDictionary<string, CipherResponse> serverSites, bool deleteMissing)
|
private async Task SyncLoginsAsync(IDictionary<string, CipherResponse> serverLogins, bool deleteMissing)
|
||||||
{
|
{
|
||||||
if(!_authService.IsAuthenticated)
|
if(!_authService.IsAuthenticated)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var localSites = (await _siteRepository.GetAllByUserIdAsync(_authService.UserId).ConfigureAwait(false))
|
var localLogins = (await _loginRepository.GetAllByUserIdAsync(_authService.UserId).ConfigureAwait(false))
|
||||||
.ToDictionary(s => s.Id);
|
.ToDictionary(s => s.Id);
|
||||||
|
|
||||||
foreach(var serverSite in serverSites)
|
foreach(var serverLogin in serverLogins)
|
||||||
{
|
{
|
||||||
if(!_authService.IsAuthenticated)
|
if(!_authService.IsAuthenticated)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var existingLocalSite = localSites.ContainsKey(serverSite.Key) ? localSites[serverSite.Key] : null;
|
var existingLocalLogin = localLogins.ContainsKey(serverLogin.Key) ? localLogins[serverLogin.Key] : null;
|
||||||
if(existingLocalSite == null)
|
if(existingLocalLogin == null)
|
||||||
{
|
{
|
||||||
var data = new SiteData(serverSite.Value, _authService.UserId);
|
var data = new LoginData(serverLogin.Value, _authService.UserId);
|
||||||
await _siteRepository.InsertAsync(data).ConfigureAwait(false);
|
await _loginRepository.InsertAsync(data).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
else if(existingLocalSite.RevisionDateTime != serverSite.Value.RevisionDate)
|
else if(existingLocalLogin.RevisionDateTime != serverLogin.Value.RevisionDate)
|
||||||
{
|
{
|
||||||
var data = new SiteData(serverSite.Value, _authService.UserId);
|
var data = new LoginData(serverLogin.Value, _authService.UserId);
|
||||||
await _siteRepository.UpdateAsync(data).ConfigureAwait(false);
|
await _loginRepository.UpdateAsync(data).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -304,9 +304,9 @@ namespace Bit.App.Services
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach(var site in localSites.Where(localSite => !serverSites.ContainsKey(localSite.Key)))
|
foreach(var login in localLogins.Where(localLogin => !serverLogins.ContainsKey(localLogin.Key)))
|
||||||
{
|
{
|
||||||
await _siteRepository.DeleteAsync(site.Value.Id).ConfigureAwait(false);
|
await _loginRepository.DeleteAsync(login.Value.Id).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -320,7 +320,7 @@ namespace Bit.App.Services
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.Add(_siteRepository.DeleteAsync(cipherId));
|
tasks.Add(_loginRepository.DeleteAsync(cipherId));
|
||||||
tasks.Add(_folderRepository.DeleteAsync(cipherId));
|
tasks.Add(_folderRepository.DeleteAsync(cipherId));
|
||||||
}
|
}
|
||||||
await Task.WhenAll(tasks).ConfigureAwait(false);
|
await Task.WhenAll(tasks).ConfigureAwait(false);
|
||||||
|
@ -123,22 +123,22 @@ namespace Bit.iOS.Extension
|
|||||||
var navController = segue.DestinationViewController as UINavigationController;
|
var navController = segue.DestinationViewController as UINavigationController;
|
||||||
if(navController != null)
|
if(navController != null)
|
||||||
{
|
{
|
||||||
var listSiteController = navController.TopViewController as SiteListViewController;
|
var listLoginController = navController.TopViewController as LoginListViewController;
|
||||||
var addSiteController = navController.TopViewController as SiteAddViewController;
|
var addLoginController = navController.TopViewController as LoginAddViewController;
|
||||||
var fingerprintViewController = navController.TopViewController as LockFingerprintViewController;
|
var fingerprintViewController = navController.TopViewController as LockFingerprintViewController;
|
||||||
var pinViewController = navController.TopViewController as LockPinViewController;
|
var pinViewController = navController.TopViewController as LockPinViewController;
|
||||||
var passwordViewController = navController.TopViewController as LockPasswordViewController;
|
var passwordViewController = navController.TopViewController as LockPasswordViewController;
|
||||||
var setupViewController = navController.TopViewController as SetupViewController;
|
var setupViewController = navController.TopViewController as SetupViewController;
|
||||||
|
|
||||||
if(listSiteController != null)
|
if(listLoginController != null)
|
||||||
{
|
{
|
||||||
listSiteController.Context = _context;
|
listLoginController.Context = _context;
|
||||||
listSiteController.LoadingController = this;
|
listLoginController.LoadingController = this;
|
||||||
}
|
}
|
||||||
else if(addSiteController != null)
|
else if(addLoginController != null)
|
||||||
{
|
{
|
||||||
addSiteController.Context = _context;
|
addLoginController.Context = _context;
|
||||||
addSiteController.LoadingController = this;
|
addLoginController.LoadingController = this;
|
||||||
}
|
}
|
||||||
else if(fingerprintViewController != null)
|
else if(fingerprintViewController != null)
|
||||||
{
|
{
|
||||||
@ -174,12 +174,12 @@ namespace Bit.iOS.Extension
|
|||||||
|
|
||||||
private void ContinueOn()
|
private void ContinueOn()
|
||||||
{
|
{
|
||||||
Debug.WriteLine("BW Log, Segue to setup, site add or list.");
|
Debug.WriteLine("BW Log, Segue to setup, login add or list.");
|
||||||
_settings.AddOrUpdateValue(App.Constants.LastActivityDate, DateTime.UtcNow);
|
_settings.AddOrUpdateValue(App.Constants.LastActivityDate, DateTime.UtcNow);
|
||||||
|
|
||||||
if(_context.ProviderType == Constants.UTTypeAppExtensionSaveLoginAction)
|
if(_context.ProviderType == Constants.UTTypeAppExtensionSaveLoginAction)
|
||||||
{
|
{
|
||||||
PerformSegue("newSiteSegue", this);
|
PerformSegue("newLoginSegue", this);
|
||||||
}
|
}
|
||||||
else if(_context.ProviderType == Constants.UTTypeAppExtensionSetup)
|
else if(_context.ProviderType == Constants.UTTypeAppExtensionSetup)
|
||||||
{
|
{
|
||||||
@ -187,7 +187,7 @@ namespace Bit.iOS.Extension
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
PerformSegue("siteListSegue", this);
|
PerformSegue("loginListSegue", this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -271,7 +271,7 @@ namespace Bit.iOS.Extension
|
|||||||
.RegisterType<IKeyDerivationService, CommonCryptoKeyDerivationService>(new ContainerControlledLifetimeManager())
|
.RegisterType<IKeyDerivationService, CommonCryptoKeyDerivationService>(new ContainerControlledLifetimeManager())
|
||||||
.RegisterType<IAuthService, AuthService>(new ContainerControlledLifetimeManager())
|
.RegisterType<IAuthService, AuthService>(new ContainerControlledLifetimeManager())
|
||||||
.RegisterType<IFolderService, FolderService>(new ContainerControlledLifetimeManager())
|
.RegisterType<IFolderService, FolderService>(new ContainerControlledLifetimeManager())
|
||||||
.RegisterType<ISiteService, SiteService>(new ContainerControlledLifetimeManager())
|
.RegisterType<ILoginService, LoginService>(new ContainerControlledLifetimeManager())
|
||||||
.RegisterType<ISyncService, SyncService>(new ContainerControlledLifetimeManager())
|
.RegisterType<ISyncService, SyncService>(new ContainerControlledLifetimeManager())
|
||||||
.RegisterType<IPasswordGenerationService, PasswordGenerationService>(new ContainerControlledLifetimeManager())
|
.RegisterType<IPasswordGenerationService, PasswordGenerationService>(new ContainerControlledLifetimeManager())
|
||||||
.RegisterType<IAppIdService, AppIdService>(new ContainerControlledLifetimeManager())
|
.RegisterType<IAppIdService, AppIdService>(new ContainerControlledLifetimeManager())
|
||||||
@ -283,8 +283,8 @@ namespace Bit.iOS.Extension
|
|||||||
// Repositories
|
// Repositories
|
||||||
.RegisterType<IFolderRepository, FolderRepository>(new ContainerControlledLifetimeManager())
|
.RegisterType<IFolderRepository, FolderRepository>(new ContainerControlledLifetimeManager())
|
||||||
.RegisterType<IFolderApiRepository, FolderApiRepository>(new ContainerControlledLifetimeManager())
|
.RegisterType<IFolderApiRepository, FolderApiRepository>(new ContainerControlledLifetimeManager())
|
||||||
.RegisterType<ISiteRepository, SiteRepository>(new ContainerControlledLifetimeManager())
|
.RegisterType<ILoginRepository, LoginRepository>(new ContainerControlledLifetimeManager())
|
||||||
.RegisterType<ISiteApiRepository, SiteApiRepository>(new ContainerControlledLifetimeManager())
|
.RegisterType<ILoginApiRepository, LoginApiRepository>(new ContainerControlledLifetimeManager())
|
||||||
.RegisterType<IAuthApiRepository, AuthApiRepository>(new ContainerControlledLifetimeManager())
|
.RegisterType<IAuthApiRepository, AuthApiRepository>(new ContainerControlledLifetimeManager())
|
||||||
// Other
|
// Other
|
||||||
.RegisterInstance(CrossConnectivity.Current, new ContainerControlledLifetimeManager())
|
.RegisterInstance(CrossConnectivity.Current, new ContainerControlledLifetimeManager())
|
||||||
@ -326,7 +326,7 @@ namespace Bit.iOS.Extension
|
|||||||
|
|
||||||
Debug.WriteLine("BW LOG, ProviderType: " + _context.ProviderType);
|
Debug.WriteLine("BW LOG, ProviderType: " + _context.ProviderType);
|
||||||
Debug.WriteLine("BW LOG, Url: " + _context.Url);
|
Debug.WriteLine("BW LOG, Url: " + _context.Url);
|
||||||
Debug.WriteLine("BW LOG, Title: " + _context.SiteTitle);
|
Debug.WriteLine("BW LOG, Title: " + _context.LoginTitle);
|
||||||
Debug.WriteLine("BW LOG, Username: " + _context.Username);
|
Debug.WriteLine("BW LOG, Username: " + _context.Username);
|
||||||
Debug.WriteLine("BW LOG, Password: " + _context.Password);
|
Debug.WriteLine("BW LOG, Password: " + _context.Password);
|
||||||
Debug.WriteLine("BW LOG, Old Password: " + _context.OldPassword);
|
Debug.WriteLine("BW LOG, Old Password: " + _context.OldPassword);
|
||||||
@ -409,7 +409,7 @@ namespace Bit.iOS.Extension
|
|||||||
_context.Url = new Uri(url);
|
_context.Url = new Uri(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
_context.SiteTitle = title;
|
_context.LoginTitle = title;
|
||||||
_context.Username = username;
|
_context.Username = username;
|
||||||
_context.Password = password;
|
_context.Password = password;
|
||||||
_context.Notes = notes;
|
_context.Notes = notes;
|
||||||
@ -436,7 +436,7 @@ namespace Bit.iOS.Extension
|
|||||||
_context.Url = new Uri(url);
|
_context.Url = new Uri(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
_context.SiteTitle = title;
|
_context.LoginTitle = title;
|
||||||
_context.Username = username;
|
_context.Username = username;
|
||||||
_context.Password = password;
|
_context.Password = password;
|
||||||
_context.OldPassword = oldPassword;
|
_context.OldPassword = oldPassword;
|
||||||
|
@ -28,11 +28,11 @@
|
|||||||
</constraints>
|
</constraints>
|
||||||
</view>
|
</view>
|
||||||
<connections>
|
<connections>
|
||||||
<segue destination="oCZ-GQ-aOK" kind="show" identifier="siteListSegue" id="1679"/>
|
<segue destination="oCZ-GQ-aOK" kind="show" identifier="loginListSegue" id="1679"/>
|
||||||
<segue id="8446" destination="6512" kind="presentation" identifier="lockFingerprintSegue"/>
|
<segue id="8446" destination="6512" kind="presentation" identifier="lockFingerprintSegue"/>
|
||||||
<segue id="8924" destination="6815" kind="presentation" identifier="lockPinSegue"/>
|
<segue id="8924" destination="6815" kind="presentation" identifier="lockPinSegue"/>
|
||||||
<segue id="9874" destination="6855" kind="presentation" identifier="lockPasswordSegue"/>
|
<segue id="9874" destination="6855" kind="presentation" identifier="lockPasswordSegue"/>
|
||||||
<segue id="10498" destination="1845" kind="presentation" identifier="newSiteSegue" modalPresentationStyle="fullScreen" modalTransitionStyle="coverVertical"/>
|
<segue id="10498" destination="1845" kind="presentation" identifier="newLoginSegue" modalPresentationStyle="fullScreen" modalTransitionStyle="coverVertical"/>
|
||||||
<segue id="11089" destination="10580" kind="presentation" modalTransitionStyle="coverVertical" identifier="setupSegue"/>
|
<segue id="11089" destination="10580" kind="presentation" modalTransitionStyle="coverVertical" identifier="setupSegue"/>
|
||||||
</connections>
|
</connections>
|
||||||
</viewController>
|
</viewController>
|
||||||
@ -100,7 +100,7 @@
|
|||||||
</scene>
|
</scene>
|
||||||
<scene sceneID="2086">
|
<scene sceneID="2086">
|
||||||
<objects>
|
<objects>
|
||||||
<tableViewController id="2087" sceneMemberID="viewController" customClass="SiteAddViewController">
|
<tableViewController id="2087" sceneMemberID="viewController" customClass="LoginAddViewController">
|
||||||
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" rowHeight="50" sectionHeaderHeight="22" sectionFooterHeight="22" id="2088" opaque="NO" allowsSelection="NO">
|
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" rowHeight="50" sectionHeaderHeight="22" sectionFooterHeight="22" id="2088" opaque="NO" allowsSelection="NO">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
|
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
@ -112,7 +112,7 @@
|
|||||||
<sections/>
|
<sections/>
|
||||||
<color key="sectionIndexBackgroundColor" colorSpace="calibratedWhite" white="0" alpha="0"/>
|
<color key="sectionIndexBackgroundColor" colorSpace="calibratedWhite" white="0" alpha="0"/>
|
||||||
</tableView>
|
</tableView>
|
||||||
<navigationItem title="Add Site" id="2252" key="navigationItem">
|
<navigationItem title="Add Login" id="2252" key="navigationItem">
|
||||||
<barButtonItem title="Cancel" id="3747" translatesAutoresizingMaskIntoConstraints="NO" key="leftBarButtonItem">
|
<barButtonItem title="Cancel" id="3747" translatesAutoresizingMaskIntoConstraints="NO" key="leftBarButtonItem">
|
||||||
<color key="tintColor" colorSpace="calibratedWhite" white="1" alpha="1"/>
|
<color key="tintColor" colorSpace="calibratedWhite" white="1" alpha="1"/>
|
||||||
<connections>
|
<connections>
|
||||||
@ -139,7 +139,7 @@
|
|||||||
</scene>
|
</scene>
|
||||||
<scene sceneID="2303">
|
<scene sceneID="2303">
|
||||||
<objects>
|
<objects>
|
||||||
<tableViewController id="2304" sceneMemberID="viewController" customClass="SiteListViewController">
|
<tableViewController id="2304" sceneMemberID="viewController" customClass="LoginListViewController">
|
||||||
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="2305">
|
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="2305">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
|
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
@ -176,14 +176,14 @@
|
|||||||
</connections>
|
</connections>
|
||||||
</tableView>
|
</tableView>
|
||||||
<connections>
|
<connections>
|
||||||
<segue id="3731" destination="1845" kind="presentation" identifier="siteAddSegue" modalPresentationStyle="fullScreen" modalTransitionStyle="coverVertical"/>
|
<segue id="3731" destination="1845" kind="presentation" identifier="loginAddSegue" modalPresentationStyle="fullScreen" modalTransitionStyle="coverVertical"/>
|
||||||
<outlet property="AddBarButton" destination="3736" id="name-outlet-3736"/>
|
<outlet property="AddBarButton" destination="3736" id="name-outlet-3736"/>
|
||||||
<outlet property="CancelBarButton" destination="3735" id="name-outlet-3735"/>
|
<outlet property="CancelBarButton" destination="3735" id="name-outlet-3735"/>
|
||||||
<outlet property="NavItem" destination="3734" id="name-outlet-3734"/>
|
<outlet property="NavItem" destination="3734" id="name-outlet-3734"/>
|
||||||
</connections>
|
</connections>
|
||||||
<toolbarItems/>
|
<toolbarItems/>
|
||||||
<simulatedToolbarMetrics key="simulatedBottomBarMetrics"/>
|
<simulatedToolbarMetrics key="simulatedBottomBarMetrics"/>
|
||||||
<navigationItem title="Sites" id="3734" translatesAutoresizingMaskIntoConstraints="NO" key="navigationItem">
|
<navigationItem title="Logins" id="3734" translatesAutoresizingMaskIntoConstraints="NO" key="navigationItem">
|
||||||
<barButtonItem title="Cancel" id="3735" translatesAutoresizingMaskIntoConstraints="NO" key="leftBarButtonItem">
|
<barButtonItem title="Cancel" id="3735" translatesAutoresizingMaskIntoConstraints="NO" key="leftBarButtonItem">
|
||||||
<color key="tintColor" colorSpace="calibratedWhite" white="1" alpha="1"/>
|
<color key="tintColor" colorSpace="calibratedWhite" white="1" alpha="1"/>
|
||||||
<connections>
|
<connections>
|
||||||
|
@ -29,7 +29,7 @@ namespace Bit.iOS.Extension.Models
|
|||||||
return _domainName;
|
return _domainName;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public string SiteTitle { get; set; }
|
public string LoginTitle { get; set; }
|
||||||
public string Username { get; set; }
|
public string Username { get; set; }
|
||||||
public string Password { get; set; }
|
public string Password { get; set; }
|
||||||
public string OldPassword { get; set; }
|
public string OldPassword { get; set; }
|
||||||
|
@ -5,19 +5,19 @@ using Bit.App.Models;
|
|||||||
|
|
||||||
namespace Bit.iOS.Extension.Models
|
namespace Bit.iOS.Extension.Models
|
||||||
{
|
{
|
||||||
public class SiteViewModel
|
public class LoginViewModel
|
||||||
{
|
{
|
||||||
private string _uri;
|
private string _uri;
|
||||||
private DomainName _domain = null;
|
private DomainName _domain = null;
|
||||||
private bool _domainParsed = false;
|
private bool _domainParsed = false;
|
||||||
|
|
||||||
public SiteViewModel(Site site)
|
public LoginViewModel(Login login)
|
||||||
{
|
{
|
||||||
Id = site.Id;
|
Id = login.Id;
|
||||||
Name = site.Name?.Decrypt();
|
Name = login.Name?.Decrypt();
|
||||||
Username = site.Username?.Decrypt();
|
Username = login.Username?.Decrypt();
|
||||||
Password = site.Password?.Decrypt();
|
Password = login.Password?.Decrypt();
|
||||||
Uri = site.Uri?.Decrypt();
|
Uri = login.Uri?.Decrypt();
|
||||||
}
|
}
|
||||||
|
|
||||||
public string Id { get; set; }
|
public string Id { get; set; }
|
||||||
|
@ -25,7 +25,7 @@ namespace Bit.iOS.Extension
|
|||||||
{ }
|
{ }
|
||||||
|
|
||||||
public Context Context { get; set; }
|
public Context Context { get; set; }
|
||||||
public SiteAddViewController Parent { get; set; }
|
public LoginAddViewController Parent { get; set; }
|
||||||
public UITableViewController OptionsTableViewController { get; set; }
|
public UITableViewController OptionsTableViewController { get; set; }
|
||||||
public SwitchTableViewCell UppercaseCell { get; set; } = new SwitchTableViewCell("A-Z");
|
public SwitchTableViewCell UppercaseCell { get; set; } = new SwitchTableViewCell("A-Z");
|
||||||
public SwitchTableViewCell LowercaseCell { get; set; } = new SwitchTableViewCell("a-z");
|
public SwitchTableViewCell LowercaseCell { get; set; } = new SwitchTableViewCell("a-z");
|
||||||
|
@ -17,19 +17,19 @@ using Bit.iOS.Core.Controllers;
|
|||||||
|
|
||||||
namespace Bit.iOS.Extension
|
namespace Bit.iOS.Extension
|
||||||
{
|
{
|
||||||
public partial class SiteAddViewController : ExtendedUITableViewController
|
public partial class LoginAddViewController : ExtendedUITableViewController
|
||||||
{
|
{
|
||||||
private ISiteService _siteService;
|
private ILoginService _loginService;
|
||||||
private IFolderService _folderService;
|
private IFolderService _folderService;
|
||||||
private IConnectivity _connectivity;
|
private IConnectivity _connectivity;
|
||||||
private IEnumerable<Folder> _folders;
|
private IEnumerable<Folder> _folders;
|
||||||
private IGoogleAnalyticsService _googleAnalyticsService;
|
private IGoogleAnalyticsService _googleAnalyticsService;
|
||||||
|
|
||||||
public SiteAddViewController(IntPtr handle) : base(handle)
|
public LoginAddViewController(IntPtr handle) : base(handle)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
public Context Context { get; set; }
|
public Context Context { get; set; }
|
||||||
public SiteListViewController SiteListController { get; set; }
|
public LoginListViewController LoginListController { get; set; }
|
||||||
public LoadingViewController LoadingController { get; set; }
|
public LoadingViewController LoadingController { get; set; }
|
||||||
public FormEntryTableViewCell NameCell { get; set; } = new FormEntryTableViewCell(AppResources.Name);
|
public FormEntryTableViewCell NameCell { get; set; } = new FormEntryTableViewCell(AppResources.Name);
|
||||||
public FormEntryTableViewCell UriCell { get; set; } = new FormEntryTableViewCell(AppResources.URI);
|
public FormEntryTableViewCell UriCell { get; set; } = new FormEntryTableViewCell(AppResources.URI);
|
||||||
@ -49,12 +49,12 @@ namespace Bit.iOS.Extension
|
|||||||
|
|
||||||
public override void ViewDidLoad()
|
public override void ViewDidLoad()
|
||||||
{
|
{
|
||||||
_siteService = Resolver.Resolve<ISiteService>();
|
_loginService = Resolver.Resolve<ILoginService>();
|
||||||
_connectivity = Resolver.Resolve<IConnectivity>();
|
_connectivity = Resolver.Resolve<IConnectivity>();
|
||||||
_folderService = Resolver.Resolve<IFolderService>();
|
_folderService = Resolver.Resolve<IFolderService>();
|
||||||
_googleAnalyticsService = Resolver.Resolve<IGoogleAnalyticsService>();
|
_googleAnalyticsService = Resolver.Resolve<IGoogleAnalyticsService>();
|
||||||
|
|
||||||
NavItem.Title = AppResources.AddSite;
|
NavItem.Title = AppResources.AddLogin;
|
||||||
CancelBarButton.Title = AppResources.Cancel;
|
CancelBarButton.Title = AppResources.Cancel;
|
||||||
SaveBarButton.Title = AppResources.Save;
|
SaveBarButton.Title = AppResources.Save;
|
||||||
View.BackgroundColor = new UIColor(red: 0.94f, green: 0.94f, blue: 0.96f, alpha: 1.0f);
|
View.BackgroundColor = new UIColor(red: 0.94f, green: 0.94f, blue: 0.96f, alpha: 1.0f);
|
||||||
@ -121,7 +121,7 @@ namespace Bit.iOS.Extension
|
|||||||
|
|
||||||
partial void CancelBarButton_Activated(UIBarButtonItem sender)
|
partial void CancelBarButton_Activated(UIBarButtonItem sender)
|
||||||
{
|
{
|
||||||
if(SiteListController != null)
|
if(LoginListController != null)
|
||||||
{
|
{
|
||||||
DismissViewController(true, null);
|
DismissViewController(true, null);
|
||||||
}
|
}
|
||||||
@ -151,7 +151,7 @@ namespace Bit.iOS.Extension
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var site = new Site
|
var login = new Login
|
||||||
{
|
{
|
||||||
Uri = string.IsNullOrWhiteSpace(UriCell.TextField.Text) ? null : UriCell.TextField.Text.Encrypt(),
|
Uri = string.IsNullOrWhiteSpace(UriCell.TextField.Text) ? null : UriCell.TextField.Text.Encrypt(),
|
||||||
Name = string.IsNullOrWhiteSpace(NameCell.TextField.Text) ? null : NameCell.TextField.Text.Encrypt(),
|
Name = string.IsNullOrWhiteSpace(NameCell.TextField.Text) ? null : NameCell.TextField.Text.Encrypt(),
|
||||||
@ -162,17 +162,17 @@ namespace Bit.iOS.Extension
|
|||||||
FolderId = FolderCell.SelectedIndex == 0 ? null : _folders.ElementAtOrDefault(FolderCell.SelectedIndex - 1)?.Id
|
FolderId = FolderCell.SelectedIndex == 0 ? null : _folders.ElementAtOrDefault(FolderCell.SelectedIndex - 1)?.Id
|
||||||
};
|
};
|
||||||
|
|
||||||
var saveTask = _siteService.SaveAsync(site);
|
var saveTask = _loginService.SaveAsync(login);
|
||||||
var loadingAlert = Dialogs.CreateLoadingAlert(AppResources.Saving);
|
var loadingAlert = Dialogs.CreateLoadingAlert(AppResources.Saving);
|
||||||
PresentViewController(loadingAlert, true, null);
|
PresentViewController(loadingAlert, true, null);
|
||||||
await saveTask;
|
await saveTask;
|
||||||
|
|
||||||
if(saveTask.Result.Succeeded)
|
if(saveTask.Result.Succeeded)
|
||||||
{
|
{
|
||||||
_googleAnalyticsService.TrackExtensionEvent("CreatedSite");
|
_googleAnalyticsService.TrackExtensionEvent("CreatedLogin");
|
||||||
if(SiteListController != null)
|
if(LoginListController != null)
|
||||||
{
|
{
|
||||||
SiteListController.DismissModal();
|
LoginListController.DismissModal();
|
||||||
}
|
}
|
||||||
else if(LoadingController != null)
|
else if(LoadingController != null)
|
||||||
{
|
{
|
||||||
@ -216,9 +216,9 @@ namespace Bit.iOS.Extension
|
|||||||
|
|
||||||
public class TableSource : UITableViewSource
|
public class TableSource : UITableViewSource
|
||||||
{
|
{
|
||||||
private SiteAddViewController _controller;
|
private LoginAddViewController _controller;
|
||||||
|
|
||||||
public TableSource(SiteAddViewController controller)
|
public TableSource(LoginAddViewController controller)
|
||||||
{
|
{
|
||||||
_controller = controller;
|
_controller = controller;
|
||||||
}
|
}
|
||||||
@ -302,7 +302,7 @@ namespace Bit.iOS.Extension
|
|||||||
{
|
{
|
||||||
if(section == 0)
|
if(section == 0)
|
||||||
{
|
{
|
||||||
return AppResources.SiteInformation;
|
return AppResources.LoginInformation;
|
||||||
}
|
}
|
||||||
else if(section == 2)
|
else if(section == 2)
|
||||||
{
|
{
|
||||||
|
@ -11,8 +11,8 @@ using UIKit;
|
|||||||
|
|
||||||
namespace Bit.iOS.Extension
|
namespace Bit.iOS.Extension
|
||||||
{
|
{
|
||||||
[Register ("SiteAddViewController")]
|
[Register ("LoginAddViewController")]
|
||||||
partial class SiteAddViewController
|
partial class LoginAddViewController
|
||||||
{
|
{
|
||||||
[Outlet]
|
[Outlet]
|
||||||
[GeneratedCode ("iOS Designer", "1.0")]
|
[GeneratedCode ("iOS Designer", "1.0")]
|
||||||
|
@ -17,9 +17,9 @@ using Bit.App.Resources;
|
|||||||
|
|
||||||
namespace Bit.iOS.Extension
|
namespace Bit.iOS.Extension
|
||||||
{
|
{
|
||||||
public partial class SiteListViewController : ExtendedUITableViewController
|
public partial class LoginListViewController : ExtendedUITableViewController
|
||||||
{
|
{
|
||||||
public SiteListViewController(IntPtr handle) : base(handle)
|
public LoginListViewController(IntPtr handle) : base(handle)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
public Context Context { get; set; }
|
public Context Context { get; set; }
|
||||||
@ -35,7 +35,7 @@ namespace Bit.iOS.Extension
|
|||||||
public async override void ViewDidLoad()
|
public async override void ViewDidLoad()
|
||||||
{
|
{
|
||||||
base.ViewDidLoad();
|
base.ViewDidLoad();
|
||||||
NavItem.Title = AppResources.Sites;
|
NavItem.Title = AppResources.Logins;
|
||||||
if(!CanAutoFill())
|
if(!CanAutoFill())
|
||||||
{
|
{
|
||||||
CancelBarButton.Title = AppResources.Close;
|
CancelBarButton.Title = AppResources.Close;
|
||||||
@ -71,7 +71,7 @@ namespace Bit.iOS.Extension
|
|||||||
|
|
||||||
partial void AddBarButton_Activated(UIBarButtonItem sender)
|
partial void AddBarButton_Activated(UIBarButtonItem sender)
|
||||||
{
|
{
|
||||||
PerformSegue("siteAddSegue", this);
|
PerformSegue("loginAddSegue", this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void PrepareForSegue(UIStoryboardSegue segue, NSObject sender)
|
public override void PrepareForSegue(UIStoryboardSegue segue, NSObject sender)
|
||||||
@ -79,11 +79,11 @@ namespace Bit.iOS.Extension
|
|||||||
var navController = segue.DestinationViewController as UINavigationController;
|
var navController = segue.DestinationViewController as UINavigationController;
|
||||||
if(navController != null)
|
if(navController != null)
|
||||||
{
|
{
|
||||||
var addSiteController = navController.TopViewController as SiteAddViewController;
|
var addLoginController = navController.TopViewController as LoginAddViewController;
|
||||||
if(addSiteController != null)
|
if(addLoginController != null)
|
||||||
{
|
{
|
||||||
addSiteController.Context = Context;
|
addLoginController.Context = Context;
|
||||||
addSiteController.SiteListController = this;
|
addLoginController.LoginListController = this;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -101,11 +101,11 @@ namespace Bit.iOS.Extension
|
|||||||
{
|
{
|
||||||
private const string CellIdentifier = "TableCell";
|
private const string CellIdentifier = "TableCell";
|
||||||
|
|
||||||
private IEnumerable<SiteViewModel> _tableItems;
|
private IEnumerable<LoginViewModel> _tableItems;
|
||||||
private Context _context;
|
private Context _context;
|
||||||
private SiteListViewController _controller;
|
private LoginListViewController _controller;
|
||||||
|
|
||||||
public TableSource(SiteListViewController controller)
|
public TableSource(LoginListViewController controller)
|
||||||
{
|
{
|
||||||
_context = controller.Context;
|
_context = controller.Context;
|
||||||
_controller = controller;
|
_controller = controller;
|
||||||
@ -113,20 +113,20 @@ namespace Bit.iOS.Extension
|
|||||||
|
|
||||||
public async Task LoadItemsAsync()
|
public async Task LoadItemsAsync()
|
||||||
{
|
{
|
||||||
_tableItems = new List<SiteViewModel>();
|
_tableItems = new List<LoginViewModel>();
|
||||||
if(_context.DomainName != null)
|
if(_context.DomainName != null)
|
||||||
{
|
{
|
||||||
var siteService = Resolver.Resolve<ISiteService>();
|
var loginService = Resolver.Resolve<ILoginService>();
|
||||||
var sites = await siteService.GetAllAsync();
|
var logins = await loginService.GetAllAsync();
|
||||||
var siteModels = sites.Select(s => new SiteViewModel(s));
|
var loginModels = logins.Select(s => new LoginViewModel(s));
|
||||||
_tableItems = siteModels
|
_tableItems = loginModels
|
||||||
.Where(s => s.Domain != null && s.Domain.BaseDomain == _context.DomainName.BaseDomain)
|
.Where(s => s.Domain != null && s.Domain.BaseDomain == _context.DomainName.BaseDomain)
|
||||||
.OrderBy(s => s.Name).ThenBy(s => s.Username)
|
.OrderBy(s => s.Name).ThenBy(s => s.Username)
|
||||||
.ToList();
|
.ToList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<SiteViewModel> TableItems { get; set; }
|
public IEnumerable<LoginViewModel> TableItems { get; set; }
|
||||||
|
|
||||||
public override nint RowsInSection(UITableView tableview, nint section)
|
public override nint RowsInSection(UITableView tableview, nint section)
|
||||||
{
|
{
|
||||||
@ -138,7 +138,7 @@ namespace Bit.iOS.Extension
|
|||||||
if(_tableItems.Count() == 0)
|
if(_tableItems.Count() == 0)
|
||||||
{
|
{
|
||||||
var noDataCell = new UITableViewCell(UITableViewCellStyle.Default, "NoDataCell");
|
var noDataCell = new UITableViewCell(UITableViewCellStyle.Default, "NoDataCell");
|
||||||
noDataCell.TextLabel.Text = AppResources.NoSitesTap;
|
noDataCell.TextLabel.Text = AppResources.NoLoginsTap;
|
||||||
noDataCell.TextLabel.TextAlignment = UITextAlignment.Center;
|
noDataCell.TextLabel.TextAlignment = UITextAlignment.Center;
|
||||||
noDataCell.TextLabel.LineBreakMode = UILineBreakMode.WordWrap;
|
noDataCell.TextLabel.LineBreakMode = UILineBreakMode.WordWrap;
|
||||||
noDataCell.TextLabel.Lines = 0;
|
noDataCell.TextLabel.Lines = 0;
|
||||||
@ -176,7 +176,7 @@ namespace Bit.iOS.Extension
|
|||||||
|
|
||||||
if(_tableItems.Count() == 0)
|
if(_tableItems.Count() == 0)
|
||||||
{
|
{
|
||||||
_controller.PerformSegue("siteAddSegue", this);
|
_controller.PerformSegue("loginAddSegue", this);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,8 +11,8 @@ using UIKit;
|
|||||||
|
|
||||||
namespace Bit.iOS.Extension
|
namespace Bit.iOS.Extension
|
||||||
{
|
{
|
||||||
[Register ("SiteListViewController")]
|
[Register ("LoginListViewController")]
|
||||||
partial class SiteListViewController
|
partial class LoginListViewController
|
||||||
{
|
{
|
||||||
[Outlet]
|
[Outlet]
|
||||||
[GeneratedCode ("iOS Designer", "1.0")]
|
[GeneratedCode ("iOS Designer", "1.0")]
|
||||||
|
@ -249,7 +249,7 @@ namespace Bit.iOS
|
|||||||
.RegisterType<IKeyDerivationService, CommonCryptoKeyDerivationService>(new ContainerControlledLifetimeManager())
|
.RegisterType<IKeyDerivationService, CommonCryptoKeyDerivationService>(new ContainerControlledLifetimeManager())
|
||||||
.RegisterType<IAuthService, AuthService>(new ContainerControlledLifetimeManager())
|
.RegisterType<IAuthService, AuthService>(new ContainerControlledLifetimeManager())
|
||||||
.RegisterType<IFolderService, FolderService>(new ContainerControlledLifetimeManager())
|
.RegisterType<IFolderService, FolderService>(new ContainerControlledLifetimeManager())
|
||||||
.RegisterType<ISiteService, SiteService>(new ContainerControlledLifetimeManager())
|
.RegisterType<ILoginService, LoginService>(new ContainerControlledLifetimeManager())
|
||||||
.RegisterType<ISyncService, SyncService>(new ContainerControlledLifetimeManager())
|
.RegisterType<ISyncService, SyncService>(new ContainerControlledLifetimeManager())
|
||||||
.RegisterType<IClipboardService, ClipboardService>(new ContainerControlledLifetimeManager())
|
.RegisterType<IClipboardService, ClipboardService>(new ContainerControlledLifetimeManager())
|
||||||
.RegisterType<IPushNotificationListener, PushNotificationListener>(new ContainerControlledLifetimeManager())
|
.RegisterType<IPushNotificationListener, PushNotificationListener>(new ContainerControlledLifetimeManager())
|
||||||
@ -267,8 +267,8 @@ namespace Bit.iOS
|
|||||||
// Repositories
|
// Repositories
|
||||||
.RegisterType<IFolderRepository, FolderRepository>(new ContainerControlledLifetimeManager())
|
.RegisterType<IFolderRepository, FolderRepository>(new ContainerControlledLifetimeManager())
|
||||||
.RegisterType<IFolderApiRepository, FolderApiRepository>(new ContainerControlledLifetimeManager())
|
.RegisterType<IFolderApiRepository, FolderApiRepository>(new ContainerControlledLifetimeManager())
|
||||||
.RegisterType<ISiteRepository, SiteRepository>(new ContainerControlledLifetimeManager())
|
.RegisterType<ILoginRepository, LoginRepository>(new ContainerControlledLifetimeManager())
|
||||||
.RegisterType<ISiteApiRepository, SiteApiRepository>(new ContainerControlledLifetimeManager())
|
.RegisterType<ILoginApiRepository, LoginApiRepository>(new ContainerControlledLifetimeManager())
|
||||||
.RegisterType<IAuthApiRepository, AuthApiRepository>(new ContainerControlledLifetimeManager())
|
.RegisterType<IAuthApiRepository, AuthApiRepository>(new ContainerControlledLifetimeManager())
|
||||||
.RegisterType<IDeviceApiRepository, DeviceApiRepository>(new ContainerControlledLifetimeManager())
|
.RegisterType<IDeviceApiRepository, DeviceApiRepository>(new ContainerControlledLifetimeManager())
|
||||||
.RegisterType<IAccountsApiRepository, AccountsApiRepository>(new ContainerControlledLifetimeManager())
|
.RegisterType<IAccountsApiRepository, AccountsApiRepository>(new ContainerControlledLifetimeManager())
|
||||||
|
Loading…
Reference in New Issue
Block a user