mirror of
https://github.com/bitwarden/android.git
synced 2024-12-25 18:38:27 +03:00
go to view page from groupings
This commit is contained in:
parent
b107df60e2
commit
1cde9b8356
10 changed files with 168 additions and 87 deletions
|
@ -28,7 +28,7 @@
|
||||||
<Compile Update="Pages\GeneratorPage.xaml.cs">
|
<Compile Update="Pages\GeneratorPage.xaml.cs">
|
||||||
<DependentUpon>GeneratorPage.xaml</DependentUpon>
|
<DependentUpon>GeneratorPage.xaml</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Update="Pages\ViewPage.xaml.cs">
|
<Compile Update="Pages\Vault\ViewPage.xaml.cs">
|
||||||
<DependentUpon>ViewPage.xaml</DependentUpon>
|
<DependentUpon>ViewPage.xaml</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Update="Pages\SettingsPage.xaml.cs">
|
<Compile Update="Pages\SettingsPage.xaml.cs">
|
||||||
|
|
|
@ -72,6 +72,7 @@
|
||||||
CachingStrategy="RecycleElement"
|
CachingStrategy="RecycleElement"
|
||||||
ItemTemplate="{StaticResource listItemDataTemplateSelector}"
|
ItemTemplate="{StaticResource listItemDataTemplateSelector}"
|
||||||
IsGroupingEnabled="True"
|
IsGroupingEnabled="True"
|
||||||
|
ItemSelected="RowSelected"
|
||||||
StyleClass="list, list-platform">
|
StyleClass="list, list-platform">
|
||||||
<ListView.GroupHeaderTemplate>
|
<ListView.GroupHeaderTemplate>
|
||||||
<DataTemplate x:DataType="pages:GroupingsPageListGroup">
|
<DataTemplate x:DataType="pages:GroupingsPageListGroup">
|
||||||
|
|
|
@ -22,6 +22,7 @@ namespace Bit.App.Pages
|
||||||
_broadcasterService = ServiceContainer.Resolve<IBroadcasterService>("broadcasterService");
|
_broadcasterService = ServiceContainer.Resolve<IBroadcasterService>("broadcasterService");
|
||||||
_syncService = ServiceContainer.Resolve<ISyncService>("syncService");
|
_syncService = ServiceContainer.Resolve<ISyncService>("syncService");
|
||||||
_viewModel = BindingContext as GroupingsPageViewModel;
|
_viewModel = BindingContext as GroupingsPageViewModel;
|
||||||
|
_viewModel.Page = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async override void OnAppearing()
|
protected async override void OnAppearing()
|
||||||
|
@ -55,5 +56,22 @@ namespace Bit.App.Pages
|
||||||
base.OnDisappearing();
|
base.OnDisappearing();
|
||||||
_broadcasterService.Unsubscribe(nameof(GroupingsPage));
|
_broadcasterService.Unsubscribe(nameof(GroupingsPage));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async void RowSelected(object sender, SelectedItemChangedEventArgs e)
|
||||||
|
{
|
||||||
|
if(!(e.SelectedItem is GroupingsPageListItem item))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(item.Cipher != null)
|
||||||
|
{
|
||||||
|
await _viewModel.SelectCipherAsync(item.Cipher);
|
||||||
|
}
|
||||||
|
else if(item.Folder != null || item.Collection != null)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -99,6 +99,12 @@ namespace Bit.App.Pages
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task SelectCipherAsync(CipherView cipher)
|
||||||
|
{
|
||||||
|
var page = new ViewPage(cipher.Id);
|
||||||
|
await Page.Navigation.PushModalAsync(new NavigationPage(page));
|
||||||
|
}
|
||||||
|
|
||||||
private async Task LoadFoldersAsync()
|
private async Task LoadFoldersAsync()
|
||||||
{
|
{
|
||||||
if(!ShowFolders)
|
if(!ShowFolders)
|
||||||
|
|
38
src/App/Pages/Vault/ViewPage.xaml
Normal file
38
src/App/Pages/Vault/ViewPage.xaml
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<ContentPage
|
||||||
|
xmlns="http://xamarin.com/schemas/2014/forms"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
|
||||||
|
x:Class="Bit.App.Pages.ViewPage"
|
||||||
|
xmlns:pages="clr-namespace:Bit.App.Pages"
|
||||||
|
xmlns:u="clr-namespace:Bit.App.Utilities"
|
||||||
|
x:DataType="pages:ViewPageViewModel"
|
||||||
|
Title="{Binding PageTitle}">
|
||||||
|
<ContentPage.BindingContext>
|
||||||
|
<pages:ViewPageViewModel />
|
||||||
|
</ContentPage.BindingContext>
|
||||||
|
|
||||||
|
<ContentPage.ToolbarItems>
|
||||||
|
<ToolbarItem Icon="cogs.png"
|
||||||
|
Text="{u:I18n Edit}" />
|
||||||
|
</ContentPage.ToolbarItems>
|
||||||
|
|
||||||
|
<StackLayout StyleClass="box">
|
||||||
|
<StackLayout StyleClass="box-row">
|
||||||
|
<Label
|
||||||
|
Text="{u:I18n Name}"
|
||||||
|
StyleClass="box-label" />
|
||||||
|
<Label
|
||||||
|
Text="{Binding Cipher.Name, Mode=OneWay}"
|
||||||
|
StyleClass="box-value" />
|
||||||
|
</StackLayout>
|
||||||
|
<StackLayout StyleClass="box-row">
|
||||||
|
<Label
|
||||||
|
Text="{u:I18n Notes}"
|
||||||
|
StyleClass="box-label" />
|
||||||
|
<Label
|
||||||
|
Text="{Binding Cipher.Notes, Mode=OneWay}"
|
||||||
|
StyleClass="box-value" />
|
||||||
|
</StackLayout>
|
||||||
|
</StackLayout>
|
||||||
|
|
||||||
|
</ContentPage>
|
54
src/App/Pages/Vault/ViewPage.xaml.cs
Normal file
54
src/App/Pages/Vault/ViewPage.xaml.cs
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
using Bit.Core.Abstractions;
|
||||||
|
using Bit.Core.Utilities;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Xamarin.Forms;
|
||||||
|
using Xamarin.Forms.Xaml;
|
||||||
|
|
||||||
|
namespace Bit.App.Pages
|
||||||
|
{
|
||||||
|
public partial class ViewPage : ContentPage
|
||||||
|
{
|
||||||
|
private readonly IBroadcasterService _broadcasterService;
|
||||||
|
private ViewPageViewModel _vm;
|
||||||
|
|
||||||
|
public ViewPage(string cipherId)
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
_broadcasterService = ServiceContainer.Resolve<IBroadcasterService>("broadcasterService");
|
||||||
|
_vm = BindingContext as ViewPageViewModel;
|
||||||
|
_vm.Page = this;
|
||||||
|
_vm.CipherId = cipherId;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected async override void OnAppearing()
|
||||||
|
{
|
||||||
|
base.OnAppearing();
|
||||||
|
_broadcasterService.Subscribe(nameof(ViewPage), async (message) =>
|
||||||
|
{
|
||||||
|
if(message.Command == "syncCompleted")
|
||||||
|
{
|
||||||
|
var data = message.Data as Dictionary<string, object>;
|
||||||
|
if(data.ContainsKey("successfully"))
|
||||||
|
{
|
||||||
|
var success = data["successfully"] as bool?;
|
||||||
|
if(success.HasValue && success.Value)
|
||||||
|
{
|
||||||
|
await _vm.LoadAsync();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
await _vm.LoadAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnDisappearing()
|
||||||
|
{
|
||||||
|
base.OnDisappearing();
|
||||||
|
_broadcasterService.Unsubscribe(nameof(ViewPage));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
50
src/App/Pages/Vault/ViewPageViewModel.cs
Normal file
50
src/App/Pages/Vault/ViewPageViewModel.cs
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
using Bit.App.Abstractions;
|
||||||
|
using Bit.App.Resources;
|
||||||
|
using Bit.Core.Abstractions;
|
||||||
|
using Bit.Core.Models.View;
|
||||||
|
using Bit.Core.Utilities;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Bit.App.Pages
|
||||||
|
{
|
||||||
|
public class ViewPageViewModel : BaseViewModel
|
||||||
|
{
|
||||||
|
private readonly IDeviceActionService _deviceActionService;
|
||||||
|
private readonly ICipherService _cipherService;
|
||||||
|
private readonly IUserService _userService;
|
||||||
|
private CipherView _cipher;
|
||||||
|
private bool _canAccessPremium;
|
||||||
|
|
||||||
|
public ViewPageViewModel()
|
||||||
|
{
|
||||||
|
_deviceActionService = ServiceContainer.Resolve<IDeviceActionService>("deviceActionService");
|
||||||
|
_cipherService = ServiceContainer.Resolve<ICipherService>("cipherService");
|
||||||
|
_userService = ServiceContainer.Resolve<IUserService>("userService");
|
||||||
|
|
||||||
|
PageTitle = AppResources.ViewItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string CipherId { get; set; }
|
||||||
|
public CipherView Cipher
|
||||||
|
{
|
||||||
|
get => _cipher;
|
||||||
|
set => SetProperty(ref _cipher, value);
|
||||||
|
}
|
||||||
|
public bool CanAccessPremium
|
||||||
|
{
|
||||||
|
get => _canAccessPremium;
|
||||||
|
set => SetProperty(ref _canAccessPremium, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task LoadAsync()
|
||||||
|
{
|
||||||
|
// TODO: Cleanup
|
||||||
|
|
||||||
|
var cipher = await _cipherService.GetAsync(CipherId);
|
||||||
|
Cipher = await cipher.DecryptAsync();
|
||||||
|
CanAccessPremium = await _userService.CanAccessPremiumAsync();
|
||||||
|
|
||||||
|
// TODO: Totp
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,31 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8" ?>
|
|
||||||
<ContentPage
|
|
||||||
xmlns="http://xamarin.com/schemas/2014/forms"
|
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
|
|
||||||
x:Class="Bit.App.Pages.ViewPage"
|
|
||||||
xmlns:pages="clr-namespace:Bit.App.Pages"
|
|
||||||
xmlns:u="clr-namespace:Bit.App.Utilities"
|
|
||||||
xmlns:bv="clr-namespace:Bit.App.Controls.BoxedView"
|
|
||||||
x:DataType="pages:ViewPageViewModel"
|
|
||||||
Title="{Binding PageTitle}">
|
|
||||||
<ContentPage.BindingContext>
|
|
||||||
<pages:ViewPageViewModel />
|
|
||||||
</ContentPage.BindingContext>
|
|
||||||
|
|
||||||
<ContentPage.ToolbarItems>
|
|
||||||
<ToolbarItem Icon="cogs.png" Text="{u:I18n Edit}" />
|
|
||||||
</ContentPage.ToolbarItems>
|
|
||||||
|
|
||||||
<bv:BoxedView HasUnevenRows="True">
|
|
||||||
<bv:BoxedSection HeaderHeight="0">
|
|
||||||
<bv:EntryCell Title="{u:I18n EmailAddress}"
|
|
||||||
ValueText="{Binding Email}" />
|
|
||||||
<bv:EntryCell Title="{u:I18n MasterPassword}"
|
|
||||||
ValueText="{Binding MasterPassword}"
|
|
||||||
IsPassword="True"
|
|
||||||
Button1Icon="cogs"
|
|
||||||
Button1Command="{Binding ShowPasswordCommand}" />
|
|
||||||
</bv:BoxedSection>
|
|
||||||
</bv:BoxedView>
|
|
||||||
|
|
||||||
</ContentPage>
|
|
|
@ -1,22 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Xamarin.Forms;
|
|
||||||
using Xamarin.Forms.Xaml;
|
|
||||||
|
|
||||||
namespace Bit.App.Pages
|
|
||||||
{
|
|
||||||
public partial class ViewPage : ContentPage
|
|
||||||
{
|
|
||||||
private ViewPageViewModel _vm;
|
|
||||||
|
|
||||||
public ViewPage()
|
|
||||||
{
|
|
||||||
InitializeComponent();
|
|
||||||
_vm = BindingContext as ViewPageViewModel;
|
|
||||||
_vm.Page = this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,33 +0,0 @@
|
||||||
using Bit.App.Abstractions;
|
|
||||||
using Bit.App.Resources;
|
|
||||||
using Bit.Core.Abstractions;
|
|
||||||
using Bit.Core.Exceptions;
|
|
||||||
using Bit.Core.Utilities;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using System.Windows.Input;
|
|
||||||
using Xamarin.Forms;
|
|
||||||
|
|
||||||
namespace Bit.App.Pages
|
|
||||||
{
|
|
||||||
public class ViewPageViewModel : BaseViewModel
|
|
||||||
{
|
|
||||||
private readonly IDeviceActionService _deviceActionService;
|
|
||||||
private readonly IAuthService _authService;
|
|
||||||
private readonly ISyncService _syncService;
|
|
||||||
|
|
||||||
public ViewPageViewModel()
|
|
||||||
{
|
|
||||||
_deviceActionService = ServiceContainer.Resolve<IDeviceActionService>("deviceActionService");
|
|
||||||
_authService = ServiceContainer.Resolve<IAuthService>("authService");
|
|
||||||
_syncService = ServiceContainer.Resolve<ISyncService>("syncService");
|
|
||||||
|
|
||||||
PageTitle = AppResources.Bitwarden;
|
|
||||||
ShowPasswordCommand = new Command(() =>
|
|
||||||
Page.DisplayAlert("Button 1 Command", "Button 1 message", "Cancel"));
|
|
||||||
}
|
|
||||||
|
|
||||||
public ICommand ShowPasswordCommand { get; }
|
|
||||||
public string Email { get; set; }
|
|
||||||
public string MasterPassword { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in a new issue