Merge with OUT-619 sync
authorThomas
Mon, 28 Oct 2019 08:16:34 +0100
branchsync
changeset 2835417b06496e98
parent 2829 cf97661db398
parent 2834 4fa3adadc41d
child 2836 3ecccf434c40
Merge with OUT-619
UI/Models/Dialog.cs
UI/ViewModels/HandshakeViewModel.cs
     1.1 --- a/Properties/Resources.Designer.cs	Thu Oct 24 11:54:07 2019 +0200
     1.2 +++ b/Properties/Resources.Designer.cs	Mon Oct 28 08:16:34 2019 +0100
     1.3 @@ -549,6 +549,26 @@
     1.4          /// <summary>
     1.5          ///   Looks up a localized resource of type System.Drawing.Bitmap.
     1.6          /// </summary>
     1.7 +        public static System.Drawing.Bitmap ImageIntroTutorialPrivacyStatusExpanded {
     1.8 +            get {
     1.9 +                object obj = ResourceManager.GetObject("ImageIntroTutorialPrivacyStatusExpanded", resourceCulture);
    1.10 +                return ((System.Drawing.Bitmap)(obj));
    1.11 +            }
    1.12 +        }
    1.13 +        
    1.14 +        /// <summary>
    1.15 +        ///   Looks up a localized resource of type System.Drawing.Bitmap.
    1.16 +        /// </summary>
    1.17 +        public static System.Drawing.Bitmap ImageIntroTutorialTrustwords {
    1.18 +            get {
    1.19 +                object obj = ResourceManager.GetObject("ImageIntroTutorialTrustwords", resourceCulture);
    1.20 +                return ((System.Drawing.Bitmap)(obj));
    1.21 +            }
    1.22 +        }
    1.23 +        
    1.24 +        /// <summary>
    1.25 +        ///   Looks up a localized resource of type System.Drawing.Bitmap.
    1.26 +        /// </summary>
    1.27          public static System.Drawing.Bitmap ImageLogoBlack {
    1.28              get {
    1.29                  object obj = ResourceManager.GetObject("ImageLogoBlack", resourceCulture);
    1.30 @@ -857,6 +877,71 @@
    1.31          }
    1.32          
    1.33          /// <summary>
    1.34 +        ///   Looks up a localized string similar to Complete a handshake with your communication partner. A handshake is needed only once per partner and will ensure Secure and Trusted communication..
    1.35 +        /// </summary>
    1.36 +        public static string IntroTutorial_AcceptHandshake {
    1.37 +            get {
    1.38 +                return ResourceManager.GetString("IntroTutorial_AcceptHandshake", resourceCulture);
    1.39 +            }
    1.40 +        }
    1.41 +        
    1.42 +        /// <summary>
    1.43 +        ///   Looks up a localized string similar to When you click on the Privacy Status icon in the top bar, you will get to the Handshake, where you can verify your communication partner..
    1.44 +        /// </summary>
    1.45 +        public static string IntroTutorial_Handshake {
    1.46 +            get {
    1.47 +                return ResourceManager.GetString("IntroTutorial_Handshake", resourceCulture);
    1.48 +            }
    1.49 +        }
    1.50 +        
    1.51 +        /// <summary>
    1.52 +        ///   Looks up a localized string similar to If the Trustwords are not correct, your communication partner is Mistrusted..
    1.53 +        /// </summary>
    1.54 +        public static string IntroTutorial_Mistrusted {
    1.55 +            get {
    1.56 +                return ResourceManager.GetString("IntroTutorial_Mistrusted", resourceCulture);
    1.57 +            }
    1.58 +        }
    1.59 +        
    1.60 +        /// <summary>
    1.61 +        ///   Looks up a localized string similar to With this Privacy Status all communication is secure, but to confirm that your communication partner is really the person you know, you should compare Trustwords with this contact..
    1.62 +        /// </summary>
    1.63 +        public static string IntroTutorial_Secure {
    1.64 +            get {
    1.65 +                return ResourceManager.GetString("IntroTutorial_Secure", resourceCulture);
    1.66 +            }
    1.67 +        }
    1.68 +        
    1.69 +        /// <summary>
    1.70 +        ///   Looks up a localized string similar to When the Trustwords are confirmed to be correct and the Handshake is done, your communication will be completely Secure &amp; Trusted..
    1.71 +        /// </summary>
    1.72 +        public static string IntroTutorial_SecureAndTrusted {
    1.73 +            get {
    1.74 +                return ResourceManager.GetString("IntroTutorial_SecureAndTrusted", resourceCulture);
    1.75 +            }
    1.76 +        }
    1.77 +        
    1.78 +        /// <summary>
    1.79 +        ///   Looks up a localized string similar to p≡p uses a Privacy Status to indicate how secure your communication is.
    1.80 +        ///
    1.81 +        ///This Privacy Status is shown as an icon in the top bar:.
    1.82 +        /// </summary>
    1.83 +        public static string IntroTutorial_Welcome {
    1.84 +            get {
    1.85 +                return ResourceManager.GetString("IntroTutorial_Welcome", resourceCulture);
    1.86 +            }
    1.87 +        }
    1.88 +        
    1.89 +        /// <summary>
    1.90 +        ///   Looks up a localized string similar to Welcome to p≡p.
    1.91 +        /// </summary>
    1.92 +        public static string IntroTutorial_WindowTitle {
    1.93 +            get {
    1.94 +                return ResourceManager.GetString("IntroTutorial_WindowTitle", resourceCulture);
    1.95 +            }
    1.96 +        }
    1.97 +        
    1.98 +        /// <summary>
    1.99          ///   Looks up a localized string similar to Device Group.
   1.100          /// </summary>
   1.101          public static string KeySync_DeviceGroup {
     2.1 --- a/Properties/Resources.de.resx	Thu Oct 24 11:54:07 2019 +0200
     2.2 +++ b/Properties/Resources.de.resx	Mon Oct 28 08:16:34 2019 +0100
     2.3 @@ -909,4 +909,27 @@
     2.4    <data name="Options_DocumentationText" xml:space="preserve">
     2.5      <value>Dokumentation:</value>
     2.6    </data>
     2.7 +  <data name="IntroTutorial_WindowTitle" xml:space="preserve">
     2.8 +    <value>Willkommen bei p≡p</value>
     2.9 +  </data>
    2.10 +  <data name="IntroTutorial_Welcome" xml:space="preserve">
    2.11 +    <value>p≡p verwendet einen Datenschutzstatus, der angibt, wie sicher Ihre Kommunikation ist.
    2.12 +
    2.13 +Dieser Datenschutzstatus wird im Menüband oben durch ein Symbol repräsentiert:</value>
    2.14 +  </data>
    2.15 +  <data name="IntroTutorial_Secure" xml:space="preserve">
    2.16 +    <value>Dieser Datenschutzstatus bedeutet, dass die Verbindung selbst bereits sicher ist. Darüber hinaus sollten Sie aber auch noch die Trustwords mit Ihrem Kommunikationspartner vergleichen, um sicherzustellen, dass es sich auch wirklich um die Person handelt, für die sie sich ausgibt.</value>
    2.17 +  </data>
    2.18 +  <data name="IntroTutorial_Handshake" xml:space="preserve">
    2.19 +    <value>Durch Klick auf das Datenschutzstatussymbol öffnen Sie den Handshake-Dialog, in dem Sie Ihren Kommunikationspartner verifizieren können.</value>
    2.20 +  </data>
    2.21 +  <data name="IntroTutorial_SecureAndTrusted" xml:space="preserve">
    2.22 +    <value>Wenn die Trustwords übereinstimmen und Sie den Handshake abschließen, ist Ihre Kommunikation sicher und verifiziert.</value>
    2.23 +  </data>
    2.24 +  <data name="IntroTutorial_Mistrusted" xml:space="preserve">
    2.25 +    <value>Wenn die Trustwords nicht übereinstimmen, ist Ihr Kommunikationspartner verdächtig.</value>
    2.26 +  </data>
    2.27 +  <data name="IntroTutorial_AcceptHandshake" xml:space="preserve">
    2.28 +    <value>Führen Sie einen Handshake mit Ihrem Kommunikationspartner durch. Der Handshake ist nur einmal pro Partner nötig und garantiert eine sichere und verifizierte Kommunikation.</value>
    2.29 +  </data>
    2.30  </root>
    2.31 \ No newline at end of file
     3.1 --- a/Properties/Resources.es.resx	Thu Oct 24 11:54:07 2019 +0200
     3.2 +++ b/Properties/Resources.es.resx	Mon Oct 28 08:16:34 2019 +0100
     3.3 @@ -909,4 +909,27 @@
     3.4    <data name="Options_DocumentationText" xml:space="preserve">
     3.5      <value>Documentación:</value>
     3.6    </data>
     3.7 +  <data name="IntroTutorial_WindowTitle" xml:space="preserve">
     3.8 +    <value>Bienvenido a p≡p</value>
     3.9 +  </data>
    3.10 +  <data name="IntroTutorial_Welcome" xml:space="preserve">
    3.11 +    <value>p≡p usa un estatus de privacidad para indicar el nivel de seguridad de tu comunicación.
    3.12 +
    3.13 +Este estatus de privacidad se muestra en la cinta superior mediante un icono:</value>
    3.14 +  </data>
    3.15 +  <data name="IntroTutorial_Secure" xml:space="preserve">
    3.16 +    <value>Este estatus de privacidad significa que la comunicación es segura. Sin embargo, deberías comparar además las Trustwords con tu interlocutor para asegurarte de que, efectivamente, se trata de la persona por la que se hace pasar.</value>
    3.17 +  </data>
    3.18 +  <data name="IntroTutorial_Handshake" xml:space="preserve">
    3.19 +    <value>Completa un handshake con tu interlocutor. Un handshake se necesita solo una vez por interlocutor y garantiza una comunicación segura y verificada.</value>
    3.20 +  </data>
    3.21 +  <data name="IntroTutorial_SecureAndTrusted" xml:space="preserve">
    3.22 +    <value>Si las Trustwords son correctas y has confirmado el Handshake, la comunicación será segura y de confianza.</value>
    3.23 +  </data>
    3.24 +  <data name="IntroTutorial_Mistrusted" xml:space="preserve">
    3.25 +    <value>Si las Trustwords no son correctas, tu interlocutor es sospechoso.</value>
    3.26 +  </data>
    3.27 +  <data name="IntroTutorial_AcceptHandshake" xml:space="preserve">
    3.28 +    <value>Al confirmar que tus Trustwords y las de tu interlocutor coincidan, tu comunicación será segura y verificada.</value>
    3.29 +  </data>
    3.30  </root>
    3.31 \ No newline at end of file
     4.1 --- a/Properties/Resources.resx	Thu Oct 24 11:54:07 2019 +0200
     4.2 +++ b/Properties/Resources.resx	Mon Oct 28 08:16:34 2019 +0100
     4.3 @@ -1033,4 +1033,33 @@
     4.4    <data name="Options_DocumentationText" xml:space="preserve">
     4.5      <value>Documentation:</value>
     4.6    </data>
     4.7 +  <data name="IntroTutorial_WindowTitle" xml:space="preserve">
     4.8 +    <value>Welcome to p≡p</value>
     4.9 +  </data>
    4.10 +  <data name="IntroTutorial_Welcome" xml:space="preserve">
    4.11 +    <value>p≡p uses a Privacy Status to indicate how secure your communication is.
    4.12 +
    4.13 +This Privacy Status is shown as an icon in the top bar:</value>
    4.14 +  </data>
    4.15 +  <data name="IntroTutorial_Secure" xml:space="preserve">
    4.16 +    <value>With this Privacy Status all communication is secure, but to confirm that your communication partner is really the person you know, you should compare Trustwords with this contact.</value>
    4.17 +  </data>
    4.18 +  <data name="IntroTutorial_Handshake" xml:space="preserve">
    4.19 +    <value>When you click on the Privacy Status icon in the top bar, you will get to the Handshake, where you can verify your communication partner.</value>
    4.20 +  </data>
    4.21 +  <data name="IntroTutorial_SecureAndTrusted" xml:space="preserve">
    4.22 +    <value>When the Trustwords are confirmed to be correct and the Handshake is done, your communication will be completely Secure &amp; Trusted.</value>
    4.23 +  </data>
    4.24 +  <data name="IntroTutorial_Mistrusted" xml:space="preserve">
    4.25 +    <value>If the Trustwords are not correct, your communication partner is Mistrusted.</value>
    4.26 +  </data>
    4.27 +  <data name="ImageIntroTutorialPrivacyStatusExpanded" type="System.Resources.ResXFileRef, System.Windows.Forms">
    4.28 +    <value>..\Resources\ImageIntroTutorialPrivacyStatusExpanded.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
    4.29 +  </data>
    4.30 +  <data name="ImageIntroTutorialTrustwords" type="System.Resources.ResXFileRef, System.Windows.Forms">
    4.31 +    <value>..\Resources\ImageIntroTutorialTrustwords.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
    4.32 +  </data>
    4.33 +  <data name="IntroTutorial_AcceptHandshake" xml:space="preserve">
    4.34 +    <value>Complete a handshake with your communication partner. A handshake is needed only once per partner and will ensure Secure and Trusted communication.</value>
    4.35 +  </data>
    4.36  </root>
    4.37 \ No newline at end of file
     5.1 Binary file Resources/ImageIntroTutorialPrivacyStatusExpanded.png has changed
     6.1 Binary file Resources/ImageIntroTutorialTrustwords.png has changed
     7.1 --- a/ThisAddIn.cs	Thu Oct 24 11:54:07 2019 +0200
     7.2 +++ b/ThisAddIn.cs	Mon Oct 28 08:16:34 2019 +0100
     7.3 @@ -1,6 +1,7 @@
     7.4  using Microsoft.Win32;
     7.5  using pEp.Extensions;
     7.6  using pEp.UI;
     7.7 +using pEp.UI.Models;
     7.8  using pEp.UI.Views;
     7.9  using pEpCOMServerAdapterLib;
    7.10  using System;
    7.11 @@ -2481,7 +2482,7 @@
    7.12              string languageName = null;
    7.13              const string defaultLanguageName = "en";
    7.14  
    7.15 -            // The current supported languages. Has to be synced with resources.
    7.16 +            // The currently supported languages. Has to be synced with resources.
    7.17              List<string> pEpLanguages = new List<string>
    7.18              {
    7.19                  "ca",
    7.20 @@ -2507,7 +2508,7 @@
    7.21                   * This is needed because we have not yet country-specific localization.
    7.22                   * If the language is supported, use it. Else, use default language.
    7.23                   */
    7.24 -                languageName = outlookCulture.TwoLetterISOLanguageName;
    7.25 +                languageName = outlookCulture.TwoLetterISOLanguageName.ToLower();
    7.26                  if (pEpLanguages.Contains(languageName))
    7.27                  {
    7.28                      pEpCulture = new CultureInfo(languageName);
    7.29 @@ -2642,12 +2643,17 @@
    7.30          /// </summary>
    7.31          private void ThisAddIn_Startup(object sender, EventArgs e)
    7.32          {
    7.33 -            CultureInfo culture;
    7.34 -
    7.35              // Disable GPGOL
    7.36              Log.Info("ThisAddIn_Startup: Disable GPGOL");
    7.37              this.DisableGpgOL();
    7.38  
    7.39 +            // Set the UI culture for resource translation
    7.40 +            Log.Info("ThisAddIn_Startup: Set UI language");
    7.41 +            CultureInfo culture = this.GetActiveUICulture();
    7.42 +            CultureInfo.DefaultThreadCurrentCulture = culture;
    7.43 +            CultureInfo.DefaultThreadCurrentUICulture = culture;
    7.44 +            Log.Info("ThisAddIn_Startup: " + culture.TwoLetterISOLanguageName + " language detected.");
    7.45 +
    7.46              // Init global error handling
    7.47              Log.Info("ThisAddIn_Startup: Connect Events");
    7.48              Globals.ConnectEvents(true);
    7.49 @@ -2692,13 +2698,6 @@
    7.50              this.SyncWithSettings();
    7.51              this._Settings.PropertyChanged += Settings_PropertyChanged;
    7.52  
    7.53 -            // Set the UI culture for resource translation
    7.54 -            Log.Info("ThisAddIn_Startup: Set UI language");
    7.55 -            culture = this.GetActiveUICulture();
    7.56 -            CultureInfo.DefaultThreadCurrentCulture = culture;
    7.57 -            CultureInfo.DefaultThreadCurrentUICulture = culture;
    7.58 -            Log.Info("ThisAddIn_Startup: " + culture.TwoLetterISOLanguageName + " language detected.");
    7.59 -
    7.60              // Create UI thread dispatcher to open dialog windows
    7.61              DialogWindow.UIThreadDispatcher = new DialogWindow()?.Dispatcher;
    7.62  
    7.63 @@ -3274,6 +3273,9 @@
    7.64          {
    7.65              Log.Info("ThisAddIn_FirstStartup: First startup detected");
    7.66  
    7.67 +            // Show the introduction tutorial
    7.68 +            new DialogWindow(new Dialog(Dialog.Type.IntroTutorial))?.Show();
    7.69 +
    7.70              // Set rules and inbox view filters for all accounts
    7.71              Task.Factory.StartNew(() =>
    7.72              {
     8.1 --- a/UI/Models/Dialog.cs	Thu Oct 24 11:54:07 2019 +0200
     8.2 +++ b/UI/Models/Dialog.cs	Mon Oct 28 08:16:34 2019 +0100
     8.3 @@ -14,7 +14,7 @@
     8.4              Undefined,
     8.5              Handshake,
     8.6              KeySync,
     8.7 -            KeyImportPGP,
     8.8 +            IntroTutorial,
     8.9              ForceProtection
    8.10          }
    8.11  
    8.12 @@ -39,6 +39,14 @@
    8.13          public Type DialogType { get; } = Type.Undefined;
    8.14  
    8.15          /// <summary>
    8.16 +        /// Primary constructor
    8.17 +        /// </summary>
    8.18 +        public Dialog(Type type)
    8.19 +        {
    8.20 +            this.DialogType = type;
    8.21 +        }
    8.22 +
    8.23 +        /// <summary>
    8.24          /// Constructor for a dialog with multiple partner identities.
    8.25          /// </summary>
    8.26          /// <param name="type">The type of the dialog.</param>
     9.1 --- a/UI/ValueConverters.cs	Thu Oct 24 11:54:07 2019 +0200
     9.2 +++ b/UI/ValueConverters.cs	Mon Oct 28 08:16:34 2019 +0100
     9.3 @@ -318,7 +318,7 @@
     9.4              if (value is Dialog.Type val)
     9.5              {
     9.6                  return ((val == Dialog.Type.KeySync) ||                       
     9.7 -                        (val == Dialog.Type.KeyImportPGP));
     9.8 +                        (val == Dialog.Type.IntroTutorial));
     9.9              }
    9.10              else
    9.11              {
    10.1 --- a/UI/ViewModels/HandshakeViewModel.cs	Thu Oct 24 11:54:07 2019 +0200
    10.2 +++ b/UI/ViewModels/HandshakeViewModel.cs	Mon Oct 28 08:16:34 2019 +0100
    10.3 @@ -567,7 +567,7 @@
    10.4                          this.ButtonWrongText = Properties.Resources.Handshake_WrongTrustwords;
    10.5                      }
    10.6                      break;
    10.7 -                case Dialog.Type.KeyImportPGP:
    10.8 +                case Dialog.Type.IntroTutorial:
    10.9                  case Dialog.Type.ForceProtection:
   10.10                      throw new NotImplementedException();
   10.11                  case Dialog.Type.Undefined:
    11.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    11.2 +++ b/UI/ViewModels/IntroTutorialHandshakeViewModel.cs	Mon Oct 28 08:16:34 2019 +0100
    11.3 @@ -0,0 +1,6 @@
    11.4 +namespace pEp.UI.ViewModels
    11.5 +{
    11.6 +    class IntroTutorialHandshakeViewModel : WizardPageViewModelBase
    11.7 +    {
    11.8 +    }
    11.9 +}
    12.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    12.2 +++ b/UI/ViewModels/IntroTutorialStatusExplanationViewModel.cs	Mon Oct 28 08:16:34 2019 +0100
    12.3 @@ -0,0 +1,6 @@
    12.4 +namespace pEp.UI.ViewModels
    12.5 +{
    12.6 +    class IntroTutorialStatusExplanationViewModel : WizardPageViewModelBase
    12.7 +    {
    12.8 +    }
    12.9 +}
    13.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    13.2 +++ b/UI/ViewModels/IntroTutorialViewModel.cs	Mon Oct 28 08:16:34 2019 +0100
    13.3 @@ -0,0 +1,55 @@
    13.4 +using pEp.UI.Models;
    13.5 +using System;
    13.6 +using System.Collections.Generic;
    13.7 +using System.Collections.ObjectModel;
    13.8 +using System.Windows.Media.Imaging;
    13.9 +
   13.10 +namespace pEp.UI.ViewModels
   13.11 +{
   13.12 +    internal class IntroTutorialViewModel : WizardViewModelBase
   13.13 +    {
   13.14 +        /// <summary>
   13.15 +        /// Primary constructor.
   13.16 +        /// </summary>
   13.17 +        /// <param name="dialog">The dialog for this Intro tutorial.</param>
   13.18 +        /// <param name="closeWindow">The action to close this window.</param>
   13.19 +        public IntroTutorialViewModel(Dialog dialog, Action closeWindow) : base(dialog, closeWindow)
   13.20 +        {
   13.21 +        }
   13.22 +
   13.23 +        /// <summary>
   13.24 +        /// Creates the pages of this intro tutorial wizard.
   13.25 +        /// </summary>
   13.26 +        /// <returns></returns>
   13.27 +        public override ReadOnlyCollection<ViewModelBase> CreatePages()
   13.28 +        {
   13.29 +            return new ReadOnlyCollection<ViewModelBase>(new List<ViewModelBase>
   13.30 +            {
   13.31 +                // Welcome page
   13.32 +                new WizardGenericPageViewModel
   13.33 +                {
   13.34 +                    ButtonCancelText = Properties.Resources.ManagePrivacyStatus_CloseText,
   13.35 +                    ExplanationText = Properties.Resources.IntroTutorial_Welcome,
   13.36 +                    Image = new BitmapImage(new Uri("pack://application:,,,/pEp;component/Resources/ImagePrivacyStatusYellow.png", UriKind.RelativeOrAbsolute)),
   13.37 +                    ImageHeight = 40,
   13.38 +                    ImageWidth = 40
   13.39 +                },
   13.40 +
   13.41 +                // Handshake explanation
   13.42 +                new IntroTutorialHandshakeViewModel
   13.43 +                {
   13.44 +                    ButtonCancelText = Properties.Resources.ManagePrivacyStatus_CloseText,
   13.45 +                    IsButtonBackVisible = true
   13.46 +                },
   13.47 +
   13.48 +                // Status explanation
   13.49 +                new IntroTutorialStatusExplanationViewModel
   13.50 +                {
   13.51 +                    ButtonCancelText = Properties.Resources.ManagePrivacyStatus_CloseText,
   13.52 +                    IsButtonBackVisible = true,
   13.53 +                    IsButtonNextVisible = false
   13.54 +                }
   13.55 +            });
   13.56 +        }
   13.57 +    }
   13.58 +}
    14.1 --- a/UI/ViewModels/SyncWizardViewModel.cs	Thu Oct 24 11:54:07 2019 +0200
    14.2 +++ b/UI/ViewModels/SyncWizardViewModel.cs	Mon Oct 28 08:16:34 2019 +0100
    14.3 @@ -28,13 +28,18 @@
    14.4                  // Welcome page
    14.5                  new WizardGenericPageViewModel
    14.6                  {
    14.7 +                    ButtonCancelText = Properties.Resources.DialogWindow_NotNow,
    14.8                      ExplanationText = Properties.Resources.Handshake_SyncTypeAExplanationText,
    14.9                      Image = new BitmapImage(new Uri("pack://application:,,,/pEp;component/Resources/ImageIconDeviceGroup2.png", UriKind.RelativeOrAbsolute)),
   14.10                      IsButtonBackVisible = false
   14.11                  },
   14.12                                  
   14.13                  // Handshake
   14.14 -                new WizardHandshakePageViewModel(this.Dialog, this),
   14.15 +                new WizardHandshakePageViewModel(this.Dialog, this)
   14.16 +                {
   14.17 +                    ButtonCancelText = Properties.Resources.DialogWindow_NotNow,
   14.18 +                    IsButtonBackVisible = true
   14.19 +                },
   14.20  
   14.21                  // Waiting for completion
   14.22                  new WizardGenericPageViewModel
    15.1 --- a/UI/ViewModels/WizardGenericPageViewModel.cs	Thu Oct 24 11:54:07 2019 +0200
    15.2 +++ b/UI/ViewModels/WizardGenericPageViewModel.cs	Mon Oct 28 08:16:34 2019 +0100
    15.3 @@ -4,8 +4,13 @@
    15.4  {
    15.5      public class WizardGenericPageViewModel : WizardPageViewModelBase
    15.6      {
    15.7 -        private string          _ExplanationText    = null;
    15.8 -        private ImageSource     _Image              = null;
    15.9 +        private string          _ExplanationText        = null;
   15.10 +        private ImageSource     _Image                  = null;
   15.11 +        private double          _ImageHeight            = WizardGenericPageViewModel.IMAGE_HEIGHT_DEFAULT;
   15.12 +        private double          _ImageWidth             = WizardGenericPageViewModel.IMAGE_WIDTH_DEFAULT;
   15.13 +
   15.14 +        private const double    IMAGE_HEIGHT_DEFAULT    = 80;
   15.15 +        private const double    IMAGE_WIDTH_DEFAULT     = 80;
   15.16  
   15.17          /// <summary>
   15.18          /// Gets or sets the text that explains the current wizard step.
   15.19 @@ -34,6 +39,32 @@
   15.20          }
   15.21  
   15.22          /// <summary>
   15.23 +        /// Gets or sets the height of the image in the current wizard step.
   15.24 +        /// </summary>
   15.25 +        public double ImageHeight
   15.26 +        {
   15.27 +            get => this._ImageHeight;
   15.28 +            set
   15.29 +            {
   15.30 +                this._ImageHeight = value;
   15.31 +                this.OnPropertyChanged();
   15.32 +            }
   15.33 +        }
   15.34 +
   15.35 +        /// <summary>
   15.36 +        /// Gets or sets the width of the image in the current wizard step.
   15.37 +        /// </summary>
   15.38 +        public double ImageWidth
   15.39 +        {
   15.40 +            get => this._ImageWidth;
   15.41 +            set
   15.42 +            {
   15.43 +                this._ImageWidth = value;
   15.44 +                this.OnPropertyChanged();
   15.45 +            }
   15.46 +        }
   15.47 +
   15.48 +        /// <summary>
   15.49          /// Primary constructor.
   15.50          /// </summary>
   15.51          public WizardGenericPageViewModel()
    16.1 --- a/UI/ViewModels/WizardPageViewModelBase.cs	Thu Oct 24 11:54:07 2019 +0200
    16.2 +++ b/UI/ViewModels/WizardPageViewModelBase.cs	Mon Oct 28 08:16:34 2019 +0100
    16.3 @@ -8,12 +8,12 @@
    16.4          private Style               _ButtonAcceptHandshakeStyle         = WizardPageViewModelBase.GreenButtonStyle;
    16.5          private Style               _ButtonBackStyle                    = WizardPageViewModelBase.GreyButtonStyle;
    16.6          private Style               _ButtonCancelStyle                  = WizardPageViewModelBase.GreyButtonStyle;
    16.7 -        private string              _ButtonCancelText                   = Properties.Resources.DialogWindow_NotNow;
    16.8 +        private string              _ButtonCancelText                   = null;
    16.9          private Style               _ButtonNextStyle                    = WizardPageViewModelBase.GreyButtonStyle;
   16.10          private Style               _ButtonRejectHandshakeStyle         = WizardPageViewModelBase.RedButtonStyle;
   16.11          private ViewModelBase       _Content                            = null;
   16.12          private bool                _IsButtonAcceptHandshakeVisible     = false;
   16.13 -        private bool                _IsButtonBackVisible                = true;
   16.14 +        private bool                _IsButtonBackVisible                = false;
   16.15          private bool                _IsButtonCancelVisible              = true;
   16.16          private bool                _IsButtonNextVisible                = true;
   16.17          private bool                _IsButtonRejectHandshakeVisible     = false;
    17.1 --- a/UI/ViewModels/WizardViewModelBase.cs	Thu Oct 24 11:54:07 2019 +0200
    17.2 +++ b/UI/ViewModels/WizardViewModelBase.cs	Mon Oct 28 08:16:34 2019 +0100
    17.3 @@ -208,7 +208,7 @@
    17.4                          this.MoveToNextPage();
    17.5                      }
    17.6                      break;
    17.7 -                case Dialog.Type.KeyImportPGP:
    17.8 +                case Dialog.Type.IntroTutorial:
    17.9                  case Dialog.Type.ForceProtection:
   17.10                      {
   17.11                          Log.Error("AcceptHandshake: Dialog type {0} not implemented. ", Enum.GetName(typeof(Dialog.Type), this.Dialog.DialogType));
   17.12 @@ -298,7 +298,7 @@
   17.13                          this.CloseWindowAction?.Invoke();
   17.14                      }
   17.15                      break;
   17.16 -                case Dialog.Type.KeyImportPGP:
   17.17 +                case Dialog.Type.IntroTutorial:
   17.18                      {
   17.19                          Log.Error("RejectHandshake: Dialog type {0} not implemented. ", Enum.GetName(typeof(Dialog.Type), this.Dialog.DialogType));
   17.20                      }
    18.1 --- a/UI/Views/DialogWindow.xaml	Thu Oct 24 11:54:07 2019 +0200
    18.2 +++ b/UI/Views/DialogWindow.xaml	Mon Oct 28 08:16:34 2019 +0100
    18.3 @@ -19,11 +19,14 @@
    18.4          WindowStartupLocation="CenterScreen"
    18.5          Closing="DialogWindow_Closing">
    18.6      <Window.Resources>
    18.7 +        <DataTemplate DataType="{x:Type vm:HandshakeDialogViewModel}">
    18.8 +            <v:HandshakeDialogView />
    18.9 +        </DataTemplate>
   18.10          <DataTemplate DataType="{x:Type vm:SyncWizardViewModel}">
   18.11              <v:WizardView />
   18.12          </DataTemplate>
   18.13 -        <DataTemplate DataType="{x:Type vm:HandshakeDialogViewModel}">
   18.14 -            <v:HandshakeDialogView />
   18.15 +        <DataTemplate DataType="{x:Type vm:IntroTutorialViewModel}">
   18.16 +            <v:WizardView />
   18.17          </DataTemplate>
   18.18      </Window.Resources>
   18.19  </Window>
    19.1 --- a/UI/Views/DialogWindow.xaml.cs	Thu Oct 24 11:54:07 2019 +0200
    19.2 +++ b/UI/Views/DialogWindow.xaml.cs	Mon Oct 28 08:16:34 2019 +0100
    19.3 @@ -49,7 +49,12 @@
    19.4                          this.Content = new SyncWizardViewModel(dialog, this.Close);
    19.5                      }
    19.6                      break;
    19.7 -                case Dialog.Type.KeyImportPGP:
    19.8 +                case Dialog.Type.IntroTutorial:
    19.9 +                    {
   19.10 +                        this.Title = Properties.Resources.IntroTutorial_WindowTitle;
   19.11 +                        this.Content = new IntroTutorialViewModel(dialog, this.Close);
   19.12 +                    }
   19.13 +                    break;
   19.14                  case Dialog.Type.ForceProtection:
   19.15                  default:
   19.16                      {
   19.17 @@ -181,6 +186,6 @@
   19.18              DialogWindow.CreateAndShow(type, new PEPIdentity(myself), new PEPIdentity(partner));
   19.19          }
   19.20  
   19.21 -        #endregion        
   19.22 +        #endregion
   19.23      }
   19.24  }
    20.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    20.2 +++ b/UI/Views/IntroTutorialHandshakePageView.xaml	Mon Oct 28 08:16:34 2019 +0100
    20.3 @@ -0,0 +1,47 @@
    20.4 +<UserControl x:Class="pEp.UI.Views.IntroTutorialHandshakePageView"
    20.5 +             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    20.6 +             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    20.7 +             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    20.8 +             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    20.9 +             xmlns:p="clr-namespace:pEp.Properties"
   20.10 +             mc:Ignorable="d">
   20.11 +    <StackPanel>
   20.12 +
   20.13 +        <!--Upper section-->
   20.14 +        <Grid>
   20.15 +            <Grid.ColumnDefinitions>
   20.16 +                <ColumnDefinition Width="*"/>
   20.17 +                <ColumnDefinition Width="Auto"/>
   20.18 +            </Grid.ColumnDefinitions>
   20.19 +
   20.20 +            <!--Explanation-->
   20.21 +            <TextBlock Grid.Column="0"
   20.22 +                       Text="{x:Static p:Resources.IntroTutorial_Handshake}"
   20.23 +                       TextWrapping="Wrap"
   20.24 +                       Margin="5,5,5,15" />
   20.25 +
   20.26 +            <!--Icon image-->
   20.27 +            <Image Grid.Column="1"
   20.28 +                   VerticalAlignment="Stretch"
   20.29 +                   HorizontalAlignment="Center"
   20.30 +                   Margin="10"
   20.31 +                   Width="160"
   20.32 +                   Stretch="Uniform"
   20.33 +                   Source="pack://application:,,,/pEp;component/Resources/ImageIntroTutorialPrivacyStatusExpanded.png" />
   20.34 +        </Grid>
   20.35 +
   20.36 +        <!--Handshake image-->
   20.37 +        <Image Stretch="Uniform"
   20.38 +               VerticalAlignment="Stretch"
   20.39 +               HorizontalAlignment="Center"
   20.40 +               Width="480"
   20.41 +               Margin="0,15"
   20.42 +               Source="pack://application:,,,/pEp;component/Resources/ImageIntroTutorialTrustwords.png" />
   20.43 +
   20.44 +        <!--Trusted explanation-->
   20.45 +        <TextBlock Text="{x:Static p:Resources.IntroTutorial_AcceptHandshake}"
   20.46 +                   TextWrapping="Wrap"
   20.47 +                   Margin="5,5,5,15" />
   20.48 +
   20.49 +    </StackPanel>
   20.50 +</UserControl>
    21.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    21.2 +++ b/UI/Views/IntroTutorialHandshakePageView.xaml.cs	Mon Oct 28 08:16:34 2019 +0100
    21.3 @@ -0,0 +1,15 @@
    21.4 +using System.Windows.Controls;
    21.5 +
    21.6 +namespace pEp.UI.Views
    21.7 +{
    21.8 +    /// <summary>
    21.9 +    /// Interaction logic for IntroTutorialHandshakePageView.xaml
   21.10 +    /// </summary>
   21.11 +    public partial class IntroTutorialHandshakePageView : UserControl
   21.12 +    {
   21.13 +        public IntroTutorialHandshakePageView()
   21.14 +        {
   21.15 +            InitializeComponent();
   21.16 +        }
   21.17 +    }
   21.18 +}
    22.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    22.2 +++ b/UI/Views/IntroTutorialStatusExplanationView.xaml	Mon Oct 28 08:16:34 2019 +0100
    22.3 @@ -0,0 +1,100 @@
    22.4 +<UserControl x:Class="pEp.UI.Views.IntroTutorialStatusExplanationView"
    22.5 +             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    22.6 +             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    22.7 +             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    22.8 +             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    22.9 +             xmlns:p="clr-namespace:pEp.Properties"
   22.10 +             mc:Ignorable="d">
   22.11 +    <Grid>
   22.12 +        <Grid.ColumnDefinitions>
   22.13 +            <ColumnDefinition Width="Auto" />
   22.14 +            <ColumnDefinition Width="*" />
   22.15 +        </Grid.ColumnDefinitions>
   22.16 +        <Grid.RowDefinitions>
   22.17 +            <RowDefinition Height="Auto" />
   22.18 +            <RowDefinition Height="Auto" />
   22.19 +            <RowDefinition Height="Auto" />
   22.20 +            <RowDefinition Height="Auto" />
   22.21 +            <RowDefinition Height="Auto" />
   22.22 +            <RowDefinition Height="*" />
   22.23 +        </Grid.RowDefinitions>
   22.24 +
   22.25 +        <!--Secure image-->
   22.26 +        <Image Grid.Column="0"
   22.27 +               Grid.Row="0"
   22.28 +               Grid.RowSpan="2"
   22.29 +               Stretch="Uniform"
   22.30 +               VerticalAlignment="Top"
   22.31 +               HorizontalAlignment="Center"
   22.32 +               Width="40"
   22.33 +               Margin="10"
   22.34 +               Source="pack://application:,,,/pEp;component/Resources/ImagePrivacyStatusYellow.png" />
   22.35 +
   22.36 +        <!--Secure title-->
   22.37 +        <TextBlock Grid.Column="1"
   22.38 +                   Grid.Row="0"
   22.39 +                   Text="{x:Static p:Resources.PrivacyStatus_RatingReliableText}"
   22.40 +                   FontWeight="DemiBold"
   22.41 +                   TextWrapping="Wrap"
   22.42 +                   Margin="10,10,10,0" />
   22.43 +
   22.44 +        <!--Secure explanation-->
   22.45 +        <TextBlock Grid.Column="1"
   22.46 +                   Grid.Row="1"
   22.47 +                   Text="{x:Static p:Resources.IntroTutorial_Secure}"
   22.48 +                   TextWrapping="Wrap"
   22.49 +                   Margin="10,2,10,20" />
   22.50 +
   22.51 +        <!--Trusted image-->
   22.52 +        <Image Grid.Column="0"
   22.53 +               Grid.Row="2"
   22.54 +               Grid.RowSpan="2"
   22.55 +               Stretch="Uniform"
   22.56 +               VerticalAlignment="Top"
   22.57 +               HorizontalAlignment="Center"
   22.58 +               Width="40"
   22.59 +               Margin="10"
   22.60 +               Source="pack://application:,,,/pEp;component/Resources/ImagePrivacyStatusGreen.png" />
   22.61 +
   22.62 +        <!--Trusted title-->
   22.63 +        <TextBlock Grid.Column="1"
   22.64 +                   Grid.Row="2"
   22.65 +                   Text="{x:Static p:Resources.PrivacyStatus_RatingTrustedText}"
   22.66 +                   FontWeight="DemiBold"
   22.67 +                   TextWrapping="Wrap"
   22.68 +                   Margin="10,10,10,0" />
   22.69 +
   22.70 +        <!--Trusted explanation-->
   22.71 +        <TextBlock Grid.Column="1"
   22.72 +                   Grid.Row="3"
   22.73 +                   Text="{x:Static p:Resources.IntroTutorial_SecureAndTrusted}"
   22.74 +                   TextWrapping="Wrap"
   22.75 +                   Margin="10,2,10,20" />
   22.76 +
   22.77 +        <!--Mistrust image-->
   22.78 +        <Image Grid.Column="0"
   22.79 +               Grid.Row="4"
   22.80 +               Grid.RowSpan="2"
   22.81 +               Stretch="Uniform"
   22.82 +               VerticalAlignment="Top"
   22.83 +               HorizontalAlignment="Center"
   22.84 +               Width="40"
   22.85 +               Margin="10"
   22.86 +               Source="pack://application:,,,/pEp;component/Resources/ImagePrivacyStatusRed.png" />
   22.87 +
   22.88 +        <!--Mistrust title-->
   22.89 +        <TextBlock Grid.Column="1"
   22.90 +                   Grid.Row="4"
   22.91 +                   Text="{x:Static p:Resources.PrivacyStatus_RatingMistrustText}"
   22.92 +                   FontWeight="DemiBold"
   22.93 +                   TextWrapping="Wrap"
   22.94 +                   Margin="10,10,10,0" />
   22.95 +
   22.96 +        <!--Mistrust explanation-->
   22.97 +        <TextBlock Grid.Column="1"
   22.98 +                   Grid.Row="5"
   22.99 +                   Text="{x:Static p:Resources.IntroTutorial_Mistrusted}"
  22.100 +                   TextWrapping="Wrap"
  22.101 +                   Margin="10,2,10,0" />
  22.102 +    </Grid>
  22.103 +</UserControl>
    23.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    23.2 +++ b/UI/Views/IntroTutorialStatusExplanationView.xaml.cs	Mon Oct 28 08:16:34 2019 +0100
    23.3 @@ -0,0 +1,28 @@
    23.4 +using System;
    23.5 +using System.Collections.Generic;
    23.6 +using System.Linq;
    23.7 +using System.Text;
    23.8 +using System.Threading.Tasks;
    23.9 +using System.Windows;
   23.10 +using System.Windows.Controls;
   23.11 +using System.Windows.Data;
   23.12 +using System.Windows.Documents;
   23.13 +using System.Windows.Input;
   23.14 +using System.Windows.Media;
   23.15 +using System.Windows.Media.Imaging;
   23.16 +using System.Windows.Navigation;
   23.17 +using System.Windows.Shapes;
   23.18 +
   23.19 +namespace pEp.UI.Views
   23.20 +{
   23.21 +    /// <summary>
   23.22 +    /// Interaction logic for IntroTutorialStatusExplanationView.xaml
   23.23 +    /// </summary>
   23.24 +    public partial class IntroTutorialStatusExplanationView : UserControl
   23.25 +    {
   23.26 +        public IntroTutorialStatusExplanationView()
   23.27 +        {
   23.28 +            InitializeComponent();
   23.29 +        }
   23.30 +    }
   23.31 +}
    24.1 --- a/UI/Views/WizardGenericPageView.xaml	Thu Oct 24 11:54:07 2019 +0200
    24.2 +++ b/UI/Views/WizardGenericPageView.xaml	Mon Oct 28 08:16:34 2019 +0100
    24.3 @@ -3,7 +3,8 @@
    24.4               xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    24.5               xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    24.6               xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    24.7 -             mc:Ignorable="d">
    24.8 +             mc:Ignorable="d"
    24.9 +             Loaded="WizardGenericPageView_Loaded">
   24.10      <StackPanel>
   24.11  
   24.12          <!--Information section-->
   24.13 @@ -11,11 +12,12 @@
   24.14                     TextWrapping="Wrap"
   24.15                     Margin="5,5,5,15" />
   24.16  
   24.17 -        <Image Height="80"
   24.18 +        <Image Height="{Binding ImageHeight}"
   24.19 +               Width="{Binding ImageWidth}"
   24.20                 Stretch="Uniform"
   24.21                 VerticalAlignment="Stretch"
   24.22                 HorizontalAlignment="Center"
   24.23 -               Margin="0,0,15,0"
   24.24 +               Margin="15"
   24.25                 Source="{Binding Image}" />
   24.26  
   24.27      </StackPanel>
    25.1 --- a/UI/Views/WizardGenericPageView.xaml.cs	Thu Oct 24 11:54:07 2019 +0200
    25.2 +++ b/UI/Views/WizardGenericPageView.xaml.cs	Mon Oct 28 08:16:34 2019 +0100
    25.3 @@ -1,17 +1,8 @@
    25.4  using System;
    25.5 -using System.Collections.Generic;
    25.6 -using System.Linq;
    25.7 -using System.Text;
    25.8 -using System.Threading.Tasks;
    25.9  using System.Windows;
   25.10  using System.Windows.Controls;
   25.11 -using System.Windows.Data;
   25.12  using System.Windows.Documents;
   25.13 -using System.Windows.Input;
   25.14  using System.Windows.Media;
   25.15 -using System.Windows.Media.Imaging;
   25.16 -using System.Windows.Navigation;
   25.17 -using System.Windows.Shapes;
   25.18  
   25.19  namespace pEp.UI.Views
   25.20  {
   25.21 @@ -24,5 +15,42 @@
   25.22          {
   25.23              InitializeComponent();
   25.24          }
   25.25 +
   25.26 +        /// <summary>
   25.27 +        /// Event handler for when a generic wizard page is loaded.
   25.28 +        /// </summary>
   25.29 +        private void WizardGenericPageView_Loaded(object sender, RoutedEventArgs e)
   25.30 +        {
   25.31 +            /* Replace "p≡p" in the explanation string (if existing) with a green version of itself.
   25.32 +             * TODO: This is kind of ugly. The main reason for this solution is to be able to stay 
   25.33 +             * flexible for localized versions where the name might occur in other places than the first
   25.34 +             * position.
   25.35 +             */ 
   25.36 +            try
   25.37 +            {                
   25.38 +                string pEpName = "p≡p";
   25.39 +                TextBlock textBlock = (this.Content as StackPanel).Children[0] as TextBlock;
   25.40 +                string explanationText = textBlock.Text;
   25.41 +
   25.42 +                if (explanationText?.Contains(pEpName) == true)
   25.43 +                {
   25.44 +                    textBlock.Text = null;
   25.45 +                    string[] textArray = explanationText.Split(new string[] { pEpName }, StringSplitOptions.None);
   25.46 +                    for (int i = 0; i < textArray.Length; i++)
   25.47 +                    {
   25.48 +                        textBlock.Inlines.Add(new Run(textArray[i]));
   25.49 +
   25.50 +                        if (i < (textArray.Length - 1))
   25.51 +                        {
   25.52 +                            textBlock.Inlines.Add(new Run(pEpName) { Foreground = (Brush)(new BrushConverter()).ConvertFrom("#FF00AA2B") });
   25.53 +                        }
   25.54 +                    }
   25.55 +                }
   25.56 +            }
   25.57 +            catch (Exception ex)
   25.58 +            {
   25.59 +                Log.Error("WizardGenericPageView_Loaded: Error occured.  " + ex.ToString());
   25.60 +            }
   25.61 +        }
   25.62      }
   25.63  }
    26.1 --- a/UI/Views/WizardView.xaml	Thu Oct 24 11:54:07 2019 +0200
    26.2 +++ b/UI/Views/WizardView.xaml	Mon Oct 28 08:16:34 2019 +0100
    26.3 @@ -16,6 +16,12 @@
    26.4          <DataTemplate DataType="{x:Type vm:WizardHandshakePageViewModel}">
    26.5              <v:WizardPageView />
    26.6          </DataTemplate>
    26.7 +        <DataTemplate DataType="{x:Type vm:IntroTutorialHandshakeViewModel}">
    26.8 +            <v:IntroTutorialHandshakePageView />
    26.9 +        </DataTemplate>
   26.10 +        <DataTemplate DataType="{x:Type vm:IntroTutorialStatusExplanationViewModel}">
   26.11 +            <v:IntroTutorialStatusExplanationView />
   26.12 +        </DataTemplate>
   26.13      </UserControl.Resources>
   26.14  
   26.15      <StackPanel Margin="10"
    27.1 --- a/pEpForOutlook.csproj	Thu Oct 24 11:54:07 2019 +0200
    27.2 +++ b/pEpForOutlook.csproj	Mon Oct 28 08:16:34 2019 +0100
    27.3 @@ -442,6 +442,9 @@
    27.4      <Compile Include="UI\Models\SyncIdentity.cs" />
    27.5      <Compile Include="UI\ViewModels\DialogWindowViewModel.cs" />
    27.6      <Compile Include="UI\ViewModels\HandshakeDialogViewModel.cs" />
    27.7 +    <Compile Include="UI\ViewModels\IntroTutorialHandshakeViewModel.cs" />
    27.8 +    <Compile Include="UI\ViewModels\IntroTutorialStatusExplanationViewModel.cs" />
    27.9 +    <Compile Include="UI\ViewModels\IntroTutorialViewModel.cs" />
   27.10      <Compile Include="UI\ViewModels\WizardGenericPageViewModel.cs" />
   27.11      <Compile Include="UI\ViewModels\HandshakeViewModel.cs" />
   27.12      <Compile Include="UI\ViewModels\SyncWizardViewModel.cs" />
   27.13 @@ -494,6 +497,12 @@
   27.14      <Compile Include="UI\Views\HandshakeView.xaml.cs">
   27.15        <DependentUpon>HandshakeView.xaml</DependentUpon>
   27.16      </Compile>
   27.17 +    <Compile Include="UI\Views\IntroTutorialHandshakePageView.xaml.cs">
   27.18 +      <DependentUpon>IntroTutorialHandshakePageView.xaml</DependentUpon>
   27.19 +    </Compile>
   27.20 +    <Compile Include="UI\Views\IntroTutorialStatusExplanationView.xaml.cs">
   27.21 +      <DependentUpon>IntroTutorialStatusExplanationView.xaml</DependentUpon>
   27.22 +    </Compile>
   27.23      <Compile Include="UI\Views\WizardGenericPageView.xaml.cs">
   27.24        <DependentUpon>WizardGenericPageView.xaml</DependentUpon>
   27.25      </Compile>
   27.26 @@ -613,6 +622,8 @@
   27.27      <Resource Include="Resources\ImagePrivacyStatusYellowInvert.png" />
   27.28      <Resource Include="Resources\ImageIconDeviceGroup.png" />
   27.29      <Resource Include="Resources\ImageIconDeviceGroup2.png" />
   27.30 +    <Resource Include="Resources\ImageIntroTutorialPrivacyStatusExpanded.png" />
   27.31 +    <Resource Include="Resources\ImageIntroTutorialTrustwords.png" />
   27.32      <Content Include="Resources\ImageReaderSplash.png" />
   27.33      <Content Include="Resources\ImageUpgradePEP.png" />
   27.34      <Resource Include="Resources\ImageNeverUnsecureOff.png" />
   27.35 @@ -668,6 +679,14 @@
   27.36        <SubType>Designer</SubType>
   27.37        <Generator>MSBuild:Compile</Generator>
   27.38      </Page>
   27.39 +    <Page Include="UI\Views\IntroTutorialHandshakePageView.xaml">
   27.40 +      <SubType>Designer</SubType>
   27.41 +      <Generator>MSBuild:Compile</Generator>
   27.42 +    </Page>
   27.43 +    <Page Include="UI\Views\IntroTutorialStatusExplanationView.xaml">
   27.44 +      <SubType>Designer</SubType>
   27.45 +      <Generator>MSBuild:Compile</Generator>
   27.46 +    </Page>
   27.47      <Page Include="UI\Views\WizardGenericPageView.xaml">
   27.48        <SubType>Designer</SubType>
   27.49        <Generator>MSBuild:Compile</Generator>