0

ash: Adding flag to enable 16 virtual desks.

When the flag (enable-16-desks) is enabled, up to 16 virtual desks can
be created, up from the default 8.

Most of the changes are related to the constant kMaxNumberOfDesks
changing to the function GetMaxNumberOfDesks.

The unit tests in desks_unittests have been updated to work with either
8 or 16 desks. Additionally, they have been parameterized so that going
forward, we will test with both 8 and 16 desks.

Bug: b/250957096


Change-Id: I7d0506f8ccfac4d3b891e340c6694cf99f7d4b0d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3928065
Reviewed-by: Richard Chui <richui@chromium.org>
Reviewed-by: James Cook <jamescook@chromium.org>
Reviewed-by: Jimmy Gong <jimmyxgong@chromium.org>
Reviewed-by: Sammie Quon <sammiequon@chromium.org>
Commit-Queue: Daniel Andersson <dandersson@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1058389}
This commit is contained in:
Daniel Andersson
2022-10-13 00:16:29 +00:00
committed by Chromium LUCI CQ
parent 504701647f
commit a34c86efd0
30 changed files with 601 additions and 320 deletions

@ -2012,6 +2012,30 @@ This file contains the strings for ash.
<message name="IDS_ASH_DESKS_DESK_8_MINI_VIEW_TITLE" desc="The label of the eighth virtual desk thumbnail.">
Desk 8
</message>
<message name="IDS_ASH_DESKS_DESK_9_MINI_VIEW_TITLE" desc="The label of the ninth virtual desk thumbnail.">
Desk 9
</message>
<message name="IDS_ASH_DESKS_DESK_10_MINI_VIEW_TITLE" desc="The label of the tenth virtual desk thumbnail.">
Desk 10
</message>
<message name="IDS_ASH_DESKS_DESK_11_MINI_VIEW_TITLE" desc="The label of the eleventh virtual desk thumbnail.">
Desk 11
</message>
<message name="IDS_ASH_DESKS_DESK_12_MINI_VIEW_TITLE" desc="The label of the twelfth virtual desk thumbnail.">
Desk 12
</message>
<message name="IDS_ASH_DESKS_DESK_13_MINI_VIEW_TITLE" desc="The label of the thirteenth virtual desk thumbnail.">
Desk 13
</message>
<message name="IDS_ASH_DESKS_DESK_14_MINI_VIEW_TITLE" desc="The label of the fourteenth virtual desk thumbnail.">
Desk 14
</message>
<message name="IDS_ASH_DESKS_DESK_15_MINI_VIEW_TITLE" desc="The label of the fifteenth virtual desk thumbnail.">
Desk 15
</message>
<message name="IDS_ASH_DESKS_DESK_16_MINI_VIEW_TITLE" desc="The label of the sixteenth virtual desk thumbnail.">
Desk 16
</message>
<message name="IDS_ASH_DESKS_MAX_NUM_REACHED" desc="Message shown to users when they attempt to add a new virtual desk when the maximum number of desks has been reached.">
Maximum number of desks reached.
</message>

@ -0,0 +1 @@
5734ddc2b3616da0363ef3915f8140047c3fd679

@ -0,0 +1 @@
4b01ef86b4f18673e366f0daa288c81b24632d72

@ -0,0 +1 @@
0e20c93104f0c3f888799858ab1ac602b6fc2895

@ -0,0 +1 @@
37c590fe6a4e29648d256d3d46d659fc1c39f2be

@ -0,0 +1 @@
5c910096df22f0d70a42f2932679657316c0f1ff

@ -0,0 +1 @@
c8e2cc7de44021c8fcba1df1f005d1e46a56996e

@ -0,0 +1 @@
9746407f33db29d2cfaf7a3f2935789ccb0a55a3

@ -0,0 +1 @@
d40bf6abd2477ead797905d83556bfc37914615b

@ -686,6 +686,11 @@ BASE_FEATURE(kEcheSWADisableStunServer,
"EcheSWADisableStunServer",
base::FEATURE_DISABLED_BY_DEFAULT);
// If enabled, allows the creation of up to 16 desks (default is 8).
BASE_FEATURE(kEnable16Desks,
"Enable16Desks",
base::FEATURE_DISABLED_BY_DEFAULT);
// Enables background blur for the app list, shelf, unified system tray,
// autoclick menu, etc. Also enables the AppsGridView mask layer, slower devices
// may have choppier app list animations while in this mode. crbug.com/765292.
@ -2176,6 +2181,10 @@ bool DoWindowsFollowCursor() {
return base::FeatureList::IsEnabled(kWindowsFollowCursor);
}
bool Is16DesksEnabled() {
return base::FeatureList::IsEnabled(kEnable16Desks);
}
bool IsAdaptiveChargingEnabled() {
return base::FeatureList::IsEnabled(kAdaptiveCharging);
}

@ -241,6 +241,7 @@ BASE_DECLARE_FEATURE(kEnableOobeNetworkScreenSkip);
COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kEnableOobeThemeSelection);
COMPONENT_EXPORT(ASH_CONSTANTS)
BASE_DECLARE_FEATURE(kEnableSamlNotificationOnPasswordChangeSuccess);
COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kEnable16Desks);
COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kEnableSavedDesks);
COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kEnableAllSystemWebApps);
COMPONENT_EXPORT(ASH_CONSTANTS)
@ -601,6 +602,7 @@ COMPONENT_EXPORT(ASH_CONSTANTS) bool IsAutocompleteExtendedSuggestionsEnabled();
COMPONENT_EXPORT(ASH_CONSTANTS) bool IsAvatarsCloudMigrationEnabled();
COMPONENT_EXPORT(ASH_CONSTANTS) bool AreImprovedScreenCaptureSettingsEnabled();
COMPONENT_EXPORT(ASH_CONSTANTS) bool DoWindowsFollowCursor();
COMPONENT_EXPORT(ASH_CONSTANTS) bool Is16DesksEnabled();
COMPONENT_EXPORT(ASH_CONSTANTS) bool IsAdaptiveChargingEnabled();
COMPONENT_EXPORT(ASH_CONSTANTS) bool IsAdaptiveChargingForTestingEnabled();
COMPONENT_EXPORT(ASH_CONSTANTS) bool IsAdjustSplitViewForVKEnabled();

@ -44,23 +44,34 @@ constexpr std::array<int, 5> kPostDesksActivatableContainersIds = {
kShellWindowId_ShelfBubbleContainer,
};
// List of desk container IDs. Can't use desks_util since we're in ash/public
// here.
constexpr std::array<int, 16> kDeskContainerIds = {
kShellWindowId_DefaultContainerDeprecated,
kShellWindowId_DeskContainerB,
kShellWindowId_DeskContainerC,
kShellWindowId_DeskContainerD,
kShellWindowId_DeskContainerE,
kShellWindowId_DeskContainerF,
kShellWindowId_DeskContainerG,
kShellWindowId_DeskContainerH,
kShellWindowId_DeskContainerI,
kShellWindowId_DeskContainerJ,
kShellWindowId_DeskContainerK,
kShellWindowId_DeskContainerL,
kShellWindowId_DeskContainerM,
kShellWindowId_DeskContainerN,
kShellWindowId_DeskContainerO,
kShellWindowId_DeskContainerP,
};
} // namespace
std::vector<int> GetActivatableShellWindowIds() {
std::vector<int> ids(kPreDesksActivatableContainersIds.begin(),
kPreDesksActivatableContainersIds.end());
// Add the desks containers IDs. Can't use desks_util since we're in
// ash/public here.
ids.emplace_back(kShellWindowId_DefaultContainerDeprecated);
ids.emplace_back(kShellWindowId_DeskContainerB);
ids.emplace_back(kShellWindowId_DeskContainerC);
ids.emplace_back(kShellWindowId_DeskContainerD);
ids.emplace_back(kShellWindowId_DeskContainerE);
ids.emplace_back(kShellWindowId_DeskContainerF);
ids.emplace_back(kShellWindowId_DeskContainerG);
ids.emplace_back(kShellWindowId_DeskContainerH);
ids.insert(ids.end(), kDeskContainerIds.begin(), kDeskContainerIds.end());
ids.insert(ids.end(), kPostDesksActivatableContainersIds.begin(),
kPostDesksActivatableContainersIds.end());
return ids;

@ -78,6 +78,14 @@ enum ShellWindowId {
kShellWindowId_DeskContainerF,
kShellWindowId_DeskContainerG,
kShellWindowId_DeskContainerH,
kShellWindowId_DeskContainerI,
kShellWindowId_DeskContainerJ,
kShellWindowId_DeskContainerK,
kShellWindowId_DeskContainerL,
kShellWindowId_DeskContainerM,
kShellWindowId_DeskContainerN,
kShellWindowId_DeskContainerO,
kShellWindowId_DeskContainerP,
// The container for top-level windows with the 'always-on-top' flag set.
kShellWindowId_AlwaysOnTopContainer,

@ -69,7 +69,7 @@ TEST_F(AutotestDesksApiTest, ActivateDeskAtIndex) {
auto* controller = DesksController::Get();
while (controller->CanCreateDesks())
EXPECT_TRUE(test_api.CreateNewDesk());
EXPECT_EQ(desks_util::kMaxNumberOfDesks, controller->desks().size());
EXPECT_EQ(desks_util::GetMaxNumberOfDesks(), controller->desks().size());
constexpr int kIndices[] = {1, 2, 3, 0};
for (const int index : kIndices) {
base::RunLoop run_loop;
@ -83,7 +83,7 @@ TEST_F(AutotestDesksApiTest, RemoveActiveDesk) {
AutotestDesksApi test_api;
EXPECT_FALSE(test_api.RemoveActiveDesk(base::DoNothing()));
const size_t max_number_of_desks = desks_util::kMaxNumberOfDesks;
const size_t max_number_of_desks = desks_util::GetMaxNumberOfDesks();
auto* controller = DesksController::Get();
while (controller->CanCreateDesks())
EXPECT_TRUE(test_api.CreateNewDesk());
@ -114,7 +114,7 @@ TEST_F(EnhancedDeskAnimationsAutotestDesksApiTest,
DISABLED_ActivateAdjacentDesksToTargetIndex) {
// Create all desks possible.
AutotestDesksApi test_api;
const int max_number_of_desks = desks_util::kMaxNumberOfDesks;
const int max_number_of_desks = desks_util::GetMaxNumberOfDesks();
auto* controller = DesksController::Get();
while (controller->CanCreateDesks())
EXPECT_TRUE(test_api.CreateNewDesk());
@ -127,7 +127,7 @@ TEST_F(EnhancedDeskAnimationsAutotestDesksApiTest,
// Activating already active desk does nothing.
EXPECT_FALSE(
test_api.ActivateAdjacentDesksToTargetIndex(0, base::DoNothing()));
EXPECT_EQ(desks_util::kMaxNumberOfDesks, controller->desks().size());
EXPECT_EQ(desks_util::GetMaxNumberOfDesks(), controller->desks().size());
// Replacing needs to be done while a current animation is underway, otherwise
// it will have no effect.

@ -104,23 +104,9 @@ constexpr char kNumberOfWindowsClosedBySaveAndRecall[] =
"Ash.Desks.NumberOfWindowsClosed.SaveRecall";
constexpr char kNumberOfWindowsClosedByApi[] =
"Ash.Desks.NumberOfWindowsClosed.Api";
constexpr char kNumberOfWindowsOnDesk_1_HistogramName[] =
"Ash.Desks.NumberOfWindowsOnDesk_1";
constexpr char kNumberOfWindowsOnDesk_2_HistogramName[] =
"Ash.Desks.NumberOfWindowsOnDesk_2";
constexpr char kNumberOfWindowsOnDesk_3_HistogramName[] =
"Ash.Desks.NumberOfWindowsOnDesk_3";
constexpr char kNumberOfWindowsOnDesk_4_HistogramName[] =
"Ash.Desks.NumberOfWindowsOnDesk_4";
constexpr char kNumberOfWindowsOnDesk_5_HistogramName[] =
"Ash.Desks.NumberOfWindowsOnDesk_5";
constexpr char kNumberOfWindowsOnDesk_6_HistogramName[] =
"Ash.Desks.NumberOfWindowsOnDesk_6";
constexpr char kNumberOfWindowsOnDesk_7_HistogramName[] =
"Ash.Desks.NumberOfWindowsOnDesk_7";
constexpr char kNumberOfWindowsOnDesk_8_HistogramName[] =
"Ash.Desks.NumberOfWindowsOnDesk_8";
// Used for histograms from "Ash.Desks.NumberOfWindowsOnDesk_1" up to 16.
constexpr char kNumberOfWindowsOnDeskHistogramPrefix[] =
"Ash.Desks.NumberOfWindowsOnDesk_";
constexpr char kNumberOfDeskTraversalsHistogramName[] =
"Ash.Desks.NumberOfDeskTraversals";
@ -132,10 +118,23 @@ constexpr int kDeskTraversalsMaxValue = 20;
constexpr base::TimeDelta kDeskTraversalsTimeout = base::Seconds(5);
constexpr int kDeskDefaultNameIds[] = {
IDS_ASH_DESKS_DESK_1_MINI_VIEW_TITLE, IDS_ASH_DESKS_DESK_2_MINI_VIEW_TITLE,
IDS_ASH_DESKS_DESK_3_MINI_VIEW_TITLE, IDS_ASH_DESKS_DESK_4_MINI_VIEW_TITLE,
IDS_ASH_DESKS_DESK_5_MINI_VIEW_TITLE, IDS_ASH_DESKS_DESK_6_MINI_VIEW_TITLE,
IDS_ASH_DESKS_DESK_7_MINI_VIEW_TITLE, IDS_ASH_DESKS_DESK_8_MINI_VIEW_TITLE};
IDS_ASH_DESKS_DESK_1_MINI_VIEW_TITLE,
IDS_ASH_DESKS_DESK_2_MINI_VIEW_TITLE,
IDS_ASH_DESKS_DESK_3_MINI_VIEW_TITLE,
IDS_ASH_DESKS_DESK_4_MINI_VIEW_TITLE,
IDS_ASH_DESKS_DESK_5_MINI_VIEW_TITLE,
IDS_ASH_DESKS_DESK_6_MINI_VIEW_TITLE,
IDS_ASH_DESKS_DESK_7_MINI_VIEW_TITLE,
IDS_ASH_DESKS_DESK_8_MINI_VIEW_TITLE,
IDS_ASH_DESKS_DESK_9_MINI_VIEW_TITLE,
IDS_ASH_DESKS_DESK_10_MINI_VIEW_TITLE,
IDS_ASH_DESKS_DESK_11_MINI_VIEW_TITLE,
IDS_ASH_DESKS_DESK_12_MINI_VIEW_TITLE,
IDS_ASH_DESKS_DESK_13_MINI_VIEW_TITLE,
IDS_ASH_DESKS_DESK_14_MINI_VIEW_TITLE,
IDS_ASH_DESKS_DESK_15_MINI_VIEW_TITLE,
IDS_ASH_DESKS_DESK_16_MINI_VIEW_TITLE,
};
// Appends the given |windows| to the end of the currently active overview mode
// session such that the most-recently used window is added first. If
@ -419,7 +418,7 @@ DesksController* DesksController::Get() {
// static
std::u16string DesksController::GetDeskDefaultName(size_t desk_index) {
DCHECK_LT(desk_index, desks_util::kMaxNumberOfDesks);
DCHECK_LT(desk_index, desks_util::GetMaxNumberOfDesks());
return l10n_util::GetStringUTF16(kDeskDefaultNameIds[desk_index]);
}
@ -493,7 +492,7 @@ bool DesksController::AreDesksBeingModified() const {
}
bool DesksController::CanCreateDesks() const {
return desks_.size() < desks_util::kMaxNumberOfDesks;
return desks_.size() < desks_util::GetMaxNumberOfDesks();
}
Desk* DesksController::GetNextDesk(bool use_target_active_desk) const {
@ -1699,7 +1698,7 @@ void DesksController::RemoveDeskInternal(const Desk* desk,
desks_restore_util::UpdatePrimaryUserDeskNamesPrefs();
desks_restore_util::UpdatePrimaryUserDeskMetricsPrefs();
DCHECK_LE(available_container_ids_.size(), desks_util::kMaxNumberOfDesks);
DCHECK_LE(available_container_ids_.size(), desks_util::GetMaxNumberOfDesks());
if (close_type == DeskCloseType::kCloseAllWindowsAndWait) {
ShowDeskRemovalUndoToast(
@ -1961,60 +1960,19 @@ void DesksController::GetAllDesks(std::vector<const Desk*>& out_desks) const {
}
void DesksController::ReportNumberOfWindowsPerDeskHistogram() const {
DCHECK_LE(desks_.size(), desks_util::kDesksUpperLimit);
for (size_t i = 0; i < desks_.size(); ++i) {
const size_t windows_count = desks_[i]->windows().size();
switch (i) {
case 0:
UMA_HISTOGRAM_COUNTS_100(kNumberOfWindowsOnDesk_1_HistogramName,
windows_count);
break;
case 1:
UMA_HISTOGRAM_COUNTS_100(kNumberOfWindowsOnDesk_2_HistogramName,
windows_count);
break;
case 2:
UMA_HISTOGRAM_COUNTS_100(kNumberOfWindowsOnDesk_3_HistogramName,
windows_count);
break;
case 3:
UMA_HISTOGRAM_COUNTS_100(kNumberOfWindowsOnDesk_4_HistogramName,
windows_count);
break;
case 4:
UMA_HISTOGRAM_COUNTS_100(kNumberOfWindowsOnDesk_5_HistogramName,
windows_count);
break;
case 5:
UMA_HISTOGRAM_COUNTS_100(kNumberOfWindowsOnDesk_6_HistogramName,
windows_count);
break;
case 6:
UMA_HISTOGRAM_COUNTS_100(kNumberOfWindowsOnDesk_7_HistogramName,
windows_count);
break;
case 7:
UMA_HISTOGRAM_COUNTS_100(kNumberOfWindowsOnDesk_8_HistogramName,
windows_count);
break;
default:
NOTREACHED();
break;
}
base::UmaHistogramCounts100(
kNumberOfWindowsOnDeskHistogramPrefix + base::NumberToString(i + 1),
windows_count);
}
}
void DesksController::ReportDesksCountHistogram() const {
DCHECK_LE(desks_.size(), desks_util::kMaxNumberOfDesks);
DCHECK_LE(desks_.size(), desks_util::kDesksUpperLimit);
UMA_HISTOGRAM_EXACT_LINEAR(kDesksCountHistogramName, desks_.size(),
desks_util::kMaxNumberOfDesks);
desks_util::kDesksUpperLimit + 1);
}
void DesksController::RecordAndResetNumberOfWeeklyActiveDesks() {

@ -80,9 +80,7 @@ PrefService* GetPrimaryUserPrefService() {
// DesksController.
bool IsValidDeskIndex(int desk_index) {
return desk_index >= 0 &&
desk_index <
static_cast<int>(DesksController::Get()->desks().size()) &&
desk_index < int{desks_util::kMaxNumberOfDesks};
desk_index < static_cast<int>(DesksController::Get()->desks().size());
}
base::Time GetTime(int year, int month, int day_of_month, int day_of_week) {
@ -151,13 +149,16 @@ void RestorePrimaryUserDesks() {
primary_user_prefs->GetList(prefs::kDesksMetricsList);
// First create the same number of desks.
const size_t restore_size = desks_names_list.size();
size_t restore_size = desks_names_list.size();
// If we don't have any restore data, or the list is corrupt for some reason,
// abort.
if (!restore_size || restore_size > desks_util::kMaxNumberOfDesks)
// If we don't have any restore data, abort.
if (restore_size == 0)
return;
// If we have more restore data than the *current* max, clamp it. This can
// happen if the restore data was created when more desks were permitted.
restore_size = std::min(restore_size, desks_util::GetMaxNumberOfDesks());
auto* desks_controller = DesksController::Get();
while (desks_controller->desks().size() < restore_size)
desks_controller->NewDesk(DesksCreationRemovalSource::kDesksRestore);

File diff suppressed because it is too large Load Diff

@ -6,6 +6,7 @@
#include <array>
#include "ash/constants/ash_features.h"
#include "ash/public/cpp/tablet_mode.h"
#include "ash/shell.h"
#include "ash/wm/desks/desk.h"
@ -25,7 +26,7 @@ namespace desks_util {
namespace {
constexpr std::array<int, kMaxNumberOfDesks> kDesksContainersIds = {
constexpr std::array<int, kDesksUpperLimit> kDesksContainersIds = {
kShellWindowId_DefaultContainerDeprecated,
kShellWindowId_DeskContainerB,
kShellWindowId_DeskContainerC,
@ -34,13 +35,28 @@ constexpr std::array<int, kMaxNumberOfDesks> kDesksContainersIds = {
kShellWindowId_DeskContainerF,
kShellWindowId_DeskContainerG,
kShellWindowId_DeskContainerH,
kShellWindowId_DeskContainerI,
kShellWindowId_DeskContainerJ,
kShellWindowId_DeskContainerK,
kShellWindowId_DeskContainerL,
kShellWindowId_DeskContainerM,
kShellWindowId_DeskContainerN,
kShellWindowId_DeskContainerO,
kShellWindowId_DeskContainerP,
};
// Default max number of desks (that is, enable-16-desks is off).
constexpr size_t kDesksDefaultLimit = 8;
} // namespace
size_t GetMaxNumberOfDesks() {
return features::Is16DesksEnabled() ? kDesksUpperLimit : kDesksDefaultLimit;
}
std::vector<int> GetDesksContainersIds() {
return std::vector<int>(kDesksContainersIds.begin(),
kDesksContainersIds.end());
kDesksContainersIds.begin() + GetMaxNumberOfDesks());
}
std::vector<aura::Window*> GetDesksContainers(aura::Window* root) {
@ -85,6 +101,30 @@ const char* GetDeskContainerName(int container_id) {
case kShellWindowId_DeskContainerH:
return "Desk_Container_H";
case kShellWindowId_DeskContainerI:
return "Desk_Container_I";
case kShellWindowId_DeskContainerJ:
return "Desk_Container_J";
case kShellWindowId_DeskContainerK:
return "Desk_Container_K";
case kShellWindowId_DeskContainerL:
return "Desk_Container_L";
case kShellWindowId_DeskContainerM:
return "Desk_Container_M";
case kShellWindowId_DeskContainerN:
return "Desk_Container_N";
case kShellWindowId_DeskContainerO:
return "Desk_Container_O";
case kShellWindowId_DeskContainerP:
return "Desk_Container_P";
default:
NOTREACHED();
return "";
@ -104,7 +144,15 @@ bool IsDeskContainerId(int id) {
id == kShellWindowId_DeskContainerE ||
id == kShellWindowId_DeskContainerF ||
id == kShellWindowId_DeskContainerG ||
id == kShellWindowId_DeskContainerH;
id == kShellWindowId_DeskContainerH ||
id == kShellWindowId_DeskContainerI ||
id == kShellWindowId_DeskContainerJ ||
id == kShellWindowId_DeskContainerK ||
id == kShellWindowId_DeskContainerL ||
id == kShellWindowId_DeskContainerM ||
id == kShellWindowId_DeskContainerN ||
id == kShellWindowId_DeskContainerO ||
id == kShellWindowId_DeskContainerP;
}
int GetActiveDeskContainerId() {

@ -25,7 +25,12 @@ namespace ash {
namespace desks_util {
constexpr size_t kMaxNumberOfDesks = 8;
// Note: the max number of desks depends on a runtime flag and the function
// `GetMaxNumberOfDesks` below will return that value. The value returned from
// that function will not be more than this constant.
constexpr size_t kDesksUpperLimit = 16;
ASH_EXPORT size_t GetMaxNumberOfDesks();
ASH_EXPORT std::vector<int> GetDesksContainersIds();

@ -120,7 +120,7 @@ RootWindowDeskSwitchAnimator::RootWindowDeskSwitchAnimator(
DCHECK_NE(starting_desk_index_, ending_desk_index_);
DCHECK(delegate_);
screenshot_layers_.resize(desks_util::kMaxNumberOfDesks);
screenshot_layers_.resize(desks_util::GetMaxNumberOfDesks());
}
RootWindowDeskSwitchAnimator::~RootWindowDeskSwitchAnimator() {

@ -409,7 +409,7 @@ void SavedDeskPresenter::LaunchSavedDesk(
/*text=*/
l10n_util::GetStringFUTF16(
IDS_ASH_DESKS_TEMPLATES_REACH_MAXIMUM_DESK_TOAST,
base::FormatNumber(desks_util::kMaxNumberOfDesks))};
base::FormatNumber(desks_util::GetMaxNumberOfDesks()))};
ToastManager::Get()->Show(toast_data);
return;
}

@ -884,7 +884,8 @@ TEST_P(DesksOverviewHighlightControllerTest,
SendKey(ui::VKEY_TAB);
}
EXPECT_FALSE(new_desk_button->GetEnabled());
EXPECT_EQ(desks_util::kMaxNumberOfDesks, desks_controller->desks().size());
EXPECT_EQ(desks_util::GetMaxNumberOfDesks(),
desks_controller->desks().size());
}
TEST_P(DesksOverviewHighlightControllerTest, ZeroStateOfDesksBar) {

@ -92,7 +92,7 @@ void ReportPossibleDesksSwitchStats(int active_desk_container_id_before_cycle) {
active_desk_container_id_before_cycle);
base::UmaHistogramExactLinear(kAltTabDesksSwitchDistanceHistogramName,
desks_switch_distance,
desks_util::kMaxNumberOfDesks);
desks_util::kDesksUpperLimit);
}
} // namespace

@ -49,7 +49,7 @@ WindowRestoreController* g_instance = nullptr;
WindowRestoreController::SaveWindowCallback g_save_window_callback_for_testing;
// The list of possible app window parents.
constexpr ShellWindowId kAppParentContainers[11] = {
constexpr ShellWindowId kAppParentContainers[19] = {
kShellWindowId_DefaultContainerDeprecated,
kShellWindowId_DeskContainerB,
kShellWindowId_DeskContainerC,
@ -58,6 +58,14 @@ constexpr ShellWindowId kAppParentContainers[11] = {
kShellWindowId_DeskContainerF,
kShellWindowId_DeskContainerG,
kShellWindowId_DeskContainerH,
kShellWindowId_DeskContainerI,
kShellWindowId_DeskContainerJ,
kShellWindowId_DeskContainerK,
kShellWindowId_DeskContainerL,
kShellWindowId_DeskContainerM,
kShellWindowId_DeskContainerN,
kShellWindowId_DeskContainerO,
kShellWindowId_DeskContainerP,
kShellWindowId_AlwaysOnTopContainer,
kShellWindowId_FloatContainer,
kShellWindowId_UnparentedContainer,

@ -9729,6 +9729,9 @@ const FeatureEntry kFeatureEntries[] = {
{"vc-controls-ui", flag_descriptions::kVcControlsUiName,
flag_descriptions::kVcControlsUiDescription, kOsCrOS,
FEATURE_VALUE_TYPE(chromeos::features::kVcControlsUi)},
{"enable-16-desks", flag_descriptions::kDesks16Name,
flag_descriptions::kDesks16Description, kOsCrOS,
FEATURE_VALUE_TYPE(ash::features::kEnable16Desks)},
#endif
// NOTE: Adding a new flag requires adding a corresponding entry to enum

@ -1654,6 +1654,11 @@
"owners": [ "arakeri@microsoft.com", "flackr@chromium.org" ],
"expiry_milestone": 99
},
{
"name": "enable-16-desks",
"owners": [ "dandersson", "janetmac" ],
"expiry_milestone": 118
},
{
"name": "enable-accelerated-video-decode",
"owners": [ "media-dev@chromium.org" ],

@ -4993,6 +4993,10 @@ const char kDefaultLinkCapturingInBrowserDescription[] =
"When enabled, newly installed apps will not capture links clicked in the "
"browser.";
extern const char kDesks16Name[] = "Enable up to 16 virtual desks";
extern const char kDesks16Description[] =
"When enabled, up to 16 virtual desks are allowed.";
const char kDesksCloseAllName[] = "Desks Close All";
const char kDesksCloseAllDescription[] =
"Close a desk along with all of its windows and tabs.";

@ -2851,6 +2851,9 @@ extern const char kCalendarModelDebugModeDescription[];
extern const char kDefaultLinkCapturingInBrowserName[];
extern const char kDefaultLinkCapturingInBrowserDescription[];
extern const char kDesks16Name[];
extern const char kDesks16Description[];
extern const char kDesksCloseAllName[];
extern const char kDesksCloseAllDescription[];

@ -56674,6 +56674,7 @@ from previous Chrome versions.
<int value="-2129013032" label="DocumentTransition:enabled"/>
<int value="-2128705444" label="AssistantAppSupport:enabled"/>
<int value="-2128535212" label="GuestOsFiles:enabled"/>
<int value="-2127806304" label="Enable16Desks:disabled"/>
<int value="-2127319228" label="enable-media-internals:disabled"/>
<int value="-2126697213" label="EnablePalmSuppression:disabled"/>
<int value="-2126275491" label="WebViewAppsPackageNamesAllowlist:disabled"/>
@ -58186,6 +58187,7 @@ from previous Chrome versions.
<int value="-1261110018" label="AllowDisableTouchpadHapticFeedback:disabled"/>
<int value="-1260211490" label="FastPairLowPower:disabled"/>
<int value="-1259901957" label="VrBrowserKeyboard:disabled"/>
<int value="-1259809702" label="Enable16Desks:enabled"/>
<int value="-1259627326" label="AllowRepeatedUpdates:disabled"/>
<int value="-1258141852" label="ScrollUnification:enabled"/>
<int value="-1257822114" label="ContextMenuPopupForAllScreenSizes:disabled"/>

@ -1644,6 +1644,76 @@ chromium-metrics-reviews@google.com.
</summary>
</histogram>
<histogram name="Ash.Desks.NumberOfWindowsOnDesk_10" units="units"
expires_after="2023-04-23">
<owner>dandersson@chromium.org</owner>
<owner>janetmac@chromium.org</owner>
<summary>
The number of windows on the tenth desk. Emitted when a desk is removed, or
a window is moved to another desk.
</summary>
</histogram>
<histogram name="Ash.Desks.NumberOfWindowsOnDesk_11" units="units"
expires_after="2023-04-23">
<owner>dandersson@chromium.org</owner>
<owner>janetmac@chromium.org</owner>
<summary>
The number of windows on the eleventh desk. Emitted when a desk is removed,
or a window is moved to another desk.
</summary>
</histogram>
<histogram name="Ash.Desks.NumberOfWindowsOnDesk_12" units="units"
expires_after="2023-04-23">
<owner>dandersson@chromium.org</owner>
<owner>janetmac@chromium.org</owner>
<summary>
The number of windows on the twelfth desk. Emitted when a desk is removed,
or a window is moved to another desk.
</summary>
</histogram>
<histogram name="Ash.Desks.NumberOfWindowsOnDesk_13" units="units"
expires_after="2023-04-23">
<owner>dandersson@chromium.org</owner>
<owner>janetmac@chromium.org</owner>
<summary>
The number of windows on the thirteenth desk. Emitted when a desk is
removed, or a window is moved to another desk.
</summary>
</histogram>
<histogram name="Ash.Desks.NumberOfWindowsOnDesk_14" units="units"
expires_after="2023-04-23">
<owner>dandersson@chromium.org</owner>
<owner>janetmac@chromium.org</owner>
<summary>
The number of windows on the fourteenth desk. Emitted when a desk is
removed, or a window is moved to another desk.
</summary>
</histogram>
<histogram name="Ash.Desks.NumberOfWindowsOnDesk_15" units="units"
expires_after="2023-04-23">
<owner>dandersson@chromium.org</owner>
<owner>janetmac@chromium.org</owner>
<summary>
The number of windows on the fifteenth desk. Emitted when a desk is removed,
or a window is moved to another desk.
</summary>
</histogram>
<histogram name="Ash.Desks.NumberOfWindowsOnDesk_16" units="units"
expires_after="2023-04-23">
<owner>dandersson@chromium.org</owner>
<owner>janetmac@chromium.org</owner>
<summary>
The number of windows on the sixteenth desk. Emitted when a desk is removed,
or a window is moved to another desk.
</summary>
</histogram>
<histogram name="Ash.Desks.NumberOfWindowsOnDesk_2" units="units"
expires_after="2023-04-23">
<owner>afakhry@chromium.org</owner>
@ -1714,6 +1784,16 @@ chromium-metrics-reviews@google.com.
</summary>
</histogram>
<histogram name="Ash.Desks.NumberOfWindowsOnDesk_9" units="units"
expires_after="2023-04-23">
<owner>dandersson@chromium.org</owner>
<owner>janetmac@chromium.org</owner>
<summary>
The number of windows on the ninth desk. Emitted when a desk is removed, or
a window is moved to another desk.
</summary>
</histogram>
<histogram name="Ash.Desks.PresentationTime.UpdateGesture" units="ms"
expires_after="2023-01-10">
<owner>afakhry@chromium.org</owner>