// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/ash/shelf/arc_app_shelf_id.h"
#include "base/strings/string_split.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "chrome/browser/ash/app_list/arc/intent.h"
#include "components/crx_file/id_util.h"
namespace arc {
namespace {
// Prefix in intent that specifies ARC shelf group. S. means string type.
constexpr char kShelfGroupIntentPrefix[] = "S.org.chromium.arc.shelf_group_id=";
// Prefix to specify ARC shelf group.
constexpr char kShelfGroupPrefix[] = "shelf_group:";
} // namespace
ArcAppShelfId::ArcAppShelfId() = default;
ArcAppShelfId::ArcAppShelfId(const std::string& shelf_group_id,
const std::string& app_id)
: shelf_group_id_(shelf_group_id), app_id_(app_id) {
DCHECK(crx_file::id_util::IdIsValid(app_id));
}
ArcAppShelfId::ArcAppShelfId(const ArcAppShelfId& other) = default;
ArcAppShelfId::~ArcAppShelfId() = default;
// static
ArcAppShelfId ArcAppShelfId::FromString(const std::string& id) {
if (base::StartsWith(id, kShelfGroupPrefix, base::CompareCase::SENSITIVE)) {
const std::vector<std::string> parts = base::SplitString(
id, ":", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
if (parts.size() == 3u && crx_file::id_util::IdIsValid(parts[2]))
return ArcAppShelfId(parts[1], parts[2]);
} else if (crx_file::id_util::IdIsValid(id)) {
return ArcAppShelfId(std::string(), id);
}
return ArcAppShelfId();
}
// static
ArcAppShelfId ArcAppShelfId::FromIntentAndAppId(const std::string& intent,
const std::string& app_id) {
if (intent.empty())
return ArcAppShelfId(std::string(), app_id);
auto parsed_intent = Intent::Get(intent);
if (!parsed_intent)
return ArcAppShelfId(std::string(), app_id);
const std::string prefix(kShelfGroupIntentPrefix);
for (const auto& param : parsed_intent->extra_params()) {
if (base::StartsWith(param, prefix, base::CompareCase::SENSITIVE))
return ArcAppShelfId(param.substr(prefix.length()), app_id);
}
return ArcAppShelfId(std::string(), app_id);
}
std::string ArcAppShelfId::ToString() const {
if (!has_shelf_group_id())
return app_id_;
return base::StringPrintf("%s%s:%s", kShelfGroupPrefix,
shelf_group_id_.c_str(), app_id_.c_str());
}
bool ArcAppShelfId::operator<(const ArcAppShelfId& other) const {
const int compare_group = shelf_group_id_.compare(other.shelf_group_id());
if (compare_group == 0)
return app_id_ < other.app_id();
return compare_group < 0;
}
} // namespace arc