Skip to content

Commit 7270d2d

Browse files
Toni BarzicToni Barzic
authored andcommitted
Update stylus settings for lock screen note taking
Fixes a number of issues with stylus settings for note taking on lock screen: * Provide a NoteTakingHelper observer interface called when the preferred app changes (or when it's lock screen status changes) * Settings UI can use this to update itself when the preferred app changes. * Switch lock_screen_apps::AppManagerImpl to observe this event for preferred app changes (instead of observing note taking pref directly) * Introduces kNoteTakingAppsAllowedOnLockScreen pref, that will be used by a user policy to whitelist apps available on the lock screen (to be added in dependent patch) * Disable lock screen support for note taking apps in non-primary profiles (the profile that supports lock screen use case is set by lock_screen_apps::StateController during its initialization). * Redo settings UI for enabling apps on the lock screen so its state (whether it's disabled, the policy indicator) does not depend on prefs directly, instead derive the state from the note taking app's NoteAppInfo (in particular lockScreenSupport property) While here, did some cleanup in test code: * Provided utility methods to NoteTakingHelper unit tests to reduce code duplication: * Method to create/install lock screen enabled note taking app * Methods for verifying preferred app and available apps info * In stylus device page browser tests, made fake browser proxy smarter, so test don't have to "manually" trigger note taking app changes [email protected] (cherry picked from commit e4a5c06) Bug: 741940 Bug: 741053 Bug: 746116 Cq-Include-Trybots: master.tryserver.chromium.linux:closure_compilation Change-Id: I5e2ee138df620d3832a8ad0d1b4d0db285fba0da Reviewed-on: https://chromium-review.googlesource.com/572842 Commit-Queue: Toni Barzic <[email protected]> Reviewed-by: Jacob Dufault <[email protected]> Reviewed-by: Steven Bennetts <[email protected]> Cr-Original-Commit-Position: refs/heads/master@{#489142} Reviewed-on: https://chromium-review.googlesource.com/588341 Reviewed-by: Toni Barzic <[email protected]> Cr-Commit-Position: refs/branch-heads/3163@{#72} Cr-Branched-From: ff259ba-refs/heads/master@{#488528}
1 parent ade4b37 commit 7270d2d

22 files changed

+1505
-495
lines changed

chrome/browser/chromeos/lock_screen_apps/app_manager_impl.cc

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,9 @@ void InstallExtensionCopy(
113113
} // namespace
114114

115115
AppManagerImpl::AppManagerImpl()
116-
: extensions_observer_(this), weak_ptr_factory_(this) {}
116+
: extensions_observer_(this),
117+
note_taking_helper_observer_(this),
118+
weak_ptr_factory_(this) {}
117119

118120
AppManagerImpl::~AppManagerImpl() = default;
119121

@@ -138,15 +140,7 @@ void AppManagerImpl::Initialize(Profile* primary_profile,
138140
lock_screen_profile_ = lock_screen_profile;
139141
state_ = State::kInactive;
140142

141-
pref_change_registrar_.Init(primary_profile->GetPrefs());
142-
pref_change_registrar_.Add(
143-
prefs::kNoteTakingAppId,
144-
base::Bind(&AppManagerImpl::OnNoteTakingExtensionChanged,
145-
base::Unretained(this)));
146-
pref_change_registrar_.Add(
147-
prefs::kNoteTakingAppEnabledOnLockScreen,
148-
base::Bind(&AppManagerImpl::OnNoteTakingExtensionChanged,
149-
base::Unretained(this)));
143+
note_taking_helper_observer_.Add(chromeos::NoteTakingHelper::Get());
150144
}
151145

152146
void AppManagerImpl::Start(const base::Closure& note_taking_changed_callback) {
@@ -233,6 +227,15 @@ void AppManagerImpl::OnExtensionUnloaded(
233227
OnNoteTakingExtensionChanged();
234228
}
235229

230+
void AppManagerImpl::OnAvailableNoteTakingAppsUpdated() {}
231+
232+
void AppManagerImpl::OnPreferredNoteTakingAppUpdated(Profile* profile) {
233+
if (profile != primary_profile_)
234+
return;
235+
236+
OnNoteTakingExtensionChanged();
237+
}
238+
236239
void AppManagerImpl::OnNoteTakingExtensionChanged() {
237240
if (state_ == State::kInactive)
238241
return;
@@ -259,9 +262,9 @@ std::string AppManagerImpl::FindLockScreenNoteTakingApp() const {
259262
chromeos::NoteTakingHelper::Get()->GetPreferredChromeAppInfo(
260263
primary_profile_);
261264

262-
if (!note_taking_app ||
265+
if (!note_taking_app || !note_taking_app->preferred ||
263266
note_taking_app->lock_screen_support !=
264-
chromeos::NoteTakingLockScreenSupport::kSelected) {
267+
chromeos::NoteTakingLockScreenSupport::kEnabled) {
265268
return std::string();
266269
}
267270

chrome/browser/chromeos/lock_screen_apps/app_manager_impl.h

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
#include "base/memory/weak_ptr.h"
1313
#include "base/scoped_observer.h"
1414
#include "chrome/browser/chromeos/lock_screen_apps/app_manager.h"
15-
#include "components/prefs/pref_change_registrar.h"
15+
#include "chrome/browser/chromeos/note_taking_helper.h"
1616
#include "extensions/browser/extension_registry_observer.h"
1717

1818
class Profile;
@@ -26,6 +26,7 @@ namespace lock_screen_apps {
2626

2727
// The default implementation of lock_screen_apps::AppManager.
2828
class AppManagerImpl : public AppManager,
29+
public chromeos::NoteTakingHelper::Observer,
2930
public extensions::ExtensionRegistryObserver {
3031
public:
3132
AppManagerImpl();
@@ -40,13 +41,17 @@ class AppManagerImpl : public AppManager,
4041
bool IsNoteTakingAppAvailable() const override;
4142
std::string GetNoteTakingAppId() const override;
4243

43-
// extensions::ExtensionRegistryObserver implementation:
44+
// extensions::ExtensionRegistryObserver:
4445
void OnExtensionLoaded(content::BrowserContext* browser_context,
4546
const extensions::Extension* extension) override;
4647
void OnExtensionUnloaded(content::BrowserContext* browser_context,
4748
const extensions::Extension* extension,
4849
extensions::UnloadedExtensionReason reason) override;
4950

51+
// chromeos::NoteTakingHelper::Observer:
52+
void OnAvailableNoteTakingAppsUpdated() override;
53+
void OnPreferredNoteTakingAppUpdated(Profile* profile) override;
54+
5055
private:
5156
enum class State {
5257
// The manager has not yet been initialized.
@@ -101,11 +106,14 @@ class AppManagerImpl : public AppManager,
101106
State state_ = State::kNotInitialized;
102107
std::string lock_screen_app_id_;
103108

104-
PrefChangeRegistrar pref_change_registrar_;
105109
ScopedObserver<extensions::ExtensionRegistry,
106110
extensions::ExtensionRegistryObserver>
107111
extensions_observer_;
108112

113+
ScopedObserver<chromeos::NoteTakingHelper,
114+
chromeos::NoteTakingHelper::Observer>
115+
note_taking_helper_observer_;
116+
109117
base::Closure note_taking_changed_callback_;
110118

111119
// Counts app installs. Passed to app install callback as install request

chrome/browser/chromeos/lock_screen_apps/app_manager_impl_unittest.cc

Lines changed: 90 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -144,14 +144,21 @@ class LockScreenAppManagerImplTest
144144
base::Bind(&ArcSessionFactory)));
145145

146146
chromeos::NoteTakingHelper::Initialize();
147+
chromeos::NoteTakingHelper::Get()->SetProfileWithEnabledLockScreenApps(
148+
profile());
147149

148150
ResetAppManager();
149151
}
150152

151153
void TearDown() override {
154+
// App manager has to be destroyed before NoteTakingHelper is shutdown - it
155+
// removes itself from the NoteTakingHelper observer list during its
156+
// destruction.
157+
app_manager_.reset();
158+
159+
chromeos::NoteTakingHelper::Shutdown();
152160
extensions::ExtensionSystem::Get(profile())->Shutdown();
153161
extensions::ExtensionSystem::Get(lock_screen_profile())->Shutdown();
154-
chromeos::NoteTakingHelper::Shutdown();
155162
}
156163

157164
void InitExtensionSystem(Profile* profile) {
@@ -323,8 +330,8 @@ class LockScreenAppManagerImplTest
323330
->AddExtension(app.get());
324331

325332
chromeos::NoteTakingHelper::Get()->SetPreferredApp(profile, app_id);
326-
profile->GetPrefs()->SetBoolean(prefs::kNoteTakingAppEnabledOnLockScreen,
327-
enable_on_lock_screen);
333+
chromeos::NoteTakingHelper::Get()->SetPreferredAppEnabledOnLockScreen(
334+
profile, enable_on_lock_screen);
328335
return app;
329336
}
330337

@@ -515,8 +522,8 @@ TEST_P(LockScreenAppManagerImplTest, LockScreenNoteTakingDisabledWhileStarted) {
515522
lock_app->path());
516523
EXPECT_TRUE(base::PathExists(note_taking_app->path()));
517524

518-
profile()->GetPrefs()->SetBoolean(prefs::kNoteTakingAppEnabledOnLockScreen,
519-
false);
525+
chromeos::NoteTakingHelper::Get()->SetPreferredAppEnabledOnLockScreen(
526+
profile(), false);
520527

521528
EXPECT_EQ(1, note_taking_changed_count());
522529
ResetNoteTakingChangedCount();
@@ -560,8 +567,8 @@ TEST_P(LockScreenAppManagerImplTest, LockScreenNoteTakingEnabledWhileStarted) {
560567
extensions::ExtensionRegistry::EVERYTHING);
561568
EXPECT_FALSE(lock_app);
562569

563-
profile()->GetPrefs()->SetBoolean(prefs::kNoteTakingAppEnabledOnLockScreen,
564-
true);
570+
chromeos::NoteTakingHelper::Get()->SetPreferredAppEnabledOnLockScreen(
571+
profile(), true);
565572

566573
EXPECT_EQ(1, note_taking_changed_count());
567574
ResetNoteTakingChangedCount();
@@ -604,7 +611,7 @@ TEST_P(LockScreenAppManagerImplTest, LockScreenNoteTakingChangedWhileStarted) {
604611
scoped_refptr<const extensions::Extension> dev_note_taking_app =
605612
AddTestAppWithLockScreenSupport(
606613
profile(), chromeos::NoteTakingHelper::kDevKeepExtensionId, "1.0",
607-
false /* enable_on_lock_screen */);
614+
true /* enable_on_lock_screen */);
608615

609616
scoped_refptr<const extensions::Extension> prod_note_taking_app =
610617
AddTestAppWithLockScreenSupport(
@@ -684,6 +691,81 @@ TEST_P(LockScreenAppManagerImplTest, LockScreenNoteTakingChangedWhileStarted) {
684691
EXPECT_TRUE(base::PathExists(prod_note_taking_app->path()));
685692
}
686693

694+
TEST_P(LockScreenAppManagerImplTest, NoteTakingChangedToLockScreenSupported) {
695+
scoped_refptr<const extensions::Extension> dev_note_taking_app =
696+
AddTestAppWithLockScreenSupport(
697+
profile(), chromeos::NoteTakingHelper::kDevKeepExtensionId, "1.0",
698+
true /* enable_on_lock_screen */);
699+
700+
scoped_refptr<const extensions::Extension> prod_note_taking_app =
701+
CreateTestAppInProfile(profile(),
702+
chromeos::NoteTakingHelper::kProdKeepExtensionId,
703+
"1.0", false /* supports_lock_screen */);
704+
extensions::ExtensionSystem::Get(profile())
705+
->extension_service()
706+
->AddExtension(prod_note_taking_app.get());
707+
chromeos::NoteTakingHelper::Get()->SetPreferredApp(
708+
profile(), chromeos::NoteTakingHelper::kProdKeepExtensionId);
709+
710+
// Initialize app manager - the note taking should be disabled initially
711+
// because the preferred app (prod) is not enabled on lock screen.
712+
InitializeAndStartAppManager(profile());
713+
RunExtensionServiceTaskRunner(lock_screen_profile());
714+
EXPECT_EQ(0, note_taking_changed_count());
715+
EXPECT_EQ(false, app_manager()->IsNoteTakingAppAvailable());
716+
717+
// Setting dev app, which is enabled on lock screen, as preferred will enable
718+
// lock screen note taking,
719+
chromeos::NoteTakingHelper::Get()->SetPreferredApp(
720+
profile(), chromeos::NoteTakingHelper::kDevKeepExtensionId);
721+
722+
EXPECT_EQ(1, note_taking_changed_count());
723+
ResetNoteTakingChangedCount();
724+
// If test app is installed asynchronously. the app won't be enabled on
725+
// lock screen until extension service task runner tasks are run.
726+
EXPECT_EQ(!IsInstallAsync(), app_manager()->IsNoteTakingAppAvailable());
727+
RunExtensionServiceTaskRunner(lock_screen_profile());
728+
729+
EXPECT_EQ(NoteTakingChangedCountOnStart(), note_taking_changed_count());
730+
ResetNoteTakingChangedCount();
731+
EXPECT_TRUE(app_manager()->IsNoteTakingAppAvailable());
732+
EXPECT_EQ(chromeos::NoteTakingHelper::kDevKeepExtensionId,
733+
app_manager()->GetNoteTakingAppId());
734+
735+
// Verify the dev app copy is installed in the lock screen app profile.
736+
const extensions::Extension* lock_app =
737+
extensions::ExtensionRegistry::Get(lock_screen_profile())
738+
->GetExtensionById(chromeos::NoteTakingHelper::kDevKeepExtensionId,
739+
extensions::ExtensionRegistry::ENABLED);
740+
ASSERT_TRUE(lock_app);
741+
EXPECT_TRUE(base::PathExists(lock_app->path()));
742+
EXPECT_EQ(GetLockScreenAppPath(dev_note_taking_app->id(),
743+
dev_note_taking_app->VersionString()),
744+
lock_app->path());
745+
746+
// Verify the prod app was not coppied to the lock screen profile (for
747+
// unpacked apps, the lock screen extension path is the same as the original
748+
// app path, so it's expected to still exist).
749+
EXPECT_EQ(
750+
GetParam() == TestAppLocation::kUnpacked,
751+
base::PathExists(GetLockScreenAppPath(
752+
prod_note_taking_app->id(), prod_note_taking_app->VersionString())));
753+
754+
app_manager()->Stop();
755+
756+
// Stopping app manager will disable lock screen note taking.
757+
EXPECT_EQ(0, note_taking_changed_count());
758+
EXPECT_FALSE(app_manager()->IsNoteTakingAppAvailable());
759+
EXPECT_TRUE(app_manager()->GetNoteTakingAppId().empty());
760+
761+
RunExtensionServiceTaskRunner(lock_screen_profile());
762+
RunExtensionServiceTaskRunner(profile());
763+
764+
// Make sure original app paths are not deleted.
765+
EXPECT_TRUE(base::PathExists(dev_note_taking_app->path()));
766+
EXPECT_TRUE(base::PathExists(prod_note_taking_app->path()));
767+
}
768+
687769
TEST_P(LockScreenAppManagerImplTest, LockScreenNoteTakingReloadedWhileStarted) {
688770
scoped_refptr<const extensions::Extension> note_taking_app =
689771
AddTestAppWithLockScreenSupport(

chrome/browser/chromeos/lock_screen_apps/note_taking_browsertest.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,9 @@ class LockScreenNoteTakingTest : public ExtensionBrowserTest {
3535

3636
bool EnableLockScreenAppLaunch(const std::string& app_id) {
3737
chromeos::NoteTakingHelper::Get()->SetPreferredApp(profile(), app_id);
38-
profile()->GetPrefs()->SetBoolean(prefs::kNoteTakingAppEnabledOnLockScreen,
39-
true);
38+
chromeos::NoteTakingHelper::Get()->SetPreferredAppEnabledOnLockScreen(
39+
profile(), true);
40+
4041
session_manager::SessionManager::Get()->SetSessionState(
4142
session_manager::SessionState::LOCKED);
4243

chrome/browser/chromeos/lock_screen_apps/state_controller.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "base/strings/string16.h"
1616
#include "chrome/browser/browser_process.h"
1717
#include "chrome/browser/chromeos/lock_screen_apps/app_manager_impl.h"
18+
#include "chrome/browser/chromeos/note_taking_helper.h"
1819
#include "chrome/browser/chromeos/profiles/profile_helper.h"
1920
#include "chrome/browser/profiles/profile_manager.h"
2021
#include "chrome/common/chrome_paths.h"
@@ -210,6 +211,9 @@ void StateController::InitializeWithCryptoKey(Profile* profile,
210211
profile, g_browser_process->local_state(), crypto_key,
211212
base_path.AppendASCII("lock_screen_app_data"));
212213

214+
chromeos::NoteTakingHelper::Get()->SetProfileWithEnabledLockScreenApps(
215+
profile);
216+
213217
// App manager might have been set previously by a test.
214218
if (!app_manager_)
215219
app_manager_ = base::MakeUnique<AppManagerImpl>();

chrome/browser/chromeos/lock_screen_apps/state_controller_unittest.cc

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@
1414
#include "base/files/file_path.h"
1515
#include "base/memory/ptr_util.h"
1616
#include "base/test/scoped_command_line.h"
17+
#include "chrome/browser/chromeos/arc/arc_session_manager.h"
1718
#include "chrome/browser/chromeos/lock_screen_apps/app_manager.h"
1819
#include "chrome/browser/chromeos/lock_screen_apps/state_observer.h"
20+
#include "chrome/browser/chromeos/note_taking_helper.h"
1921
#include "chrome/browser/chromeos/profiles/profile_helper.h"
2022
#include "chrome/browser/extensions/extension_service.h"
2123
#include "chrome/browser/extensions/test_extension_system.h"
@@ -27,6 +29,8 @@
2729
#include "chrome/test/base/testing_profile_manager.h"
2830
#include "chromeos/dbus/dbus_thread_manager.h"
2931
#include "chromeos/dbus/fake_power_manager_client.h"
32+
#include "components/arc/arc_service_manager.h"
33+
#include "components/arc/arc_session.h"
3034
#include "components/session_manager/core/session_manager.h"
3135
#include "content/public/browser/web_contents.h"
3236
#include "content/public/browser/web_contents_observer.h"
@@ -62,6 +66,11 @@ const char kPrimaryProfileName[] = "primary_profile";
6266
// Key for pref containing lock screen data crypto key.
6367
constexpr char kDataCryptoKeyPref[] = "lockScreenAppDataCryptoKey";
6468

69+
std::unique_ptr<arc::ArcSession> ArcSessionFactory() {
70+
ADD_FAILURE() << "Attempt to create arc session.";
71+
return nullptr;
72+
}
73+
6574
scoped_refptr<extensions::Extension> CreateTestNoteTakingApp(
6675
const std::string& app_id) {
6776
ListBuilder action_handlers;
@@ -350,6 +359,13 @@ class LockScreenAppStateTest : public BrowserWithTestWindowTest {
350359
session_manager_->SetSessionState(
351360
session_manager::SessionState::LOGIN_PRIMARY);
352361

362+
// Initialize arc session manager - NoteTakingHelper expects it to be set.
363+
arc_session_manager_ = base::MakeUnique<arc::ArcSessionManager>(
364+
base::MakeUnique<arc::ArcSessionRunner>(
365+
base::Bind(&ArcSessionFactory)));
366+
367+
chromeos::NoteTakingHelper::Initialize();
368+
353369
ASSERT_TRUE(lock_screen_apps::StateController::IsEnabled());
354370

355371
// Create fake lock screen app profile.
@@ -381,6 +397,8 @@ class LockScreenAppStateTest : public BrowserWithTestWindowTest {
381397

382398
state_controller_->RemoveObserver(&observer_);
383399
state_controller_->Shutdown();
400+
chromeos::NoteTakingHelper::Shutdown();
401+
384402
session_manager_.reset();
385403
app_manager_ = nullptr;
386404
app_window_.reset();
@@ -548,6 +566,11 @@ class LockScreenAppStateTest : public BrowserWithTestWindowTest {
548566
// owned by DBusThreadManager.
549567
chromeos::FakePowerManagerClient* power_manager_client_ = nullptr;
550568

569+
// The StateController does not really have dependency on ARC, but this is
570+
// needed to properly initialize NoteTakingHelper.
571+
std::unique_ptr<arc::ArcServiceManager> arc_service_manager_;
572+
std::unique_ptr<arc::ArcSessionManager> arc_session_manager_;
573+
551574
std::unique_ptr<session_manager::SessionManager> session_manager_;
552575

553576
std::unique_ptr<lock_screen_apps::StateController> state_controller_;

0 commit comments

Comments
 (0)