From 2821cb36b5ea3c8d0b490c60a20d7177a3264bf2 Mon Sep 17 00:00:00 2001 From: Christopher Snowhill Date: Tue, 21 Jun 2022 19:01:06 -0700 Subject: [PATCH] [Crashlytics] Require asking user consent Require asking user consent for data transmission on first launch, or otherwise disable sending crash reports by default. Signed-off-by: Christopher Snowhill --- Application/AppController.m | 13 +++++++--- Audio/PluginController.mm | 2 ++ Info.plist | 2 ++ .../Preferences/Base.lproj/Preferences.xib | 17 ++++++++++--- Window/MainWindow.m | 25 +++++++++++++++++++ Window/MiniWindow.m | 6 +++++ en.lproj/Localizable.strings | 5 ++++ es.lproj/Localizable.strings | 5 ++++ 8 files changed, 68 insertions(+), 7 deletions(-) diff --git a/Application/AppController.m b/Application/AppController.m index e0bf3c997..e6ad5df26 100644 --- a/Application/AppController.m +++ b/Application/AppController.m @@ -147,8 +147,9 @@ BOOL kAppControllerShuttingDown = NO; [[NSUserDefaults standardUserDefaults] registerDefaults:@{ @"NSApplicationCrashOnExceptions": @(YES) }]; [FIRApp configure]; - [FIRAnalytics setAnalyticsCollectionEnabled:YES]; - + + [[NSUserDefaultsController sharedUserDefaultsController] addObserver:self forKeyPath:@"values.crashlyticsConsented" options:(NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew) context:kAppControllerContext]; + [[totalTimeField cell] setBackgroundStyle:NSBackgroundStyleRaised]; [self.infoButton setToolTip:NSLocalizedString(@"InfoButtonTooltip", @"")]; @@ -284,8 +285,12 @@ BOOL kAppControllerShuttingDown = NO; if(context != kAppControllerContext) { return; } - - if([keyPath isEqualToString:@"playlistController.currentEntry"]) { + + if([keyPath isEqualToString:@"values.crashlyticsConsented"]) { + BOOL enabled = [[NSUserDefaults standardUserDefaults] boolForKey:@"crashlyticsConsented"]; + [[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:enabled]; + [FIRAnalytics setAnalyticsCollectionEnabled:enabled]; + } else if([keyPath isEqualToString:@"playlistController.currentEntry"]) { PlaylistEntry *entry = playlistController.currentEntry; NSString *appTitle = NSLocalizedString(@"CogTitle", @""); if(!entry) { diff --git a/Audio/PluginController.mm b/Audio/PluginController.mm index c04f7d0f0..799f518b7 100644 --- a/Audio/PluginController.mm +++ b/Audio/PluginController.mm @@ -375,6 +375,8 @@ static NSString *xmlEscapeString(NSString * string) { \n\ \n\ \n\ +\tFirebaseCrashlyticsCollectionEnabled\n\ +\t\n\ \tSUEnableInstallerLauncherService\n\ \t\n\ \tCFBundleDevelopmentRegion\n\ diff --git a/Info.plist b/Info.plist index f212449f6..673c5ae26 100644 --- a/Info.plist +++ b/Info.plist @@ -2,6 +2,8 @@ + FirebaseCrashlyticsCollectionEnabled + SUEnableInstallerLauncherService CFBundleDevelopmentRegion diff --git a/Preferences/Preferences/Base.lproj/Preferences.xib b/Preferences/Preferences/Base.lproj/Preferences.xib index 1c4326df1..3c0b62c5c 100644 --- a/Preferences/Preferences/Base.lproj/Preferences.xib +++ b/Preferences/Preferences/Base.lproj/Preferences.xib @@ -402,11 +402,11 @@ - + + @@ -534,7 +545,7 @@ - + diff --git a/Window/MainWindow.m b/Window/MainWindow.m index 13166e65b..094fca788 100644 --- a/Window/MainWindow.m +++ b/Window/MainWindow.m @@ -8,6 +8,27 @@ #import "MainWindow.h" +void showCrashlyticsConsent(NSWindow *window) { + BOOL askedConsent = [[NSUserDefaults standardUserDefaults] boolForKey:@"crashlyticsAskedConsent"]; + if(!askedConsent) { + [window orderFront:window]; + + NSAlert *alert = [[NSAlert alloc] init]; + [alert setMessageText:NSLocalizedString(@"CrashlyticsConsentTitle", @"")]; + [alert setInformativeText:NSLocalizedString(@"CrashlyticsConsentText", @"")]; + [alert addButtonWithTitle:NSLocalizedString(@"ConsentYes",@"")]; + [alert addButtonWithTitle:NSLocalizedString(@"ConsentNo", @"")]; + + [alert beginSheetModalForWindow:window completionHandler:^(NSModalResponse returnCode) { + if(returnCode == NSAlertFirstButtonReturn) { + [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"crashlyticsConsented"]; + } + }]; + + [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"crashlyticsAskedConsent"]; + } +} + @implementation MainWindow - (id)initWithContentRect:(NSRect)contentRect styleMask:(NSWindowStyleMask)windowStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)deferCreation { @@ -27,6 +48,10 @@ hdcdLogo = [NSImage imageNamed:@"hdcdLogoTemplate"]; [self showHDCDLogo:NO]; + + if(![[NSUserDefaults standardUserDefaults] boolForKey:@"miniMode"]) { + showCrashlyticsConsent(self); + } } - (void)showHDCDLogo:(BOOL)show { diff --git a/Window/MiniWindow.m b/Window/MiniWindow.m index 04f6ea39a..c92c0548f 100644 --- a/Window/MiniWindow.m +++ b/Window/MiniWindow.m @@ -12,6 +12,8 @@ extern NSString *iTunesDropType; +extern void showCrashlyticsConsent(NSWindow *window); + @implementation MiniWindow - (id)initWithContentRect:(NSRect)contentRect styleMask:(NSWindowStyleMask)windowStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)deferCreation { @@ -46,6 +48,10 @@ extern NSString *iTunesDropType; fileType = NSFilenamesPboardType; } [self registerForDraggedTypes:@[fileType, iTunesDropType]]; + + if([[NSUserDefaults standardUserDefaults] boolForKey:@"miniMode"]) { + showCrashlyticsConsent(self); + } } - (void)toggleToolbarShown:(id)sender { diff --git a/en.lproj/Localizable.strings b/en.lproj/Localizable.strings index 42cde3302..f833d21df 100644 --- a/en.lproj/Localizable.strings +++ b/en.lproj/Localizable.strings @@ -74,3 +74,8 @@ "GainTrackPeak" = "Track Peak"; "GainVolumeScale" = "Volume Scale"; "GainNone" = "None"; + +"CrashlyticsConsentTitle" = "Crashlytics crash collection"; +"CrashlyticsConsentText" = "Would you like to allow Crashlytics to submit crash reports? You may turn this off again in Preferences. We won't ask you again."; +"ConsentYes" = "Yes"; +"ConsentNo" = "No"; diff --git a/es.lproj/Localizable.strings b/es.lproj/Localizable.strings index 42cde3302..f833d21df 100644 --- a/es.lproj/Localizable.strings +++ b/es.lproj/Localizable.strings @@ -74,3 +74,8 @@ "GainTrackPeak" = "Track Peak"; "GainVolumeScale" = "Volume Scale"; "GainNone" = "None"; + +"CrashlyticsConsentTitle" = "Crashlytics crash collection"; +"CrashlyticsConsentText" = "Would you like to allow Crashlytics to submit crash reports? You may turn this off again in Preferences. We won't ask you again."; +"ConsentYes" = "Yes"; +"ConsentNo" = "No";