diff --git a/app/src/main/java/fr/free/nrw/commons/review/ReviewActivity.java b/app/src/main/java/fr/free/nrw/commons/review/ReviewActivity.java index 9b01f7357..5eb758ada 100644 --- a/app/src/main/java/fr/free/nrw/commons/review/ReviewActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/review/ReviewActivity.java @@ -11,22 +11,12 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; -import android.widget.Button; -import android.widget.FrameLayout; -import android.widget.LinearLayout; -import android.widget.ProgressBar; -import android.widget.TextView; -import androidx.appcompat.widget.Toolbar; -import androidx.drawerlayout.widget.DrawerLayout; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; -import butterknife.BindView; -import butterknife.ButterKnife; -import com.facebook.drawee.view.SimpleDraweeView; -import com.viewpagerindicator.CirclePageIndicator; import fr.free.nrw.commons.Media; import fr.free.nrw.commons.R; import fr.free.nrw.commons.auth.AccountUtil; +import fr.free.nrw.commons.databinding.ActivityReviewBinding; import fr.free.nrw.commons.delete.DeleteHelper; import fr.free.nrw.commons.media.MediaDetailFragment; import fr.free.nrw.commons.theme.BaseActivity; @@ -39,27 +29,10 @@ import javax.inject.Inject; public class ReviewActivity extends BaseActivity { - @BindView(R.id.pager_indicator_review) - public CirclePageIndicator pagerIndicator; - @BindView(R.id.toolbar) - Toolbar toolbar; - @BindView(R.id.drawer_layout) - DrawerLayout drawerLayout; - @BindView(R.id.view_pager_review) - ReviewViewPager reviewPager; - @BindView(R.id.skip_image) - Button btnSkipImage; - @BindView(R.id.review_image_view) - SimpleDraweeView simpleDraweeView; - @BindView(R.id.pb_review_image) - ProgressBar progressBar; - @BindView(R.id.tv_image_caption) - TextView imageCaption; - @BindView(R.id.mediaDetailContainer) - FrameLayout mediaDetailContainer; + + private ActivityReviewBinding binding; + MediaDetailFragment mediaDetailFragment; - @BindView(R.id.reviewActivityContainer) - LinearLayout reviewContainer; public ReviewPagerAdapter reviewPagerAdapter; public ReviewController reviewController; @Inject @@ -110,19 +83,20 @@ public class ReviewActivity extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_review); - ButterKnife.bind(this); - setSupportActionBar(toolbar); + binding = ActivityReviewBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + setSupportActionBar(binding.toolbarBinding.toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); reviewController = new ReviewController(deleteHelper, this); reviewPagerAdapter = new ReviewPagerAdapter(getSupportFragmentManager()); - reviewPager.setAdapter(reviewPagerAdapter); - pagerIndicator.setViewPager(reviewPager); - progressBar.setVisibility(View.VISIBLE); + binding.viewPagerReview.setAdapter(reviewPagerAdapter); + binding.pagerIndicatorReview.setViewPager(binding.viewPagerReview); + binding.pbReviewImage.setVisibility(View.VISIBLE); - Drawable d[]=btnSkipImage.getCompoundDrawablesRelative(); + Drawable d[]=binding.skipImage.getCompoundDrawablesRelative(); d[2].setColorFilter(getApplicationContext().getResources().getColor(R.color.button_blue), PorterDuff.Mode.SRC_IN); if (savedInstanceState != null && savedInstanceState.getParcelable(SAVED_MEDIA) != null) { @@ -132,17 +106,17 @@ public class ReviewActivity extends BaseActivity { runRandomizer(); //Run randomizer whenever everything is ready so that a first random image will be added } - btnSkipImage.setOnClickListener(view -> { + binding.skipImage.setOnClickListener(view -> { reviewImageFragment = getInstanceOfReviewImageFragment(); reviewImageFragment.disableButtons(); runRandomizer(); }); - simpleDraweeView.setOnClickListener(view ->setUpMediaDetailFragment()); + binding.reviewImageView.setOnClickListener(view ->setUpMediaDetailFragment()); - btnSkipImage.setOnTouchListener((view, event) -> { + binding.skipImage.setOnTouchListener((view, event) -> { if (event.getAction() == MotionEvent.ACTION_UP && event.getRawX() >= ( - btnSkipImage.getRight() - btnSkipImage + binding.skipImage.getRight() - binding.skipImage .getCompoundDrawables()[2].getBounds().width())) { showSkipImageInfo(); return true; @@ -160,8 +134,8 @@ public class ReviewActivity extends BaseActivity { @SuppressLint("CheckResult") public boolean runRandomizer() { hasNonHiddenCategories = false; - progressBar.setVisibility(View.VISIBLE); - reviewPager.setCurrentItem(0); + binding.pbReviewImage.setVisibility(View.VISIBLE); + binding.viewPagerReview.setCurrentItem(0); // Finds non-hidden categories from Media instance compositeDisposable.add(reviewHelper.getRandomMedia() .subscribeOn(Schedulers.io()) @@ -213,7 +187,7 @@ public class ReviewActivity extends BaseActivity { this.media = media; String fileName = media.getFilename(); if (fileName.length() == 0) { - ViewUtil.showShortSnackbar(drawerLayout, R.string.error_review); + ViewUtil.showShortSnackbar(binding.drawerLayout, R.string.error_review); return; } @@ -223,7 +197,7 @@ public class ReviewActivity extends BaseActivity { return; } - simpleDraweeView.setImageURI(media.getImageUrl()); + binding.reviewImageView.setImageURI(media.getImageUrl()); reviewController.onImageRefreshed(media); //file name is updated compositeDisposable.add(reviewHelper.getFirstRevisionOfFile(fileName) @@ -233,19 +207,19 @@ public class ReviewActivity extends BaseActivity { reviewController.firstRevision = revision; reviewPagerAdapter.updateFileInformation(); @SuppressLint({"StringFormatInvalid", "LocalSuppress"}) String caption = String.format(getString(R.string.review_is_uploaded_by), fileName, revision.getUser()); - imageCaption.setText(caption); - progressBar.setVisibility(View.GONE); + binding.tvImageCaption.setText(caption); + binding.pbReviewImage.setVisibility(View.GONE); reviewImageFragment = getInstanceOfReviewImageFragment(); reviewImageFragment.enableButtons(); })); - reviewPager.setCurrentItem(0); + binding.viewPagerReview.setCurrentItem(0); } public void swipeToNext() { - int nextPos = reviewPager.getCurrentItem() + 1; + int nextPos = binding.viewPagerReview.getCurrentItem() + 1; // If currently at category fragment, then check whether the media has any non-hidden category if (nextPos <= 3) { - reviewPager.setCurrentItem(nextPos); + binding.viewPagerReview.setCurrentItem(nextPos); if (nextPos == 2) { // The media has no non-hidden category. Such media are already flagged by server-side bots, so no need to review manually. if (!hasNonHiddenCategories) { @@ -262,6 +236,7 @@ public class ReviewActivity extends BaseActivity { public void onDestroy() { super.onDestroy(); compositeDisposable.clear(); + binding = null; } public void showSkipImageInfo(){ @@ -306,8 +281,8 @@ public class ReviewActivity extends BaseActivity { * this function return the instance of reviewImageFragment */ public ReviewImageFragment getInstanceOfReviewImageFragment(){ - int currentItemOfReviewPager = reviewPager.getCurrentItem(); - reviewImageFragment = (ReviewImageFragment) reviewPagerAdapter.instantiateItem(reviewPager, currentItemOfReviewPager); + int currentItemOfReviewPager = binding.viewPagerReview.getCurrentItem(); + reviewImageFragment = (ReviewImageFragment) reviewPagerAdapter.instantiateItem(binding.viewPagerReview, currentItemOfReviewPager); return reviewImageFragment; } @@ -315,9 +290,9 @@ public class ReviewActivity extends BaseActivity { * set up the media detail fragment when click on the review image */ private void setUpMediaDetailFragment() { - if (mediaDetailContainer.getVisibility() == View.GONE && media != null) { - mediaDetailContainer.setVisibility(View.VISIBLE); - reviewContainer.setVisibility(View.INVISIBLE); + if (binding.mediaDetailContainer.getVisibility() == View.GONE && media != null) { + binding.mediaDetailContainer.setVisibility(View.VISIBLE); + binding.reviewActivityContainer.setVisibility(View.INVISIBLE); FragmentManager fragmentManager = getSupportFragmentManager(); mediaDetailFragment = new MediaDetailFragment(); Bundle bundle = new Bundle(); @@ -334,9 +309,9 @@ public class ReviewActivity extends BaseActivity { */ @Override public void onBackPressed() { - if (mediaDetailContainer.getVisibility() == View.VISIBLE) { - mediaDetailContainer.setVisibility(View.GONE); - reviewContainer.setVisibility(View.VISIBLE); + if (binding.mediaDetailContainer.getVisibility() == View.VISIBLE) { + binding.mediaDetailContainer.setVisibility(View.GONE); + binding.reviewActivityContainer.setVisibility(View.VISIBLE); } super.onBackPressed(); } @@ -348,10 +323,11 @@ public class ReviewActivity extends BaseActivity { Fragment mediaDetailFragment = getSupportFragmentManager() .findFragmentById(R.id.mediaDetailContainer); if (mediaDetailFragment != null) { - mediaDetailContainer.setVisibility(View.VISIBLE); - reviewContainer.setVisibility(View.INVISIBLE); + binding.mediaDetailContainer.setVisibility(View.VISIBLE); + binding.reviewActivityContainer.setVisibility(View.INVISIBLE); getSupportFragmentManager().beginTransaction() .replace(R.id.mediaDetailContainer, mediaDetailFragment).commit(); } } + } diff --git a/app/src/main/java/fr/free/nrw/commons/review/ReviewImageFragment.java b/app/src/main/java/fr/free/nrw/commons/review/ReviewImageFragment.java index 29552e375..fb23654e2 100644 --- a/app/src/main/java/fr/free/nrw/commons/review/ReviewImageFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/review/ReviewImageFragment.java @@ -7,17 +7,12 @@ import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.Button; -import android.widget.ProgressBar; -import android.widget.TextView; import androidx.annotation.NonNull; -import butterknife.BindView; -import butterknife.ButterKnife; -import butterknife.OnClick; import fr.free.nrw.commons.Media; import fr.free.nrw.commons.R; +import fr.free.nrw.commons.databinding.FragmentReviewImageBinding; import fr.free.nrw.commons.di.CommonsDaggerSupportFragment; import java.util.ArrayList; import java.util.List; @@ -31,16 +26,10 @@ public class ReviewImageFragment extends CommonsDaggerSupportFragment { private int position; - public ProgressBar progressBar; + private FragmentReviewImageBinding binding; + + - @BindView(R.id.tv_review_question) - TextView textViewQuestion; - @BindView(R.id.tv_review_question_context) - TextView textViewQuestionContext; - @BindView(R.id.button_yes) - Button yesButton; - @BindView(R.id.button_no) - Button noButton; // Constant variable used to store user's key name for onSaveInstanceState method private final String SAVED_USER = "saved_user"; @@ -68,7 +57,7 @@ public class ReviewImageFragment extends CommonsDaggerSupportFragment { categories.add(value); } String catString = TextUtils.join(", ", categories); - if (catString != null && !catString.equals("") && textViewQuestionContext != null) { + if (catString != null && !catString.equals("") && binding.tvReviewQuestionContext != null) { catString = "" + catString + ""; String stringToConvertHtml = String.format(getResources().getString(R.string.review_category_explanation), catString); return Html.fromHtml(stringToConvertHtml).toString(); @@ -86,19 +75,19 @@ public class ReviewImageFragment extends CommonsDaggerSupportFragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { position = getArguments().getInt("position"); - View layoutView = inflater.inflate(R.layout.fragment_review_image, container, - false); - ButterKnife.bind(this, layoutView); + binding = FragmentReviewImageBinding.inflate(inflater, container, false); String question, explanation=null, yesButtonText, noButtonText; + binding.buttonYes.setOnClickListener(view -> onYesButtonClicked()); + switch (position) { case SPAM: question = getString(R.string.review_spam); explanation = getString(R.string.review_spam_explanation); yesButtonText = getString(R.string.yes); noButtonText = getString(R.string.no); - noButton.setOnClickListener(view -> getReviewActivity() + binding.buttonNo.setOnClickListener(view -> getReviewActivity() .reviewController.reportSpam(requireActivity(), getReviewCallback())); break; case COPYRIGHT: @@ -107,7 +96,7 @@ public class ReviewImageFragment extends CommonsDaggerSupportFragment { explanation = getString(R.string.review_copyright_explanation); yesButtonText = getString(R.string.yes); noButtonText = getString(R.string.no); - noButton.setOnClickListener(view -> getReviewActivity() + binding.buttonNo.setOnClickListener(view -> getReviewActivity() .reviewController .reportPossibleCopyRightViolation(requireActivity(), getReviewCallback())); break; @@ -117,7 +106,7 @@ public class ReviewImageFragment extends CommonsDaggerSupportFragment { explanation = updateCategoriesQuestion(); yesButtonText = getString(R.string.yes); noButtonText = getString(R.string.no); - noButton.setOnClickListener(view -> { + binding.buttonNo.setOnClickListener(view -> { getReviewActivity() .reviewController .reportWrongCategory(requireActivity(), getReviewCallback()); @@ -144,9 +133,9 @@ public class ReviewImageFragment extends CommonsDaggerSupportFragment { // Note that the yes and no buttons are swapped in this section yesButtonText = getString(R.string.review_thanks_yes_button_text); noButtonText = getString(R.string.review_thanks_no_button_text); - yesButton.setTextColor(Color.parseColor("#116aaa")); - noButton.setTextColor(Color.parseColor("#228b22")); - noButton.setOnClickListener(view -> { + binding.buttonYes.setTextColor(Color.parseColor("#116aaa")); + binding.buttonNo.setTextColor(Color.parseColor("#228b22")); + binding.buttonNo.setOnClickListener(view -> { getReviewActivity().reviewController.sendThanks(getReviewActivity()); getReviewActivity().swipeToNext(); }); @@ -159,11 +148,11 @@ public class ReviewImageFragment extends CommonsDaggerSupportFragment { noButtonText = "no"; } - textViewQuestion.setText(question); - textViewQuestionContext.setText(explanation); - yesButton.setText(yesButtonText); - noButton.setText(noButtonText); - return layoutView; + binding.tvReviewQuestion.setText(question); + binding.tvReviewQuestionContext.setText(explanation); + binding.buttonYes.setText(yesButtonText); + binding.buttonNo.setText(noButtonText); + return binding.getRoot(); } @@ -200,10 +189,10 @@ public class ReviewImageFragment extends CommonsDaggerSupportFragment { * been loaded to enable the review buttons. */ public void enableButtons() { - yesButton.setEnabled(true); - yesButton.setAlpha(1); - noButton.setEnabled(true); - noButton.setAlpha(1); + binding.buttonYes.setEnabled(true); + binding.buttonYes.setAlpha(1); + binding.buttonNo.setEnabled(true); + binding.buttonNo.setAlpha(1); } /** @@ -211,13 +200,12 @@ public class ReviewImageFragment extends CommonsDaggerSupportFragment { * to disable the review buttons */ public void disableButtons() { - yesButton.setEnabled(false); - yesButton.setAlpha(0.5f); - noButton.setEnabled(false); - noButton.setAlpha(0.5f); + binding.buttonYes.setEnabled(false); + binding.buttonYes.setAlpha(0.5f); + binding.buttonNo.setEnabled(false); + binding.buttonNo.setAlpha(0.5f); } - @OnClick(R.id.button_yes) void onYesButtonClicked() { getReviewActivity().swipeToNext(); } @@ -225,4 +213,10 @@ public class ReviewImageFragment extends CommonsDaggerSupportFragment { private ReviewActivity getReviewActivity() { return (ReviewActivity) requireActivity(); } + + @Override + public void onDestroy() { + super.onDestroy(); + binding = null; + } } diff --git a/app/src/main/res/layout/activity_review.xml b/app/src/main/res/layout/activity_review.xml index b3de4e8ef..871d25c7d 100644 --- a/app/src/main/res/layout/activity_review.xml +++ b/app/src/main/res/layout/activity_review.xml @@ -20,7 +20,9 @@ android:orientation="vertical" android:visibility="visible"> - + - \ No newline at end of file + diff --git a/app/src/test/kotlin/fr/free/nrw/commons/review/ReviewActivityTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/review/ReviewActivityTest.kt index 042559f8a..b401d7e81 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/review/ReviewActivityTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/review/ReviewActivityTest.kt @@ -12,6 +12,7 @@ import fr.free.nrw.commons.Media import fr.free.nrw.commons.OkHttpConnectionFactory import fr.free.nrw.commons.TestCommonsApplication import fr.free.nrw.commons.createTestClient +import fr.free.nrw.commons.databinding.ActivityReviewBinding import io.reactivex.Single import org.junit.Assert import org.junit.Before @@ -58,6 +59,8 @@ class ReviewActivityTest { @Mock private lateinit var reviewImageFragment: ReviewImageFragment + private lateinit var binding: ActivityReviewBinding + @Before fun setUp() { MockitoAnnotations.openMocks(this) @@ -71,11 +74,12 @@ class ReviewActivityTest { Fresco.initialize(context) activity = Robolectric.buildActivity(ReviewActivity::class.java).create().get() + binding = ActivityReviewBinding.inflate(activity.layoutInflater) menuItem = RoboMenuItem(null) menu = RoboMenu(context) - Whitebox.setInternalState(activity, "reviewPager", reviewPager); + Whitebox.setInternalState(binding, "viewPagerReview", reviewPager); Whitebox.setInternalState(activity, "hasNonHiddenCategories", hasNonHiddenCategories); Whitebox.setInternalState(activity, "reviewHelper", reviewHelper); Whitebox.setInternalState(activity, "reviewImageFragment", reviewImageFragment); @@ -192,4 +196,4 @@ class ReviewActivityTest { activity.onBackPressed() } -} \ No newline at end of file +} diff --git a/app/src/test/kotlin/fr/free/nrw/commons/review/ReviewImageFragmentTest.kt b/app/src/test/kotlin/fr/free/nrw/commons/review/ReviewImageFragmentTest.kt index fdadedc03..6e08dc665 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/review/ReviewImageFragmentTest.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/review/ReviewImageFragmentTest.kt @@ -18,6 +18,7 @@ import fr.free.nrw.commons.OkHttpConnectionFactory import fr.free.nrw.commons.R import fr.free.nrw.commons.TestCommonsApplication import fr.free.nrw.commons.createTestClient +import fr.free.nrw.commons.databinding.FragmentReviewImageBinding import org.junit.Assert import org.junit.Before import org.junit.Test @@ -57,6 +58,8 @@ class ReviewImageFragmentTest { private lateinit var activity: ReviewActivity + private lateinit var binding: FragmentReviewImageBinding + @Before fun setUp() { @@ -78,16 +81,18 @@ class ReviewImageFragmentTest { view = LayoutInflater.from(activity) .inflate(R.layout.fragment_review_image, null) as View + binding = FragmentReviewImageBinding.inflate(LayoutInflater.from(activity)) noButton = view.findViewById(R.id.button_no) yesButton = view.findViewById(R.id.button_yes) textViewQuestion = view.findViewById(R.id.tv_review_question) textViewQuestionContext = view.findViewById(R.id.tv_review_question_context) - fragment.noButton = noButton - fragment.yesButton = yesButton - fragment.textViewQuestion = textViewQuestion - fragment.textViewQuestionContext = textViewQuestionContext + Whitebox.setInternalState(fragment, "binding", binding) + Whitebox.setInternalState(binding, "buttonYes", yesButton) + Whitebox.setInternalState(binding, "buttonNo", noButton) + Whitebox.setInternalState(binding, "tvReviewQuestion", textViewQuestion) + Whitebox.setInternalState(binding, "tvReviewQuestionContext", textViewQuestionContext) } @Test @@ -159,4 +164,4 @@ class ReviewImageFragmentTest { shadowOf(Looper.getMainLooper()).idle() Assert.assertNotNull(method.invoke(fragment)) } -} \ No newline at end of file +}