From 93eb3312cb3e915effa69e4509ae20fbee08d6a8 Mon Sep 17 00:00:00 2001 From: Mateusz Drzazga Date: Fri, 7 May 2021 16:44:58 +0200 Subject: [PATCH 1/2] Guard against invalid selections. Notify-update clicked item only, instead of the entire collection. --- .../actionarea/GalleryNoteFragment.java | 33 +++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/OpenScienceJournal/whistlepunk_library/src/main/java/com/google/android/apps/forscience/whistlepunk/actionarea/GalleryNoteFragment.java b/OpenScienceJournal/whistlepunk_library/src/main/java/com/google/android/apps/forscience/whistlepunk/actionarea/GalleryNoteFragment.java index aa033bd4..433ce858 100644 --- a/OpenScienceJournal/whistlepunk_library/src/main/java/com/google/android/apps/forscience/whistlepunk/actionarea/GalleryNoteFragment.java +++ b/OpenScienceJournal/whistlepunk_library/src/main/java/com/google/android/apps/forscience/whistlepunk/actionarea/GalleryNoteFragment.java @@ -22,12 +22,6 @@ import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; -import androidx.annotation.Nullable; -import androidx.loader.app.LoaderManager; -import androidx.loader.content.Loader; -import androidx.recyclerview.widget.DefaultItemAnimator; -import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.RecyclerView; import android.text.format.DateUtils; import android.util.Log; import android.view.LayoutInflater; @@ -35,17 +29,25 @@ import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.loader.app.LoaderManager; +import androidx.loader.content.Loader; +import androidx.recyclerview.widget.DefaultItemAnimator; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + import com.bumptech.glide.load.DataSource; import com.bumptech.glide.load.engine.GlideException; import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.target.Target; import com.google.android.apps.forscience.whistlepunk.GlideApp; import com.google.android.apps.forscience.whistlepunk.NoteTakingActivity; -import com.google.android.apps.forscience.whistlepunk.actionarea.PhotoAsyncLoader.Image; import com.google.android.apps.forscience.whistlepunk.PictureUtils; import com.google.android.apps.forscience.whistlepunk.R; import com.google.android.apps.forscience.whistlepunk.RxEvent; import com.google.android.apps.forscience.whistlepunk.accounts.AppAccount; +import com.google.android.apps.forscience.whistlepunk.actionarea.PhotoAsyncLoader.Image; import com.google.android.apps.forscience.whistlepunk.filemetadata.FileMetadataUtil; import com.google.android.apps.forscience.whistlepunk.filemetadata.Label; import com.google.android.apps.forscience.whistlepunk.metadata.GoosciLabel; @@ -55,14 +57,16 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.jakewharton.rxbinding2.view.RxView; import com.tbruyelle.rxpermissions2.RxPermissions; -import io.reactivex.subjects.BehaviorSubject; -import io.reactivex.subjects.SingleSubject; + import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Locale; +import io.reactivex.subjects.BehaviorSubject; +import io.reactivex.subjects.SingleSubject; + /** * Fragment controlling adding picture notes from the gallery in the ExperimentActivity. * @@ -401,16 +405,19 @@ public boolean onResourceReady( holder.image.setOnClickListener( view -> { - boolean newlySelected = !selectedIndices.contains(holder.getAdapterPosition()); + final int adapterPosition = holder.getAdapterPosition(); + // Ignore invalid clicks that happened between layouts. + if (adapterPosition == RecyclerView.NO_POSITION) return; + boolean newlySelected = !selectedIndices.contains(adapterPosition); if (newlySelected) { // It was clicked for the first time. - setSelectedIndex(holder.getAdapterPosition()); + setSelectedIndex(adapterPosition); } else { // A second click on the same image is a deselect. - selectedIndices.remove(selectedIndices.indexOf(holder.getAdapterPosition())); + selectedIndices.remove(selectedIndices.indexOf(adapterPosition)); } holder.selectedIndicator.setSelected(newlySelected); - notifyDataSetChanged(); + notifyItemChanged(adapterPosition); listener.onImageClicked(); }); From 470818be8062f3852f1169a2577dbc555ffca06f Mon Sep 17 00:00:00 2001 From: Mateusz Drzazga Date: Mon, 10 May 2021 08:59:34 +0200 Subject: [PATCH 2/2] Update other selected indices labels when uselecting item --- .../whistlepunk/actionarea/GalleryNoteFragment.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/OpenScienceJournal/whistlepunk_library/src/main/java/com/google/android/apps/forscience/whistlepunk/actionarea/GalleryNoteFragment.java b/OpenScienceJournal/whistlepunk_library/src/main/java/com/google/android/apps/forscience/whistlepunk/actionarea/GalleryNoteFragment.java index 433ce858..e583f1ca 100644 --- a/OpenScienceJournal/whistlepunk_library/src/main/java/com/google/android/apps/forscience/whistlepunk/actionarea/GalleryNoteFragment.java +++ b/OpenScienceJournal/whistlepunk_library/src/main/java/com/google/android/apps/forscience/whistlepunk/actionarea/GalleryNoteFragment.java @@ -415,9 +415,13 @@ public boolean onResourceReady( } else { // A second click on the same image is a deselect. selectedIndices.remove(selectedIndices.indexOf(adapterPosition)); + // Update other selected items labels. + for (int i = 0; i < selectedIndices.size(); ++i) { + notifyItemChanged(selectedIndices.get(i)); + } + // Update current selection + notifyItemChanged(adapterPosition); } - holder.selectedIndicator.setSelected(newlySelected); - notifyItemChanged(adapterPosition); listener.onImageClicked(); });