blob: bda656256230bb78d6805a1b3a5d944f4a20fc53 [file] [log] [blame]
// Copyright 2024 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/browser/drive/model/drive_list.h"
#import "base/notreached.h"
#import "ios/chrome/browser/shared/ui/symbols/symbols.h"
namespace {
// The size of the drive file picker item icon.
constexpr CGFloat kDriveFilePickerItemIconSize = 18;
// Prefix of MIME types associated with images.
NSString* kImageMIMETypePrefix = @"image/";
// Prefix of the icon link for shortcuts.
NSString* kShortcutImageLinkPrefix =
@"https://drive-thirdparty.googleusercontent.com/64/type/";
// Prefix of links to icons in the Drive third-party icon repository.
NSString* kDriveIconRepositoryPrefix =
@"https://drive-thirdparty.googleusercontent.com/";
// MIME type for folder items.
NSString* kFolderMIMEType = @"application/vnd.google-apps.folder";
} // namespace
#pragma mark - DriveItem
DriveItem::DriveItem() = default;
DriveItem::DriveItem(const DriveItem& other) : DriveItem() {
*this = other;
}
DriveItem::DriveItem(DriveItem&& other) : DriveItem() {
*this = std::move(other);
}
DriveItem::~DriveItem() = default;
DriveItem& DriveItem::operator=(const DriveItem& other) {
identifier = [other.identifier copy];
name = [other.name copy];
icon_link = [other.icon_link copy];
thumbnail_link = [other.thumbnail_link copy];
background_image_link = [other.background_image_link copy];
created_time = other.created_time;
modified_time = other.modified_time;
modified_by_me_time = other.modified_by_me_time;
viewed_by_me_time = other.viewed_by_me_time;
shared_with_me_time = other.shared_with_me_time;
parent_identifier = [other.parent_identifier copy];
is_shortcut = other.is_shortcut;
shortcut_target_identifier = [other.shortcut_target_identifier copy];
shortcut_target_mime_type = [other.shortcut_target_mime_type copy];
is_shared_drive = other.is_shared_drive;
is_folder = other.is_folder;
mime_type = [other.mime_type copy];
size = other.size;
can_download = other.can_download;
md5_checksum = [other.md5_checksum copy];
return *this;
}
DriveItem& DriveItem::operator=(DriveItem&& other) {
std::swap(identifier, other.identifier);
std::swap(name, other.name);
std::swap(icon_link, other.icon_link);
std::swap(thumbnail_link, other.thumbnail_link);
std::swap(background_image_link, other.background_image_link);
std::swap(created_time, other.created_time);
std::swap(modified_time, other.modified_time);
std::swap(modified_by_me_time, other.modified_by_me_time);
std::swap(viewed_by_me_time, other.viewed_by_me_time);
std::swap(shared_with_me_time, other.shared_with_me_time);
std::swap(parent_identifier, other.parent_identifier);
std::swap(is_shortcut, other.is_shortcut);
std::swap(shortcut_target_identifier, other.shortcut_target_identifier);
std::swap(shortcut_target_mime_type, other.shortcut_target_mime_type);
std::swap(is_shared_drive, other.is_shared_drive);
std::swap(is_folder, other.is_folder);
std::swap(mime_type, other.mime_type);
std::swap(size, other.size);
std::swap(can_download, other.can_download);
std::swap(md5_checksum, other.md5_checksum);
return *this;
}
bool DriveItem::CanBeBrowsed() const {
return is_folder || is_shared_drive ||
(is_shortcut &&
[shortcut_target_mime_type isEqualToString:kFolderMIMEType]);
}
UIImage* DriveItem::GetPlaceholderImage() const {
if (is_shared_drive) {
return CustomSymbolWithPointSize(kSharedDrivesSymbol,
kDriveFilePickerItemIconSize);
} else if (is_folder) {
return DefaultSymbolWithPointSize(kFolderSymbol,
kDriveFilePickerItemIconSize);
} else if (is_shortcut) {
return DefaultSymbolWithPointSize(kArrowUTurnForwardSymbol,
kDriveFilePickerItemIconSize);
} else {
return DefaultSymbolWithPointSize(kDocSymbol, kDriveFilePickerItemIconSize);
}
}
DriveItem::ImageType DriveItem::GetImageType() const {
if (is_shared_drive) {
// If this is a shared drive, the background image link should be fetched.
return ImageType::kBackground;
} else if ([mime_type hasPrefix:kImageMIMETypePrefix] && thumbnail_link) {
return ImageType::kThumbnail;
} else if (is_shortcut && shortcut_target_mime_type) {
return ImageType::kShortcut;
}
// Otherwise the icon link should be fetched.
return ImageType::kIcon;
}
NSString* DriveItem::GetImageLink() const {
switch (GetImageType()) {
case ImageType::kIcon: {
// By default drive api provides a 16 resolution icons, replacing 16 by 64
// in the icon URLs provide better sized icons e.g. the URL
// https://drive-thirdparty.googleusercontent.com/16/type/video/mp4
// becomes
// https://drive-thirdparty.googleusercontent.com/64/type/video/mp4
NSString* target =
[kDriveIconRepositoryPrefix stringByAppendingString:@"16"];
NSString* replacement =
[kDriveIconRepositoryPrefix stringByAppendingString:@"64"];
return [icon_link stringByReplacingOccurrencesOfString:target
withString:replacement];
}
case ImageType::kThumbnail:
return thumbnail_link;
case ImageType::kBackground:
return background_image_link;
case ImageType::kShortcut:
// Icon links are expected to have the following format:
// https://drive-thirdparty.googleusercontent.com/64/type/<MIME type>
return [kShortcutImageLinkPrefix
stringByAppendingString:shortcut_target_mime_type];
}
}
#pragma mark - DriveListResult
DriveListResult::DriveListResult() = default;
DriveListResult::DriveListResult(const DriveListResult& other)
: DriveListResult() {
*this = other;
}
DriveListResult::DriveListResult(DriveListResult&& other) : DriveListResult() {
*this = std::move(other);
}
DriveListResult::~DriveListResult() = default;
DriveListResult& DriveListResult::operator=(const DriveListResult& other) {
items = other.items;
next_page_token = [other.next_page_token copy];
error = [other.error copy];
return *this;
}
DriveListResult& DriveListResult::operator=(DriveListResult&& other) {
std::swap(items, other.items);
std::swap(next_page_token, other.next_page_token);
std::swap(error, other.error);
return *this;
}
#pragma mark - DriveList
DriveList::DriveList() = default;
DriveList::~DriveList() = default;
void DriveList::ListItems(const DriveListQuery& query,
DriveListCompletionCallback completion_callback) {
NOTREACHED();
}
void DriveList::ListFiles(const DriveListQuery& query,
DriveListCompletionCallback completion_callback) {
ListItems(query, std::move(completion_callback));
}
void DriveList::ListSharedDrives(
const DriveListQuery& query,
DriveListCompletionCallback completion_callback) {
NOTREACHED();
}