Avi Drissman | 4a8573c | 2022-09-09 19:35:54 | [diff] [blame] | 1 | // Copyright 2017 The Chromium Authors |
Shuhei Takahashi | b1f9a9c | 2017-08-17 07:44:10 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
Yeunjoo Choi | ef8a4a4 | 2022-11-08 04:21:05 | [diff] [blame] | 5 | #include "chrome/browser/ash/fileapi/recent_drive_source.h" |
Shuhei Takahashi | b1f9a9c | 2017-08-17 07:44:10 | [diff] [blame] | 6 | |
Wenbo Jie | a26431d | 2022-05-20 06:16:12 | [diff] [blame] | 7 | #include <iterator> |
Shuhei Takahashi | b1f9a9c | 2017-08-17 07:44:10 | [diff] [blame] | 8 | #include <utility> |
| 9 | #include <vector> |
| 10 | |
| 11 | #include "base/files/file_path.h" |
Avi Drissman | 02e49e58 | 2023-01-07 01:23:18 | [diff] [blame] | 12 | #include "base/functional/bind.h" |
Shuhei Takahashi | 1b95b4cc | 2017-08-21 03:02:45 | [diff] [blame] | 13 | #include "base/metrics/histogram_macros.h" |
Yeunjoo Choi | f23b136 | 2021-03-29 14:31:14 | [diff] [blame] | 14 | #include "chrome/browser/ash/drive/drive_integration_service.h" |
| 15 | #include "chrome/browser/ash/drive/file_system_util.h" |
Yeunjoo Choi | 6ecc45b8 | 2021-06-22 01:40:04 | [diff] [blame] | 16 | #include "chrome/browser/ash/file_manager/fileapi_util.h" |
Yeunjoo Choi | ef8a4a4 | 2022-11-08 04:21:05 | [diff] [blame] | 17 | #include "chrome/browser/ash/fileapi/recent_file.h" |
Henrique Ferreiro | 19781296 | 2022-08-22 23:51:10 | [diff] [blame] | 18 | #include "chromeos/ash/components/drivefs/drivefs_util.h" |
Eric Seckler | 8652dcd5 | 2018-09-20 10:42:28 | [diff] [blame] | 19 | #include "content/public/browser/browser_task_traits.h" |
Shuhei Takahashi | b1f9a9c | 2017-08-17 07:44:10 | [diff] [blame] | 20 | #include "content/public/browser/browser_thread.h" |
Bo Majewski | 965f1c7 | 2023-02-06 01:51:44 | [diff] [blame] | 21 | #include "recent_drive_source.h" |
DongJun Kim | febb3c2 | 2019-10-21 02:08:06 | [diff] [blame] | 22 | #include "storage/browser/file_system/file_system_operation.h" |
| 23 | #include "storage/browser/file_system/file_system_operation_runner.h" |
| 24 | #include "storage/browser/file_system/file_system_url.h" |
DongJun Kim | d6930ea | 2019-10-24 08:49:25 | [diff] [blame] | 25 | #include "storage/common/file_system/file_system_types.h" |
Wenbo Jie | a26431d | 2022-05-20 06:16:12 | [diff] [blame] | 26 | #include "ui/file_manager/file_types_data.h" |
Md. Hasanur Rashid | 7a5e1d4 | 2020-02-12 11:15:20 | [diff] [blame] | 27 | #include "url/origin.h" |
Shuhei Takahashi | b1f9a9c | 2017-08-17 07:44:10 | [diff] [blame] | 28 | |
| 29 | using content::BrowserThread; |
| 30 | |
Yeunjoo Choi | 3d9ed38a | 2022-11-10 02:51:24 | [diff] [blame] | 31 | namespace ash { |
Shuhei Takahashi | b1f9a9c | 2017-08-17 07:44:10 | [diff] [blame] | 32 | |
Shuhei Takahashi | 1b95b4cc | 2017-08-21 03:02:45 | [diff] [blame] | 33 | const char RecentDriveSource::kLoadHistogramName[] = |
| 34 | "FileBrowser.Recent.LoadDrive"; |
| 35 | |
Naoki Fukino | 44798b1 | 2020-01-21 12:02:25 | [diff] [blame] | 36 | const char kAudioMimeType[] = "audio"; |
| 37 | const char kImageMimeType[] = "image"; |
| 38 | const char kVideoMimeType[] = "video"; |
| 39 | |
Bo Majewski | 65e32846 | 2024-02-12 06:15:04 | [diff] [blame] | 40 | RecentDriveSource::CallContext::CallContext(GetRecentFilesCallback callback) |
| 41 | : callback(std::move(callback)), build_start_time(base::TimeTicks::Now()) {} |
| 42 | |
| 43 | RecentDriveSource::CallContext::CallContext(CallContext&& context) |
| 44 | : callback(std::move(context.callback)), |
| 45 | build_start_time(context.build_start_time), |
| 46 | files(std::move(context.files)), |
| 47 | search_query(std::move(context.search_query)) {} |
| 48 | |
| 49 | RecentDriveSource::CallContext::~CallContext() = default; |
| 50 | |
Bo Majewski | 6f33bc8 | 2024-05-28 02:24:00 | [diff] [blame] | 51 | RecentDriveSource::RecentDriveSource(Profile* profile) |
| 52 | : RecentSource(extensions::api::file_manager_private::VolumeType::kDrive), |
| 53 | profile_(profile) { |
Shuhei Takahashi | b1f9a9c | 2017-08-17 07:44:10 | [diff] [blame] | 54 | DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 55 | } |
| 56 | |
| 57 | RecentDriveSource::~RecentDriveSource() { |
| 58 | DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 59 | } |
| 60 | |
Bo Majewski | 965f1c7 | 2023-02-06 01:51:44 | [diff] [blame] | 61 | std::vector<std::string> RecentDriveSource::CreateTypeFilters( |
| 62 | RecentSource::FileType file_type) { |
| 63 | std::vector<std::string> type_filters; |
| 64 | switch (file_type) { |
| 65 | case FileType::kAudio: |
| 66 | type_filters.push_back(kAudioMimeType); |
| 67 | break; |
| 68 | case FileType::kImage: |
| 69 | type_filters.push_back(kImageMimeType); |
| 70 | break; |
| 71 | case FileType::kVideo: |
| 72 | type_filters.push_back(kVideoMimeType); |
| 73 | break; |
| 74 | case FileType::kDocument: { |
| 75 | type_filters.insert(type_filters.end(), |
| 76 | file_types_data::kDocumentMIMETypes.begin(), |
| 77 | file_types_data::kDocumentMIMETypes.end()); |
| 78 | break; |
| 79 | } |
| 80 | default: |
| 81 | // Leave the filters empty. |
| 82 | break; |
| 83 | } |
| 84 | return type_filters; |
| 85 | } |
| 86 | |
Bo Majewski | 3e5a6bd | 2024-02-29 03:06:23 | [diff] [blame] | 87 | void RecentDriveSource::GetRecentFiles(const Params& params, |
Bo Majewski | b5b1880 | 2023-11-22 06:04:53 | [diff] [blame] | 88 | GetRecentFilesCallback callback) { |
Shuhei Takahashi | b1f9a9c | 2017-08-17 07:44:10 | [diff] [blame] | 89 | DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 90 | |
Bo Majewski | 65e32846 | 2024-02-12 06:15:04 | [diff] [blame] | 91 | auto context = std::make_unique<CallContext>(std::move(callback)); |
| 92 | CallContext* context_ptr = context.get(); |
| 93 | context_map_.AddWithID(std::move(context), params.call_id()); |
Shuhei Takahashi | 1b95b4cc | 2017-08-21 03:02:45 | [diff] [blame] | 94 | |
Sam McNally | e408858 | 2018-09-21 06:15:14 | [diff] [blame] | 95 | auto* integration_service = |
| 96 | drive::util::GetIntegrationServiceByProfile(profile_); |
| 97 | if (!integration_service) { |
| 98 | // |integration_service| is nullptr if Drive is disabled. |
Bo Majewski | 65e32846 | 2024-02-12 06:15:04 | [diff] [blame] | 99 | OnComplete(params.call_id()); |
Shuhei Takahashi | b1f9a9c | 2017-08-17 07:44:10 | [diff] [blame] | 100 | return; |
| 101 | } |
| 102 | |
Sam McNally | e408858 | 2018-09-21 06:15:14 | [diff] [blame] | 103 | auto query_params = drivefs::mojom::QueryParameters::New(); |
Munira Tursunova | b67fa75 | 2024-11-01 08:49:58 | [diff] [blame] | 104 | query_params->page_size = params.max_files(); |
Sam McNally | e408858 | 2018-09-21 06:15:14 | [diff] [blame] | 105 | query_params->query_source = |
| 106 | drivefs::mojom::QueryParameters::QuerySource::kLocalOnly; |
| 107 | query_params->sort_field = |
mlcui | 4c76b0a | 2024-08-02 07:03:38 | [diff] [blame] | 108 | drivefs::mojom::QueryParameters::SortField::kLastViewedByMe; |
Sam McNally | e408858 | 2018-09-21 06:15:14 | [diff] [blame] | 109 | query_params->sort_direction = |
| 110 | drivefs::mojom::QueryParameters::SortDirection::kDescending; |
Bo Majewski | 965f1c7 | 2023-02-06 01:51:44 | [diff] [blame] | 111 | std::vector<std::string> type_filters = |
Bo Majewski | b5b1880 | 2023-11-22 06:04:53 | [diff] [blame] | 112 | RecentDriveSource::CreateTypeFilters(params.file_type()); |
mlcui | 4c76b0a | 2024-08-02 07:03:38 | [diff] [blame] | 113 | query_params->viewed_time = params.cutoff_time(); |
Bo Majewski | b5b1880 | 2023-11-22 06:04:53 | [diff] [blame] | 114 | query_params->title = params.query(); |
mlcui | 4c76b0a | 2024-08-02 07:03:38 | [diff] [blame] | 115 | query_params->viewed_time_operator = |
Bo Majewski | 852dcb1 | 2023-08-25 04:55:25 | [diff] [blame] | 116 | drivefs::mojom::QueryParameters::DateComparisonOperator::kGreaterThan; |
Bo Majewski | 965f1c7 | 2023-02-06 01:51:44 | [diff] [blame] | 117 | if (type_filters.size() == 1) { |
| 118 | query_params->mime_type = type_filters.front(); |
| 119 | } else if (type_filters.size() > 1) { |
| 120 | query_params->mime_types = std::move(type_filters); |
Naoki Fukino | 44798b1 | 2020-01-21 12:02:25 | [diff] [blame] | 121 | } |
Sam McNally | e408858 | 2018-09-21 06:15:14 | [diff] [blame] | 122 | integration_service->GetDriveFsInterface()->StartSearchQuery( |
Bo Majewski | 65e32846 | 2024-02-12 06:15:04 | [diff] [blame] | 123 | context_ptr->search_query.BindNewPipeAndPassReceiver(), |
| 124 | std::move(query_params)); |
| 125 | context_ptr->search_query->GetNextPage( |
| 126 | base::BindOnce(&RecentDriveSource::GotSearchResults, |
| 127 | weak_ptr_factory_.GetWeakPtr(), params)); |
Shuhei Takahashi | b1f9a9c | 2017-08-17 07:44:10 | [diff] [blame] | 128 | } |
| 129 | |
Bo Majewski | 65e32846 | 2024-02-12 06:15:04 | [diff] [blame] | 130 | std::vector<RecentFile> RecentDriveSource::Stop(const int32_t call_id) { |
Shuhei Takahashi | 257ee53 | 2017-08-21 09:06:22 | [diff] [blame] | 131 | DCHECK_CURRENTLY_ON(BrowserThread::UI); |
Bo Majewski | 65e32846 | 2024-02-12 06:15:04 | [diff] [blame] | 132 | CallContext* context = context_map_.Lookup(call_id); |
| 133 | if (context == nullptr) { |
| 134 | return {}; |
| 135 | } |
| 136 | std::vector<RecentFile> files = std::move(context->files); |
| 137 | context_map_.Remove(call_id); |
| 138 | return files; |
| 139 | } |
| 140 | |
Bo Majewski | 3e5a6bd | 2024-02-29 03:06:23 | [diff] [blame] | 141 | void RecentDriveSource::OnComplete(const int32_t call_id) { |
Bo Majewski | 65e32846 | 2024-02-12 06:15:04 | [diff] [blame] | 142 | DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 143 | CallContext* context = context_map_.Lookup(call_id); |
| 144 | if (context == nullptr) { |
| 145 | return; |
| 146 | } |
| 147 | DCHECK(!context->build_start_time.is_null()); |
Shuhei Takahashi | 257ee53 | 2017-08-21 09:06:22 | [diff] [blame] | 148 | |
Shuhei Takahashi | 1b95b4cc | 2017-08-21 03:02:45 | [diff] [blame] | 149 | UMA_HISTOGRAM_TIMES(kLoadHistogramName, |
Bo Majewski | 65e32846 | 2024-02-12 06:15:04 | [diff] [blame] | 150 | base::TimeTicks::Now() - context->build_start_time); |
| 151 | std::move(context->callback).Run(std::move(context->files)); |
| 152 | context_map_.Remove(call_id); |
Shuhei Takahashi | b1f9a9c | 2017-08-17 07:44:10 | [diff] [blame] | 153 | } |
| 154 | |
Sam McNally | e408858 | 2018-09-21 06:15:14 | [diff] [blame] | 155 | void RecentDriveSource::GotSearchResults( |
Munira Tursunova | b67fa75 | 2024-11-01 08:49:58 | [diff] [blame] | 156 | const Params& params, |
Sam McNally | e408858 | 2018-09-21 06:15:14 | [diff] [blame] | 157 | drive::FileError error, |
Mohamed Mansour | 5cf9214 | 2023-12-08 23:12:12 | [diff] [blame] | 158 | std::optional<std::vector<drivefs::mojom::QueryItemPtr>> results) { |
Bo Majewski | 65e32846 | 2024-02-12 06:15:04 | [diff] [blame] | 159 | CallContext* context = context_map_.Lookup(params.call_id()); |
| 160 | if (context == nullptr) { |
Sam McNally | e408858 | 2018-09-21 06:15:14 | [diff] [blame] | 161 | return; |
| 162 | } |
| 163 | |
Bo Majewski | 65e32846 | 2024-02-12 06:15:04 | [diff] [blame] | 164 | auto* integration_service = |
| 165 | drive::util::GetIntegrationServiceByProfile(profile_); |
| 166 | if (!results || !integration_service) { |
| 167 | OnComplete(params.call_id()); |
| 168 | return; |
| 169 | } |
| 170 | |
Munira Tursunova | b67fa75 | 2024-11-01 08:49:58 | [diff] [blame] | 171 | context->files.reserve(results->size()); |
Sam McNally | e408858 | 2018-09-21 06:15:14 | [diff] [blame] | 172 | for (auto& result : *results) { |
Sergei Datsenko | 0adc8727 | 2019-07-05 06:14:05 | [diff] [blame] | 173 | if (!drivefs::IsAFile(result->metadata->type)) { |
Sam McNally | e408858 | 2018-09-21 06:15:14 | [diff] [blame] | 174 | continue; |
| 175 | } |
| 176 | base::FilePath path = integration_service->GetMountPointPath().BaseName(); |
| 177 | if (!base::FilePath("/").AppendRelativePath(result->path, &path)) { |
| 178 | path = path.Append(result->path); |
| 179 | } |
Bo Majewski | 65e32846 | 2024-02-12 06:15:04 | [diff] [blame] | 180 | context->files.emplace_back( |
Bo Majewski | b5b1880 | 2023-11-22 06:04:53 | [diff] [blame] | 181 | params.file_system_context()->CreateCrackedFileSystemURL( |
Ari Chivukula | c81e13e | 2023-02-15 20:44:57 | [diff] [blame] | 182 | blink::StorageKey::CreateFirstParty( |
Bo Majewski | b5b1880 | 2023-11-22 06:04:53 | [diff] [blame] | 183 | url::Origin::Create(params.origin())), |
Md. Hasanur Rashid | 7a5e1d4 | 2020-02-12 11:15:20 | [diff] [blame] | 184 | storage::kFileSystemTypeExternal, path), |
Wenbo Jie | bea7271 | 2022-08-08 04:01:31 | [diff] [blame] | 185 | // Do not use "modification_time" field here because that will cause |
| 186 | // files modified by others recently (e.g. Shared with me) being |
| 187 | // treated as recent files. |
| 188 | result->metadata->last_viewed_by_me_time); |
Sam McNally | e408858 | 2018-09-21 06:15:14 | [diff] [blame] | 189 | } |
Munira Tursunova | b67fa75 | 2024-11-01 08:49:58 | [diff] [blame] | 190 | OnComplete(params.call_id()); |
Sam McNally | e408858 | 2018-09-21 06:15:14 | [diff] [blame] | 191 | } |
| 192 | |
Yeunjoo Choi | 3d9ed38a | 2022-11-10 02:51:24 | [diff] [blame] | 193 | } // namespace ash |