From c003bb4e718b98aee6051edd82c32b346232f0f4 Mon Sep 17 00:00:00 2001
From: chylex <contact@chylex.com>
Date: Fri, 26 Jan 2018 17:32:54 +0100
Subject: [PATCH] Add a way to display the TweetDuck logo in the browser

---
 Core/Notification/FormNotificationBase.cs |   1 +
 Core/Notification/TweetNotification.cs    |   4 ++++
 Core/TweetDeckBrowser.cs                  |   2 ++
 Properties/Resources.Designer.cs          |  12 +++++++++++-
 Properties/Resources.resx                 |   3 +++
 Resources/avatar.png                      | Bin 0 -> 4456 bytes
 TweetDuck.csproj                          |  13 +++++++------
 7 files changed, 28 insertions(+), 7 deletions(-)
 create mode 100644 Resources/avatar.png

diff --git a/Core/Notification/FormNotificationBase.cs b/Core/Notification/FormNotificationBase.cs
index a4ae66d3..1582574b 100644
--- a/Core/Notification/FormNotificationBase.cs
+++ b/Core/Notification/FormNotificationBase.cs
@@ -140,6 +140,7 @@ protected FormNotificationBase(FormBrowser owner, bool enableContextMenu){
             DpiScale = this.GetDPIScale();
 
             browser.SetupResourceHandler(TwitterUtils.TweetDeckURL, this.resourceHandler);
+            browser.SetupResourceHandler(TweetNotification.AppLogoLink, TweetNotification.AppLogoHandler);
 
             Controls.Add(browser);
 
diff --git a/Core/Notification/TweetNotification.cs b/Core/Notification/TweetNotification.cs
index b16405af..12487773 100644
--- a/Core/Notification/TweetNotification.cs
+++ b/Core/Notification/TweetNotification.cs
@@ -1,5 +1,6 @@
 using System;
 using System.Text;
+using CefSharp;
 using TweetDuck.Core.Bridge;
 using TweetDuck.Resources;
 
@@ -8,6 +9,9 @@ sealed class TweetNotification{
         private const string DefaultHeadLayout = @"<html id='tduck' class='os-windows txt-size--14' data-td-font='medium' data-td-theme='dark'><head><meta charset='utf-8'><meta http-equiv='X-UA-Compatible' content='chrome=1'><link rel='stylesheet' href='https://ton.twimg.com/tweetdeck-web/web/css/font.5ef884f9f9.css'><link rel='stylesheet' href='https://ton.twimg.com/tweetdeck-web/web/css/app-dark.5631e0dd42.css'><style type='text/css'>body{background:#222426}</style>";
         private static readonly string CustomCSS = ScriptLoader.LoadResource("styles/notification.css");
 
+        public const string AppLogoLink = "https://ton.twimg.com/tduck/avatar";
+        public static readonly IResourceHandler AppLogoHandler = ResourceHandler.FromByteArray(Properties.Resources.avatar, "image/png");
+
         public static TweetNotification Example(string html, int characters){
             return new TweetNotification(string.Empty, string.Empty, "Home", html, characters, string.Empty, string.Empty, true);
         }
diff --git a/Core/TweetDeckBrowser.cs b/Core/TweetDeckBrowser.cs
index 3680b39b..318ddd67 100644
--- a/Core/TweetDeckBrowser.cs
+++ b/Core/TweetDeckBrowser.cs
@@ -66,6 +66,8 @@ public TweetDeckBrowser(FormBrowser owner, PluginManager plugins, TweetDeckBridg
             this.browser.Dock = DockStyle.None;
             this.browser.Location = ControlExtensions.InvisibleLocation;
 
+            this.browser.SetupResourceHandler(TweetNotification.AppLogoLink, TweetNotification.AppLogoHandler);
+
             owner.Controls.Add(browser);
 
             this.plugins = plugins;
diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs
index b3403071..b2731f44 100644
--- a/Properties/Resources.Designer.cs
+++ b/Properties/Resources.Designer.cs
@@ -19,7 +19,7 @@ namespace TweetDuck.Properties {
     // class via a tool like ResGen or Visual Studio.
     // To add or remove a member, edit your .ResX file then rerun ResGen
     // with the /str option, or rebuild your VS project.
-    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")]
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
     [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
     internal class Resources {
@@ -60,6 +60,16 @@ internal Resources() {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized resource of type System.Byte[].
+        /// </summary>
+        internal static byte[] avatar {
+            get {
+                object obj = ResourceManager.GetObject("avatar", resourceCulture);
+                return ((byte[])(obj));
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
         /// </summary>
diff --git a/Properties/Resources.resx b/Properties/Resources.resx
index d6afc110..d01687dc 100644
--- a/Properties/Resources.resx
+++ b/Properties/Resources.resx
@@ -118,6 +118,9 @@
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
   <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="avatar" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\avatar.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </data>
   <data name="icon" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\icon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
   </data>
diff --git a/Resources/avatar.png b/Resources/avatar.png
new file mode 100644
index 0000000000000000000000000000000000000000..e61b1caedf43a7744432f2c65c9d28bbcddb8622
GIT binary patch
literal 4456
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

literal 0
HcmV?d00001

diff --git a/TweetDuck.csproj b/TweetDuck.csproj
index fdb03ed8..04ba3a36 100644
--- a/TweetDuck.csproj
+++ b/TweetDuck.csproj
@@ -280,6 +280,11 @@
     <Compile Include="Plugins\Events\PluginErrorEventArgs.cs" />
     <Compile Include="Plugins\PluginManager.cs" />
     <Compile Include="Plugins\PluginScriptGenerator.cs" />
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
     <Compile Include="Reporter.cs" />
     <Compile Include="Updates\FormUpdateDownload.cs">
       <SubType>Form</SubType>
@@ -301,11 +306,6 @@
     <Compile Include="Updates\UpdateInfo.cs" />
     <Compile Include="Program.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="Properties\Resources.Designer.cs">
-      <AutoGen>True</AutoGen>
-      <DesignTime>True</DesignTime>
-      <DependentUpon>Resources.resx</DependentUpon>
-    </Compile>
     <Compile Include="Resources\ScriptLoader.cs" />
     <Compile Include="Updates\UpdateEventArgs.cs" />
     <Compile Include="Updates\UpdaterSettings.cs" />
@@ -343,8 +343,8 @@
     </EmbeddedResource>
     <EmbeddedResource Include="Properties\Resources.resx">
       <Generator>ResXFileCodeGenerator</Generator>
-      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
       <SubType>Designer</SubType>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
     </EmbeddedResource>
   </ItemGroup>
   <ItemGroup>
@@ -363,6 +363,7 @@
     <Folder Include="Resources\Plugins\" />
   </ItemGroup>
   <ItemGroup>
+    <Content Include="Resources\avatar.png" />
     <Content Include="Resources\Scripts\code.js" />
     <Content Include="Resources\Scripts\introduction.js" />
     <Content Include="Resources\Scripts\notification.js" />