sources/Google.Solutions.IapDesktop.Application/Windows/Options/GeneralOptionsViewModel.cs (86 lines of code) (raw):
//
// Copyright 2020 Google LLC
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
using Google.Solutions.Common;
using Google.Solutions.IapDesktop.Application.Client;
using Google.Solutions.IapDesktop.Application.Data;
using Google.Solutions.IapDesktop.Application.Diagnostics;
using Google.Solutions.IapDesktop.Application.Host;
using Google.Solutions.IapDesktop.Application.Profile.Settings;
using Google.Solutions.Mvvm.Binding;
using Google.Solutions.Mvvm.Binding.Commands;
using Google.Solutions.Platform.Net;
using Google.Solutions.Settings.Collection;
using System;
using System.Reflection;
namespace Google.Solutions.IapDesktop.Application.Windows.Options
{
internal class GeneralOptionsViewModel : OptionsViewModelBase<IApplicationSettings>
{
private readonly IBrowserProtocolRegistry protocolRegistry;
public GeneralOptionsViewModel(
IRepository<IApplicationSettings> settingsRepository,
IBrowserProtocolRegistry protocolRegistry,
HelpClient helpService)
: base("General", settingsRepository)
{
var settings = settingsRepository.GetSettings();
this.protocolRegistry = protocolRegistry;
this.OpenBrowserIntegrationHelp = ObservableCommand.Build(
string.Empty,
() => helpService.OpenTopic(HelpTopics.BrowserIntegration));
this.OpenTelemetryHelp = ObservableCommand.Build(
string.Empty,
() => helpService.OpenTopic(HelpTopics.Privacy));
this.IsUpdateCheckEditable = ObservableProperty.Build(
!settings.IsUpdateCheckEnabled.IsReadOnly);
this.IsUpdateCheckEnabled = ObservableProperty.Build(
settings.IsUpdateCheckEnabled.Value);
this.IsBrowserIntegrationEnabled = ObservableProperty.Build(
this.protocolRegistry.IsRegistered(
IapRdpUrl.Scheme,
ExecutableLocation));
this.IsTelemetryEditable = ObservableProperty.Build(
!settings.IsTelemetryEnabled.IsReadOnly);
this.IsTelemetryEnabled = ObservableProperty.Build(
settings.IsTelemetryEnabled.Value);
this.LastUpdateCheck = settings.LastUpdateCheck.IsDefault
? "never"
: DateTime
.FromBinary(settings.LastUpdateCheck.Value)
.ToLocalTime()
.ToString();
MarkDirtyWhenPropertyChanges(this.IsUpdateCheckEnabled);
MarkDirtyWhenPropertyChanges(this.IsBrowserIntegrationEnabled);
MarkDirtyWhenPropertyChanges(this.IsTelemetryEnabled);
base.OnInitializationCompleted();
}
protected override void Save(IApplicationSettings settings)
{
settings.IsUpdateCheckEnabled.Value = this.IsUpdateCheckEnabled.Value;
settings.IsTelemetryEnabled.Value = this.IsTelemetryEnabled.Value;
//
// Update protocol registration.
//
if (this.IsBrowserIntegrationEnabled.Value)
{
this.protocolRegistry.Register(
IapRdpUrl.Scheme,
Install.ProductName,
ExecutableLocation);
}
else
{
this.protocolRegistry.Unregister(IapRdpUrl.Scheme);
}
//
// Apply telemetry settings so that we don't have
// to relaunch.
//
TelemetryLog.Current.Enabled = this.IsTelemetryEnabled.Value;
}
private static string ExecutableLocation
{
//
// NB. GetEntryAssembly returns the .exe, but this does not work during tests.
//
get => (Assembly.GetEntryAssembly() ?? Assembly.GetExecutingAssembly()).Location;
}
//---------------------------------------------------------------------
// Observable command.
//---------------------------------------------------------------------
public ObservableCommand OpenBrowserIntegrationHelp { get; }
public ObservableCommand OpenTelemetryHelp { get; }
//---------------------------------------------------------------------
// Observable properties.
//---------------------------------------------------------------------
public ObservableProperty<bool> IsUpdateCheckEditable { get; }
public ObservableProperty<bool> IsUpdateCheckEnabled { get; }
public ObservableProperty<bool> IsBrowserIntegrationEnabled { get; }
public string LastUpdateCheck { get; private set; }
public ObservableProperty<bool> IsTelemetryEditable { get; }
public ObservableProperty<bool> IsTelemetryEnabled { get; }
}
}