From 1ad4dc59e30d5bbad738dc3917b4e00278ce1fe1 Mon Sep 17 00:00:00 2001 From: Anna Bauza Date: Fri, 21 Apr 2023 16:17:15 +0000 Subject: [PATCH] fix: Avatar picker opens multiple photo picker window when tapped quickly Bug: 269603336 Test: manual Change-Id: I786af065f76e39fe6f982018e993819ce0627d86 --- .../users/AvatarPickerActivity.java | 41 ++++++++++++++----- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/packages/SettingsLib/src/com/android/settingslib/users/AvatarPickerActivity.java b/packages/SettingsLib/src/com/android/settingslib/users/AvatarPickerActivity.java index f5dddc39b21e1..bcbd1caa45d3d 100644 --- a/packages/SettingsLib/src/com/android/settingslib/users/AvatarPickerActivity.java +++ b/packages/SettingsLib/src/com/android/settingslib/users/AvatarPickerActivity.java @@ -108,6 +108,12 @@ public class AvatarPickerActivity extends Activity { mWaitingForActivityResult); } + @Override + protected void onResume() { + super.onResume(); + mAdapter.onAdapterResume(); + } + private void setUpButtons() { GlifLayout glifLayout = findViewById(R.id.glif_layout); FooterBarMixin mixin = glifLayout.getMixin(FooterBarMixin.class); @@ -198,6 +204,8 @@ public class AvatarPickerActivity extends Activity { private final int[] mUserIconColors; private int mSelectedPosition = NONE; + private int mLastSelectedPosition = NONE; + AvatarAdapter() { final boolean canTakePhoto = PhotoCapabilityUtils.canTakePhoto(AvatarPickerActivity.this); @@ -226,12 +234,10 @@ public class AvatarPickerActivity extends Activity { if (position == mTakePhotoPosition) { viewHolder.setDrawable(getDrawable(R.drawable.avatar_take_photo_circled)); viewHolder.setContentDescription(getString(R.string.user_image_take_photo)); - viewHolder.setClickListener(view -> mAvatarPhotoController.takePhoto()); } else if (position == mChoosePhotoPosition) { viewHolder.setDrawable(getDrawable(R.drawable.avatar_choose_photo_circled)); viewHolder.setContentDescription(getString(R.string.user_image_choose_photo)); - viewHolder.setClickListener(view -> mAvatarPhotoController.choosePhoto()); } else if (position >= mPreselectedImageStartPosition) { int index = indexFromPosition(position); @@ -240,17 +246,30 @@ public class AvatarPickerActivity extends Activity { if (mImageDescriptions != null) { viewHolder.setContentDescription(mImageDescriptions.get(index)); } else { - viewHolder.setContentDescription( - getString(R.string.default_user_icon_description)); + viewHolder.setContentDescription(getString( + R.string.default_user_icon_description)); } - viewHolder.setClickListener(view -> { - if (mSelectedPosition == position) { - deselect(position); - } else { - select(position); - } - }); } + viewHolder.setClickListener(view -> onViewHolderSelected(position)); + } + + private void onViewHolderSelected(int position) { + if ((mTakePhotoPosition == position) && (mLastSelectedPosition != position)) { + mAvatarPhotoController.takePhoto(); + } else if ((mChoosePhotoPosition == position) && (mLastSelectedPosition != position)) { + mAvatarPhotoController.choosePhoto(); + } else { + if (mSelectedPosition == position) { + deselect(position); + } else { + select(position); + } + } + mLastSelectedPosition = position; + } + + public void onAdapterResume() { + mLastSelectedPosition = NONE; } @Override