chromium/chrome/services/mac_notifications/mac_notification_service_utils.mm

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

#import "chrome/services/mac_notifications/mac_notification_service_utils.h"

#include "base/strings/strcat.h"
#include "base/strings/sys_string_conversions.h"

namespace mac_notifications {

NSDictionary* GetMacNotificationUserInfo(
    const mojom::NotificationPtr& notification) {
  const mojom::NotificationMetadataPtr& meta = notification->meta;
  NSString* notification_id = base::SysUTF8ToNSString(meta->id->id);
  NSString* profile_id = base::SysUTF8ToNSString(meta->id->profile->id);
  NSNumber* incognito = [NSNumber numberWithBool:meta->id->profile->incognito];

  NSString* origin_url = base::SysUTF8ToNSString(meta->origin_url.spec());
  NSNumber* type = @(meta->type);
  NSString* user_data_dir = base::SysUTF8ToNSString(meta->user_data_dir);
  NSNumber* settings_button =
      [NSNumber numberWithBool:notification->show_settings_button];

  return @{
    kNotificationId : notification_id,
    kNotificationProfileId : profile_id,
    kNotificationIncognito : incognito,
    kNotificationOrigin : origin_url,
    kNotificationType : type,
    kNotificationUserDataDir : user_data_dir,
    kNotificationHasSettingsButton : settings_button,
  };
}

mojom::NotificationMetadataPtr GetMacNotificationMetadata(
    NSDictionary* user_info) {
  NSString* notification_id_ns = [user_info objectForKey:kNotificationId];
  NSString* profile_id_ns = [user_info objectForKey:kNotificationProfileId];
  BOOL incognito = [[user_info objectForKey:kNotificationIncognito] boolValue];

  auto profile_id = mojom::ProfileIdentifier::New(
      base::SysNSStringToUTF8(profile_id_ns), incognito);
  auto notification_id = mojom::NotificationIdentifier::New(
      base::SysNSStringToUTF8(notification_id_ns), std::move(profile_id));

  int type = [[user_info objectForKey:kNotificationType] intValue];
  NSString* origin_url_ns = [user_info objectForKey:kNotificationOrigin];
  NSString* user_data_dir_ns =
      [user_info objectForKey:kNotificationUserDataDir];

  return mojom::NotificationMetadata::New(
      std::move(notification_id), type,
      GURL(base::SysNSStringToUTF8(origin_url_ns)),
      base::SysNSStringToUTF8(user_data_dir_ns));
}

std::string DeriveMacNotificationId(
    const mojom::NotificationIdentifierPtr& identifier) {
  // i: incognito, r: regular profile
  return base::StrCat({identifier->profile->incognito ? "i" : "r", "|",
                       identifier->profile->id, "|", identifier->id});
}

NSString* const kNotificationButtonOne = @"buttonOne";
NSString* const kNotificationButtonTwo = @"buttonTwo";
NSString* const kNotificationCloseButtonTag = @"closeButton";
NSString* const kNotificationHasSettingsButton =
    @"notificationHasSettingsButton";
NSString* const kNotificationId = @"notificationId";
NSString* const kNotificationIncognito = @"notificationIncognito";
NSString* const kNotificationOrigin = @"notificationOrigin";
NSString* const kNotificationProfileId = @"notificationProfileId";
NSString* const kNotificationSettingsButtonTag = @"settingsButton";
NSString* const kNotificationType = @"notificationType";
NSString* const kNotificationUserDataDir = @"notificationUserDataDir";

}  // namespace mac_notifications