Reland "Do not re-layout user pods if the user image does not change"
This reverts commit 6989a511f72f8b6f72c83a33ffdf738b72353f95.
Reason for revert: adressed
Original change's description:
> Revert "Do not re-layout user pods if the user image does not change"
>
> This reverts commit 2d41eb810b4ce492421422bfeff0e0480f9a7020.
>
> Reason for revert: didn't address some comments properly
>
> Original change's description:
> > Do not re-layout user pods if the user image does not change
> >
> > With MGS enabled, we are loading its image asynchronously. When the load
> > completes, we are updating the list of users on the screen, deleting
> > existing user views, which could have been already interacted with.
> >
> > Bug: b:162939476
> > Change-Id: I3881e2003ef6ae39269e0f2b01c76e96b6096834
> > Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2972689
> > Reviewed-by: Roman Sorokin [CET] <rsorokin@chromium.org>
> > Reviewed-by: Thomas Tellier <tellier@google.com>
> > Commit-Queue: Anatoliy Potapchuk <apotapchuk@chromium.org>
> > Cr-Commit-Position: refs/heads/master@{#894659}
>
> Bug: b:162939476
> Change-Id: I1a4498f1475c1dde351b4b6a30e5dc328c637b89
> No-Presubmit: true
> No-Tree-Checks: true
> No-Try: true
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2976484
> Auto-Submit: Anatoliy Potapchuk <apotapchuk@chromium.org>
> Reviewed-by: Roman Sorokin [CET] <rsorokin@chromium.org>
> Commit-Queue: Roman Sorokin [CET] <rsorokin@chromium.org>
> Commit-Queue: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
> Bot-Commit: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
> Cr-Commit-Position: refs/heads/master@{#894733}
Bug: b:162939476
Change-Id: I181aff4e0e49f249237dae704aa49d20876c88d9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2976349
Reviewed-by: Roman Sorokin [CET] <rsorokin@chromium.org>
Commit-Queue: Roman Sorokin [CET] <rsorokin@chromium.org>
Auto-Submit: Anatoliy Potapchuk <apotapchuk@chromium.org>
Cr-Commit-Position: refs/heads/master@{#894764}
diff --git a/ash/login/ui/lock_contents_view.cc b/ash/login/ui/lock_contents_view.cc
index 01419c5..feb3930 100644
--- a/ash/login/ui/lock_contents_view.cc
+++ b/ash/login/ui/lock_contents_view.cc
@@ -899,6 +899,8 @@
// Removing child views can change focus, which may result in LockContentsView
// getting focused. Make sure to clear internal references before that happens
// so there is not stale-pointer usage. See crbug.com/884402.
+ // TODO(crbug.com/1222096): We should figure out a better way of handling
+ // user info changes such as avatar changes. They should not cause view re-layouting.
main_view_->RemoveAllChildViews(true /*delete_children*/);
// Build user state list. Preserve previous state if the user already exists.
diff --git a/chrome/browser/ash/login/users/avatar/user_image_manager_impl.cc b/chrome/browser/ash/login/users/avatar/user_image_manager_impl.cc
index 6035ed3..bba212d1 100644
--- a/chrome/browser/ash/login/users/avatar/user_image_manager_impl.cc
+++ b/chrome/browser/ash/login/users/avatar/user_image_manager_impl.cc
@@ -85,8 +85,7 @@
}
// Returns the codec enum for the given image path's extension.
-ImageDecoder::ImageCodec ChooseCodecFromPath(
- const base::FilePath& image_path) {
+ImageDecoder::ImageCodec ChooseCodecFromPath(const base::FilePath& image_path) {
if (image_path.Extension() == FILE_PATH_LITERAL(".png"))
return ImageDecoder::PNG_CODEC;
@@ -347,7 +346,6 @@
user_manager::User* user = parent_->GetUserAndModify();
if (!user)
return;
-
if (!user_image->image().isNull()) {
user->SetImage(std::move(user_image), image_index_);
} else {
@@ -449,6 +447,8 @@
if (parent_->user_manager_->IsUserNonCryptohomeDataEphemeral(account_id()))
return;
+ PrefService* local_state = g_browser_process->local_state();
+
std::unique_ptr<base::DictionaryValue> entry(new base::DictionaryValue);
entry->Set(kImagePathNodeName,
std::make_unique<base::Value>(image_path_.value()));
@@ -456,8 +456,17 @@
if (!image_url_.is_empty())
entry->Set(kImageURLNodeName,
std::make_unique<base::Value>(image_url_.spec()));
- DictionaryPrefUpdate update(g_browser_process->local_state(),
- kUserImageProperties);
+
+ const base::Value* existing_value =
+ local_state->GetDictionary(kUserImageProperties)
+ ->FindDictKey(account_id().GetUserEmail());
+
+ if (existing_value && *existing_value == *entry) {
+ return;
+ }
+
+ DictionaryPrefUpdate update(local_state, kUserImageProperties);
+
update->SetKey(account_id().GetUserEmail(),
base::Value::FromUniquePtrValue(std::move(entry)));