fix: Avatar picker opens multiple photo picker window when tapped quickly
Bug: 269603336
Test: manual
Change-Id: I786af065f76e39fe6f982018e993819ce0627d86
diff --git a/packages/SettingsLib/src/com/android/settingslib/users/AvatarPickerActivity.java b/packages/SettingsLib/src/com/android/settingslib/users/AvatarPickerActivity.java
index f5dddc3..bcbd1ca 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 @@
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 @@
private final int[] mUserIconColors;
private int mSelectedPosition = NONE;
+ private int mLastSelectedPosition = NONE;
+
AvatarAdapter() {
final boolean canTakePhoto =
PhotoCapabilityUtils.canTakePhoto(AvatarPickerActivity.this);
@@ -226,12 +234,10 @@
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 @@
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