add:Dlass遥测

This commit is contained in:
2026-02-06 23:54:33 +08:00
parent afcc8050ce
commit 5601f72d59
4 changed files with 264 additions and 20 deletions
+14 -1
View File
@@ -3898,7 +3898,20 @@
<Line X1="0" Y1="0" X2="460" Y2="0" Stroke="#3f3f46"
StrokeThickness="1" Margin="0,6,0,6" />
<ui:SimpleStackPanel Orientation="Horizontal" HorizontalAlignment="Left">
<CheckBox x:Name="CheckBoxTelemetryPrivacyAccepted"
Margin="0,0,0,2"
Foreground="#a1a1aa"
FontSize="12"
Checked="CheckBoxTelemetryPrivacyAccepted_Checked"
Unchecked="CheckBoxTelemetryPrivacyAccepted_Checked">
<TextBlock>
<Run Text="我已阅读并同意 " />
<Run Text="privacy" FontWeight="Bold" />
<Run Text=" 中的隐私说明" />
</TextBlock>
</CheckBox>
<ui:SimpleStackPanel Orientation="Horizontal" HorizontalAlignment="Left" Margin="0,2,0,0">
<TextBlock Text="匿名使用数据上传:" Foreground="#a1a1aa" FontSize="12"
VerticalAlignment="Center" />
<ComboBox x:Name="ComboBoxTelemetryUploadLevel"
+224 -3
View File
@@ -31,31 +31,218 @@ namespace Ink_Canvas
#region Behavior
private bool _isChangingUpdateChannelInternally;
private bool _isChangingTelemetryInternally;
private bool _isChangingTelemetryPrivacyInternally;
private void ComboBoxTelemetryUploadLevel_SelectionChanged(object sender, RoutedEventArgs e)
{
if (!isLoaded) return;
if (_isChangingTelemetryInternally) return;
var oldLevel = Settings.Startup.TelemetryUploadLevel;
var item = ComboBoxTelemetryUploadLevel?.SelectedItem as ComboBoxItem;
if (item == null) return;
var tag = item.Tag?.ToString() ?? "0";
var newLevel = TelemetryUploadLevel.None;
switch (tag)
{
case "1":
Settings.Startup.TelemetryUploadLevel = TelemetryUploadLevel.Basic;
newLevel = TelemetryUploadLevel.Basic;
break;
case "2":
Settings.Startup.TelemetryUploadLevel = TelemetryUploadLevel.Extended;
newLevel = TelemetryUploadLevel.Extended;
break;
default:
Settings.Startup.TelemetryUploadLevel = TelemetryUploadLevel.None;
newLevel = TelemetryUploadLevel.None;
break;
}
// 关闭遥测时:若当前处于 Preview/Beta 通道,则提示用户将切回正式通道
if (newLevel == TelemetryUploadLevel.None &&
oldLevel != TelemetryUploadLevel.None &&
Settings.Startup.UpdateChannel != UpdateChannel.Release)
{
var result = MessageBox.Show(
"关闭匿名使用数据上传后,将无法继续使用预览/测试通道,系统会自动切换回正式通道(Release)。\n\n是否确认关闭?",
"确认关闭遥测",
MessageBoxButton.YesNo,
MessageBoxImage.Warning);
if (result != MessageBoxResult.Yes)
{
// 回滚下拉框选择
_isChangingTelemetryInternally = true;
try
{
int idx = 0;
switch (oldLevel)
{
case TelemetryUploadLevel.Basic:
idx = 1;
break;
case TelemetryUploadLevel.Extended:
idx = 2;
break;
default:
idx = 0;
break;
}
ComboBoxTelemetryUploadLevel.SelectedIndex = idx;
}
finally
{
_isChangingTelemetryInternally = false;
}
return;
}
// 用户确认关闭:切回正式通道
_isChangingUpdateChannelInternally = true;
try
{
Settings.Startup.UpdateChannel = UpdateChannel.Release;
DeviceIdentifier.UpdateUsageChannel(UpdateChannel.Release);
if (UpdateChannelSelector != null)
{
foreach (var u in UpdateChannelSelector.Items)
{
var rb = u as RadioButton;
if (rb != null && rb.Tag != null && rb.Tag.ToString() == "Release")
{
rb.IsChecked = true;
break;
}
}
}
}
finally
{
_isChangingUpdateChannelInternally = false;
}
}
if (newLevel != TelemetryUploadLevel.None && !Settings.Startup.HasAcceptedTelemetryPrivacy)
{
MessageBox.Show(
"在开启匿名使用数据上传前,请先阅读并勾选上方的隐私说明。",
"需要同意隐私说明",
MessageBoxButton.OK,
MessageBoxImage.Warning);
_isChangingTelemetryInternally = true;
try
{
Settings.Startup.TelemetryUploadLevel = TelemetryUploadLevel.None;
if (ComboBoxTelemetryUploadLevel != null)
{
ComboBoxTelemetryUploadLevel.SelectedIndex = 0;
}
}
finally
{
_isChangingTelemetryInternally = false;
}
return;
}
Settings.Startup.TelemetryUploadLevel = newLevel;
SaveSettingsToFile();
ShowNotification("匿名使用数据上传设置已保存");
}
private void CheckBoxTelemetryPrivacyAccepted_Checked(object sender, RoutedEventArgs e)
{
if (!isLoaded) return;
if (_isChangingTelemetryPrivacyInternally) return;
bool isChecked = CheckBoxTelemetryPrivacyAccepted.IsChecked == true;
if (isChecked)
{
// 读取 privacy 文本并展示给用户二次确认
string privacyText = null;
try
{
string pathTxt = System.IO.Path.Combine(App.RootPath, "privacy.txt");
string pathNoExt = System.IO.Path.Combine(App.RootPath, "privacy");
if (System.IO.File.Exists(pathTxt))
{
privacyText = System.IO.File.ReadAllText(pathTxt);
}
else if (System.IO.File.Exists(pathNoExt))
{
privacyText = System.IO.File.ReadAllText(pathNoExt);
}
}
catch (Exception ex)
{
LogHelper.WriteLogToFile($"Settings | 读取隐私说明失败: {ex.Message}", LogHelper.LogType.Warning);
}
if (string.IsNullOrWhiteSpace(privacyText))
{
MessageBox.Show(
"未找到隐私说明文件(privacy / privacy.txt),暂时无法启用匿名使用数据上传。",
"隐私说明缺失",
MessageBoxButton.OK,
MessageBoxImage.Warning);
_isChangingTelemetryPrivacyInternally = true;
try
{
CheckBoxTelemetryPrivacyAccepted.IsChecked = false;
}
finally
{
_isChangingTelemetryPrivacyInternally = false;
}
Settings.Startup.HasAcceptedTelemetryPrivacy = false;
SaveSettingsToFile();
return;
}
var result = MessageBox.Show(
privacyText + "\n\n是否同意以上隐私说明并启用匿名使用数据上传?",
"隐私说明确认",
MessageBoxButton.YesNo,
MessageBoxImage.Information,
MessageBoxResult.No);
if (result != MessageBoxResult.Yes)
{
// 用户不同意,取消勾选
_isChangingTelemetryPrivacyInternally = true;
try
{
CheckBoxTelemetryPrivacyAccepted.IsChecked = false;
}
finally
{
_isChangingTelemetryPrivacyInternally = false;
}
Settings.Startup.HasAcceptedTelemetryPrivacy = false;
SaveSettingsToFile();
return;
}
// 同意隐私说明
Settings.Startup.HasAcceptedTelemetryPrivacy = true;
SaveSettingsToFile();
}
else
{
// 用户主动取消勾选,关闭隐私同意
Settings.Startup.HasAcceptedTelemetryPrivacy = false;
SaveSettingsToFile();
}
}
private void ToggleSwitchIsAutoUpdate_Toggled(object sender, RoutedEventArgs e)
{
if (!isLoaded) return;
@@ -3960,6 +4147,40 @@ namespace Ink_Canvas
}
bool isTestChannel = newChannel == UpdateChannel.Preview || newChannel == UpdateChannel.Beta;
if (isTestChannel && !Settings.Startup.HasAcceptedTelemetryPrivacy)
{
MessageBox.Show(
"加入预览 / 测试通道前,请先在关于页面勾选“我已阅读并同意 privacy 中的隐私说明”。",
"需要同意隐私说明",
MessageBoxButton.OK,
MessageBoxImage.Warning);
_isChangingUpdateChannelInternally = true;
try
{
Settings.Startup.UpdateChannel = oldChannel;
if (UpdateChannelSelector != null)
{
foreach (var item in UpdateChannelSelector.Items)
{
if (item is RadioButton rb && rb.Tag != null &&
string.Equals(rb.Tag.ToString(), oldChannel.ToString(), StringComparison.OrdinalIgnoreCase))
{
rb.IsChecked = true;
break;
}
}
}
}
finally
{
_isChangingUpdateChannelInternally = false;
}
LogHelper.WriteLogToFile("Settings | User not accepted privacy, reverted update channel");
return;
}
if (isTestChannel && Settings.Startup.TelemetryUploadLevel == TelemetryUploadLevel.None)
{
var result = MessageBox.Show(
+24 -16
View File
@@ -144,26 +144,34 @@ namespace Ink_Canvas
try
{
if (ComboBoxTelemetryUploadLevel != null && Settings?.Startup != null)
if (Settings?.Startup != null)
{
int idx = 0;
switch (Settings.Startup.TelemetryUploadLevel)
if (ComboBoxTelemetryUploadLevel != null)
{
case TelemetryUploadLevel.None:
idx = 0;
break;
case TelemetryUploadLevel.Basic:
idx = 1;
break;
case TelemetryUploadLevel.Extended:
idx = 2;
break;
default:
idx = 0;
break;
int idx = 0;
switch (Settings.Startup.TelemetryUploadLevel)
{
case TelemetryUploadLevel.None:
idx = 0;
break;
case TelemetryUploadLevel.Basic:
idx = 1;
break;
case TelemetryUploadLevel.Extended:
idx = 2;
break;
default:
idx = 0;
break;
}
ComboBoxTelemetryUploadLevel.SelectedIndex = idx;
}
ComboBoxTelemetryUploadLevel.SelectedIndex = idx;
if (CheckBoxTelemetryPrivacyAccepted != null)
{
CheckBoxTelemetryPrivacyAccepted.IsChecked = Settings.Startup.HasAcceptedTelemetryPrivacy;
}
}
}
catch
+2
View File
@@ -189,6 +189,8 @@ namespace Ink_Canvas
public int CrashAction { get; set; }
[JsonProperty("telemetryUploadLevel")]
public TelemetryUploadLevel TelemetryUploadLevel { get; set; } = TelemetryUploadLevel.None;
[JsonProperty("hasAcceptedTelemetryPrivacy")]
public bool HasAcceptedTelemetryPrivacy { get; set; } = false;
}
public class Appearance