Added fuzzy matches to autofill listing page. Allow autofilling from main vault search page when arriving from autofill service

This commit is contained in:
Kyle Spearrin 2017-02-13 19:12:02 -05:00
parent 99c81e5a5d
commit 75201c9b30
9 changed files with 276 additions and 638 deletions

View file

@ -2,6 +2,7 @@
using System.Threading.Tasks;
using Bit.App.Models;
using Bit.App.Models.Api;
using System;
namespace Bit.App.Abstractions
{
@ -10,7 +11,7 @@ namespace Bit.App.Abstractions
Task<Login> GetByIdAsync(string id);
Task<IEnumerable<Login>> GetAllAsync();
Task<IEnumerable<Login>> GetAllAsync(bool favorites);
Task<IEnumerable<Login>> GetAllAsync(string uriString);
Task<Tuple<IEnumerable<Login>, IEnumerable<Login>>> GetAllAsync(string uriString);
Task<ApiResult<LoginResponse>> SaveAsync(Login login);
Task<ApiResult> DeleteAsync(string id);
}

View file

@ -93,11 +93,6 @@ namespace Bit.App
{
Device.BeginInvokeOnMainThread(() => Logout(args));
});
MessagingCenter.Subscribe<Application>(Current, "SetMainPage", (sender) =>
{
SetMainPageFromAutofill();
});
}
protected async override void OnStart()
@ -125,7 +120,12 @@ namespace Bit.App
// Handle when your app sleeps
Debug.WriteLine("OnSleep");
SetMainPageFromAutofill();
if(Device.OS == TargetPlatform.Android && !string.IsNullOrWhiteSpace(_uri))
{
MainPage = new MainPage();
_uri = null;
}
if(Device.OS == TargetPlatform.Android && !TopPageIsLock())
{
_settings.AddOrUpdateValue(Constants.LastActivityDate, DateTime.UtcNow);
@ -169,17 +169,6 @@ namespace Bit.App
#endif
}
private void SetMainPageFromAutofill()
{
if(Device.OS != TargetPlatform.Android || string.IsNullOrWhiteSpace(_uri))
{
return;
}
MainPage = new MainPage();
_uri = null;
}
private async Task FullSyncAsync()
{
if(_connectivity.IsConnected)

View file

@ -44,5 +44,16 @@ namespace Bit.App.Models.Page
public string Id { get; set; }
public string Name { get; set; } = AppResources.FolderNone;
}
public class AutofillGrouping : List<Login>
{
public AutofillGrouping(List<Login> logins, string name)
{
AddRange(logins);
Name = name;
}
public string Name { get; set; }
}
}
}

View file

@ -7,13 +7,13 @@ namespace Bit.App.Pages
{
public class MainPage : ExtendedTabbedPage
{
public MainPage()
public MainPage(string uri = null)
{
TintColor = Color.FromHex("3c8dbc");
var settingsNavigation = new ExtendedNavigationPage(new SettingsPage());
var favoritesNavigation = new ExtendedNavigationPage(new VaultListLoginsPage(true));
var vaultNavigation = new ExtendedNavigationPage(new VaultListLoginsPage(false));
var favoritesNavigation = new ExtendedNavigationPage(new VaultListLoginsPage(true, uri));
var vaultNavigation = new ExtendedNavigationPage(new VaultListLoginsPage(false, uri));
var toolsNavigation = new ExtendedNavigationPage(new ToolsPage());
favoritesNavigation.Title = AppResources.Favorites;

View file

@ -55,8 +55,8 @@ namespace Bit.App.Pages
Init();
}
public ExtendedObservableCollection<VaultListPageModel.Login> PresentationLogins { get; private set; }
= new ExtendedObservableCollection<VaultListPageModel.Login>();
public ExtendedObservableCollection<VaultListPageModel.AutofillGrouping> PresentationLogins { get; private set; }
= new ExtendedObservableCollection<VaultListPageModel.AutofillGrouping>();
public StackLayout NoDataStackLayout { get; set; }
public ListView ListView { get; set; }
public ActivityIndicator LoadingIndicator { get; set; }
@ -93,8 +93,10 @@ namespace Bit.App.Pages
ListView = new ListView(ListViewCachingStrategy.RecycleElement)
{
IsGroupingEnabled = true,
ItemsSource = PresentationLogins,
HasUnevenRows = true,
GroupHeaderTemplate = new DataTemplate(() => new HeaderViewCell()),
ItemTemplate = new DataTemplate(() => new VaultListViewCell(
(VaultListPageModel.Login l) => MoreClickedAsync(l)))
};
@ -151,13 +153,24 @@ namespace Bit.App.Pages
Task.Run(async () =>
{
var logins = await _loginService.GetAllAsync(Uri);
var sortedLogins = logins.Select(l => new VaultListPageModel.Login(l))
var normalLogins = logins.Item1.Select(l => new VaultListPageModel.Login(l))
.OrderBy(s => s.Name)
.ThenBy(s => s.Username);
.ThenBy(s => s.Username)
.ToList();
var fuzzyLogins = logins.Item2.Select(l => new VaultListPageModel.Login(l))
.OrderBy(s => s.Name)
.ThenBy(s => s.Username)
.ToList();
var autofillGroupings = new List<VaultListPageModel.AutofillGrouping>
{
new VaultListPageModel.AutofillGrouping(normalLogins, "Matching"),
new VaultListPageModel.AutofillGrouping(fuzzyLogins, "Possible Matches")
};
Device.BeginInvokeOnMainThread(() =>
{
PresentationLogins.ResetWithRange(sortedLogins);
PresentationLogins.ResetWithRange(autofillGroupings);
AdjustContent();
});
}, cts.Token);
@ -259,8 +272,32 @@ namespace Bit.App.Pages
private void ClickedItem(object sender, EventArgs e)
{
_page.GoogleAnalyticsService.TrackExtensionEvent("Closed", _page.Uri.StartsWith("http") ? "Website" : "App");
MessagingCenter.Send(Application.Current, "SetMainPage");
_page.GoogleAnalyticsService.TrackExtensionEvent("CloseToSearch", _page.Uri.StartsWith("http") ? "Website" : "App");
Application.Current.MainPage = new MainPage(_page.Uri);
}
}
private class HeaderViewCell : ExtendedViewCell
{
public HeaderViewCell()
{
var label = new Label
{
FontSize = Device.GetNamedSize(NamedSize.Medium, typeof(Label)),
Style = (Style)Application.Current.Resources["text-muted"],
VerticalTextAlignment = TextAlignment.Center
};
label.SetBinding<VaultListPageModel.AutofillGrouping>(Label.TextProperty, s => s.Name);
var grid = new ContentView
{
Padding = new Thickness(16, 8, 0, 8),
Content = label
};
View = grid;
BackgroundColor = Color.FromHex("efeff4");
}
}
}

View file

@ -32,7 +32,7 @@ namespace Bit.App.Pages
private bool _loadExistingData;
private CancellationTokenSource _filterResultsCancellationTokenSource;
public VaultListLoginsPage(bool favorites)
public VaultListLoginsPage(bool favorites, string uri = null)
: base(true)
{
_favorites = favorites;
@ -49,6 +49,8 @@ namespace Bit.App.Pages
var cryptoService = Resolver.Resolve<ICryptoService>();
_loadExistingData = !_settings.GetValueOrDefault(Constants.FirstVaultLoad, true) || !cryptoService.KeyChanged;
Uri = uri;
Init();
}
@ -61,6 +63,7 @@ namespace Bit.App.Pages
public StackLayout NoDataStackLayout { get; set; }
public StackLayout ResultsStackLayout { get; set; }
public ActivityIndicator LoadingIndicator { get; set; }
public string Uri { get; set; }
private void Init()
{
@ -262,6 +265,18 @@ namespace Bit.App.Pages
}
}
protected override bool OnBackButtonPressed()
{
if(string.IsNullOrWhiteSpace(Uri))
{
return false;
}
//GoogleAnalyticsService.TrackExtensionEvent("BackClosed", Uri.StartsWith("http") ? "Website" : "App");
MessagingCenter.Send(Application.Current, "Autofill", (VaultListPageModel.Login)null);
return true;
}
private void AdjustContent()
{
if(PresentationFolders.Count > 0 || !string.IsNullOrWhiteSpace(Search.Text))
@ -363,8 +378,30 @@ namespace Bit.App.Pages
private async void LoginSelected(object sender, SelectedItemChangedEventArgs e)
{
var login = e.SelectedItem as VaultListPageModel.Login;
var page = new VaultViewLoginPage(login.Id);
await Navigation.PushForDeviceAsync(page);
string selection = null;
if(!string.IsNullOrWhiteSpace(Uri))
{
selection = await DisplayActionSheet("Auto-fill or view?", AppResources.Cancel, null,
"Autofill", AppResources.View);
}
if(selection == AppResources.View || string.IsNullOrWhiteSpace(Uri))
{
var page = new VaultViewLoginPage(login.Id);
await Navigation.PushForDeviceAsync(page);
}
else if(selection == "Autofill")
{
if(Uri.StartsWith("http") && _deviceInfoService.Version < 21)
{
MoreClickedAsync(login);
return;
}
//GoogleAnalyticsService.TrackExtensionEvent("AutoFilled", Uri.StartsWith("http") ? "Website" : "App");
MessagingCenter.Send(Application.Current, "Autofill", login);
}
}
private async void MoreClickedAsync(VaultListPageModel.Login login)
@ -418,7 +455,7 @@ namespace Bit.App.Pages
private async void AddLogin()
{
var page = new VaultAddLoginPage();
var page = new VaultAddLoginPage(Uri);
await Navigation.PushForDeviceAsync(page);
}

View file

@ -55,11 +55,11 @@ namespace Bit.App.Services
return logins;
}
public async Task<IEnumerable<Login>> GetAllAsync(string uriString)
public async Task<Tuple<IEnumerable<Login>, IEnumerable<Login>>> GetAllAsync(string uriString)
{
if(string.IsNullOrWhiteSpace(uriString))
{
return new List<Login>();
return null;
}
Uri uri = null;
@ -74,24 +74,58 @@ namespace Bit.App.Services
}
}
if(!androidApp && domainName == null)
{
return new List<Login>();
return null;
}
string androidAppWebUriString = null;
if(androidApp)
{
var androidUriParts = uriString.Replace(Constants.AndroidAppProtocol, string.Empty).Split('.');
if(androidUriParts.Length >= 2)
{
androidAppWebUriString = string.Join(".", androidUriParts[1], androidUriParts[0]);
}
}
var eqDomains = (await _settingsService.GetEquivalentDomainsAsync()).Select(d => d.ToArray());
var matchingDomains = eqDomains
.Where(d => (androidApp && Array.IndexOf(d, uriString) >= 0) ||
(!androidApp && Array.IndexOf(d, domainName.BaseDomain) >= 0))
.SelectMany(d => d).ToList();
var matchingDomains = new List<string>();
var matchingFuzzyDomains = new List<string>();
foreach(var eqDomain in eqDomains)
{
if(androidApp)
{
if(Array.IndexOf(eqDomain, uriString) >= 0)
{
matchingDomains.AddRange(eqDomain.Select(d => d).ToList());
}
if(androidAppWebUriString != null && Array.IndexOf(eqDomain, androidAppWebUriString) >= 0)
{
matchingFuzzyDomains.AddRange(eqDomain.Select(d => d).ToList());
}
}
else if(Array.IndexOf(eqDomain, domainName.BaseDomain) >= 0)
{
matchingDomains.AddRange(eqDomain.Select(d => d).ToList());
}
}
if(!matchingDomains.Any())
{
matchingDomains.Add(androidApp ? uriString : domainName.BaseDomain);
}
if(androidApp && androidAppWebUriString != null && !matchingFuzzyDomains.Any())
{
matchingFuzzyDomains.Add(androidAppWebUriString);
}
var matchingDomainsArray = matchingDomains.ToArray();
var matchingFuzzyDomainsArray = matchingFuzzyDomains.ToArray();
var matchingLogins = new List<Login>();
var matchingFuzzyLogins = new List<Login>();
var logins = await _loginRepository.GetAllByUserIdAsync(_authService.UserId);
foreach(var login in logins)
{
@ -106,11 +140,16 @@ namespace Bit.App.Services
continue;
}
if(androidApp && Array.IndexOf(matchingDomainsArray, loginUriString) >= 0)
if(Array.IndexOf(matchingDomainsArray, loginUriString) >= 0)
{
matchingLogins.Add(new Login(login));
continue;
}
else if(androidApp && Array.IndexOf(matchingFuzzyDomainsArray, loginUriString) >= 0)
{
matchingFuzzyLogins.Add(new Login(login));
continue;
}
Uri loginUri;
DomainName loginDomainName;
@ -124,9 +163,13 @@ namespace Bit.App.Services
{
matchingLogins.Add(new Login(login));
}
else if(androidApp && Array.IndexOf(matchingFuzzyDomainsArray, loginDomainName.BaseDomain) >= 0)
{
matchingFuzzyLogins.Add(new Login(login));
}
}
return matchingLogins;
return new Tuple<IEnumerable<Login>, IEnumerable<Login>>(matchingLogins, matchingFuzzyLogins);
}
public async Task<ApiResult<LoginResponse>> SaveAsync(Login login)

View file

@ -115,11 +115,10 @@ namespace Bit.iOS.Extension
{
var loginService = Resolver.Resolve<ILoginService>();
var logins = await loginService.GetAllAsync(_context.UrlString);
var loginModels = logins;
_tableItems = logins.Select(s => new LoginViewModel(s))
_tableItems = logins?.Item1.Select(s => new LoginViewModel(s))
.OrderBy(s => s.Name)
.ThenBy(s => s.Username)
.ToList();
.ToList() ?? new List<LoginViewModel>();
}
public IEnumerable<LoginViewModel> TableItems { get; set; }

View file

@ -222,42 +222,6 @@ namespace Bit.Android.Test
// aapt resource value: 0x7f0100b4
public const int activityChooserViewStyle = 2130772148;
// aapt resource value: 0x7f01012b
public const int ahBarColor = 2130772267;
// aapt resource value: 0x7f010133
public const int ahBarLength = 2130772275;
// aapt resource value: 0x7f010132
public const int ahBarWidth = 2130772274;
// aapt resource value: 0x7f010130
public const int ahCircleColor = 2130772272;
// aapt resource value: 0x7f01012f
public const int ahDelayMillis = 2130772271;
// aapt resource value: 0x7f010131
public const int ahRadius = 2130772273;
// aapt resource value: 0x7f01012c
public const int ahRimColor = 2130772268;
// aapt resource value: 0x7f01012d
public const int ahRimWidth = 2130772269;
// aapt resource value: 0x7f01012e
public const int ahSpinSpeed = 2130772270;
// aapt resource value: 0x7f010128
public const int ahText = 2130772264;
// aapt resource value: 0x7f010129
public const int ahTextColor = 2130772265;
// aapt resource value: 0x7f01012a
public const int ahTextSize = 2130772266;
// aapt resource value: 0x7f0100d7
public const int alertDialogButtonGroupStyle = 2130772183;
@ -1094,32 +1058,32 @@ namespace Bit.Android.Test
public partial class Color
{
// aapt resource value: 0x7f0c0052
public const int abc_background_cache_hint_selector_material_dark = 2131492946;
// aapt resource value: 0x7f0c0048
public const int abc_background_cache_hint_selector_material_dark = 2131492936;
// aapt resource value: 0x7f0c0053
public const int abc_background_cache_hint_selector_material_light = 2131492947;
// aapt resource value: 0x7f0c0049
public const int abc_background_cache_hint_selector_material_light = 2131492937;
// aapt resource value: 0x7f0c0054
public const int abc_color_highlight_material = 2131492948;
// aapt resource value: 0x7f0c004a
public const int abc_color_highlight_material = 2131492938;
// aapt resource value: 0x7f0c000e
public const int abc_input_method_navigation_guard = 2131492878;
// aapt resource value: 0x7f0c0055
public const int abc_primary_text_disable_only_material_dark = 2131492949;
// aapt resource value: 0x7f0c004b
public const int abc_primary_text_disable_only_material_dark = 2131492939;
// aapt resource value: 0x7f0c0056
public const int abc_primary_text_disable_only_material_light = 2131492950;
// aapt resource value: 0x7f0c004c
public const int abc_primary_text_disable_only_material_light = 2131492940;
// aapt resource value: 0x7f0c0057
public const int abc_primary_text_material_dark = 2131492951;
// aapt resource value: 0x7f0c004d
public const int abc_primary_text_material_dark = 2131492941;
// aapt resource value: 0x7f0c0058
public const int abc_primary_text_material_light = 2131492952;
// aapt resource value: 0x7f0c004e
public const int abc_primary_text_material_light = 2131492942;
// aapt resource value: 0x7f0c0059
public const int abc_search_url_text = 2131492953;
// aapt resource value: 0x7f0c004f
public const int abc_search_url_text = 2131492943;
// aapt resource value: 0x7f0c000f
public const int abc_search_url_text_normal = 2131492879;
@ -1130,11 +1094,11 @@ namespace Bit.Android.Test
// aapt resource value: 0x7f0c0011
public const int abc_search_url_text_selected = 2131492881;
// aapt resource value: 0x7f0c005a
public const int abc_secondary_text_material_dark = 2131492954;
// aapt resource value: 0x7f0c0050
public const int abc_secondary_text_material_dark = 2131492944;
// aapt resource value: 0x7f0c005b
public const int abc_secondary_text_material_light = 2131492955;
// aapt resource value: 0x7f0c0051
public const int abc_secondary_text_material_light = 2131492945;
// aapt resource value: 0x7f0c0012
public const int accent_material_dark = 2131492882;
@ -1250,36 +1214,6 @@ namespace Bit.Android.Test
// aapt resource value: 0x7f0c0029
public const int hint_foreground_material_light = 2131492905;
// aapt resource value: 0x7f0c0048
public const int hockeyapp_background_header = 2131492936;
// aapt resource value: 0x7f0c0049
public const int hockeyapp_background_light = 2131492937;
// aapt resource value: 0x7f0c004a
public const int hockeyapp_background_white = 2131492938;
// aapt resource value: 0x7f0c004b
public const int hockeyapp_button_background = 2131492939;
// aapt resource value: 0x7f0c004c
public const int hockeyapp_button_background_pressed = 2131492940;
// aapt resource value: 0x7f0c004d
public const int hockeyapp_button_background_selected = 2131492941;
// aapt resource value: 0x7f0c004e
public const int hockeyapp_text_black = 2131492942;
// aapt resource value: 0x7f0c004f
public const int hockeyapp_text_light = 2131492943;
// aapt resource value: 0x7f0c0050
public const int hockeyapp_text_normal = 2131492944;
// aapt resource value: 0x7f0c0051
public const int hockeyapp_text_white = 2131492945;
// aapt resource value: 0x7f0c002a
public const int material_blue_grey_800 = 2131492906;
@ -1364,11 +1298,11 @@ namespace Bit.Android.Test
// aapt resource value: 0x7f0c0045
public const int switch_thumb_disabled_material_light = 2131492933;
// aapt resource value: 0x7f0c005c
public const int switch_thumb_material_dark = 2131492956;
// aapt resource value: 0x7f0c0052
public const int switch_thumb_material_dark = 2131492946;
// aapt resource value: 0x7f0c005d
public const int switch_thumb_material_light = 2131492957;
// aapt resource value: 0x7f0c0053
public const int switch_thumb_material_light = 2131492947;
// aapt resource value: 0x7f0c0046
public const int switch_thumb_normal_material_dark = 2131492934;
@ -1967,25 +1901,10 @@ namespace Bit.Android.Test
public const int fingerprint_white = 2130837581;
// aapt resource value: 0x7f02004e
public const int hockeyapp_btn_background = 2130837582;
public const int icon = 2130837582;
// aapt resource value: 0x7f02004f
public const int ic_errorstatus = 2130837583;
// aapt resource value: 0x7f020050
public const int ic_successstatus = 2130837584;
// aapt resource value: 0x7f020051
public const int icon = 2130837585;
// aapt resource value: 0x7f020054
public const int notification_template_icon_bg = 2130837588;
// aapt resource value: 0x7f020052
public const int roundedbg = 2130837586;
// aapt resource value: 0x7f020053
public const int roundedbgdark = 2130837587;
public const int notification_template_icon_bg = 2130837583;
static Drawable()
{
@ -2000,62 +1919,62 @@ namespace Bit.Android.Test
public partial class Id
{
// aapt resource value: 0x7f0800a4
public const int OptionHostName = 2131230884;
// aapt resource value: 0x7f080084
public const int OptionHostName = 2131230852;
// aapt resource value: 0x7f0800a5
public const int OptionPort = 2131230885;
// aapt resource value: 0x7f080085
public const int OptionPort = 2131230853;
// aapt resource value: 0x7f0800a3
public const int OptionRemoteServer = 2131230883;
// aapt resource value: 0x7f080083
public const int OptionRemoteServer = 2131230851;
// aapt resource value: 0x7f0800b3
public const int OptionsButton = 2131230899;
// aapt resource value: 0x7f080093
public const int OptionsButton = 2131230867;
// aapt resource value: 0x7f0800ae
public const int ResultFullName = 2131230894;
// aapt resource value: 0x7f08008e
public const int ResultFullName = 2131230862;
// aapt resource value: 0x7f0800b0
public const int ResultMessage = 2131230896;
// aapt resource value: 0x7f080090
public const int ResultMessage = 2131230864;
// aapt resource value: 0x7f0800af
public const int ResultResultState = 2131230895;
// aapt resource value: 0x7f08008f
public const int ResultResultState = 2131230863;
// aapt resource value: 0x7f0800ad
public const int ResultRunSingleMethodTest = 2131230893;
// aapt resource value: 0x7f08008d
public const int ResultRunSingleMethodTest = 2131230861;
// aapt resource value: 0x7f0800b1
public const int ResultStackTrace = 2131230897;
// aapt resource value: 0x7f080091
public const int ResultStackTrace = 2131230865;
// aapt resource value: 0x7f0800a9
public const int ResultsFailed = 2131230889;
// aapt resource value: 0x7f080089
public const int ResultsFailed = 2131230857;
// aapt resource value: 0x7f0800a6
public const int ResultsId = 2131230886;
// aapt resource value: 0x7f080086
public const int ResultsId = 2131230854;
// aapt resource value: 0x7f0800aa
public const int ResultsIgnored = 2131230890;
// aapt resource value: 0x7f08008a
public const int ResultsIgnored = 2131230858;
// aapt resource value: 0x7f0800ab
public const int ResultsInconclusive = 2131230891;
// aapt resource value: 0x7f08008b
public const int ResultsInconclusive = 2131230859;
// aapt resource value: 0x7f0800ac
public const int ResultsMessage = 2131230892;
// aapt resource value: 0x7f08008c
public const int ResultsMessage = 2131230860;
// aapt resource value: 0x7f0800a8
public const int ResultsPassed = 2131230888;
// aapt resource value: 0x7f080088
public const int ResultsPassed = 2131230856;
// aapt resource value: 0x7f0800a7
public const int ResultsResult = 2131230887;
// aapt resource value: 0x7f080087
public const int ResultsResult = 2131230855;
// aapt resource value: 0x7f0800b2
public const int RunTestsButton = 2131230898;
// aapt resource value: 0x7f080092
public const int RunTestsButton = 2131230866;
// aapt resource value: 0x7f0800b4
public const int TestSuiteListView = 2131230900;
// aapt resource value: 0x7f080094
public const int TestSuiteListView = 2131230868;
// aapt resource value: 0x7f080096
public const int action0 = 2131230870;
// aapt resource value: 0x7f080076
public const int action0 = 2131230838;
// aapt resource value: 0x7f08005c
public const int action_bar = 2131230812;
@ -2081,8 +2000,8 @@ namespace Bit.Android.Test
// aapt resource value: 0x7f08005d
public const int action_context_bar = 2131230813;
// aapt resource value: 0x7f08009a
public const int action_divider = 2131230874;
// aapt resource value: 0x7f08007a
public const int action_divider = 2131230842;
// aapt resource value: 0x7f080004
public const int action_menu_divider = 2131230724;
@ -2123,26 +2042,8 @@ namespace Bit.Android.Test
// aapt resource value: 0x7f080046
public const int buttonPanel = 2131230790;
// aapt resource value: 0x7f080083
public const int button_add_response = 2131230851;
// aapt resource value: 0x7f08007e
public const int button_attachment = 2131230846;
// aapt resource value: 0x7f080088
public const int button_login = 2131230856;
// aapt resource value: 0x7f080084
public const int button_refresh = 2131230852;
// aapt resource value: 0x7f08007f
public const int button_send = 2131230847;
// aapt resource value: 0x7f08008c
public const int button_update = 2131230860;
// aapt resource value: 0x7f080097
public const int cancel_action = 2131230871;
// aapt resource value: 0x7f080077
public const int cancel_action = 2131230839;
// aapt resource value: 0x7f080016
public const int center = 2131230742;
@ -2156,8 +2057,8 @@ namespace Bit.Android.Test
// aapt resource value: 0x7f080054
public const int checkbox = 2131230804;
// aapt resource value: 0x7f08009d
public const int chronometer = 2131230877;
// aapt resource value: 0x7f08007d
public const int chronometer = 2131230845;
// aapt resource value: 0x7f08001f
public const int clip_horizontal = 2131230751;
@ -2207,8 +2108,8 @@ namespace Bit.Android.Test
// aapt resource value: 0x7f080019
public const int end = 2131230745;
// aapt resource value: 0x7f0800a2
public const int end_padder = 2131230882;
// aapt resource value: 0x7f080082
public const int end_padder = 2131230850;
// aapt resource value: 0x7f08000e
public const int enterAlways = 2131230734;
@ -2258,80 +2159,29 @@ namespace Bit.Android.Test
// aapt resource value: 0x7f080041
public const int image = 2131230785;
// aapt resource value: 0x7f0800a1
public const int info = 2131230881;
// aapt resource value: 0x7f08007a
public const int input_email = 2131230842;
// aapt resource value: 0x7f08007c
public const int input_message = 2131230844;
// aapt resource value: 0x7f080079
public const int input_name = 2131230841;
// aapt resource value: 0x7f080087
public const int input_password = 2131230855;
// aapt resource value: 0x7f08007b
public const int input_subject = 2131230843;
// aapt resource value: 0x7f080081
public const int info = 2131230849;
// aapt resource value: 0x7f080000
public const int item_touch_helper_previous_elevation = 2131230720;
// aapt resource value: 0x7f08008e
public const int label_author = 2131230862;
// aapt resource value: 0x7f08008f
public const int label_date = 2131230863;
// aapt resource value: 0x7f080081
public const int label_last_updated = 2131230849;
// aapt resource value: 0x7f080076
public const int label_message = 2131230838;
// aapt resource value: 0x7f080090
public const int label_text = 2131230864;
// aapt resource value: 0x7f08008a
public const int label_title = 2131230858;
// aapt resource value: 0x7f08008b
public const int label_version = 2131230859;
// aapt resource value: 0x7f08001b
public const int left = 2131230747;
// aapt resource value: 0x7f08009b
public const int line1 = 2131230875;
// aapt resource value: 0x7f08007b
public const int line1 = 2131230843;
// aapt resource value: 0x7f08009f
public const int line3 = 2131230879;
// aapt resource value: 0x7f08007f
public const int line3 = 2131230847;
// aapt resource value: 0x7f080027
public const int listMode = 2131230759;
// aapt resource value: 0x7f080091
public const int list_attachments = 2131230865;
// aapt resource value: 0x7f080085
public const int list_feedback_messages = 2131230853;
// aapt resource value: 0x7f080043
public const int list_item = 2131230787;
// aapt resource value: 0x7f080094
public const int loadingImage = 2131230868;
// aapt resource value: 0x7f080092
public const int loadingProgressBar = 2131230866;
// aapt resource value: 0x7f080095
public const int loadingProgressWheel = 2131230869;
// aapt resource value: 0x7f080099
public const int media_actions = 2131230873;
// aapt resource value: 0x7f080079
public const int media_actions = 2131230841;
// aapt resource value: 0x7f080036
public const int middle = 2131230774;
@ -2465,8 +2315,8 @@ namespace Bit.Android.Test
// aapt resource value: 0x7f08001d
public const int start = 2131230749;
// aapt resource value: 0x7f080098
public const int status_bar_latest_event_content = 2131230872;
// aapt resource value: 0x7f080078
public const int status_bar_latest_event_content = 2131230840;
// aapt resource value: 0x7f080067
public const int submit_area = 2131230823;
@ -2474,23 +2324,17 @@ namespace Bit.Android.Test
// aapt resource value: 0x7f080028
public const int tabMode = 2131230760;
// aapt resource value: 0x7f0800a0
public const int text = 2131230880;
// aapt resource value: 0x7f080080
public const int text = 2131230848;
// aapt resource value: 0x7f08009e
public const int text2 = 2131230878;
// aapt resource value: 0x7f08007e
public const int text2 = 2131230846;
// aapt resource value: 0x7f08004f
public const int textSpacerNoButtons = 2131230799;
// aapt resource value: 0x7f080093
public const int textViewStatus = 2131230867;
// aapt resource value: 0x7f080086
public const int text_headline = 2131230854;
// aapt resource value: 0x7f08009c
public const int time = 2131230876;
// aapt resource value: 0x7f08007c
public const int time = 2131230844;
// aapt resource value: 0x7f080045
public const int title = 2131230789;
@ -2513,36 +2357,15 @@ namespace Bit.Android.Test
// aapt resource value: 0x7f08002e
public const int useLogo = 2131230766;
// aapt resource value: 0x7f080089
public const int view_header = 2131230857;
// aapt resource value: 0x7f080001
public const int view_offset_helper = 2131230721;
// aapt resource value: 0x7f08008d
public const int web_update_details = 2131230861;
// aapt resource value: 0x7f08003b
public const int withText = 2131230779;
// aapt resource value: 0x7f08002f
public const int wrap_content = 2131230767;
// aapt resource value: 0x7f08007d
public const int wrapper_attachments = 2131230845;
// aapt resource value: 0x7f080078
public const int wrapper_feedback = 2131230840;
// aapt resource value: 0x7f080077
public const int wrapper_feedback_scroll = 2131230839;
// aapt resource value: 0x7f080080
public const int wrapper_messages = 2131230848;
// aapt resource value: 0x7f080082
public const int wrapper_messages_buttons = 2131230850;
static Id()
{
global::Android.Runtime.ResourceIdManager.UpdateIdValues();
@ -2708,79 +2531,52 @@ namespace Bit.Android.Test
public const int FingerprintDialog = 2130903077;
// aapt resource value: 0x7f030026
public const int hockeyapp_activity_expiry_info = 2130903078;
public const int notification_media_action = 2130903078;
// aapt resource value: 0x7f030027
public const int hockeyapp_activity_feedback = 2130903079;
public const int notification_media_cancel_action = 2130903079;
// aapt resource value: 0x7f030028
public const int hockeyapp_activity_login = 2130903080;
public const int notification_template_big_media = 2130903080;
// aapt resource value: 0x7f030029
public const int hockeyapp_activity_update = 2130903081;
public const int notification_template_big_media_narrow = 2130903081;
// aapt resource value: 0x7f03002a
public const int hockeyapp_fragment_update = 2130903082;
public const int notification_template_lines = 2130903082;
// aapt resource value: 0x7f03002b
public const int hockeyapp_view_feedback_message = 2130903083;
public const int notification_template_media = 2130903083;
// aapt resource value: 0x7f03002c
public const int loading = 2130903084;
public const int notification_template_part_chronometer = 2130903084;
// aapt resource value: 0x7f03002d
public const int loadingimage = 2130903085;
public const int notification_template_part_time = 2130903085;
// aapt resource value: 0x7f03002e
public const int loadingprogress = 2130903086;
public const int options = 2130903086;
// aapt resource value: 0x7f03002f
public const int notification_media_action = 2130903087;
public const int results = 2130903087;
// aapt resource value: 0x7f030030
public const int notification_media_cancel_action = 2130903088;
public const int select_dialog_item_material = 2130903088;
// aapt resource value: 0x7f030031
public const int notification_template_big_media = 2130903089;
public const int select_dialog_multichoice_material = 2130903089;
// aapt resource value: 0x7f030032
public const int notification_template_big_media_narrow = 2130903090;
public const int select_dialog_singlechoice_material = 2130903090;
// aapt resource value: 0x7f030033
public const int notification_template_lines = 2130903091;
public const int support_simple_spinner_dropdown_item = 2130903091;
// aapt resource value: 0x7f030034
public const int notification_template_media = 2130903092;
public const int test_result = 2130903092;
// aapt resource value: 0x7f030035
public const int notification_template_part_chronometer = 2130903093;
// aapt resource value: 0x7f030036
public const int notification_template_part_time = 2130903094;
// aapt resource value: 0x7f030037
public const int options = 2130903095;
// aapt resource value: 0x7f030038
public const int results = 2130903096;
// aapt resource value: 0x7f030039
public const int select_dialog_item_material = 2130903097;
// aapt resource value: 0x7f03003a
public const int select_dialog_multichoice_material = 2130903098;
// aapt resource value: 0x7f03003b
public const int select_dialog_singlechoice_material = 2130903099;
// aapt resource value: 0x7f03003c
public const int support_simple_spinner_dropdown_item = 2130903100;
// aapt resource value: 0x7f03003d
public const int test_result = 2130903101;
// aapt resource value: 0x7f03003e
public const int test_suite = 2130903102;
public const int test_suite = 2130903093;
static Layout()
{
@ -2811,11 +2607,11 @@ namespace Bit.Android.Test
public partial class String
{
// aapt resource value: 0x7f090063
public const int ApplicationName = 2131296355;
// aapt resource value: 0x7f09001b
public const int ApplicationName = 2131296283;
// aapt resource value: 0x7f090062
public const int Hello = 2131296354;
// aapt resource value: 0x7f09001a
public const int Hello = 2131296282;
// aapt resource value: 0x7f090006
public const int abc_action_bar_home_description = 2131296262;
@ -2892,222 +2688,6 @@ namespace Bit.Android.Test
// aapt resource value: 0x7f090002
public const int common_google_play_services_unknown_issue = 2131296258;
// aapt resource value: 0x7f09001b
public const int hockeyapp_crash_dialog_app_name_fallback = 2131296283;
// aapt resource value: 0x7f09001c
public const int hockeyapp_crash_dialog_message = 2131296284;
// aapt resource value: 0x7f09001d
public const int hockeyapp_crash_dialog_negative_button = 2131296285;
// aapt resource value: 0x7f09001e
public const int hockeyapp_crash_dialog_neutral_button = 2131296286;
// aapt resource value: 0x7f09001f
public const int hockeyapp_crash_dialog_positive_button = 2131296287;
// aapt resource value: 0x7f090020
public const int hockeyapp_crash_dialog_title = 2131296288;
// aapt resource value: 0x7f090021
public const int hockeyapp_dialog_error_message = 2131296289;
// aapt resource value: 0x7f090022
public const int hockeyapp_dialog_error_title = 2131296290;
// aapt resource value: 0x7f090023
public const int hockeyapp_dialog_negative_button = 2131296291;
// aapt resource value: 0x7f090024
public const int hockeyapp_dialog_positive_button = 2131296292;
// aapt resource value: 0x7f090025
public const int hockeyapp_download_failed_dialog_message = 2131296293;
// aapt resource value: 0x7f090026
public const int hockeyapp_download_failed_dialog_negative_button = 2131296294;
// aapt resource value: 0x7f090027
public const int hockeyapp_download_failed_dialog_positive_button = 2131296295;
// aapt resource value: 0x7f090028
public const int hockeyapp_download_failed_dialog_title = 2131296296;
// aapt resource value: 0x7f090029
public const int hockeyapp_error_no_network_message = 2131296297;
// aapt resource value: 0x7f09002a
public const int hockeyapp_expiry_info_text = 2131296298;
// aapt resource value: 0x7f09002b
public const int hockeyapp_expiry_info_title = 2131296299;
// aapt resource value: 0x7f09002c
public const int hockeyapp_feedback_attach_file = 2131296300;
// aapt resource value: 0x7f09002d
public const int hockeyapp_feedback_attach_picture = 2131296301;
// aapt resource value: 0x7f09002e
public const int hockeyapp_feedback_attachment_button_text = 2131296302;
// aapt resource value: 0x7f09002f
public const int hockeyapp_feedback_attachment_error = 2131296303;
// aapt resource value: 0x7f090030
public const int hockeyapp_feedback_attachment_loading = 2131296304;
// aapt resource value: 0x7f090031
public const int hockeyapp_feedback_email_hint = 2131296305;
// aapt resource value: 0x7f090032
public const int hockeyapp_feedback_failed_text = 2131296306;
// aapt resource value: 0x7f090033
public const int hockeyapp_feedback_failed_title = 2131296307;
// aapt resource value: 0x7f090034
public const int hockeyapp_feedback_fetching_feedback_text = 2131296308;
// aapt resource value: 0x7f090035
public const int hockeyapp_feedback_generic_error = 2131296309;
// aapt resource value: 0x7f090036
public const int hockeyapp_feedback_last_updated_text = 2131296310;
// aapt resource value: 0x7f090037
public const int hockeyapp_feedback_max_attachments_allowed = 2131296311;
// aapt resource value: 0x7f090038
public const int hockeyapp_feedback_message_hint = 2131296312;
// aapt resource value: 0x7f090039
public const int hockeyapp_feedback_name_hint = 2131296313;
// aapt resource value: 0x7f09003a
public const int hockeyapp_feedback_refresh_button_text = 2131296314;
// aapt resource value: 0x7f09003b
public const int hockeyapp_feedback_response_button_text = 2131296315;
// aapt resource value: 0x7f09003c
public const int hockeyapp_feedback_select_file = 2131296316;
// aapt resource value: 0x7f09003d
public const int hockeyapp_feedback_select_picture = 2131296317;
// aapt resource value: 0x7f09003e
public const int hockeyapp_feedback_send_button_text = 2131296318;
// aapt resource value: 0x7f09003f
public const int hockeyapp_feedback_send_generic_error = 2131296319;
// aapt resource value: 0x7f090040
public const int hockeyapp_feedback_send_network_error = 2131296320;
// aapt resource value: 0x7f090041
public const int hockeyapp_feedback_sending_feedback_text = 2131296321;
// aapt resource value: 0x7f090042
public const int hockeyapp_feedback_subject_hint = 2131296322;
// aapt resource value: 0x7f090043
public const int hockeyapp_feedback_title = 2131296323;
// aapt resource value: 0x7f090044
public const int hockeyapp_feedback_validate_email_empty = 2131296324;
// aapt resource value: 0x7f090045
public const int hockeyapp_feedback_validate_email_error = 2131296325;
// aapt resource value: 0x7f090046
public const int hockeyapp_feedback_validate_name_error = 2131296326;
// aapt resource value: 0x7f090047
public const int hockeyapp_feedback_validate_subject_error = 2131296327;
// aapt resource value: 0x7f090048
public const int hockeyapp_feedback_validate_text_error = 2131296328;
// aapt resource value: 0x7f090049
public const int hockeyapp_login_email_hint = 2131296329;
// aapt resource value: 0x7f09004a
public const int hockeyapp_login_headline_text = 2131296330;
// aapt resource value: 0x7f09004b
public const int hockeyapp_login_headline_text_email_only = 2131296331;
// aapt resource value: 0x7f09004c
public const int hockeyapp_login_login_button_text = 2131296332;
// aapt resource value: 0x7f09004d
public const int hockeyapp_login_missing_credentials_toast = 2131296333;
// aapt resource value: 0x7f09004e
public const int hockeyapp_login_password_hint = 2131296334;
// aapt resource value: 0x7f09004f
public const int hockeyapp_paint_dialog_message = 2131296335;
// aapt resource value: 0x7f090050
public const int hockeyapp_paint_dialog_negative_button = 2131296336;
// aapt resource value: 0x7f090051
public const int hockeyapp_paint_dialog_neutral_button = 2131296337;
// aapt resource value: 0x7f090052
public const int hockeyapp_paint_dialog_positive_button = 2131296338;
// aapt resource value: 0x7f090053
public const int hockeyapp_paint_indicator_toast = 2131296339;
// aapt resource value: 0x7f090054
public const int hockeyapp_paint_menu_clear = 2131296340;
// aapt resource value: 0x7f090055
public const int hockeyapp_paint_menu_save = 2131296341;
// aapt resource value: 0x7f090056
public const int hockeyapp_paint_menu_undo = 2131296342;
// aapt resource value: 0x7f090057
public const int hockeyapp_permission_dialog_negative_button = 2131296343;
// aapt resource value: 0x7f090058
public const int hockeyapp_permission_dialog_positive_button = 2131296344;
// aapt resource value: 0x7f090059
public const int hockeyapp_permission_update_message = 2131296345;
// aapt resource value: 0x7f09005a
public const int hockeyapp_permission_update_title = 2131296346;
// aapt resource value: 0x7f09005b
public const int hockeyapp_update_button = 2131296347;
// aapt resource value: 0x7f09005c
public const int hockeyapp_update_dialog_message = 2131296348;
// aapt resource value: 0x7f09005d
public const int hockeyapp_update_dialog_negative_button = 2131296349;
// aapt resource value: 0x7f09005e
public const int hockeyapp_update_dialog_positive_button = 2131296350;
// aapt resource value: 0x7f09005f
public const int hockeyapp_update_dialog_title = 2131296351;
// aapt resource value: 0x7f090060
public const int hockeyapp_update_mandatory_toast = 2131296352;
// aapt resource value: 0x7f090061
public const int hockeyapp_update_version_details_label = 2131296353;
// aapt resource value: 0x7f09001a
public const int library_name = 2131296282;
// aapt resource value: 0x7f090019
public const int status_bar_notification_info_overflow = 2131296281;
@ -3571,14 +3151,14 @@ namespace Bit.Android.Test
// aapt resource value: 0x7f0b0006
public const int Base_Widget_Design_TabLayout = 2131427334;
// aapt resource value: 0x7f0b015f
public const int BitwardenTheme = 2131427679;
// aapt resource value: 0x7f0b015c
public const int BitwardenTheme = 2131427676;
// aapt resource value: 0x7f0b0160
public const int BitwardenTheme_Base = 2131427680;
// aapt resource value: 0x7f0b015d
public const int BitwardenTheme_Base = 2131427677;
// aapt resource value: 0x7f0b015e
public const int BitwardenTheme_Splash = 2131427678;
// aapt resource value: 0x7f0b015b
public const int BitwardenTheme_Splash = 2131427675;
// aapt resource value: 0x7f0b0000
public const int CardView = 2131427328;
@ -3589,15 +3169,6 @@ namespace Bit.Android.Test
// aapt resource value: 0x7f0b0003
public const int CardView_Light = 2131427331;
// aapt resource value: 0x7f0b015b
public const int HockeyApp_ButtonStyle = 2131427675;
// aapt resource value: 0x7f0b015c
public const int HockeyApp_EditTextStyle = 2131427676;
// aapt resource value: 0x7f0b015d
public const int HockeyApp_SingleLineInputStyle = 2131427677;
// aapt resource value: 0x7f0b0034
public const int Platform_AppCompat = 2131427380;
@ -5440,56 +5011,6 @@ namespace Bit.Android.Test
// aapt resource value: 0
public const int PopupWindowBackgroundState_state_above_anchor = 0;
public static int[] ProgressWheel = new int[] {
2130772264,
2130772265,
2130772266,
2130772267,
2130772268,
2130772269,
2130772270,
2130772271,
2130772272,
2130772273,
2130772274,
2130772275};
// aapt resource value: 3
public const int ProgressWheel_ahBarColor = 3;
// aapt resource value: 11
public const int ProgressWheel_ahBarLength = 11;
// aapt resource value: 10
public const int ProgressWheel_ahBarWidth = 10;
// aapt resource value: 8
public const int ProgressWheel_ahCircleColor = 8;
// aapt resource value: 7
public const int ProgressWheel_ahDelayMillis = 7;
// aapt resource value: 9
public const int ProgressWheel_ahRadius = 9;
// aapt resource value: 4
public const int ProgressWheel_ahRimColor = 4;
// aapt resource value: 5
public const int ProgressWheel_ahRimWidth = 5;
// aapt resource value: 6
public const int ProgressWheel_ahSpinSpeed = 6;
// aapt resource value: 0
public const int ProgressWheel_ahText = 0;
// aapt resource value: 1
public const int ProgressWheel_ahTextColor = 1;
// aapt resource value: 2
public const int ProgressWheel_ahTextSize = 2;
public static int[] RecyclerView = new int[] {
16842948,
2130771968,