chromium/ios/chrome/app/spotlight/spotlight_logger.mm

// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#import "ios/chrome/app/spotlight/spotlight_logger.h"

#import <UIKit/UIKit.h>

#import "base/debug/dump_without_crashing.h"
#import "base/metrics/histogram_macros.h"
#import "ios/chrome/browser/shared/public/features/system_flags.h"

namespace {

NSString* kSpotlightDebuggerErrorLogKey = @"SpotlightDebuggerErrorLogKey";

}  // namespace

@implementation SpotlightLogger

+ (instancetype)sharedLogger {
  // Read this flag once; if it changes while the app is running, don't start
  // logging.
  static BOOL debuggingEnabled =
      experimental_flags::IsSpotlightDebuggingEnabled();
  if (!debuggingEnabled) {
    return nil;
  }

  static SpotlightLogger* sharedLogger = [[SpotlightLogger alloc] init];
  return sharedLogger;
}

- (void)logSpotlightError:(NSError*)error {
  NSArray* errorLog = [[NSUserDefaults standardUserDefaults]
      objectForKey:kSpotlightDebuggerErrorLogKey];

  NSMutableArray* mutableErrorLog = [[NSMutableArray alloc] init];
  if (errorLog) {
    [mutableErrorLog addObjectsFromArray:errorLog];
  }

  [[NSUserDefaults standardUserDefaults]
      setObject:mutableErrorLog
         forKey:kSpotlightDebuggerErrorLogKey];

  [self showAlertImmediately:error.localizedDescription];
}

+ (void)logSpotlightError:(NSError*)error {
  UMA_HISTOGRAM_SPARSE("IOSSpotlightErrorCode", error.code);
  if (error) {
    [[self sharedLogger] logSpotlightError:error];
  }
}

#pragma mark - internal

- (void)showAlertImmediately:(NSString*)errorMessage {
  UIAlertController* alert =
      [UIAlertController alertControllerWithTitle:@"Spotlight Error"
                                          message:errorMessage
                                   preferredStyle:UIAlertControllerStyleAlert];
  [alert addAction:[UIAlertAction actionWithTitle:@"OK"
                                            style:UIAlertActionStyleDefault
                                          handler:nil]];
  UIWindowScene* scene = (UIWindowScene*)
      [UIApplication.sharedApplication.connectedScenes anyObject];

  [scene.windows[0].rootViewController presentViewController:alert
                                                    animated:YES
                                                  completion:nil];
}

@end