diff --git a/FoxTube/App.xaml b/FoxTube/App.xaml
index 41a4760..573cf86 100644
--- a/FoxTube/App.xaml
+++ b/FoxTube/App.xaml
@@ -5,5 +5,7 @@
xmlns:local="using:FoxTube">
Red
+
+
diff --git a/FoxTube/App.xaml.cs b/FoxTube/App.xaml.cs
index 5198496..f71b751 100644
--- a/FoxTube/App.xaml.cs
+++ b/FoxTube/App.xaml.cs
@@ -4,7 +4,9 @@ using Microsoft.AppCenter.Analytics;
using System;
using System.Collections.Generic;
using System.Diagnostics;
+using System.IO;
using System.Linq;
+using System.Xml;
using Windows.ApplicationModel;
using Windows.ApplicationModel.Activation;
using Windows.ApplicationModel.Background;
@@ -19,19 +21,12 @@ using Windows.UI.Xaml.Navigation;
namespace FoxTube
{
- ///
- /// Provides application-specific behavior to supplement the default Application class.
- ///
sealed partial class App : Application
{
- ///
- /// Initializes the singleton application object. This is the first line of authored code
- /// executed, and as such is the logical equivalent of main() or WinMain().
- ///
public App()
{
SettingsStorage.LoadData();
-
+
switch (SettingsStorage.Theme)
{
case 0:
@@ -41,20 +36,44 @@ namespace FoxTube
RequestedTheme = ApplicationTheme.Dark;
break;
}
-
ApplicationLanguages.PrimaryLanguageOverride = SettingsStorage.Language;
+
+ CheckVersion();
+
InitializeComponent();
Suspending += OnSuspending;
UnhandledException += UnhandledError;
+
AppCenter.Start("45774462-9ea7-438a-96fc-03982666f39e", typeof(Analytics));
AppCenter.SetCountryCode(SettingsStorage.Region);
}
///
- /// Invoked when the application is launched normally by the end user. Other entry points
- /// will be used such as when the application is launched to open a specific file.
+ /// Comparing current version with last recorded version. If doesn't match, poping up changelog notification
///
- /// Details about the launch request and process.
+ public async void CheckVersion()
+ {
+ PackageVersion ver = Package.Current.Id.Version;
+ if (SettingsStorage.Version != $"{ver.Major}.{ver.Minor}")
+ {
+ try
+ {
+ XmlDocument changelog = new XmlDocument();
+ StorageFile file = await (await Package.Current.InstalledLocation.GetFolderAsync(@"Assets\Data")).GetFileAsync("Patchnotes.xml");
+ changelog.Load(await file.OpenStreamForReadAsync());
+ XmlElement e = changelog["items"].ChildNodes[0] as XmlElement;
+
+ ToastNotificationManager.CreateToastNotifier().Show(FoxTube.Background.Notification.GetChangelogToast(e.GetAttribute("version")));
+
+ SettingsStorage.Version = $"{ver.Major}.{ver.Minor}";
+ }
+ catch
+ {
+ Debug.WriteLine("Unable to retrieve changelog");
+ }
+ }
+ }
+
protected override void OnLaunched(LaunchActivatedEventArgs e)
{
// Do not repeat app initialization when the Window already has content,
@@ -97,7 +116,6 @@ namespace FoxTube
return;
var backgroundRequest = await BackgroundExecutionManager.RequestAccessAsync();
- var saverRequest = PowerManager.EnergySaverStatus;
if (backgroundRequest == BackgroundAccessStatus.DeniedBySystemPolicy || backgroundRequest == BackgroundAccessStatus.DeniedByUser)
return;
@@ -225,31 +243,20 @@ namespace FoxTube
}
}
}
-
- ///
- /// Invoked when Navigation to a certain page fails
- ///
- /// The Frame which failed navigation
- /// Details about the navigation failure
+
void OnNavigationFailed(object sender, NavigationFailedEventArgs e)
{
throw new Exception("Failed to load Page " + e.SourcePageType.FullName);
}
-
- ///
- /// Invoked when application execution is being suspended. Application state is saved
- /// without knowing whether the application will be terminated or resumed with the contents
- /// of memory still intact.
- ///
- /// The source of the suspend request.
- /// Details about the suspend request.
+
private void OnSuspending(object sender, SuspendingEventArgs e)
{
var deferral = e.SuspendingOperation.GetDeferral();
- SettingsStorage.ExportSettings();
+ SettingsStorage.SaveData();
DownloadAgent.QuitPrompt();
deferral.Complete();
}
+
private void UnhandledError(object sender, Windows.UI.Xaml.UnhandledExceptionEventArgs e)
{
Analytics.TrackEvent("The app crashed", new Dictionary()
diff --git a/FoxTube/Classes/DownloadAgent.cs b/FoxTube/Classes/DownloadAgent.cs
index 5b21ec6..f83d9ef 100644
--- a/FoxTube/Classes/DownloadAgent.cs
+++ b/FoxTube/Classes/DownloadAgent.cs
@@ -9,6 +9,7 @@ using FoxTube.Controls;
namespace FoxTube
{
+ // TODO: Refactor DownloadAgent
public static class DownloadAgent
{
public static List items = new List();
diff --git a/FoxTube/Classes/Methods.cs b/FoxTube/Classes/Methods.cs
index a107347..81ad788 100644
--- a/FoxTube/Classes/Methods.cs
+++ b/FoxTube/Classes/Methods.cs
@@ -6,7 +6,6 @@ using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
-using System.Net.Http;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Web;
@@ -30,8 +29,7 @@ namespace FoxTube
{
private static ResourceLoader resources = ResourceLoader.GetForCurrentView("Methods");
public static CommentsPage CommentsPage { get; set; }
-
- public static bool NeedToResponse { get; set; } = false;
+
public static MainPage MainPage
{
get { return (Window.Current.Content as Frame).Content as MainPage; }
@@ -47,6 +45,15 @@ namespace FoxTube
return new Uri(url);
}
+ public static void Try(Action action)
+ {
+ try
+ {
+ action();
+ }
+ catch { }
+ }
+
public static string GetChars(this string str, int count)
{
try
@@ -315,10 +322,8 @@ namespace FoxTube
public static async Task> GetHistory()
{
List list = new List();
-
- HttpClient client = new HttpClient();
- client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", SecretsVault.Credential.Token.AccessToken);
- string output = await client.GetStringAsync($"https://www.youtube.com/list_ajax?style=json&action_get_list=1&list=HL&hl={SettingsStorage.RelevanceLanguage}");
+
+ string output = await SecretsVault.HttpClient.GetStringAsync($"https://www.youtube.com/list_ajax?style=json&action_get_list=1&list=HL&hl={SettingsStorage.RelevanceLanguage}");
dynamic raw = JsonConvert.DeserializeObject(output);
foreach (dynamic i in raw.video)
@@ -330,10 +335,8 @@ namespace FoxTube
public static async Task> GetLater()
{
List list = new List();
-
- HttpClient client = new HttpClient();
- client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", SecretsVault.Credential.Token.AccessToken);
- string output = await client.GetStringAsync($"https://www.youtube.com/list_ajax?style=json&action_get_list=1&list=WL&hl={SettingsStorage.RelevanceLanguage}");
+
+ string output = await SecretsVault.HttpClient.GetStringAsync($"https://www.youtube.com/list_ajax?style=json&action_get_list=1&list=WL&hl={SettingsStorage.RelevanceLanguage}");
dynamic raw = JsonConvert.DeserializeObject(output);
foreach (dynamic i in raw.video)
diff --git a/FoxTube/Classes/SecretsVault.cs b/FoxTube/Classes/SecretsVault.cs
index 3bcd4b2..a35c667 100644
--- a/FoxTube/Classes/SecretsVault.cs
+++ b/FoxTube/Classes/SecretsVault.cs
@@ -9,6 +9,7 @@ using Google.Apis.YouTube.v3.Data;
using Newtonsoft.Json;
using Windows.Storage;
using Windows.Services.Store;
+using System.Net.Http;
namespace FoxTube
{
@@ -37,18 +38,21 @@ namespace FoxTube
ApplicationName = "FoxTube"
};
public static YouTubeService Service => IsAuthorized ? new YouTubeService(Initializer) : NoAuthService;
+ public static HttpClient HttpClient { get; } = new HttpClient();
public static string AppId => true ? "d25517cb-12d4-4699-8bdc-52040c712cab" : "9ncqqxjtdlfh";
public static string AdUnitId => true ? "test" : "1100037769";
public static bool AdsDisabled { get; private set; } = true;
//User info
public static bool IsAuthorized => Credential != null;
- public static UserCredential Credential { get; set; }
+ private static UserCredential Credential { get; set; }
public static string AccountId => UserChannel?.Id;
public static Channel UserChannel { get; private set; }
public static List Subscriptions { get; } = new List();
+ public static List History { get; set; } = new List();
+ public static List WatchLater { get; set; } = new List();
#endregion
#region Methods
@@ -69,7 +73,7 @@ namespace FoxTube
try { await Service.Subscriptions.Delete(s.Id).ExecuteAsync(); }
catch { return true; }
- SubscriptionsChanged?.Invoke(null, "remove", Subscriptions.IndexOf(s));
+ SubscriptionsChanged?.Invoke(null, "remove", s);
Subscriptions.Remove(s);
return false;
}
@@ -96,6 +100,16 @@ namespace FoxTube
}
}
+ ///
+ /// Sets up **SecretsVault**
+ ///
+ public static void Initialize()
+ {
+ CheckAuthorization();
+ // TODO: Reactivate addons initialization
+ //CheckAddons();
+ }
+
///
/// Prompts to add an Youtube account and retrieves its info when successful
///
@@ -123,9 +137,13 @@ namespace FoxTube
goto InvokeEvent;
SettingsStorage.HasAccount = true;
+ HttpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", Credential.Token.AccessToken);
#endregion
#region Retrieving user's data
+ WatchLater = await Methods.GetLater();
+ History = await Methods.GetHistory();
+
var request = Service.Channels.List("snippet,contentDetails");
request.Mine = true;
UserChannel = (await request.ExecuteAsync()).Items[0];
@@ -183,6 +201,11 @@ namespace FoxTube
Credential = null;
AuthorizationStateChanged?.Invoke(args: false);
SettingsStorage.HasAccount = false;
+
+ await FileIO.WriteTextAsync(
+ await ApplicationData.Current.RoamingFolder.CreateFileAsync(
+ "background.json", CreationCollisionOption.ReplaceExisting)
+ , "");
}
}
@@ -190,11 +213,18 @@ namespace FoxTube
/// Checks if any user has already been logged in. If has, calls *Authorize()* to retrieve his info
///
/// Loads user's subscriptions if true
- public static void CheckAuthorization(bool retrieveSubs = true)
+ public static async void CheckAuthorization(bool retrieveSubs = true)
{
if (SettingsStorage.HasAccount)
Authorize(retrieveSubs);
- else AuthorizationStateChanged.Invoke(args: false);
+ else
+ {
+ AuthorizationStateChanged.Invoke(args: false);
+ await FileIO.WriteTextAsync(
+ await ApplicationData.Current.RoamingFolder.CreateFileAsync(
+ "background.json", CreationCollisionOption.ReplaceExisting),
+ "");
+ }
}
///
@@ -205,9 +235,11 @@ namespace FoxTube
try
{
StoreContext store = StoreContext.GetDefault();
- StoreProductQueryResult requset = await store.GetAssociatedStoreProductsAsync(new[] { "Consumable", "Durable", "UnmanagedConsumable" });
+ StoreProductQueryResult requset = await store.GetAssociatedStoreProductsAsync(new[] { "Durable" });
+ Dictionary l = new Dictionary();
+ requset.Products.ForEach(i => l.Add(i.Key, i.Value));
- if (!requset.Products["foxtube-adsremove"].IsInUserCollection)
+ if (!requset.Products["9NP1QK556625"].IsInUserCollection)
{
AdsDisabled = false;
Purchased?.Invoke(args:false);
@@ -219,7 +251,7 @@ namespace FoxTube
public static async void GetAdblock()
{
StoreContext store = StoreContext.GetDefault();
- StorePurchaseResult request = await store.RequestPurchaseAsync("foxtube-adsremove");
+ StorePurchaseResult request = await store.RequestPurchaseAsync("9NP1QK556625");
switch (request.Status)
{
diff --git a/FoxTube/Classes/SettingsStorage.cs b/FoxTube/Classes/SettingsStorage.cs
index 9a58a04..917d46d 100644
--- a/FoxTube/Classes/SettingsStorage.cs
+++ b/FoxTube/Classes/SettingsStorage.cs
@@ -9,126 +9,146 @@ namespace FoxTube
{
public enum MatureState { Blocked, Allowed, AllowedOnce }
+ public class SettingsContainer
+ {
+ public string videoQuality = "remember";
+ public string rememberedQuality = "1080p";
+
+ public bool videoNotifications = true;
+ public bool devNotifications = true;
+
+ public bool checkConnection = true;
+ public bool autoplay = true;
+ public int volume = 100;
+
+ public string language = (new[] { "ua", "ru", "by", "kz", "kg", "md", "lv", "ee" }).Contains(CultureInfo.InstalledUICulture.TwoLetterISOLanguageName) ? "ru-RU" : "en-US";
+ public string relevanceLanguage = (new[] { "ua", "ru", "by", "kz", "kg", "md", "lv", "ee" }).Contains(CultureInfo.InstalledUICulture.TwoLetterISOLanguageName) ? "ru" : "en";
+ public string region = (new[] { "ua", "ru", "by", "kz", "kg", "md", "lv", "ee" }).Contains(CultureInfo.InstalledUICulture.TwoLetterISOLanguageName) ? "ru" : "us";
+ public int safeSearch = 0;
+
+ public bool hasAccount = false;
+ public int theme = 2;
+ }
+
public static class SettingsStorage
{
public static string VideoQuality
{
- get { return (string)settings[0]; }
+ get { return Container.videoQuality; }
set
{
- settings[0] = value;
+ Container.videoQuality = value;
SaveData();
}
}
public static string RememberedQuality
{
- get { return (string)settings[1]; }
+ get { return Container.rememberedQuality; }
set
{
- settings[1] = value;
+ Container.rememberedQuality = value;
SaveData();
}
}
public static bool VideoNotifications
{
- get { return (bool)settings[2]; }
+ get { return Container.videoNotifications; }
set
{
- settings[2] = value;
+ Container.videoNotifications = value;
SaveData();
}
}
public static bool DevNotifications
{
- get { return (bool)settings[3]; }
+ get { return Container.devNotifications; }
set
{
- settings[3] = value;
+ Container.devNotifications = value;
SaveData();
}
}
public static bool CheckConnection
{
- get { return (bool)settings[4]; }
+ get { return Container.checkConnection; }
set
{
- settings[4] = value;
+ Container.checkConnection = value;
SaveData();
}
}
public static bool Autoplay
{
- get { return (bool)settings[5]; }
+ get { return Container.autoplay; }
set
{
- settings[5] = value;
+ Container.autoplay = value;
SaveData();
}
}
public static int Volume
{
- get { return Convert.ToInt32(settings[6]); }
+ get { return Container.volume; }
set
{
- settings[6] = value;
+ Container.volume = value;
SaveData();
}
}
public static string Language
{
- get { return (string)settings[7]; }
+ get { return Container.language; }
set
{
- settings[7] = value;
+ Container.language = value;
SaveData();
}
}
public static string RelevanceLanguage
{
- get { return (string)settings[8]; }
+ get { return Container.relevanceLanguage; }
set
{
- settings[8] = value;
+ Container.relevanceLanguage = value;
SaveData();
}
}
public static string Region
{
- get { return (string)settings[9]; }
+ get { return Container.region; }
set
{
- settings[9] = value;
+ Container.region = value;
SaveData();
}
}
public static int SafeSearch
{
- get { return Convert.ToInt32(settings[10]); }
+ get { return Container.safeSearch; }
set
{
- settings[10] = value;
- SaveData();
- }
- }
-
- public static int Theme
- {
- get { return Convert.ToInt32(settings[11]); }
- set
- {
- settings[11] = value;
+ Container.safeSearch = value;
SaveData();
}
}
public static bool HasAccount
{
- get { return (bool)settings[12]; }
+ get { return Container.hasAccount; }
set
{
- settings[12] = value;
+ Container.hasAccount = value;
+ SaveData();
+ }
+ }
+ public static int Theme
+ {
+ get { return Container.theme; }
+ set
+ {
+ Container.theme = value;
SaveData();
}
}
@@ -169,80 +189,24 @@ namespace FoxTube
//Settings storage
private static readonly ApplicationDataContainer storage = ApplicationData.Current.RoamingSettings;
-
- //Predefined preferences
- private static object[] settings = new object[]
- {
- "remember",
- "1080p",
-
- true,
- true,
-
- true,
- true,
- 100,
-
- (new[] { "ua", "ru", "by", "kz", "kg", "md", "lv", "ee" }).Contains(CultureInfo.InstalledUICulture.TwoLetterISOLanguageName) ? "ru-RU" : "en-US",
- (new[] { "ua", "ru", "by", "kz", "kg", "md", "lv", "ee" }).Contains(CultureInfo.InstalledUICulture.TwoLetterISOLanguageName) ? "ru" : "en",
- (new[] { "ua", "ru", "by", "kz", "kg", "md", "lv", "ee" }).Contains(CultureInfo.InstalledUICulture.TwoLetterISOLanguageName) ? "ru" : "US",
- 0,
-
- 2,
- false
- };
+ private static SettingsContainer Container;
public static void LoadData()
{
- /*if(true && (storage.Values["forceUpdate"] == null || storage.Values["forceUpdate"].ToString() != Version))
- {
- SaveData();
- storage.Values["forceUpdate"] = Version;
- return;
- }*/
-
try
{
- object[] saved = JsonConvert.DeserializeObject
public sealed partial class About : Page
{
- PackageVersion ver = Package.Current.Id.Version;
public About()
{
- this.InitializeComponent();
- version.Text = string.Format("{0}.{1}.{2}", ver.Major, ver.Minor, ver.Build);
+ InitializeComponent();
+ PackageVersion ver = Package.Current.Id.Version;
+ version.Text = $"{ver.Major}.{ver.Minor}.{ver.Build}";
}
private async void Button_Click(object sender, RoutedEventArgs e)
diff --git a/FoxTube/Pages/SettingsPages/General.xaml.cs b/FoxTube/Pages/SettingsPages/General.xaml.cs
index 1f6b0d4..57174fd 100644
--- a/FoxTube/Pages/SettingsPages/General.xaml.cs
+++ b/FoxTube/Pages/SettingsPages/General.xaml.cs
@@ -7,6 +7,7 @@ using Google.Apis.YouTube.v3;
using Google.Apis.YouTube.v3.Data;
using YoutubeExplode.Models.MediaStreams;
using System;
+using Windows.Globalization;
namespace FoxTube.Pages.SettingsPages
{
@@ -80,7 +81,7 @@ namespace FoxTube.Pages.SettingsPages
{
if (SettingsStorage.Language == (language.SelectedItem as ComboBoxItem).Tag.ToString())
return;
-
+ ApplicationLanguages.PrimaryLanguageOverride = (language.SelectedItem as ComboBoxItem).Tag.ToString();
SettingsStorage.Language = (language.SelectedItem as ComboBoxItem).Tag.ToString();
restartNote.Visibility = Visibility.Visible;
}
@@ -125,21 +126,20 @@ namespace FoxTube.Pages.SettingsPages
if (sender == light && SettingsStorage.Theme != 0)
{
SettingsStorage.Theme = 0;
- Methods.MainPage.RequestedTheme = ElementTheme.Light;
+ Application.Current.RequestedTheme = ApplicationTheme.Light;
}
else if (sender == dark && SettingsStorage.Theme != 1)
{
SettingsStorage.Theme = 1;
- Methods.MainPage.RequestedTheme = ElementTheme.Dark;
+ Application.Current.RequestedTheme = ApplicationTheme.Dark;
}
else if (sender == system && SettingsStorage.Theme != 2)
{
SettingsStorage.Theme = 2;
- Color uiTheme = new Windows.UI.ViewManagement.UISettings().GetColorValue(Windows.UI.ViewManagement.UIColorType.Background);
- if (uiTheme == Colors.Black)
- Methods.MainPage.RequestedTheme = ElementTheme.Dark;
+ if (new Windows.UI.ViewManagement.UISettings().GetColorValue(Windows.UI.ViewManagement.UIColorType.Background) == Colors.Black)
+ Application.Current.RequestedTheme = ApplicationTheme.Dark;
else
- Methods.MainPage.RequestedTheme = ElementTheme.Light;
+ Application.Current.RequestedTheme = ApplicationTheme.Light;
}
Methods.MainPage.SetTitleBar();
}
diff --git a/FoxTube/Pages/SettingsPages/Inbox.xaml b/FoxTube/Pages/SettingsPages/Inbox.xaml
index dd9cc27..3510774 100644
--- a/FoxTube/Pages/SettingsPages/Inbox.xaml
+++ b/FoxTube/Pages/SettingsPages/Inbox.xaml
@@ -59,20 +59,19 @@
-
-
-
-
-
+
+
-
+
-
@@ -81,12 +80,12 @@
+
-
-
-
+
+
@@ -99,8 +98,8 @@
-
-
+
+
diff --git a/FoxTube/Pages/SettingsPages/Inbox.xaml.cs b/FoxTube/Pages/SettingsPages/Inbox.xaml.cs
index b12e691..cab047f 100644
--- a/FoxTube/Pages/SettingsPages/Inbox.xaml.cs
+++ b/FoxTube/Pages/SettingsPages/Inbox.xaml.cs
@@ -6,7 +6,6 @@ using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using FoxTube.Classes;
using Windows.Storage;
-using System.Diagnostics;
using System.Xml;
namespace FoxTube.Pages.SettingsPages
@@ -88,7 +87,6 @@ namespace FoxTube.Pages.SettingsPages
{
grid.ColumnDefinitions[0].Width = new GridLength(0);
grid.ColumnDefinitions[1].Width = new GridLength(1, GridUnitType.Star);
- Debug.WriteLine("Opened");
}
}
}
@@ -115,7 +113,6 @@ namespace FoxTube.Pages.SettingsPages
{
grid.ColumnDefinitions[0].Width = new GridLength(1, GridUnitType.Star);
grid.ColumnDefinitions[1].Width = new GridLength(0);
- Debug.WriteLine("Closed");
}
}
diff --git a/FoxTube/Pages/Subscriptions.xaml b/FoxTube/Pages/Subscriptions.xaml
index 97e6f4a..105ada8 100644
--- a/FoxTube/Pages/Subscriptions.xaml
+++ b/FoxTube/Pages/Subscriptions.xaml
@@ -21,7 +21,7 @@
-
+
diff --git a/FoxTube/Pages/VideoGrid.xaml b/FoxTube/Pages/VideoGrid.xaml
index 0234a59..90e3ca6 100644
--- a/FoxTube/Pages/VideoGrid.xaml
+++ b/FoxTube/Pages/VideoGrid.xaml
@@ -15,7 +15,13 @@
-
+
+
+
+
+
+
+
diff --git a/FoxTube/Pages/VideoGrid.xaml.cs b/FoxTube/Pages/VideoGrid.xaml.cs
index a5fbc90..7f077f6 100644
--- a/FoxTube/Pages/VideoGrid.xaml.cs
+++ b/FoxTube/Pages/VideoGrid.xaml.cs
@@ -1,8 +1,17 @@
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
+namespace FoxTube
+{
+ public interface IItemCard
+ {
+
+ }
+}
+
namespace FoxTube.Pages
{
+
///
/// Items cards container
///
@@ -15,7 +24,7 @@ namespace FoxTube.Pages
InitializeComponent();
}
- public void Add(UIElement card)
+ public void Add(IItemCard card)
{
list.Items.Add(card);
/*if (list.Items.Count % 10 == 0)
diff --git a/FoxTube/Pages/VideoPage.xaml b/FoxTube/Pages/VideoPage.xaml
index fc2d669..cd4be71 100644
--- a/FoxTube/Pages/VideoPage.xaml
+++ b/FoxTube/Pages/VideoPage.xaml
@@ -55,6 +55,10 @@
+
+
+
+
-
-
-
-
@@ -138,7 +138,13 @@
-
+
+
+
+
+
+
+
diff --git a/FoxTube/Strings/en-US/Main.resw b/FoxTube/Strings/en-US/Main.resw
index a53def0..4df84a7 100644
--- a/FoxTube/Strings/en-US/Main.resw
+++ b/FoxTube/Strings/en-US/Main.resw
@@ -186,7 +186,7 @@
Create new Google account
-
+
Log out
diff --git a/FoxTube/Strings/ru-RU/Main.resw b/FoxTube/Strings/ru-RU/Main.resw
index a7638c5..b05c24a 100644
--- a/FoxTube/Strings/ru-RU/Main.resw
+++ b/FoxTube/Strings/ru-RU/Main.resw
@@ -186,7 +186,7 @@
Создать новый аккаунт Google
-
+
Выйти