chromium/chrome/browser/ash/fileapi/recent_drive_source.h

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

#ifndef CHROME_BROWSER_ASH_FILEAPI_RECENT_DRIVE_SOURCE_H_
#define CHROME_BROWSER_ASH_FILEAPI_RECENT_DRIVE_SOURCE_H_

#include <memory>
#include <optional>
#include <vector>

#include "base/containers/id_map.h"
#include "base/files/file.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "chrome/browser/ash/fileapi/recent_source.h"
#include "chromeos/ash/components/drivefs/mojom/drivefs.mojom.h"
#include "components/drive/file_errors.h"
#include "mojo/public/cpp/bindings/remote.h"

class Profile;

namespace ash {

class RecentFile;

// RecentSource implementation for Google Drive files.
//
// All member functions must be called on the UI thread.
//
// TODO(nya): Write unit tests.
class RecentDriveSource : public RecentSource {
 public:
  explicit RecentDriveSource(Profile* profile);

  RecentDriveSource(const RecentDriveSource&) = delete;
  RecentDriveSource& operator=(const RecentDriveSource&) = delete;

  ~RecentDriveSource() override;

  // RecentSource overrides:
  void GetRecentFiles(const Params& params,
                      GetRecentFilesCallback callback) override;

  // Overrides the Stop method to implement search interruption.
  std::vector<RecentFile> Stop(const int32_t call_id) override;

  // Generates type filters based on the file_type parameter. This is done so
  // that this code can be shared between recent files and file search.
  static std::vector<std::string> CreateTypeFilters(
      RecentSource::FileType file_type);

 private:
  static const char kLoadHistogramName[];

  // The context for a single GetRecentFiles call. Multiple, parallel calls can
  // be issued and each receives its unique context, stored in the map using the
  // call_id parameter.
  struct CallContext {
    explicit CallContext(GetRecentFilesCallback callback);
    // Move constructor necessary due to move-only callback type.
    CallContext(CallContext&& callcontext);
    ~CallContext();

    // The callback on which the results are delivered.
    GetRecentFilesCallback callback;

    // The time the GetRecentFiles request was started.
    base::TimeTicks build_start_time;

    // The list of files built up by the request.
    std::vector<RecentFile> files;

    // The mojo remote that performs Drive search.
    mojo::Remote<drivefs::mojom::SearchQuery> search_query;
  };

  void OnComplete(const int32_t call_id);

  void GotSearchResults(
      const Params& params,
      drive::FileError error,
      std::optional<std::vector<drivefs::mojom::QueryItemPtr>> results);

  // The current profile for which this source was constructed. This class does
  // not own the Profile object. Instead it uses it to fetch a drive integration
  // service for fetching matched files.
  const raw_ptr<Profile> profile_;

  // A map from call_id to the call context.
  base::IDMap<std::unique_ptr<CallContext>> context_map_;

  base::WeakPtrFactory<RecentDriveSource> weak_ptr_factory_{this};
};

}  // namespace ash

#endif  // CHROME_BROWSER_ASH_FILEAPI_RECENT_DRIVE_SOURCE_H_