image and icon

This commit is contained in:
Kyle Spearrin 2019-06-08 11:48:45 -04:00
parent 5f16066641
commit 2f66ee264b
5 changed files with 583 additions and 483 deletions

View file

@ -1,11 +1,17 @@
using Android.App;
using Android.Content;
using Android.Graphics;
using Android.Runtime;
using Android.Util;
using Android.Views;
using Android.Views.InputMethods;
using Android.Widget;
using Bit.App.Controls;
using Bit.Droid.Renderers;
using FFImageLoading;
using FFImageLoading.Views;
using FFImageLoading.Work;
using System;
using System.ComponentModel;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
@ -18,6 +24,8 @@ namespace Bit.Droid.Renderers
private static Typeface _faTypeface;
private static Typeface _miTypeface;
private AndroidCipherCell _cell;
protected override Android.Views.View GetCellCore(Cell item, Android.Views.View convertView,
ViewGroup parent, Context context)
{
@ -31,23 +39,26 @@ namespace Bit.Droid.Renderers
}
var cipherCell = item as CipherViewCell;
if(!(convertView is AndroidCipherCell cell))
_cell = convertView as AndroidCipherCell;
if(_cell == null)
{
cell = new AndroidCipherCell(context, cipherCell, _faTypeface, _miTypeface);
_cell = new AndroidCipherCell(context, cipherCell, _faTypeface, _miTypeface);
}
cell.CipherViewCell.PropertyChanged += CellPropertyChanged;
cell.CipherViewCell = cipherCell;
cell.CipherViewCell.PropertyChanged -= CellPropertyChanged;
cell.UpdateCell();
return cell;
else
{
_cell.CipherViewCell.PropertyChanged -= CellPropertyChanged;
}
cipherCell.PropertyChanged += CellPropertyChanged;
_cell.UpdateCell(cipherCell);
return _cell;
}
public void CellPropertyChanged(object sender, PropertyChangedEventArgs e)
{
var nativeCell = sender as AndroidCipherCell;
var cipherCell = sender as CipherViewCell;
if(e.PropertyName == CipherViewCell.CipherProperty.PropertyName)
{
nativeCell.UpdateCell();
_cell.UpdateCell(cipherCell);
}
}
}
@ -57,20 +68,25 @@ namespace Bit.Droid.Renderers
private readonly Typeface _faTypeface;
private readonly Typeface _miTypeface;
public AndroidCipherCell(Context context, CipherViewCell cipherCell, Typeface faTypeface, Typeface miTypeface)
private IScheduledWork _currentTask;
public AndroidCipherCell(Context context, CipherViewCell cipherView, Typeface faTypeface, Typeface miTypeface)
: base(context)
{
var view = (context as Activity).LayoutInflater.Inflate(Resource.Layout.CipherViewCell, null);
CipherViewCell = cipherCell;
CipherViewCell = cipherView;
_faTypeface = faTypeface;
_miTypeface = miTypeface;
var view = (context as Activity).LayoutInflater.Inflate(Resource.Layout.CipherViewCell, null);
IconImage = view.FindViewById<IconImageView>(Resource.Id.CipherCellIconImage);
Icon = view.FindViewById<TextView>(Resource.Id.CipherCellIcon);
Name = view.FindViewById<TextView>(Resource.Id.CipherCellName);
SubTitle = view.FindViewById<TextView>(Resource.Id.CipherCellSubTitle);
SharedIcon = view.FindViewById<TextView>(Resource.Id.CipherCellSharedIcon);
AttachmentsIcon = view.FindViewById<TextView>(Resource.Id.CipherCellAttachmentsIcon);
MoreButton = view.FindViewById<Android.Widget.Button>(Resource.Id.CipherCellButton);
Icon.Typeface = _faTypeface;
SharedIcon.Typeface = _faTypeface;
AttachmentsIcon.Typeface = _faTypeface;
MoreButton.Typeface = _miTypeface;
@ -80,15 +96,39 @@ namespace Bit.Droid.Renderers
public CipherViewCell CipherViewCell { get; set; }
public Element Element => CipherViewCell;
public IconImageView IconImage { get; set; }
public TextView Icon { get; set; }
public TextView Name { get; set; }
public TextView SubTitle { get; set; }
public TextView SharedIcon { get; set; }
public TextView AttachmentsIcon { get; set; }
public Android.Widget.Button MoreButton { get; set; }
public void UpdateCell()
public void UpdateCell(CipherViewCell cipherCell)
{
var cipher = CipherViewCell.Cipher;
if(_currentTask != null && !_currentTask.IsCancelled && !_currentTask.IsCompleted)
{
_currentTask.Cancel();
}
var cipher = cipherCell.Cipher;
var iconImage = cipherCell.GetIconImage(cipher);
if(iconImage.Item2 != null)
{
IconImage.SetImageResource(Resource.Drawable.login);
IconImage.Visibility = ViewStates.Visible;
Icon.Visibility = ViewStates.Gone;
_currentTask = ImageService.Instance.LoadUrl(iconImage.Item2).DownSample(64).Into(IconImage);
IconImage.Key = iconImage.Item2;
}
else
{
IconImage.Visibility = ViewStates.Gone;
Icon.Visibility = ViewStates.Visible;
Icon.Text = iconImage.Item1;
}
Name.Text = cipher.Name;
if(!string.IsNullOrWhiteSpace(cipher.SubTitle))
{
@ -103,4 +143,30 @@ namespace Bit.Droid.Renderers
AttachmentsIcon.Visibility = cipher.HasAttachments ? ViewStates.Visible : ViewStates.Gone;
}
}
[Android.Runtime.Preserve(AllMembers = true)]
[Register("bit.droid.renderers.IconImageView")]
public class IconImageView : ImageViewAsync
{
public IconImageView(Context context) : base(context)
{ }
public IconImageView(IntPtr javaReference, JniHandleOwnership transfer)
: base(javaReference, transfer)
{ }
public IconImageView(Context context, IAttributeSet attrs)
: base(context, attrs)
{ }
public string Key { get; set; }
protected override void JavaFinalize()
{
SetImageDrawable(null);
SetImageBitmap(null);
ImageService.Instance.InvalidateCacheEntryAsync(Key, FFImageLoading.Cache.CacheType.Memory);
base.JavaFinalize();
}
}
}

View file

@ -9128,44 +9128,50 @@ namespace Bit.Droid
// aapt resource value: 0x7f0d00ae
public const int CellTitleContent = 2131558574;
// aapt resource value: 0x7f0d00b9
public const int CipherCellAttachmentsIcon = 2131558585;
// aapt resource value: 0x7f0d00b5
public const int CipherCellButton = 2131558581;
// aapt resource value: 0x7f0d00b4
public const int CipherCellContent = 2131558580;
// aapt resource value: 0x7f0d00b6
public const int CipherCellContentTop = 2131558582;
// aapt resource value: 0x7f0d00b7
public const int CipherCellName = 2131558583;
// aapt resource value: 0x7f0d00b8
public const int CipherCellSharedIcon = 2131558584;
// aapt resource value: 0x7f0d00ba
public const int CipherCellSubTitle = 2131558586;
// aapt resource value: 0x7f0d00bb
public const int ContentCellBody = 2131558587;
public const int CipherCellAttachmentsIcon = 2131558586;
// aapt resource value: 0x7f0d00bc
public const int ContentCellBorder = 2131558588;
public const int CipherCellButton = 2131558588;
// aapt resource value: 0x7f0d00b6
public const int CipherCellContent = 2131558582;
// aapt resource value: 0x7f0d00b7
public const int CipherCellContentTop = 2131558583;
// aapt resource value: 0x7f0d00b5
public const int CipherCellIcon = 2131558581;
// aapt resource value: 0x7f0d00b4
public const int CipherCellIconImage = 2131558580;
// aapt resource value: 0x7f0d00b8
public const int CipherCellName = 2131558584;
// aapt resource value: 0x7f0d00b9
public const int CipherCellSharedIcon = 2131558585;
// aapt resource value: 0x7f0d00bb
public const int CipherCellSubTitle = 2131558587;
// aapt resource value: 0x7f0d00bd
public const int ContentCellBody = 2131558589;
// aapt resource value: 0x7f0d00be
public const int ContentCellBorder = 2131558590;
// aapt resource value: 0x7f0d0043
public const int FUNCTION = 2131558467;
// aapt resource value: 0x7f0d00d0
public const int FooterCellText = 2131558608;
// aapt resource value: 0x7f0d00d2
public const int HeaderCellBorder = 2131558610;
public const int FooterCellText = 2131558610;
// aapt resource value: 0x7f0d00d1
public const int HeaderCellText = 2131558609;
// aapt resource value: 0x7f0d00d4
public const int HeaderCellBorder = 2131558612;
// aapt resource value: 0x7f0d00d3
public const int HeaderCellText = 2131558611;
// aapt resource value: 0x7f0d0044
public const int META = 2131558468;
@ -9176,8 +9182,8 @@ namespace Bit.Droid
// aapt resource value: 0x7f0d0046
public const int SYM = 2131558470;
// aapt resource value: 0x7f0d0121
public const int action0 = 2131558689;
// aapt resource value: 0x7f0d0123
public const int action0 = 2131558691;
// aapt resource value: 0x7f0d0094
public const int action_bar = 2131558548;
@ -9200,17 +9206,17 @@ namespace Bit.Droid
// aapt resource value: 0x7f0d0070
public const int action_bar_title = 2131558512;
// aapt resource value: 0x7f0d011e
public const int action_container = 2131558686;
// aapt resource value: 0x7f0d0120
public const int action_container = 2131558688;
// aapt resource value: 0x7f0d0095
public const int action_context_bar = 2131558549;
// aapt resource value: 0x7f0d0125
public const int action_divider = 2131558693;
// aapt resource value: 0x7f0d0127
public const int action_divider = 2131558695;
// aapt resource value: 0x7f0d011f
public const int action_image = 2131558687;
// aapt resource value: 0x7f0d0121
public const int action_image = 2131558689;
// aapt resource value: 0x7f0d0003
public const int action_menu_divider = 2131558403;
@ -9227,11 +9233,11 @@ namespace Bit.Droid
// aapt resource value: 0x7f0d0072
public const int action_mode_close_button = 2131558514;
// aapt resource value: 0x7f0d0120
public const int action_text = 2131558688;
// aapt resource value: 0x7f0d0122
public const int action_text = 2131558690;
// aapt resource value: 0x7f0d012e
public const int actions = 2131558702;
// aapt resource value: 0x7f0d0130
public const int actions = 2131558704;
// aapt resource value: 0x7f0d0073
public const int activity_chooser_view_content = 2131558515;
@ -9293,26 +9299,26 @@ namespace Bit.Droid
// aapt resource value: 0x7f0d0079
public const int buttonPanel = 2131558521;
// aapt resource value: 0x7f0d00e0
public const int button_add_response = 2131558624;
// aapt resource value: 0x7f0d00e2
public const int button_add_response = 2131558626;
// aapt resource value: 0x7f0d00db
public const int button_attachment = 2131558619;
// aapt resource value: 0x7f0d00dd
public const int button_attachment = 2131558621;
// aapt resource value: 0x7f0d00e5
public const int button_login = 2131558629;
// aapt resource value: 0x7f0d00e7
public const int button_login = 2131558631;
// aapt resource value: 0x7f0d00e1
public const int button_refresh = 2131558625;
// aapt resource value: 0x7f0d00e3
public const int button_refresh = 2131558627;
// aapt resource value: 0x7f0d00dc
public const int button_send = 2131558620;
// aapt resource value: 0x7f0d00de
public const int button_send = 2131558622;
// aapt resource value: 0x7f0d00e9
public const int button_update = 2131558633;
// aapt resource value: 0x7f0d00eb
public const int button_update = 2131558635;
// aapt resource value: 0x7f0d0122
public const int cancel_action = 2131558690;
// aapt resource value: 0x7f0d0124
public const int cancel_action = 2131558692;
// aapt resource value: 0x7f0d0054
public const int center = 2131558484;
@ -9326,8 +9332,8 @@ namespace Bit.Droid
// aapt resource value: 0x7f0d008d
public const int checkbox = 2131558541;
// aapt resource value: 0x7f0d012a
public const int chronometer = 2131558698;
// aapt resource value: 0x7f0d012c
public const int chronometer = 2131558700;
// aapt resource value: 0x7f0d0068
public const int clip_horizontal = 2131558504;
@ -9338,20 +9344,20 @@ namespace Bit.Droid
// aapt resource value: 0x7f0d0048
public const int collapseActionView = 2131558472;
// aapt resource value: 0x7f0d00bf
public const int container = 2131558591;
// aapt resource value: 0x7f0d00c1
public const int container = 2131558593;
// aapt resource value: 0x7f0d0089
public const int content = 2131558537;
// aapt resource value: 0x7f0d013a
public const int contentFrame = 2131558714;
// aapt resource value: 0x7f0d013c
public const int contentFrame = 2131558716;
// aapt resource value: 0x7f0d007c
public const int contentPanel = 2131558524;
// aapt resource value: 0x7f0d00c0
public const int coordinator = 2131558592;
// aapt resource value: 0x7f0d00c2
public const int coordinator = 2131558594;
// aapt resource value: 0x7f0d0083
public const int custom = 2131558531;
@ -9368,20 +9374,20 @@ namespace Bit.Droid
// aapt resource value: 0x7f0d0076
public const int default_activity_button = 2131558518;
// aapt resource value: 0x7f0d00c2
public const int design_bottom_sheet = 2131558594;
// aapt resource value: 0x7f0d00c4
public const int design_bottom_sheet = 2131558596;
// aapt resource value: 0x7f0d00c9
public const int design_menu_item_action_area = 2131558601;
// aapt resource value: 0x7f0d00c8
public const int design_menu_item_action_area_stub = 2131558600;
// aapt resource value: 0x7f0d00c7
public const int design_menu_item_action_area = 2131558599;
public const int design_menu_item_text = 2131558599;
// aapt resource value: 0x7f0d00c6
public const int design_menu_item_action_area_stub = 2131558598;
// aapt resource value: 0x7f0d00c5
public const int design_menu_item_text = 2131558597;
// aapt resource value: 0x7f0d00c4
public const int design_navigation_view = 2131558596;
public const int design_navigation_view = 2131558598;
// aapt resource value: 0x7f0d0030
public const int disableHome = 2131558448;
@ -9392,8 +9398,8 @@ namespace Bit.Droid
// aapt resource value: 0x7f0d003f
public const int end = 2131558463;
// aapt resource value: 0x7f0d0130
public const int end_padder = 2131558704;
// aapt resource value: 0x7f0d0132
public const int end_padder = 2131558706;
// aapt resource value: 0x7f0d004e
public const int enterAlways = 2131558478;
@ -9422,29 +9428,29 @@ namespace Bit.Droid
// aapt resource value: 0x7f0d0066
public const int filled = 2131558502;
// aapt resource value: 0x7f0d00cc
public const int fingerprint_btnCancel = 2131558604;
// aapt resource value: 0x7f0d00ce
public const int fingerprint_btnCancel = 2131558606;
// aapt resource value: 0x7f0d00cd
public const int fingerprint_btnFallback = 2131558605;
// aapt resource value: 0x7f0d00c9
public const int fingerprint_imgFingerprint = 2131558601;
// aapt resource value: 0x7f0d00ca
public const int fingerprint_txtHelp = 2131558602;
// aapt resource value: 0x7f0d00cf
public const int fingerprint_btnFallback = 2131558607;
// aapt resource value: 0x7f0d00cb
public const int fingerprint_txtReason = 2131558603;
public const int fingerprint_imgFingerprint = 2131558603;
// aapt resource value: 0x7f0d00cc
public const int fingerprint_txtHelp = 2131558604;
// aapt resource value: 0x7f0d00cd
public const int fingerprint_txtReason = 2131558605;
// aapt resource value: 0x7f0d0063
public const int @fixed = 2131558499;
// aapt resource value: 0x7f0d00ce
public const int flyoutcontent_appbar = 2131558606;
// aapt resource value: 0x7f0d00d0
public const int flyoutcontent_appbar = 2131558608;
// aapt resource value: 0x7f0d00cf
public const int flyoutcontent_recycler = 2131558607;
// aapt resource value: 0x7f0d00d1
public const int flyoutcontent_recycler = 2131558609;
// aapt resource value: 0x7f0d006e
public const int forever = 2131558510;
@ -9464,8 +9470,8 @@ namespace Bit.Droid
// aapt resource value: 0x7f0d0078
public const int icon = 2131558520;
// aapt resource value: 0x7f0d012f
public const int icon_group = 2131558703;
// aapt resource value: 0x7f0d0131
public const int icon_group = 2131558705;
// aapt resource value: 0x7f0d0027
public const int icon_only = 2131558439;
@ -9476,23 +9482,23 @@ namespace Bit.Droid
// aapt resource value: 0x7f0d0075
public const int image = 2131558517;
// aapt resource value: 0x7f0d012b
public const int info = 2131558699;
// aapt resource value: 0x7f0d00d7
public const int input_email = 2131558615;
// aapt resource value: 0x7f0d012d
public const int info = 2131558701;
// aapt resource value: 0x7f0d00d9
public const int input_message = 2131558617;
public const int input_email = 2131558617;
// aapt resource value: 0x7f0d00d6
public const int input_name = 2131558614;
// aapt resource value: 0x7f0d00e4
public const int input_password = 2131558628;
// aapt resource value: 0x7f0d00db
public const int input_message = 2131558619;
// aapt resource value: 0x7f0d00d8
public const int input_subject = 2131558616;
public const int input_name = 2131558616;
// aapt resource value: 0x7f0d00e6
public const int input_password = 2131558630;
// aapt resource value: 0x7f0d00da
public const int input_subject = 2131558618;
// aapt resource value: 0x7f0d006f
public const int italic = 2131558511;
@ -9500,32 +9506,32 @@ namespace Bit.Droid
// aapt resource value: 0x7f0d0000
public const int item_touch_helper_previous_elevation = 2131558400;
// aapt resource value: 0x7f0d00eb
public const int label_author = 2131558635;
// aapt resource value: 0x7f0d00ec
public const int label_date = 2131558636;
// aapt resource value: 0x7f0d00de
public const int label_last_updated = 2131558622;
// aapt resource value: 0x7f0d00d3
public const int label_message = 2131558611;
// aapt resource value: 0x7f0d00ed
public const int label_text = 2131558637;
public const int label_author = 2131558637;
// aapt resource value: 0x7f0d00e7
public const int label_title = 2131558631;
// aapt resource value: 0x7f0d00ee
public const int label_date = 2131558638;
// aapt resource value: 0x7f0d00e8
public const int label_version = 2131558632;
// aapt resource value: 0x7f0d00e0
public const int label_last_updated = 2131558624;
// aapt resource value: 0x7f0d00d5
public const int label_message = 2131558613;
// aapt resource value: 0x7f0d00ef
public const int label_text = 2131558639;
// aapt resource value: 0x7f0d00e9
public const int label_title = 2131558633;
// aapt resource value: 0x7f0d00ea
public const int label_version = 2131558634;
// aapt resource value: 0x7f0d0055
public const int labeled = 2131558485;
// aapt resource value: 0x7f0d00be
public const int largeLabel = 2131558590;
// aapt resource value: 0x7f0d00c0
public const int largeLabel = 2131558592;
// aapt resource value: 0x7f0d005b
public const int left = 2131558491;
@ -9542,32 +9548,32 @@ namespace Bit.Droid
// aapt resource value: 0x7f0d002d
public const int listMode = 2131558445;
// aapt resource value: 0x7f0d00ee
public const int list_attachments = 2131558638;
// aapt resource value: 0x7f0d00f0
public const int list_attachments = 2131558640;
// aapt resource value: 0x7f0d00e2
public const int list_feedback_messages = 2131558626;
// aapt resource value: 0x7f0d00e4
public const int list_feedback_messages = 2131558628;
// aapt resource value: 0x7f0d0077
public const int list_item = 2131558519;
// aapt resource value: 0x7f0d0131
public const int main_appbar = 2131558705;
// aapt resource value: 0x7f0d0133
public const int main_appbar = 2131558707;
// aapt resource value: 0x7f0d0136
public const int main_scrollview = 2131558710;
// aapt resource value: 0x7f0d0135
public const int main_tablayout = 2131558709;
// aapt resource value: 0x7f0d0134
public const int main_scrollview = 2131558708;
public const int main_toolbar = 2131558708;
// aapt resource value: 0x7f0d0133
public const int main_tablayout = 2131558707;
// aapt resource value: 0x7f0d013e
public const int masked = 2131558718;
// aapt resource value: 0x7f0d0132
public const int main_toolbar = 2131558706;
// aapt resource value: 0x7f0d013c
public const int masked = 2131558716;
// aapt resource value: 0x7f0d0124
public const int media_actions = 2131558692;
// aapt resource value: 0x7f0d0126
public const int media_actions = 2131558694;
// aapt resource value: 0x7f0d00a3
public const int message = 2131558563;
@ -9578,143 +9584,143 @@ namespace Bit.Droid
// aapt resource value: 0x7f0d0060
public const int mini = 2131558496;
// aapt resource value: 0x7f0d010b
public const int mr_art = 2131558667;
// aapt resource value: 0x7f0d00fc
public const int mr_cast_checkbox = 2131558652;
// aapt resource value: 0x7f0d00f5
public const int mr_cast_close_button = 2131558645;
// aapt resource value: 0x7f0d00f0
public const int mr_cast_group_icon = 2131558640;
// aapt resource value: 0x7f0d00f1
public const int mr_cast_group_name = 2131558641;
// aapt resource value: 0x7f0d00ef
public const int mr_cast_list = 2131558639;
// aapt resource value: 0x7f0d00f4
public const int mr_cast_meta = 2131558644;
// aapt resource value: 0x7f0d00f6
public const int mr_cast_meta_art = 2131558646;
// aapt resource value: 0x7f0d00f8
public const int mr_cast_meta_subtitle = 2131558648;
// aapt resource value: 0x7f0d00f7
public const int mr_cast_meta_title = 2131558647;
// aapt resource value: 0x7f0d00fa
public const int mr_cast_route_icon = 2131558650;
// aapt resource value: 0x7f0d00fb
public const int mr_cast_route_name = 2131558651;
// aapt resource value: 0x7f0d00f9
public const int mr_cast_stop_button = 2131558649;
// aapt resource value: 0x7f0d00fd
public const int mr_cast_volume_layout = 2131558653;
// aapt resource value: 0x7f0d010d
public const int mr_art = 2131558669;
// aapt resource value: 0x7f0d00fe
public const int mr_cast_volume_slider = 2131558654;
public const int mr_cast_checkbox = 2131558654;
// aapt resource value: 0x7f0d0100
public const int mr_chooser_list = 2131558656;
// aapt resource value: 0x7f0d0103
public const int mr_chooser_route_desc = 2131558659;
// aapt resource value: 0x7f0d0101
public const int mr_chooser_route_icon = 2131558657;
// aapt resource value: 0x7f0d0102
public const int mr_chooser_route_name = 2131558658;
// aapt resource value: 0x7f0d00ff
public const int mr_chooser_title = 2131558655;
// aapt resource value: 0x7f0d0108
public const int mr_close = 2131558664;
// aapt resource value: 0x7f0d010e
public const int mr_control_divider = 2131558670;
// aapt resource value: 0x7f0d0119
public const int mr_control_playback_ctrl = 2131558681;
// aapt resource value: 0x7f0d011c
public const int mr_control_subtitle = 2131558684;
// aapt resource value: 0x7f0d011b
public const int mr_control_title = 2131558683;
// aapt resource value: 0x7f0d011a
public const int mr_control_title_container = 2131558682;
// aapt resource value: 0x7f0d0109
public const int mr_custom_control = 2131558665;
// aapt resource value: 0x7f0d010a
public const int mr_default_control = 2131558666;
// aapt resource value: 0x7f0d0105
public const int mr_dialog_area = 2131558661;
// aapt resource value: 0x7f0d0114
public const int mr_dialog_header_name = 2131558676;
// aapt resource value: 0x7f0d0104
public const int mr_expandable_area = 2131558660;
// aapt resource value: 0x7f0d011d
public const int mr_group_expand_collapse = 2131558685;
// aapt resource value: 0x7f0d00f7
public const int mr_cast_close_button = 2131558647;
// aapt resource value: 0x7f0d00f2
public const int mr_group_volume_route_name = 2131558642;
public const int mr_cast_group_icon = 2131558642;
// aapt resource value: 0x7f0d00f3
public const int mr_group_volume_slider = 2131558643;
public const int mr_cast_group_name = 2131558643;
// aapt resource value: 0x7f0d010c
public const int mr_media_main_control = 2131558668;
// aapt resource value: 0x7f0d00f1
public const int mr_cast_list = 2131558641;
// aapt resource value: 0x7f0d0107
public const int mr_name = 2131558663;
// aapt resource value: 0x7f0d00f6
public const int mr_cast_meta = 2131558646;
// aapt resource value: 0x7f0d0115
public const int mr_picker_close_button = 2131558677;
// aapt resource value: 0x7f0d00f8
public const int mr_cast_meta_art = 2131558648;
// aapt resource value: 0x7f0d0116
public const int mr_picker_list = 2131558678;
// aapt resource value: 0x7f0d00fa
public const int mr_cast_meta_subtitle = 2131558650;
// aapt resource value: 0x7f0d0117
public const int mr_picker_route_icon = 2131558679;
// aapt resource value: 0x7f0d00f9
public const int mr_cast_meta_title = 2131558649;
// aapt resource value: 0x7f0d0118
public const int mr_picker_route_name = 2131558680;
// aapt resource value: 0x7f0d00fc
public const int mr_cast_route_icon = 2131558652;
// aapt resource value: 0x7f0d010d
public const int mr_playback_control = 2131558669;
// aapt resource value: 0x7f0d00fd
public const int mr_cast_route_name = 2131558653;
// aapt resource value: 0x7f0d0106
public const int mr_title_bar = 2131558662;
// aapt resource value: 0x7f0d00fb
public const int mr_cast_stop_button = 2131558651;
// aapt resource value: 0x7f0d010f
public const int mr_volume_control = 2131558671;
// aapt resource value: 0x7f0d00ff
public const int mr_cast_volume_layout = 2131558655;
// aapt resource value: 0x7f0d0100
public const int mr_cast_volume_slider = 2131558656;
// aapt resource value: 0x7f0d0102
public const int mr_chooser_list = 2131558658;
// aapt resource value: 0x7f0d0105
public const int mr_chooser_route_desc = 2131558661;
// aapt resource value: 0x7f0d0103
public const int mr_chooser_route_icon = 2131558659;
// aapt resource value: 0x7f0d0104
public const int mr_chooser_route_name = 2131558660;
// aapt resource value: 0x7f0d0101
public const int mr_chooser_title = 2131558657;
// aapt resource value: 0x7f0d010a
public const int mr_close = 2131558666;
// aapt resource value: 0x7f0d0110
public const int mr_volume_group_list = 2131558672;
public const int mr_control_divider = 2131558672;
// aapt resource value: 0x7f0d011b
public const int mr_control_playback_ctrl = 2131558683;
// aapt resource value: 0x7f0d011e
public const int mr_control_subtitle = 2131558686;
// aapt resource value: 0x7f0d011d
public const int mr_control_title = 2131558685;
// aapt resource value: 0x7f0d011c
public const int mr_control_title_container = 2131558684;
// aapt resource value: 0x7f0d010b
public const int mr_custom_control = 2131558667;
// aapt resource value: 0x7f0d010c
public const int mr_default_control = 2131558668;
// aapt resource value: 0x7f0d0107
public const int mr_dialog_area = 2131558663;
// aapt resource value: 0x7f0d0116
public const int mr_dialog_header_name = 2131558678;
// aapt resource value: 0x7f0d0106
public const int mr_expandable_area = 2131558662;
// aapt resource value: 0x7f0d011f
public const int mr_group_expand_collapse = 2131558687;
// aapt resource value: 0x7f0d00f4
public const int mr_group_volume_route_name = 2131558644;
// aapt resource value: 0x7f0d00f5
public const int mr_group_volume_slider = 2131558645;
// aapt resource value: 0x7f0d010e
public const int mr_media_main_control = 2131558670;
// aapt resource value: 0x7f0d0109
public const int mr_name = 2131558665;
// aapt resource value: 0x7f0d0117
public const int mr_picker_close_button = 2131558679;
// aapt resource value: 0x7f0d0118
public const int mr_picker_list = 2131558680;
// aapt resource value: 0x7f0d0119
public const int mr_picker_route_icon = 2131558681;
// aapt resource value: 0x7f0d011a
public const int mr_picker_route_name = 2131558682;
// aapt resource value: 0x7f0d010f
public const int mr_playback_control = 2131558671;
// aapt resource value: 0x7f0d0108
public const int mr_title_bar = 2131558664;
// aapt resource value: 0x7f0d0111
public const int mr_volume_control = 2131558673;
// aapt resource value: 0x7f0d0112
public const int mr_volume_item_icon = 2131558674;
public const int mr_volume_group_list = 2131558674;
// aapt resource value: 0x7f0d0113
public const int mr_volume_slider = 2131558675;
// aapt resource value: 0x7f0d0114
public const int mr_volume_item_icon = 2131558676;
// aapt resource value: 0x7f0d0115
public const int mr_volume_slider = 2131558677;
// aapt resource value: 0x7f0d0014
public const int mtrl_child_content_container = 2131558420;
@ -9725,8 +9731,8 @@ namespace Bit.Droid
// aapt resource value: 0x7f0d0037
public const int multiply = 2131558455;
// aapt resource value: 0x7f0d00c3
public const int navigation_header_container = 2131558595;
// aapt resource value: 0x7f0d00c5
public const int navigation_header_container = 2131558597;
// aapt resource value: 0x7f0d004a
public const int never = 2131558474;
@ -9737,14 +9743,14 @@ namespace Bit.Droid
// aapt resource value: 0x7f0d002e
public const int normal = 2131558446;
// aapt resource value: 0x7f0d012d
public const int notification_background = 2131558701;
// aapt resource value: 0x7f0d012f
public const int notification_background = 2131558703;
// aapt resource value: 0x7f0d0127
public const int notification_main_column = 2131558695;
// aapt resource value: 0x7f0d0129
public const int notification_main_column = 2131558697;
// aapt resource value: 0x7f0d0126
public const int notification_main_column_container = 2131558694;
// aapt resource value: 0x7f0d0128
public const int notification_main_column_container = 2131558696;
// aapt resource value: 0x7f0d0067
public const int outline = 2131558503;
@ -9773,11 +9779,11 @@ namespace Bit.Droid
// aapt resource value: 0x7f0d005c
public const int right = 2131558492;
// aapt resource value: 0x7f0d012c
public const int right_icon = 2131558700;
// aapt resource value: 0x7f0d012e
public const int right_icon = 2131558702;
// aapt resource value: 0x7f0d0128
public const int right_side = 2131558696;
// aapt resource value: 0x7f0d012a
public const int right_side = 2131558698;
// aapt resource value: 0x7f0d000c
public const int save_image_matrix = 2131558412;
@ -9842,14 +9848,14 @@ namespace Bit.Droid
// aapt resource value: 0x7f0d0056
public const int selected = 2131558486;
// aapt resource value: 0x7f0d0135
public const int shellcontent_appbar = 2131558709;
// aapt resource value: 0x7f0d0137
public const int shellcontent_scrollview = 2131558711;
public const int shellcontent_appbar = 2131558711;
// aapt resource value: 0x7f0d0136
public const int shellcontent_toolbar = 2131558710;
// aapt resource value: 0x7f0d0139
public const int shellcontent_scrollview = 2131558713;
// aapt resource value: 0x7f0d0138
public const int shellcontent_toolbar = 2131558712;
// aapt resource value: 0x7f0d008a
public const int shortcut = 2131558538;
@ -9863,11 +9869,11 @@ namespace Bit.Droid
// aapt resource value: 0x7f0d0034
public const int showTitle = 2131558452;
// aapt resource value: 0x7f0d0138
public const int sliding_tabs = 2131558712;
// aapt resource value: 0x7f0d013a
public const int sliding_tabs = 2131558714;
// aapt resource value: 0x7f0d00bd
public const int smallLabel = 2131558589;
// aapt resource value: 0x7f0d00bf
public const int smallLabel = 2131558591;
// aapt resource value: 0x7f0d0016
public const int snackbar_action = 2131558422;
@ -9902,8 +9908,8 @@ namespace Bit.Droid
// aapt resource value: 0x7f0d005d
public const int start = 2131558493;
// aapt resource value: 0x7f0d0123
public const int status_bar_latest_event_content = 2131558691;
// aapt resource value: 0x7f0d0125
public const int status_bar_latest_event_content = 2131558693;
// aapt resource value: 0x7f0d0062
public const int stretch = 2131558498;
@ -9944,11 +9950,11 @@ namespace Bit.Droid
// aapt resource value: 0x7f0d0061
public const int textStart = 2131558497;
// aapt resource value: 0x7f0d00e3
public const int text_headline = 2131558627;
// aapt resource value: 0x7f0d00e5
public const int text_headline = 2131558629;
// aapt resource value: 0x7f0d00c8
public const int text_input_password_toggle = 2131558600;
// aapt resource value: 0x7f0d00ca
public const int text_input_password_toggle = 2131558602;
// aapt resource value: 0x7f0d0018
public const int textinput_counter = 2131558424;
@ -9959,8 +9965,8 @@ namespace Bit.Droid
// aapt resource value: 0x7f0d001a
public const int textinput_helper_text = 2131558426;
// aapt resource value: 0x7f0d0129
public const int time = 2131558697;
// aapt resource value: 0x7f0d012b
public const int time = 2131558699;
// aapt resource value: 0x7f0d0023
public const int title = 2131558435;
@ -9971,8 +9977,8 @@ namespace Bit.Droid
// aapt resource value: 0x7f0d0085
public const int title_template = 2131558533;
// aapt resource value: 0x7f0d0139
public const int toolbar = 2131558713;
// aapt resource value: 0x7f0d013b
public const int toolbar = 2131558715;
// aapt resource value: 0x7f0d004d
public const int top = 2131558477;
@ -9980,8 +9986,8 @@ namespace Bit.Droid
// aapt resource value: 0x7f0d0084
public const int topPanel = 2131558532;
// aapt resource value: 0x7f0d00c1
public const int touch_outside = 2131558593;
// aapt resource value: 0x7f0d00c3
public const int touch_outside = 2131558595;
// aapt resource value: 0x7f0d000f
public const int transition_current_scene = 2131558415;
@ -10010,20 +10016,20 @@ namespace Bit.Droid
// aapt resource value: 0x7f0d0035
public const int useLogo = 2131558453;
// aapt resource value: 0x7f0d00e6
public const int view_header = 2131558630;
// aapt resource value: 0x7f0d00e8
public const int view_header = 2131558632;
// aapt resource value: 0x7f0d001b
public const int view_offset_helper = 2131558427;
// aapt resource value: 0x7f0d013b
public const int visible = 2131558715;
// aapt resource value: 0x7f0d013d
public const int visible = 2131558717;
// aapt resource value: 0x7f0d0111
public const int volume_item_container = 2131558673;
// aapt resource value: 0x7f0d0113
public const int volume_item_container = 2131558675;
// aapt resource value: 0x7f0d00ea
public const int web_update_details = 2131558634;
// aapt resource value: 0x7f0d00ec
public const int web_update_details = 2131558636;
// aapt resource value: 0x7f0d0029
public const int wide = 2131558441;
@ -10034,20 +10040,20 @@ namespace Bit.Droid
// aapt resource value: 0x7f0d003d
public const int wrap_content = 2131558461;
// aapt resource value: 0x7f0d00da
public const int wrapper_attachments = 2131558618;
// aapt resource value: 0x7f0d00dc
public const int wrapper_attachments = 2131558620;
// aapt resource value: 0x7f0d00d5
public const int wrapper_feedback = 2131558613;
// aapt resource value: 0x7f0d00d7
public const int wrapper_feedback = 2131558615;
// aapt resource value: 0x7f0d00d4
public const int wrapper_feedback_scroll = 2131558612;
// aapt resource value: 0x7f0d00dd
public const int wrapper_messages = 2131558621;
// aapt resource value: 0x7f0d00d6
public const int wrapper_feedback_scroll = 2131558614;
// aapt resource value: 0x7f0d00df
public const int wrapper_messages_buttons = 2131558623;
public const int wrapper_messages = 2131558623;
// aapt resource value: 0x7f0d00e1
public const int wrapper_messages_buttons = 2131558625;
static Id()
{

View file

@ -2,53 +2,69 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_red_dark"
android:minHeight="44dp">
android:minHeight="44dp"
android:gravity="center_vertical">
<LinearLayout
android:id="@+id/CipherCellContent"
android:background="@android:color/holo_purple"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_toLeftOf="@+id/CipherCellButton"
android:gravity="center_vertical">
<LinearLayout
android:id="@+id/CipherCellContentTop"
android:background="@android:color/holo_green_dark"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/CipherCellName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:text="Name" />
<TextView
android:id="@+id/CipherCellSharedIcon"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="&#xf1e0;" />
<TextView
android:id="@+id/CipherCellAttachmentsIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="&#xf0c6;" />
</LinearLayout>
android:layout_height="wrap_content">
<bit.droid.renderers.IconImageView
android:id="@+id/CipherCellIconImage"
android:layout_width="24dp"
android:layout_height="24dp"
android:gravity="center"
android:layout_gravity="center_vertical" />
<TextView
android:id="@+id/CipherCellSubTitle"
android:layout_width="match_parent"
android:id="@+id/CipherCellIcon"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center_vertical"
android:gravity="center"
android:text="[X]" />
<LinearLayout
android:id="@+id/CipherCellContent"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:singleLine="true"
android:ellipsize="end"
android:text="SubTitle" />
android:layout_gravity="center_vertical">
<LinearLayout
android:id="@+id/CipherCellContentTop"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/CipherCellName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:ellipsize="end"
android:text="Name" />
<TextView
android:id="@+id/CipherCellSharedIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:text="&#xf1e0;" />
<TextView
android:id="@+id/CipherCellAttachmentsIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:text="&#xf0c6;" />
</LinearLayout>
<TextView
android:id="@+id/CipherCellSubTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:ellipsize="end"
android:text="SubTitle" />
</LinearLayout>
<Button
android:id="@+id/CipherCellButton"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="&#xe5d4;"
android:gravity="center"/>
</LinearLayout>
<Button
android:id="@+id/CipherCellButton"
android:layout_alignParentRight="true"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:text="&#xe5d4;" />
</RelativeLayout>

View file

@ -4,89 +4,83 @@
x:Class="Bit.App.Controls.CipherViewCell"
xmlns:controls="clr-namespace:Bit.App.Controls"
xmlns:ff="clr-namespace:FFImageLoading.Forms;assembly=FFImageLoading.Forms">
<ViewCell.View>
<OnPlatform x:TypeArguments="View">
<On Platform="iOS">
<Grid x:Name="_grid"
StyleClass="list-row, list-row-platform"
RowSpacing="0"
ColumnSpacing="0"
x:DataType="controls:CipherViewCellViewModel">
<Grid x:Name="_grid"
StyleClass="list-row, list-row-platform"
RowSpacing="0"
ColumnSpacing="0"
x:DataType="controls:CipherViewCellViewModel">
<Grid.BindingContext>
<controls:CipherViewCellViewModel />
</Grid.BindingContext>
<Grid.BindingContext>
<controls:CipherViewCellViewModel />
</Grid.BindingContext>
<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>
<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"
Grid.Column="0"
Grid.Row="0"
Grid.RowSpan="2"
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="22"
HeightRequest="22"
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"
<controls:FaLabel x:Name="_icon"
Grid.Column="0"
Grid.Row="0"
Grid.RowSpan="2"
HorizontalOptions="Center"
VerticalOptions="Center"
StyleClass="list-icon" />
<ff:CachedImage x:Name="_image"
Grid.Column="0"
Grid.Row="0"
HorizontalOptions="Start"
Grid.RowSpan="2"
BitmapOptimizations="True"
ErrorPlaceholder="login.png"
HorizontalOptions="Center"
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}" />
WidthRequest="22"
HeightRequest="22"
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:MiButton
Text="&#xe5d4;"
StyleClass="list-row-button, list-row-button-platform, btn-disabled"
Clicked="ImageButton_Clicked"
Grid.Column="4"
Grid.Row="0"
Grid.RowSpan="2" />
</Grid>
</On>
</OnPlatform>
</ViewCell.View>
<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}" />
<controls:MiButton
Text="&#xe5d4;"
StyleClass="list-row-button, list-row-button-platform, btn-disabled"
Clicked="ImageButton_Clicked"
Grid.Column="4"
Grid.Row="0"
Grid.RowSpan="2" />
</Grid>
</ViewCell>

View file

@ -5,7 +5,6 @@ using Bit.Core.Enums;
using Bit.Core.Models.View;
using Bit.Core.Utilities;
using System;
using System.Threading.Tasks;
using Xamarin.Forms;
namespace Bit.App.Controls
@ -18,20 +17,27 @@ namespace Bit.App.Controls
public static readonly BindableProperty ButtonCommandProperty = BindableProperty.Create(
nameof(ButtonCommand), typeof(Command<CipherView>), typeof(CipherViewCell));
private readonly IStateService _stateService;
private readonly IEnvironmentService _environmentService;
private CipherViewCellViewModel _viewModel;
private bool _usingNativeCell;
public CipherViewCell()
{
InitializeComponent();
_viewModel = _grid.BindingContext as CipherViewCellViewModel;
_stateService = ServiceContainer.Resolve<IStateService>("stateService");
_environmentService = ServiceContainer.Resolve<IEnvironmentService>("environmentService");
if(Device.RuntimePlatform == Device.iOS)
{
InitializeComponent();
_viewModel = _grid.BindingContext as CipherViewCellViewModel;
}
else
{
_usingNativeCell = true;
}
}
public bool WebsiteIconsEnabled { get; set; } = true;
public CipherView Cipher
{
get => GetValue(CipherProperty) as CipherView;
@ -47,18 +53,25 @@ namespace Bit.App.Controls
protected override void OnPropertyChanged(string propertyName = null)
{
base.OnPropertyChanged(propertyName);
if(_usingNativeCell)
{
return;
}
if(propertyName == CipherProperty.PropertyName)
{
_viewModel.Cipher = Cipher;
}
}
protected async override void OnBindingContextChanged()
protected override void OnBindingContextChanged()
{
string icon = null;
string image = null;
_image.Source = null;
base.OnBindingContextChanged();
if(_usingNativeCell)
{
return;
}
_image.Source = null;
CipherView cipher = null;
if(BindingContext is GroupingsPageListItem groupingsPageListItem)
{
@ -70,48 +83,53 @@ namespace Bit.App.Controls
}
if(cipher != null)
{
switch(cipher.Type)
{
case CipherType.Login:
var loginIconImage = await GetLoginIconImage(cipher);
icon = loginIconImage.Item1;
image = loginIconImage.Item2;
break;
case CipherType.SecureNote:
icon = "";
break;
case CipherType.Card:
icon = "";
break;
case CipherType.Identity:
icon = "";
break;
default:
break;
}
if(image != null)
var iconImage = GetIconImage(cipher);
if(iconImage.Item2 != null)
{
_image.IsVisible = true;
_icon.IsVisible = false;
_image.Source = image;
_image.Source = iconImage.Item2;
_image.LoadingPlaceholder = "login.png";
}
else
{
_image.IsVisible = false;
_icon.IsVisible = true;
_icon.Text = icon;
_icon.Text = iconImage.Item1;
}
}
base.OnBindingContextChanged();
}
private async Task<Tuple<string, string>> GetLoginIconImage(CipherView cipher)
public Tuple<string, string> GetIconImage(CipherView cipher)
{
string icon = null;
string image = null;
switch(cipher.Type)
{
case CipherType.Login:
var loginIconImage = GetLoginIconImage(cipher);
icon = loginIconImage.Item1;
image = loginIconImage.Item2;
break;
case CipherType.SecureNote:
icon = "";
break;
case CipherType.Card:
icon = "";
break;
case CipherType.Identity:
icon = "";
break;
default:
break;
}
return new Tuple<string, string>(icon, image);
}
private Tuple<string, string> GetLoginIconImage(CipherView cipher)
{
string icon = "";
string image = null;
var imageEnabled = !(await _stateService.GetAsync<bool?>(Constants.DisableFaviconKey)).GetValueOrDefault();
if(cipher.Login.Uri != null)
{
var hostnameUri = cipher.Login.Uri;
@ -125,17 +143,17 @@ namespace Bit.App.Controls
{
icon = "";
}
else if(imageEnabled && !hostnameUri.Contains("://") && hostnameUri.Contains("."))
else if(WebsiteIconsEnabled && !hostnameUri.Contains("://") && hostnameUri.Contains("."))
{
hostnameUri = string.Concat("http://", hostnameUri);
isWebsite = true;
}
else if(imageEnabled)
else if(WebsiteIconsEnabled)
{
isWebsite = hostnameUri.StartsWith("http") && hostnameUri.Contains(".");
}
if(imageEnabled && isWebsite)
if(WebsiteIconsEnabled && isWebsite)
{
var hostname = CoreHelpers.GetHostname(hostnameUri);
var iconsUrl = _environmentService.IconsUrl;