Commit 57071897 authored by Aga Wronska's avatar Aga Wronska Committed by Commit Bot

Add ChildUserService and AppTimeController

ChildUserService is a new KeyedService that will be a central point for
child user related functionality. Existing KeyedServices will become
members of ChildUserService.

AppTimeController coordinates per-app time limits for child users
similarly to ScreenTimeController. This class was added together with
ChildUserService to demonstrate how other child features will be migrated.

Bug: 1022231, 1015658
Test: AppTimeControllerTest
Change-Id: Ica55931876f172df60b9af8a7b2887fb794f5845
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1910764
Commit-Queue: Aga Wronska <agawronska@chromium.org>
Reviewed-by: default avatarXiyuan Xia <xiyuan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#714748}
parent 2fbb8e5c
...@@ -759,6 +759,10 @@ source_set("chromeos") { ...@@ -759,6 +759,10 @@ source_set("chromeos") {
"child_accounts/child_status_reporting_service.h", "child_accounts/child_status_reporting_service.h",
"child_accounts/child_status_reporting_service_factory.cc", "child_accounts/child_status_reporting_service_factory.cc",
"child_accounts/child_status_reporting_service_factory.h", "child_accounts/child_status_reporting_service_factory.h",
"child_accounts/child_user_service.cc",
"child_accounts/child_user_service.h",
"child_accounts/child_user_service_factory.cc",
"child_accounts/child_user_service_factory.h",
"child_accounts/event_based_status_reporting_service.cc", "child_accounts/event_based_status_reporting_service.cc",
"child_accounts/event_based_status_reporting_service.h", "child_accounts/event_based_status_reporting_service.h",
"child_accounts/event_based_status_reporting_service_factory.cc", "child_accounts/event_based_status_reporting_service_factory.cc",
...@@ -777,6 +781,8 @@ source_set("chromeos") { ...@@ -777,6 +781,8 @@ source_set("chromeos") {
"child_accounts/time_limit_notifier.h", "child_accounts/time_limit_notifier.h",
"child_accounts/time_limit_override.cc", "child_accounts/time_limit_override.cc",
"child_accounts/time_limit_override.h", "child_accounts/time_limit_override.h",
"child_accounts/time_limits/app_time_controller.cc",
"child_accounts/time_limits/app_time_controller.h",
"child_accounts/time_limits/web_time_limit_enforcer.cc", "child_accounts/time_limits/web_time_limit_enforcer.cc",
"child_accounts/time_limits/web_time_limit_enforcer.h", "child_accounts/time_limits/web_time_limit_enforcer.h",
"child_accounts/usage_time_limit_processor.cc", "child_accounts/usage_time_limit_processor.cc",
...@@ -2588,6 +2594,7 @@ source_set("unit_tests") { ...@@ -2588,6 +2594,7 @@ source_set("unit_tests") {
"child_accounts/parent_access_code/parent_access_test_utils.h", "child_accounts/parent_access_code/parent_access_test_utils.h",
"child_accounts/time_limit_notifier_unittest.cc", "child_accounts/time_limit_notifier_unittest.cc",
"child_accounts/time_limit_test_utils.cc", "child_accounts/time_limit_test_utils.cc",
"child_accounts/time_limits/app_time_controller_unittest.cc",
"child_accounts/usage_time_limit_processor_unittest.cc", "child_accounts/usage_time_limit_processor_unittest.cc",
"child_accounts/usage_time_state_notifier_unittest.cc", "child_accounts/usage_time_state_notifier_unittest.cc",
"chrome_content_browser_client_chromeos_part_unittest.cc", "chrome_content_browser_client_chromeos_part_unittest.cc",
......
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/chromeos/child_accounts/child_user_service.h"
#include "chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.h"
#include "content/public/browser/browser_context.h"
namespace chromeos {
ChildUserService::ChildUserService(content::BrowserContext* context) {
if (AppTimeController::ArePerAppTimeLimitsEnabled())
app_time_controller_ = std::make_unique<AppTimeController>();
}
ChildUserService::~ChildUserService() = default;
void ChildUserService::Shutdown() {
app_time_controller_.reset();
}
} // namespace chromeos
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_CHROMEOS_CHILD_ACCOUNTS_CHILD_USER_SERVICE_H_
#define CHROME_BROWSER_CHROMEOS_CHILD_ACCOUNTS_CHILD_USER_SERVICE_H_
#include <memory>
#include "components/keyed_service/core/keyed_service.h"
namespace content {
class BrowserContext;
} // namespace content
namespace chromeos {
class AppTimeController;
// Facade that exposes child user related functionality on Chrome OS.
// TODO(crbug.com/1022231): Migrate ConsumerStatusReportingService,
// EventBasedStatusReporting and ScreenTimeController to ChildUserService.
class ChildUserService : public KeyedService {
public:
explicit ChildUserService(content::BrowserContext* context);
ChildUserService(const ChildUserService&) = delete;
ChildUserService& operator=(const ChildUserService&) = delete;
~ChildUserService() override;
private:
// KeyedService:
void Shutdown() override;
std::unique_ptr<AppTimeController> app_time_controller_;
};
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_CHILD_ACCOUNTS_CHILD_USER_SERVICE_H_
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/chromeos/child_accounts/child_user_service_factory.h"
#include "chrome/browser/chromeos/child_accounts/child_user_service.h"
#include "components/keyed_service/content/browser_context_dependency_manager.h"
namespace chromeos {
// static
ChildUserService* ChildUserServiceFactory::GetForBrowserContext(
content::BrowserContext* context) {
return static_cast<ChildUserService*>(
GetInstance()->GetServiceForBrowserContext(context, true));
}
// static
ChildUserServiceFactory* ChildUserServiceFactory::GetInstance() {
static base::NoDestructor<ChildUserServiceFactory> factory;
return factory.get();
}
ChildUserServiceFactory::ChildUserServiceFactory()
: BrowserContextKeyedServiceFactory(
"ChildUserServiceFactory",
BrowserContextDependencyManager::GetInstance()) {}
ChildUserServiceFactory::~ChildUserServiceFactory() = default;
KeyedService* ChildUserServiceFactory::BuildServiceInstanceFor(
content::BrowserContext* context) const {
return new ChildUserService(context);
}
} // namespace chromeos
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_CHROMEOS_CHILD_ACCOUNTS_CHILD_USER_SERVICE_FACTORY_H_
#define CHROME_BROWSER_CHROMEOS_CHILD_ACCOUNTS_CHILD_USER_SERVICE_FACTORY_H_
#include "base/no_destructor.h"
#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
namespace content {
class BrowserContext;
}
namespace chromeos {
class ChildUserService;
// Singleton that owns all ChildUserService objects and associates them with
// BrowserContexts. Listens for the BrowserContext's destruction notification
// and cleans up the associated ChildUserService.
class ChildUserServiceFactory : public BrowserContextKeyedServiceFactory {
public:
static ChildUserService* GetForBrowserContext(
content::BrowserContext* context);
static ChildUserServiceFactory* GetInstance();
private:
friend class base::NoDestructor<ChildUserServiceFactory>;
ChildUserServiceFactory();
ChildUserServiceFactory(const ChildUserServiceFactory&) = delete;
ChildUserServiceFactory& operator=(const ChildUserServiceFactory&) = delete;
~ChildUserServiceFactory() override;
// BrowserContextKeyedServiceFactory:
KeyedService* BuildServiceInstanceFor(
content::BrowserContext* context) const override;
};
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_CHILD_ACCOUNTS_CHILD_USER_SERVICE_FACTORY_H_
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.h"
#include "base/feature_list.h"
#include "chrome/common/chrome_features.h"
namespace chromeos {
// static
bool AppTimeController::ArePerAppTimeLimitsEnabled() {
return base::FeatureList::IsEnabled(features::kPerAppTimeLimits);
}
AppTimeController::AppTimeController() = default;
AppTimeController::~AppTimeController() = default;
} // namespace chromeos
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_CHROMEOS_CHILD_ACCOUNTS_TIME_LIMITS_APP_TIME_CONTROLLER_H_
#define CHROME_BROWSER_CHROMEOS_CHILD_ACCOUNTS_TIME_LIMITS_APP_TIME_CONTROLLER_H_
namespace chromeos {
// Coordinates per-app time limit for child user.
class AppTimeController {
public:
static bool ArePerAppTimeLimitsEnabled();
AppTimeController();
AppTimeController(const AppTimeController&) = delete;
AppTimeController& operator=(const AppTimeController&) = delete;
~AppTimeController();
};
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_CHILD_ACCOUNTS_TIME_LIMITS_APP_TIME_CONTROLLER_H_
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.h"
#include "base/test/scoped_feature_list.h"
#include "chrome/common/chrome_features.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace chromeos {
class AppTimeControllerTest : public testing::Test {
protected:
AppTimeControllerTest() = default;
AppTimeControllerTest(const AppTimeControllerTest&) = delete;
AppTimeControllerTest& operator=(const AppTimeControllerTest&) = delete;
~AppTimeControllerTest() override = default;
void EnablePerAppTimeLimits() {
scoped_feature_list_.InitAndEnableFeature(features::kPerAppTimeLimits);
}
private:
base::test::ScopedFeatureList scoped_feature_list_;
};
TEST_F(AppTimeControllerTest, EnableFeature) {
EnablePerAppTimeLimits();
EXPECT_TRUE(AppTimeController::ArePerAppTimeLimitsEnabled());
}
} // namespace chromeos
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include "chrome/browser/chromeos/arc/session/arc_service_launcher.h" #include "chrome/browser/chromeos/arc/session/arc_service_launcher.h"
#include "chrome/browser/chromeos/boot_times_recorder.h" #include "chrome/browser/chromeos/boot_times_recorder.h"
#include "chrome/browser/chromeos/child_accounts/child_status_reporting_service_factory.h" #include "chrome/browser/chromeos/child_accounts/child_status_reporting_service_factory.h"
#include "chrome/browser/chromeos/child_accounts/child_user_service_factory.h"
#include "chrome/browser/chromeos/child_accounts/screen_time_controller_factory.h" #include "chrome/browser/chromeos/child_accounts/screen_time_controller_factory.h"
#include "chrome/browser/chromeos/crostini/crostini_manager.h" #include "chrome/browser/chromeos/crostini/crostini_manager.h"
#include "chrome/browser/chromeos/lock_screen_apps/state_controller.h" #include "chrome/browser/chromeos/lock_screen_apps/state_controller.h"
...@@ -169,6 +170,7 @@ void StartUserSession(Profile* user_profile, const std::string& login_user_id) { ...@@ -169,6 +170,7 @@ void StartUserSession(Profile* user_profile, const std::string& login_user_id) {
if (user->GetType() == user_manager::USER_TYPE_CHILD) { if (user->GetType() == user_manager::USER_TYPE_CHILD) {
ChildStatusReportingServiceFactory::GetForBrowserContext(user_profile); ChildStatusReportingServiceFactory::GetForBrowserContext(user_profile);
ChildUserServiceFactory::GetForBrowserContext(user_profile);
ScreenTimeControllerFactory::GetForBrowserContext(user_profile); ScreenTimeControllerFactory::GetForBrowserContext(user_profile);
} }
......
...@@ -45,6 +45,7 @@ ...@@ -45,6 +45,7 @@
#include "chrome/browser/chromeos/boot_times_recorder.h" #include "chrome/browser/chromeos/boot_times_recorder.h"
#include "chrome/browser/chromeos/child_accounts/child_policy_observer.h" #include "chrome/browser/chromeos/child_accounts/child_policy_observer.h"
#include "chrome/browser/chromeos/child_accounts/child_status_reporting_service_factory.h" #include "chrome/browser/chromeos/child_accounts/child_status_reporting_service_factory.h"
#include "chrome/browser/chromeos/child_accounts/child_user_service_factory.h"
#include "chrome/browser/chromeos/child_accounts/screen_time_controller_factory.h" #include "chrome/browser/chromeos/child_accounts/screen_time_controller_factory.h"
#include "chrome/browser/chromeos/crostini/crostini_manager.h" #include "chrome/browser/chromeos/crostini/crostini_manager.h"
#include "chrome/browser/chromeos/first_run/first_run.h" #include "chrome/browser/chromeos/first_run/first_run.h"
...@@ -1782,6 +1783,7 @@ void UserSessionManager::InitializeBrowser(Profile* profile) { ...@@ -1782,6 +1783,7 @@ void UserSessionManager::InitializeBrowser(Profile* profile) {
void UserSessionManager::InitializeChildUserServices(Profile* profile) { void UserSessionManager::InitializeChildUserServices(Profile* profile) {
ChildStatusReportingServiceFactory::GetForBrowserContext(profile); ChildStatusReportingServiceFactory::GetForBrowserContext(profile);
ChildUserServiceFactory::GetForBrowserContext(profile);
ScreenTimeControllerFactory::GetForBrowserContext(profile); ScreenTimeControllerFactory::GetForBrowserContext(profile);
} }
......
...@@ -575,8 +575,14 @@ const base::Feature kUseNewAcceptLanguageHeader{ ...@@ -575,8 +575,14 @@ const base::Feature kUseNewAcceptLanguageHeader{
const base::Feature kParentAccessCode{"ParentAccessCode", const base::Feature kParentAccessCode{"ParentAccessCode",
base::FEATURE_ENABLED_BY_DEFAULT}; base::FEATURE_ENABLED_BY_DEFAULT};
// Enables usage of Parent Access Code to authorize change of time actions on
// child user device. Requires |kParentAccessCode| to be enabled.
const base::Feature kParentAccessCodeForTimeChange{ const base::Feature kParentAccessCodeForTimeChange{
"ParentAccessCodeForTimeChange", base::FEATURE_ENABLED_BY_DEFAULT}; "ParentAccessCodeForTimeChange", base::FEATURE_ENABLED_BY_DEFAULT};
// Enables enforcement of per-app time limits for child user.
const base::Feature kPerAppTimeLimits{"PerAppTimeLimits",
base::FEATURE_DISABLED_BY_DEFAULT};
#endif #endif
// Delegate permissions to cross-origin iframes when the feature has been // Delegate permissions to cross-origin iframes when the feature has been
...@@ -878,6 +884,7 @@ const base::Feature kAccessibilityInternalsPageImprovements{ ...@@ -878,6 +884,7 @@ const base::Feature kAccessibilityInternalsPageImprovements{
base::FEATURE_DISABLED_BY_DEFAULT}; base::FEATURE_DISABLED_BY_DEFAULT};
// Enables setting time limit for Chrome and PWA's on child user device. // Enables setting time limit for Chrome and PWA's on child user device.
// Requires |kPerAppTimeLimits| to be enabled.
#if defined(OS_CHROMEOS) #if defined(OS_CHROMEOS)
const base::Feature kWebTimeLimits{"WebTimeLimits", const base::Feature kWebTimeLimits{"WebTimeLimits",
base::FEATURE_DISABLED_BY_DEFAULT}; base::FEATURE_DISABLED_BY_DEFAULT};
......
...@@ -359,6 +359,9 @@ extern const base::Feature kParentAccessCode; ...@@ -359,6 +359,9 @@ extern const base::Feature kParentAccessCode;
COMPONENT_EXPORT(CHROME_FEATURES) COMPONENT_EXPORT(CHROME_FEATURES)
extern const base::Feature kParentAccessCodeForTimeChange; extern const base::Feature kParentAccessCodeForTimeChange;
COMPONENT_EXPORT(CHROME_FEATURES)
extern const base::Feature kPerAppTimeLimits;
#endif #endif
COMPONENT_EXPORT(CHROME_FEATURES) COMPONENT_EXPORT(CHROME_FEATURES)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment