Migrated Review Package to View Binding (#5604)

* Migrated Review Package to View Binding
* fix
This commit is contained in:
Shashank Kumar 2024-03-25 09:47:08 +05:30 committed by GitHub
parent a45ab9cf16
commit 2a2780a4d2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 90 additions and 109 deletions

View file

@ -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();
}
}
}

View file

@ -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 = "<b>" + catString + "</b>";
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;
}
}

View file

@ -20,7 +20,9 @@
android:orientation="vertical"
android:visibility="visible">
<include layout="@layout/toolbar" />
<include
android:id="@+id/toolbarBinding"
layout="@layout/toolbar" />
<androidx.appcompat.widget.AppCompatButton
@ -123,4 +125,4 @@
</LinearLayout>
</androidx.drawerlayout.widget.DrawerLayout>
</androidx.drawerlayout.widget.DrawerLayout>

View file

@ -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()
}
}
}

View file

@ -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))
}
}
}