blob: 5c2b43568fc3f56b39c556b6aac8946d3571b296 [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.
#ifndef COMPONENTS_SERVICES_APP_SERVICE_PUBLIC_CPP_APP_H_
#define COMPONENTS_SERVICES_APP_SERVICE_PUBLIC_CPP_APP_H_
#include <optional>
#include <string>
#include <utility>
#include <vector>
#include "base/component_export.h"
#include "base/time/time.h"
#include "base/values.h"
#include "components/services/app_service/public/cpp/app_types.h"
#include "components/services/app_service/public/cpp/icon_types.h"
#include "components/services/app_service/public/cpp/intent_filter.h"
#include "components/services/app_service/public/cpp/package_id.h"
#include "components/services/app_service/public/cpp/permission.h"
#include "components/services/app_service/public/cpp/run_on_os_login_types.h"
namespace apps {
// Information about an app. See components/services/app_service/README.md.
struct COMPONENT_EXPORT(APP_TYPES) App {
App(AppType app_type, const std::string& app_id);
App(const App&) = delete;
App& operator=(const App&) = delete;
~App();
bool operator==(const App& other) const;
std::unique_ptr<App> Clone() const;
// Adds a new field for `extra`. The type `T` can be any type, e.g. int,
// double, string, base::Value::Dict, base::Value::List, base::Value, etc. The
// value is saved in base::Value::Dict `extra`. If the type `T` can't be
// converted to base::Value, an explicit convert function can be added to
// convert `value` to base::Value.
template <typename T>
void SetExtraField(const std::string& field_name, T&& value) {
if (!extra.has_value()) {
extra = base::Value::Dict();
}
extra->Set(field_name, value);
}
AppType app_type;
std::string app_id;
Readiness readiness = Readiness::kUnknown;
// The full name of the app. Will be used in most UIs.
std::optional<std::string> name;
// A shortened version of the app name. May omit branding (e.g.
// "Google" prefixes) or rely on abbreviations (e.g. "YT Music"). If no
// `short_name` is supplied, the `name` will be used instead.
// The `short_name` may be used in UIs where space is limited and/or we want
// to optimize for scannability.
std::optional<std::string> short_name;
// An optional, publisher-specific ID for this app, e.g. for Android apps,
// this field contains the Android package name, and for web apps, it
// contains the start URL.
std::optional<std::string> publisher_id;
// An optional ID for the package that installed this app. In general, this
// will match the `app_type` and `publisher_id` of the app. However, this is
// permitted to diverge for alternate installation methods, e.g. web apps that
// are installed through the Play Store.
std::optional<PackageId> installer_package_id;
std::optional<std::string> description;
std::optional<std::string> version;
std::vector<std::string> additional_search_terms;
std::optional<IconKey> icon_key;
std::optional<base::Time> last_launch_time;
std::optional<base::Time> install_time;
// This vector must be treated atomically, if there is a permission
// change, the publisher must send through the entire list of permissions.
// Should contain no duplicate IDs.
// If empty during updates, Subscriber can assume no changes.
// There is no guarantee that this is sorted by any criteria.
Permissions permissions;
// The main reason why this app is currently installed on the device (e.g.
// because it is required by Policy). This may change over time and is not
// necessarily the reason why the app was originally installed.
InstallReason install_reason = InstallReason::kUnknown;
// How installation of the app was triggered on this device. Either a UI
// surface (e.g. Play Store), or a system component (e.g. Sync).
InstallSource install_source = InstallSource::kUnknown;
// IDs used for policy to identify the app.
// For web apps, it contains the install URL(s).
std::vector<std::string> policy_ids;
// Whether the app is an extensions::Extensions where is_platform_app()
// returns true.
std::optional<bool> is_platform_app;
std::optional<bool> recommendable;
std::optional<bool> searchable;
std::optional<bool> show_in_launcher;
std::optional<bool> show_in_shelf;
std::optional<bool> show_in_search;
std::optional<bool> show_in_management;
// True if the app is able to handle intents and should be shown in intent
// surfaces.
std::optional<bool> handles_intents;
// Whether the app publisher allows the app to be uninstalled.
std::optional<bool> allow_uninstall;
// Whether the app icon should add the notification badging.
std::optional<bool> has_badge;
// Paused apps cannot be launched, and any running apps that become paused
// will be stopped. This is independent of whether or not the app is ready to
// be launched (defined by the Readiness field).
std::optional<bool> paused;
// This vector stores all the intent filters defined in this app. Each
// intent filter defines a matching criteria for whether an intent can
// be handled by this app. One app can have multiple intent filters.
IntentFilters intent_filters;
// Whether the app can be free resized. If this is true, various resizing
// operations will be restricted.
std::optional<bool> resize_locked;
// Whether the app's display mode is in the browser or otherwise.
WindowMode window_mode = WindowMode::kUnknown;
// Whether the app runs on os login in a new window or not.
std::optional<RunOnOsLogin> run_on_os_login;
// Whether the app can be closed by the user.
std::optional<bool> allow_close;
// If the value is false, User will not be able to select open mode (i.e.
// open in new window or in new tab) for the app. The app will default to be
// opened in a new window.
std::optional<bool> allow_window_mode_selection;
// Storage space size for app and associated data.
std::optional<uint64_t> app_size_in_bytes;
std::optional<uint64_t> data_size_in_bytes;
// App-specified supported locales.
std::vector<std::string> supported_locales;
// Currently selected locale, empty string means system language is used.
// ARC-specific note: Based on Android implementation, `selected_locale`
// is not necessarily part of `supported_locales`.
std::optional<std::string> selected_locale;
// The extra information used by the app platform(e.g. ARC, GuestOS) for an
// app. `extra` needs to be modified as a whole, and we can't only modify part
// of `extra`. AppService doesn't use the fields saved in `extra`. App
// publishers modify the content saved in `extra`.
std::optional<base::Value::Dict> extra;
// When adding new fields to the App type, the `Clone` function, the
// `operator==` function, and the `AppUpdate` class should also be updated. If
// the new fields should be saved, below functions should be updated:
// `AppStorage::IsAppChanged`
// `AppStorageFileHandler::ConvertAppsToValue`
// `AppStorageFileHandler::ConvertValueToApps`
};
using AppPtr = std::unique_ptr<App>;
COMPONENT_EXPORT(APP_TYPES)
bool IsEqual(const std::vector<AppPtr>& source,
const std::vector<AppPtr>& target);
} // namespace apps
#endif // COMPONENTS_SERVICES_APP_SERVICE_PUBLIC_CPP_APP_H_