Fixed extensions in Methods
Added chat ads Optimized users's avatar CardAdverts now appearing every 25 items Added privacy url in CommentAdvert Related Work Items: #162, #252
This commit is contained in:
@@ -3,6 +3,7 @@
|
|||||||
<item time="2019-04-06" version="0.5">
|
<item time="2019-04-06" version="0.5">
|
||||||
<content>
|
<content>
|
||||||
<en-US>### What's new:
|
<en-US>### What's new:
|
||||||
|
- App optimization
|
||||||
- Changelog notification now pops up after update at first launch
|
- Changelog notification now pops up after update at first launch
|
||||||
- Added ability to add videos to playlists on video page
|
- Added ability to add videos to playlists on video page
|
||||||
- Added ability to add videos to playlists through card's context menu
|
- Added ability to add videos to playlists through card's context menu
|
||||||
@@ -14,6 +15,7 @@
|
|||||||
- Some items were moved from menu to header
|
- Some items were moved from menu to header
|
||||||
</en-US>
|
</en-US>
|
||||||
<ru-RU>### Что нового:
|
<ru-RU>### Что нового:
|
||||||
|
- Оптимизация приложения
|
||||||
- Добавлено уведомление со списком изменений при первом запуске после обновления
|
- Добавлено уведомление со списком изменений при первом запуске после обновления
|
||||||
- Добавлена возможность добавлять видео в плейлисты на странице просмотра
|
- Добавлена возможность добавлять видео в плейлисты на странице просмотра
|
||||||
- Добавлена возможность добавлять видео в плейлисты через контекстное меню карточки
|
- Добавлена возможность добавлять видео в плейлисты через контекстное меню карточки
|
||||||
|
|||||||
@@ -42,10 +42,13 @@ namespace FoxTube
|
|||||||
|
|
||||||
public static Uri ToUri(this string url)
|
public static Uri ToUri(this string url)
|
||||||
{
|
{
|
||||||
return new Uri(url);
|
if (string.IsNullOrWhiteSpace(url))
|
||||||
|
return null;
|
||||||
|
else
|
||||||
|
return new Uri(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string GuardFromNull(this string str)
|
public static string GuardFromNull(string str)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(str))
|
if (string.IsNullOrWhiteSpace(str))
|
||||||
return string.Empty;
|
return string.Empty;
|
||||||
@@ -53,11 +56,6 @@ namespace FoxTube
|
|||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool IsNullOrWhiteSpace(this string str)
|
|
||||||
{
|
|
||||||
return string.IsNullOrWhiteSpace(str);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static string GetChars(this string str, int count)
|
public static string GetChars(this string str, int count)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|||||||
@@ -47,19 +47,19 @@ namespace FoxTube.Controls.Adverts
|
|||||||
|
|
||||||
icon.ProfilePicture = advert.AdIcon == null ? null : advert.AdIcon.Source;
|
icon.ProfilePicture = advert.AdIcon == null ? null : advert.AdIcon.Source;
|
||||||
|
|
||||||
sponsor.Text = advert.SponsoredBy.GuardFromNull();
|
sponsor.Text = Methods.GuardFromNull(advert.SponsoredBy);
|
||||||
|
|
||||||
if (advert.CallToActionText.IsNullOrWhiteSpace())
|
if (string.IsNullOrWhiteSpace(advert.CallToActionText))
|
||||||
(info.Parent as FrameworkElement).Visibility = Visibility.Collapsed;
|
(info.Parent as FrameworkElement).Visibility = Visibility.Collapsed;
|
||||||
else
|
else
|
||||||
info.Text = advert.CallToActionText;
|
info.Text = advert.CallToActionText;
|
||||||
|
|
||||||
desc.Text = string.Empty;
|
desc.Text = string.Empty;
|
||||||
|
|
||||||
if (!advert.Price.IsNullOrWhiteSpace())
|
if (!string.IsNullOrWhiteSpace(advert.Price))
|
||||||
desc.Text += advert.Price;
|
desc.Text += advert.Price;
|
||||||
|
|
||||||
if (!advert.Rating.IsNullOrWhiteSpace())
|
if (!string.IsNullOrWhiteSpace(advert.Rating))
|
||||||
desc.Text += " " + advert.Rating;
|
desc.Text += " " + advert.Rating;
|
||||||
|
|
||||||
show.Begin();
|
show.Begin();
|
||||||
|
|||||||
@@ -18,8 +18,9 @@
|
|||||||
<TextBlock Text="Sponsored by" Foreground="White" TextWrapping="WrapWholeWords" FontSize="13" Margin="3,0,3,3"/>
|
<TextBlock Text="Sponsored by" Foreground="White" TextWrapping="WrapWholeWords" FontSize="13" Margin="3,0,3,3"/>
|
||||||
</Border>
|
</Border>
|
||||||
<TextBlock Name="meta" Text="" TextWrapping="WrapWholeWords" Foreground="Gray" FontSize="13"/>
|
<TextBlock Name="meta" Text="" TextWrapping="WrapWholeWords" Foreground="Gray" FontSize="13"/>
|
||||||
<TextBlock Name="title" Text="Title" TextWrapping="WrapWholeWords" Style="{StaticResource SubtitleTextBlockStyle}"/>
|
<TextBlock Name="title" Text="Title" TextWrapping="WrapWholeWords" FontWeight="Bold"/>
|
||||||
<TextBlock Name="description" Text="Description" TextWrapping="WrapWholeWords"/>
|
<TextBlock Name="description" Text="Description" TextWrapping="WrapWholeWords"/>
|
||||||
|
<HyperlinkButton Name="privacy"/>
|
||||||
|
|
||||||
<Button Name="cta" Content="CALL TO ACTION TEXT" Margin="0,5"/>
|
<Button Name="cta" Content="CALL TO ACTION TEXT" Margin="0,5"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|||||||
@@ -39,15 +39,19 @@ namespace FoxTube.Controls.Adverts
|
|||||||
private void Initialize()
|
private void Initialize()
|
||||||
{
|
{
|
||||||
title.Text = advert.Title;
|
title.Text = advert.Title;
|
||||||
description.Text = advert.Description.GuardFromNull();
|
description.Text = Methods.GuardFromNull(advert.Description);
|
||||||
icon.ProfilePicture = advert.AdIcon == null ? null : advert.AdIcon.Source;
|
icon.ProfilePicture = advert.AdIcon == null ? null : advert.AdIcon.Source;
|
||||||
|
|
||||||
cta.Content = advert.CallToActionText.GuardFromNull();
|
privacy.NavigateUri = advert.PrivacyUrl.ToUri();
|
||||||
cta.Visibility = advert.CallToActionText.IsNullOrWhiteSpace() ? Visibility.Collapsed : Visibility.Visible;
|
privacy.Content = advert.PrivacyUrl;
|
||||||
|
privacy.Visibility = string.IsNullOrWhiteSpace(advert.PrivacyUrl) ? Visibility.Collapsed : Visibility.Visible;
|
||||||
|
|
||||||
|
cta.Content = Methods.GuardFromNull(advert.CallToActionText);
|
||||||
|
cta.Visibility = string.IsNullOrWhiteSpace(advert.CallToActionText) ? Visibility.Collapsed : Visibility.Visible;
|
||||||
|
|
||||||
meta.Text += advert.Price;
|
meta.Text += advert.Price;
|
||||||
meta.Text += " " + advert.Rating;
|
meta.Text += " " + advert.Rating;
|
||||||
meta.Visibility = meta.Text.IsNullOrWhiteSpace() ? Visibility.Collapsed : Visibility.Visible;
|
meta.Visibility = string.IsNullOrWhiteSpace(meta.Text) ? Visibility.Collapsed : Visibility.Visible;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:controls="using:FoxTube.Controls"
|
||||||
mc:Ignorable="d"
|
mc:Ignorable="d"
|
||||||
d:DesignHeight="600"
|
d:DesignHeight="600"
|
||||||
d:DesignWidth="400">
|
d:DesignWidth="400">
|
||||||
@@ -26,7 +27,7 @@
|
|||||||
|
|
||||||
<ListView Name="list" Grid.Row="1" SelectionMode="None">
|
<ListView Name="list" Grid.Row="1" SelectionMode="None">
|
||||||
<ListView.ItemTemplate>
|
<ListView.ItemTemplate>
|
||||||
<DataTemplate>
|
<DataTemplate x:DataType="controls:ChatMessage">
|
||||||
<Border BorderBrush="Red" BorderThickness="{Binding Path=BorderThickness}" CornerRadius="5" HorizontalAlignment="Stretch" Background="{Binding Path=Background}" Margin="0,2">
|
<Border BorderBrush="Red" BorderThickness="{Binding Path=BorderThickness}" CornerRadius="5" HorizontalAlignment="Stretch" Background="{Binding Path=Background}" Margin="0,2">
|
||||||
<Grid Margin="0,5,5,0">
|
<Grid Margin="0,5,5,0">
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
@@ -62,7 +63,12 @@
|
|||||||
</FontIcon>
|
</FontIcon>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<StackPanel Orientation="Horizontal" Grid.Column="1" VerticalAlignment="Top" Margin="0,0,5,0">
|
<StackPanel Orientation="Horizontal" Grid.Column="1" VerticalAlignment="Top" Margin="0,0,5,0">
|
||||||
<HyperlinkButton Content="{Binding Path=Author}" Tag="{Binding Path=ChannelId}" Grid.Column="1" Margin="0,-6,0,0" FontWeight="Bold" Click="HyperlinkButton_Click"/>
|
<HyperlinkButton Tag="{Binding Path=ChannelId}" Margin="0,-6,0,0" FontWeight="Bold" Click="HyperlinkButton_Click">
|
||||||
|
<ToolTipService.ToolTip>
|
||||||
|
<TextBlock Text="{Binding Path=Author}" Style="{StaticResource CaptionTextBlockStyle}"/>
|
||||||
|
</ToolTipService.ToolTip>
|
||||||
|
<TextBlock TextTrimming="CharacterEllipsis" MaxWidth="150" Text="{Binding Path=Author}"/>
|
||||||
|
</HyperlinkButton>
|
||||||
<TextBlock Text=":"/>
|
<TextBlock Text=":"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<GroupItem Content="{Binding Path=Message}" Grid.Column="2"/>
|
<GroupItem Content="{Binding Path=Message}" Grid.Column="2"/>
|
||||||
|
|||||||
@@ -9,6 +9,9 @@ using Microsoft.AppCenter.Analytics;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Windows.UI.Popups;
|
using Windows.UI.Popups;
|
||||||
using Windows.ApplicationModel.Resources;
|
using Windows.ApplicationModel.Resources;
|
||||||
|
using Microsoft.Advertising.WinRT.UI;
|
||||||
|
using Windows.UI.Xaml.Media.Imaging;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
namespace FoxTube.Controls
|
namespace FoxTube.Controls
|
||||||
{
|
{
|
||||||
@@ -68,17 +71,24 @@ namespace FoxTube.Controls
|
|||||||
|
|
||||||
public sealed partial class Chat : UserControl
|
public sealed partial class Chat : UserControl
|
||||||
{
|
{
|
||||||
|
NativeAdsManagerV2 manager = new NativeAdsManagerV2(SecretsVault.AppId, SecretsVault.AdUnitId);
|
||||||
|
public NativeAdV2 advert;
|
||||||
string chatId;
|
string chatId;
|
||||||
DateTime lastInsert;
|
DateTime lastInsert;
|
||||||
|
|
||||||
LiveChatMessagesResource.ListRequest request;
|
LiveChatMessagesResource.ListRequest request;
|
||||||
LiveChatMessageListResponse response;
|
LiveChatMessageListResponse response;
|
||||||
|
|
||||||
DispatcherTimer timer = new DispatcherTimer()
|
DispatcherTimer timer = new DispatcherTimer
|
||||||
{
|
{
|
||||||
Interval = TimeSpan.FromSeconds(1)
|
Interval = TimeSpan.FromSeconds(1)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
DispatcherTimer adTimer = new DispatcherTimer
|
||||||
|
{
|
||||||
|
Interval = TimeSpan.FromMinutes(5)
|
||||||
|
};
|
||||||
|
|
||||||
public Chat(string id)
|
public Chat(string id)
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
@@ -90,6 +100,132 @@ namespace FoxTube.Controls
|
|||||||
|
|
||||||
timer.Tick += Update;
|
timer.Tick += Update;
|
||||||
timer.Start();
|
timer.Start();
|
||||||
|
|
||||||
|
if (SecretsVault.AdsDisabled)
|
||||||
|
return;
|
||||||
|
|
||||||
|
adTimer.Tick += (s, e) => manager.RequestAd();
|
||||||
|
adTimer.Start();
|
||||||
|
|
||||||
|
manager.AdReady += AdReady;
|
||||||
|
manager.ErrorOccurred += ErrorOccurred;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ErrorOccurred(object sender, NativeAdErrorEventArgs e)
|
||||||
|
{
|
||||||
|
System.Diagnostics.Debug.WriteLine("Error has occured while loading ad");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AdReady(object sender, NativeAdReadyEventArgs e)
|
||||||
|
{
|
||||||
|
advert = e.NativeAd;
|
||||||
|
|
||||||
|
Grid grid = new Grid
|
||||||
|
{
|
||||||
|
Margin = new Thickness(0, 5, 5, 5),
|
||||||
|
};
|
||||||
|
|
||||||
|
grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Auto) });
|
||||||
|
grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Auto) });
|
||||||
|
grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
|
||||||
|
|
||||||
|
StackPanel iconStack = new StackPanel
|
||||||
|
{
|
||||||
|
Orientation = Orientation.Horizontal,
|
||||||
|
VerticalAlignment = VerticalAlignment.Top,
|
||||||
|
Margin = new Thickness(5, 0, 5, 0)
|
||||||
|
};
|
||||||
|
|
||||||
|
iconStack.Children.Add(new PersonPicture
|
||||||
|
{
|
||||||
|
Height = 20,
|
||||||
|
ProfilePicture = advert.AdIcon == null ? null : advert.AdIcon.Source
|
||||||
|
});
|
||||||
|
FontIcon sponsor = new FontIcon
|
||||||
|
{
|
||||||
|
Glyph = "\xE735",
|
||||||
|
Margin = new Thickness(2, 0, 2, 0)
|
||||||
|
};
|
||||||
|
ToolTipService.SetToolTip(sponsor, ResourceLoader.GetForCurrentView("Chat").GetString("/Chat/sponsor/Text"));
|
||||||
|
iconStack.Children.Add(sponsor);
|
||||||
|
|
||||||
|
StackPanel nameStack = new StackPanel
|
||||||
|
{
|
||||||
|
Orientation = Orientation.Horizontal,
|
||||||
|
VerticalAlignment = VerticalAlignment.Top,
|
||||||
|
Margin = new Thickness(0, 0, 2, 0)
|
||||||
|
};
|
||||||
|
Grid.SetColumn(nameStack, 1);
|
||||||
|
HyperlinkButton sponsorName = new HyperlinkButton
|
||||||
|
{
|
||||||
|
Margin = new Thickness(0, -6, 0, 0),
|
||||||
|
FontWeight = Windows.UI.Text.FontWeights.Bold,
|
||||||
|
Content = new TextBlock
|
||||||
|
{
|
||||||
|
TextTrimming = TextTrimming.CharacterEllipsis,
|
||||||
|
MaxWidth = 150,
|
||||||
|
Text = Methods.GuardFromNull(advert.SponsoredBy)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
ToolTipService.SetToolTip(sponsorName, Methods.GuardFromNull(advert.SponsoredBy));
|
||||||
|
nameStack.Children.Add(sponsorName);
|
||||||
|
nameStack.Children.Add(new TextBlock { Text = ":" });
|
||||||
|
|
||||||
|
StackPanel contentStack = new StackPanel
|
||||||
|
{
|
||||||
|
Padding = new Thickness(2, 0, 0, 0)
|
||||||
|
};
|
||||||
|
Grid.SetColumn(contentStack, 2);
|
||||||
|
contentStack.Children.Add(new TextBlock
|
||||||
|
{
|
||||||
|
VerticalAlignment = VerticalAlignment.Top,
|
||||||
|
TextWrapping = TextWrapping.WrapWholeWords,
|
||||||
|
FontWeight = Windows.UI.Text.FontWeights.Bold,
|
||||||
|
Text = advert.Title
|
||||||
|
});
|
||||||
|
if(!string.IsNullOrWhiteSpace(advert.Description))
|
||||||
|
contentStack.Children.Add(new TextBlock
|
||||||
|
{
|
||||||
|
VerticalAlignment = VerticalAlignment.Top,
|
||||||
|
TextWrapping = TextWrapping.WrapWholeWords,
|
||||||
|
Text = advert.Description
|
||||||
|
});
|
||||||
|
if (!string.IsNullOrWhiteSpace(advert.CallToActionText))
|
||||||
|
contentStack.Children.Add(new HyperlinkButton
|
||||||
|
{
|
||||||
|
VerticalAlignment = VerticalAlignment.Top,
|
||||||
|
Content = new TextBlock
|
||||||
|
{
|
||||||
|
TextWrapping = TextWrapping.WrapWholeWords,
|
||||||
|
Text = advert.CallToActionText
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
grid.Children.Add(iconStack);
|
||||||
|
grid.Children.Add(nameStack);
|
||||||
|
grid.Children.Add(contentStack);
|
||||||
|
|
||||||
|
ListViewItem item = new ListViewItem
|
||||||
|
{
|
||||||
|
Content = new Border
|
||||||
|
{
|
||||||
|
BorderBrush = new SolidColorBrush(Colors.Red),
|
||||||
|
BorderThickness = new Thickness(2),
|
||||||
|
CornerRadius = new CornerRadius(5),
|
||||||
|
HorizontalAlignment = HorizontalAlignment.Stretch,
|
||||||
|
Margin = new Thickness(0, 2, 0, 2),
|
||||||
|
Background = new SolidColorBrush(Colors.Red) { Opacity = .2 },
|
||||||
|
Child = grid
|
||||||
|
},
|
||||||
|
Padding = new Thickness(0,25,0,0)
|
||||||
|
};
|
||||||
|
|
||||||
|
list.Items.Insert(0, item);
|
||||||
|
|
||||||
|
if (contentStack.Children.Last() is HyperlinkButton)
|
||||||
|
advert.RegisterAdContainer(item, new List<FrameworkElement> { contentStack.Children.Last() as HyperlinkButton });
|
||||||
|
else
|
||||||
|
advert.RegisterAdContainer(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async void Update(object sender, object e)
|
public async void Update(object sender, object e)
|
||||||
|
|||||||
@@ -179,8 +179,8 @@ namespace FoxTube
|
|||||||
ToolTipService.SetToolTip(avatar, $"{SecretsVault.UserInfo.Name} ({SecretsVault.UserInfo.Email})");
|
ToolTipService.SetToolTip(avatar, $"{SecretsVault.UserInfo.Name} ({SecretsVault.UserInfo.Email})");
|
||||||
myNameFlyout.Text = SecretsVault.UserInfo.Name;
|
myNameFlyout.Text = SecretsVault.UserInfo.Name;
|
||||||
myEmail.Text = SecretsVault.UserInfo.Email;
|
myEmail.Text = SecretsVault.UserInfo.Email;
|
||||||
avatarFlyout.ProfilePicture = new BitmapImage(SecretsVault.UserInfo.Picture.ToUri());
|
avatarFlyout.ProfilePicture = new BitmapImage(SecretsVault.UserInfo.Picture.ToUri()) { DecodePixelHeight = 65, DecodePixelWidth = 65 };
|
||||||
(avatar.Content as PersonPicture).ProfilePicture = avatarFlyout.ProfilePicture;
|
(avatar.Content as PersonPicture).ProfilePicture = new BitmapImage(SecretsVault.UserInfo.Picture.ToUri()) { DecodePixelHeight = 25, DecodePixelWidth = 25 };
|
||||||
|
|
||||||
avatar.Visibility = Visibility.Visible;
|
avatar.Visibility = Visibility.Visible;
|
||||||
|
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ namespace FoxTube.Pages
|
|||||||
(grid.Children[Count % cols + 1] as StackPanel).Children.Add(card);
|
(grid.Children[Count % cols + 1] as StackPanel).Children.Add(card);
|
||||||
Children.Add(card);
|
Children.Add(card);
|
||||||
|
|
||||||
if ((Children.Count - 5) % 20 == 0 && !SecretsVault.AdsDisabled)
|
if ((Children.Count - 5) % 25 == 0 && !SecretsVault.AdsDisabled)
|
||||||
{
|
{
|
||||||
CardAdvert advert = new CardAdvert(IsRelatedVideos);
|
CardAdvert advert = new CardAdvert(IsRelatedVideos);
|
||||||
(grid.Children[Count % cols + 1] as StackPanel).Children.Add(advert);
|
(grid.Children[Count % cols + 1] as StackPanel).Children.Add(advert);
|
||||||
|
|||||||
Reference in New Issue
Block a user