chromium/chrome/browser/ash/app_list/arc/intent.h

// 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.

#ifndef CHROME_BROWSER_ASH_APP_LIST_ARC_INTENT_H_
#define CHROME_BROWSER_ASH_APP_LIST_ARC_INTENT_H_

#include <stdint.h>

#include <memory>
#include <string>
#include <vector>

namespace base {
class TimeTicks;
}

namespace arc {

extern const char kInitialStartParam[];
extern const char kRequestStartTimeParamKey[];
extern const char kRequestDeferredStartTimeParamKey[];

extern const char kAction[];
extern const char kCategory[];
extern const char kComponent[];
extern const char kEndSuffix[];
extern const char kIntentPrefix[];
extern const char kLaunchFlags[];
extern const char kCategoryLauncher[];

// Represents parsed intent.
class Intent {
 public:
  Intent(const Intent&) = delete;
  Intent& operator=(const Intent&) = delete;

  ~Intent();

  enum LaunchFlags : uint32_t {
    FLAG_ACTIVITY_NEW_TASK = 0x10000000,
    FLAG_RECEIVER_NO_ABORT = 0x08000000,
    FLAG_ACTIVITY_RESET_TASK_IF_NEEDED = 0x00200000,
    FLAG_ACTIVITY_LAUNCH_ADJACENT = 0x00001000,
  };

  // Parses provided |intent_as_string|. Returns nullptr if |intent_as_string|
  // cannot be parsed.
  static std::unique_ptr<Intent> Get(const std::string& intent_as_string);

  void AddExtraParam(const std::string& extra_param);
  bool HasExtraParam(const std::string& extra_param) const;

  // Extra param mighgt be key=value pair. Enumetates |extra_params_| and finds
  // one that starts with requested |extra_param_key|. If found value is stored
  // in |out| and true is returned.
  bool GetExtraParamValue(const std::string& extra_param_key,
                          std::string* out) const;

  const std::string& action() const { return action_; }
  void set_action(const std::string& action) { action_ = action; }

  const std::string& category() const { return category_; }
  void set_category(const std::string& category) { category_ = category; }

  const std::string& package_name() const { return package_name_; }
  void set_package_name(const std::string& package_name) {
    package_name_ = package_name;
  }

  const std::string& activity() const { return activity_; }
  void set_activity(const std::string& activity) { activity_ = activity; }

  uint32_t launch_flags() const { return launch_flags_; }
  void set_launch_flags(uint32_t launch_flags) { launch_flags_ = launch_flags; }

  const std::vector<std::string>& extra_params() const { return extra_params_; }

 private:
  Intent();

  std::string action_;                     // Extracted from action.
  std::string category_;                   // Extracted from category.
  std::string package_name_;               // Extracted from component.
  std::string activity_;                   // Extracted from component.
  uint32_t launch_flags_ = 0;              // Extracted from launchFlags;
  std::vector<std::string> extra_params_;  // Other parameters not listed above.
};

// Returns intent that can be used to launch an activity specified by
// |package_name| and |activity|. |extra_params| is the list of optional
// parameters encoded to intent.
std::string GetLaunchIntent(const std::string& package_name,
                            const std::string& activity,
                            const std::vector<std::string>& extra_params);

// This takes existing |launch_intent| and appends it with |extra_params|.
std::string AppendLaunchIntent(const std::string& launch_intent,
                               const std::vector<std::string>& extra_params);

// Helper function that creates pair key=value where value represents |ticks|.
// |ticks| is converted to ms.
std::string CreateIntentTicksExtraParam(const std::string& param_key,
                                        const base::TimeTicks& ticks);

}  // namespace arc

#endif  // CHROME_BROWSER_ASH_APP_LIST_ARC_INTENT_H_