1
0
mirror of https://github.com/bitwarden/mobile synced 2025-12-26 13:13:28 +00:00

cipher view cell and groupings styles

This commit is contained in:
Kyle Spearrin
2019-04-22 17:08:37 -04:00
parent 6cd1171fd5
commit 913cd23c45
18 changed files with 256 additions and 35 deletions

View File

@@ -2,21 +2,82 @@
<ViewCell xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Bit.App.Controls.CipherViewCell"
xmlns:controls="clr-namespace:Bit.App.Controls">
xmlns:controls="clr-namespace:Bit.App.Controls"
xmlns:ff="clr-namespace:FFImageLoading.Forms;assembly=FFImageLoading.Forms">
<ViewCell.View>
<StackLayout x:Name="_layout"
x:DataType="controls:CipherViewCellViewModel"
StyleClass="list-row">
<StackLayout.BindingContext>
<Grid x:Name="_grid"
StyleClass="list-row, list-row-platform"
RowSpacing="0"
ColumnSpacing="0"
x:DataType="controls:CipherViewCellViewModel">
<Grid.BindingContext>
<controls:CipherViewCellViewModel />
</StackLayout.BindingContext>
</Grid.BindingContext>
<Label Text="{Binding Cipher.Name, Mode=OneWay}"
StyleClass="list-title" />
<Label Text="{Binding Cipher.SubTitle, Mode=OneWay}"
StyleClass="list-subtitle" />
</StackLayout>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="40" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="60" />
</Grid.ColumnDefinitions>
<controls:FaLabel x:Name="_icon"
HorizontalOptions="Center"
VerticalOptions="Center"
StyleClass="list-icon" />
<ff:CachedImage x:Name="_image"
Grid.Column="0"
Grid.Row="0"
Grid.RowSpan="2"
BitmapOptimizations="True"
ErrorPlaceholder="login.png"
HorizontalOptions="Center"
VerticalOptions="Center"
WidthRequest="20"
HeightRequest="20"
IsVisible="False"/>
<Label LineBreakMode="TailTruncation"
Grid.Column="1"
Grid.Row="0"
StyleClass="list-title, list-title-platform"
Text="{Binding Cipher.Name, Mode=OneWay}" />
<Label LineBreakMode="TailTruncation"
Grid.Column="1"
Grid.Row="1"
Grid.ColumnSpan="3"
StyleClass="list-subtitle, list-subtitle-platform"
Text="{Binding Cipher.SubTitle, Mode=OneWay}" />
<controls:FaLabel Grid.Column="2"
Grid.Row="0"
HorizontalOptions="Start"
VerticalOptions="Center"
StyleClass="list-title-icon"
Margin="5, 0, 0, 0"
Text="&#xf1e0;"
IsVisible="{Binding Cipher.Shared, Mode=OneWay}" />
<controls:FaLabel Grid.Column="3"
Grid.Row="0"
HorizontalOptions="Start"
VerticalOptions="Center"
StyleClass="list-title-icon"
Margin="5, 0, 0, 0"
Text="&#xf0c6;"
IsVisible="{Binding Cipher.HasAttachments, Mode=OneWay}" />
<Button WidthRequest="60"
Grid.Column="4"
Grid.Row="0"
Grid.RowSpan="2"
BackgroundColor="Transparent" />
</Grid>
</ViewCell.View>
</ViewCell>

View File

@@ -1,4 +1,9 @@
using Bit.Core.Models.View;
using Bit.App.Pages;
using Bit.Core;
using Bit.Core.Enums;
using Bit.Core.Models.View;
using Bit.Core.Utilities;
using System;
using Xamarin.Forms;
namespace Bit.App.Controls
@@ -13,7 +18,7 @@ namespace Bit.App.Controls
public CipherViewCell()
{
InitializeComponent();
_viewModel = _layout.BindingContext as CipherViewCellViewModel;
_viewModel = _grid.BindingContext as CipherViewCellViewModel;
}
public CipherView Cipher
@@ -30,5 +35,88 @@ namespace Bit.App.Controls
_viewModel.Cipher = Cipher;
}
}
protected override void OnBindingContextChanged()
{
string icon = null;
string image = null;
_image.Source = null;
if(BindingContext is GroupingsPageListItem groupingsPageListItem && groupingsPageListItem.Cipher != null)
{
switch(groupingsPageListItem.Cipher.Type)
{
case CipherType.Login:
var loginIconImage = GetLoginIconImage(groupingsPageListItem.Cipher);
icon = loginIconImage.Item1;
image = loginIconImage.Item2;
break;
case CipherType.SecureNote:
icon = "&#xf24a;";
break;
case CipherType.Card:
icon = "&#xf09d;";
break;
case CipherType.Identity:
icon = "&#xf2c3;";
break;
default:
break;
}
if(image != null)
{
_image.IsVisible = true;
_icon.IsVisible = false;
_image.Source = image;
_image.LoadingPlaceholder = "login.png";
}
else
{
_image.IsVisible = false;
_icon.IsVisible = true;
_icon.Text = icon;
}
}
base.OnBindingContextChanged();
}
private Tuple<string, string> GetLoginIconImage(CipherView cipher)
{
string icon = "&#xf0ac;";
string image = null;
var imageEnabled = true;
if(cipher.Login.Uri != null)
{
var hostnameUri = cipher.Login.Uri;
var isWebsite = false;
if(hostnameUri.StartsWith(Constants.AndroidAppProtocol))
{
icon = "&#xf17b;";
}
else if(hostnameUri.StartsWith(Constants.iOSAppProtocol))
{
icon = "&#xf179;";
}
else if(imageEnabled && !hostnameUri.Contains("://") && hostnameUri.Contains("."))
{
hostnameUri = string.Concat("http://", hostnameUri);
isWebsite = true;
}
else if(imageEnabled)
{
isWebsite = hostnameUri.StartsWith("http") && hostnameUri.Contains(".");
}
if(imageEnabled && isWebsite)
{
var hostname = CoreHelpers.GetHostname(hostnameUri);
var iconsUrl = "https://icons.bitwarden.net";
image = string.Format("{0}/{1}/icon.png", iconsUrl, hostname);
}
}
return new Tuple<string, string>(icon, image);
}
}
}