mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-27 12:53:55 +01:00
Feature/switch to butterknife (#1494)
* Implemented butterknife in MediaDetailFragment [issue #1491] * Implemented butterknife in MediaDetailPagerFragment [[issue #1491]] * post merge upstream master wip [[issue #1491]]
This commit is contained in:
parent
1ae28e37c3
commit
cd212b7daa
2 changed files with 112 additions and 95 deletions
|
|
@ -9,6 +9,7 @@ import android.os.AsyncTask;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import android.text.Editable;
|
import android.text.Editable;
|
||||||
|
import android.text.TextUtils;
|
||||||
import android.text.TextWatcher;
|
import android.text.TextWatcher;
|
||||||
import android.util.TypedValue;
|
import android.util.TypedValue;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
|
|
@ -22,6 +23,9 @@ import android.widget.ScrollView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import butterknife.BindView;
|
||||||
|
import butterknife.ButterKnife;
|
||||||
|
import butterknife.OnClick;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
@ -45,7 +49,8 @@ import fr.free.nrw.commons.mwapi.MediaWikiApi;
|
||||||
import fr.free.nrw.commons.ui.widget.CompatTextView;
|
import fr.free.nrw.commons.ui.widget.CompatTextView;
|
||||||
import timber.log.Timber;
|
import timber.log.Timber;
|
||||||
|
|
||||||
import static android.view.View.*;
|
import static android.view.View.GONE;
|
||||||
|
import static android.view.View.VISIBLE;
|
||||||
import static android.widget.Toast.LENGTH_SHORT;
|
import static android.widget.Toast.LENGTH_SHORT;
|
||||||
|
|
||||||
public class MediaDetailFragment extends CommonsDaggerSupportFragment {
|
public class MediaDetailFragment extends CommonsDaggerSupportFragment {
|
||||||
|
|
@ -75,23 +80,37 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment {
|
||||||
@Inject
|
@Inject
|
||||||
MediaWikiApi mwApi;
|
MediaWikiApi mwApi;
|
||||||
|
|
||||||
|
|
||||||
private MediaWikiImageView image;
|
|
||||||
private MediaDetailSpacer spacer;
|
|
||||||
private int initialListTop = 0;
|
private int initialListTop = 0;
|
||||||
|
|
||||||
private TextView title;
|
@BindView(R.id.mediaDetailImage)
|
||||||
private TextView desc;
|
MediaWikiImageView image;
|
||||||
private TextView author;
|
@BindView(R.id.mediaDetailSpacer)
|
||||||
private TextView license;
|
MediaDetailSpacer spacer;
|
||||||
private TextView coordinates;
|
@BindView(R.id.mediaDetailTitle)
|
||||||
private TextView uploadedDate;
|
TextView title;
|
||||||
private TextView seeMore;
|
@BindView(R.id.mediaDetailDesc)
|
||||||
private LinearLayout nominatedforDeletion;
|
TextView desc;
|
||||||
private LinearLayout categoryContainer;
|
@BindView(R.id.mediaDetailAuthor)
|
||||||
private LinearLayout authorLayout;
|
TextView author;
|
||||||
private Button delete;
|
@BindView(R.id.mediaDetailLicense)
|
||||||
private ScrollView scrollView;
|
TextView license;
|
||||||
|
@BindView(R.id.mediaDetailCoordinates)
|
||||||
|
TextView coordinates;
|
||||||
|
@BindView(R.id.mediaDetailuploadeddate)
|
||||||
|
TextView uploadedDate;
|
||||||
|
@BindView(R.id.seeMore)
|
||||||
|
TextView seeMore;
|
||||||
|
@BindView(R.id.nominatedDeletionBanner)
|
||||||
|
LinearLayout nominatedForDeletion;
|
||||||
|
@BindView(R.id.mediaDetailCategoryContainer)
|
||||||
|
LinearLayout categoryContainer;
|
||||||
|
@BindView(R.id.authorLinearLayout)
|
||||||
|
LinearLayout authorLayout;
|
||||||
|
@BindView(R.id.nominateDeletion)
|
||||||
|
Button delete;
|
||||||
|
@BindView(R.id.mediaDetailScrollView)
|
||||||
|
ScrollView scrollView;
|
||||||
|
|
||||||
private ArrayList<String> categoryNames;
|
private ArrayList<String> categoryNames;
|
||||||
private boolean categoriesLoaded = false;
|
private boolean categoriesLoaded = false;
|
||||||
private boolean categoriesPresent = false;
|
private boolean categoriesPresent = false;
|
||||||
|
|
@ -101,6 +120,9 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment {
|
||||||
private AsyncTask<Void, Void, Boolean> detailFetchTask;
|
private AsyncTask<Void, Void, Boolean> detailFetchTask;
|
||||||
private LicenseList licenseList;
|
private LicenseList licenseList;
|
||||||
|
|
||||||
|
//Had to make this class variable, to implement various onClicks, which access the media, also I fell why make separate variables when one can serve the purpose
|
||||||
|
private Media media;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onSaveInstanceState(Bundle outState) {
|
public void onSaveInstanceState(Bundle outState) {
|
||||||
super.onSaveInstanceState(outState);
|
super.onSaveInstanceState(outState);
|
||||||
|
|
@ -137,22 +159,7 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment {
|
||||||
|
|
||||||
final View view = inflater.inflate(R.layout.fragment_media_detail, container, false);
|
final View view = inflater.inflate(R.layout.fragment_media_detail, container, false);
|
||||||
|
|
||||||
image = (MediaWikiImageView) view.findViewById(R.id.mediaDetailImage);
|
ButterKnife.bind(this,view);
|
||||||
scrollView = (ScrollView) view.findViewById(R.id.mediaDetailScrollView);
|
|
||||||
|
|
||||||
// Detail consists of a list view with main pane in header view, plus category list.
|
|
||||||
spacer = (MediaDetailSpacer) view.findViewById(R.id.mediaDetailSpacer);
|
|
||||||
title = (TextView) view.findViewById(R.id.mediaDetailTitle);
|
|
||||||
desc = (TextView) view.findViewById(R.id.mediaDetailDesc);
|
|
||||||
author = (TextView) view.findViewById(R.id.mediaDetailAuthor);
|
|
||||||
license = (TextView) view.findViewById(R.id.mediaDetailLicense);
|
|
||||||
coordinates = (TextView) view.findViewById(R.id.mediaDetailCoordinates);
|
|
||||||
uploadedDate = (TextView) view.findViewById(R.id.mediaDetailuploadeddate);
|
|
||||||
seeMore = (TextView) view.findViewById(R.id.seeMore);
|
|
||||||
nominatedforDeletion = (LinearLayout) view.findViewById(R.id.nominatedDeletionBanner);
|
|
||||||
delete = (Button) view.findViewById(R.id.nominateDeletion);
|
|
||||||
categoryContainer = (LinearLayout) view.findViewById(R.id.mediaDetailCategoryContainer);
|
|
||||||
authorLayout = (LinearLayout) view.findViewById(R.id.authorLinearLayout);
|
|
||||||
|
|
||||||
if (isFeaturedMedia){
|
if (isFeaturedMedia){
|
||||||
authorLayout.setVisibility(VISIBLE);
|
authorLayout.setVisibility(VISIBLE);
|
||||||
|
|
@ -196,7 +203,7 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment {
|
||||||
@Override
|
@Override
|
||||||
public void onResume() {
|
public void onResume() {
|
||||||
super.onResume();
|
super.onResume();
|
||||||
Media media = detailProvider.getMediaAtPosition(index);
|
media = detailProvider.getMediaAtPosition(index);
|
||||||
if (media == null) {
|
if (media == null) {
|
||||||
// Ask the detail provider to ping us when we're ready
|
// Ask the detail provider to ping us when we're ready
|
||||||
Timber.d("MediaDetailFragment not yet ready to display details; registering observer");
|
Timber.d("MediaDetailFragment not yet ready to display details; registering observer");
|
||||||
|
|
@ -209,17 +216,18 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment {
|
||||||
Timber.d("MediaDetailFragment ready to display delayed details!");
|
Timber.d("MediaDetailFragment ready to display delayed details!");
|
||||||
detailProvider.unregisterDataSetObserver(dataObserver);
|
detailProvider.unregisterDataSetObserver(dataObserver);
|
||||||
dataObserver = null;
|
dataObserver = null;
|
||||||
displayMediaDetails(detailProvider.getMediaAtPosition(index));
|
media=detailProvider.getMediaAtPosition(index);
|
||||||
|
displayMediaDetails();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
detailProvider.registerDataSetObserver(dataObserver);
|
detailProvider.registerDataSetObserver(dataObserver);
|
||||||
} else {
|
} else {
|
||||||
Timber.d("MediaDetailFragment ready to display details");
|
Timber.d("MediaDetailFragment ready to display details");
|
||||||
displayMediaDetails(media);
|
displayMediaDetails();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void displayMediaDetails(final Media media) {
|
private void displayMediaDetails() {
|
||||||
//Always load image from Internet to allow viewing the desc, license, and cats
|
//Always load image from Internet to allow viewing the desc, license, and cats
|
||||||
image.setMedia(media);
|
image.setMedia(media);
|
||||||
|
|
||||||
|
|
@ -256,7 +264,6 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment {
|
||||||
if (success) {
|
if (success) {
|
||||||
extractor.fill(media);
|
extractor.fill(media);
|
||||||
setTextFields(media);
|
setTextFields(media);
|
||||||
setOnClickListeners(media);
|
|
||||||
} else {
|
} else {
|
||||||
Timber.d("Failed to load photo details.");
|
Timber.d("Failed to load photo details.");
|
||||||
}
|
}
|
||||||
|
|
@ -316,74 +323,81 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment {
|
||||||
checkDeletion(media);
|
checkDeletion(media);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setOnClickListeners(final Media media) {
|
@OnClick(R.id.mediaDetailLicense)
|
||||||
if (licenseLink(media) != null) {
|
public void onMediaDetailLicenceClicked(){
|
||||||
license.setOnClickListener(v -> openWebBrowser(licenseLink(media)));
|
if (!TextUtils.isEmpty(licenseLink(media))) {
|
||||||
|
openWebBrowser(licenseLink(media));
|
||||||
} else {
|
} else {
|
||||||
if(isFeaturedMedia) {
|
if(isFeaturedMedia) {
|
||||||
Timber.d("Unable to fetch license URL for %s", media.getLicense());
|
Timber.d("Unable to fetch license URL for %s", media.getLicense());
|
||||||
} else {
|
} else {
|
||||||
Toast toast = Toast.makeText(getContext(), getString(R.string.null_url), Toast.LENGTH_SHORT);
|
Toast toast = Toast.makeText(getContext(), getString(R.string.null_url), Toast.LENGTH_SHORT);
|
||||||
toast.show();
|
toast.show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@OnClick(R.id.mediaDetailCoordinates)
|
||||||
|
public void onMediaDetailCoordinatesClicked(){
|
||||||
if (media.getCoordinates() != null) {
|
if (media.getCoordinates() != null) {
|
||||||
coordinates.setOnClickListener(v -> openMap(media.getCoordinates()));
|
openMap(media.getCoordinates());
|
||||||
}
|
}
|
||||||
if (delete.getVisibility() == VISIBLE) {
|
}
|
||||||
enableDeleteButton(true);
|
|
||||||
|
|
||||||
delete.setOnClickListener(v -> {
|
@OnClick(R.id.nominateDeletion)
|
||||||
|
public void onDeleteButtonClicked(){
|
||||||
|
//Reviewer correct me if i have misunderstood something over here
|
||||||
|
//But how does this if (delete.getVisibility() == View.VISIBLE) {
|
||||||
|
// enableDeleteButton(true); makes sense ?
|
||||||
|
AlertDialog.Builder alert = new AlertDialog.Builder(getActivity());
|
||||||
|
alert.setMessage("Why should this file be deleted?");
|
||||||
|
final EditText input = new EditText(getActivity());
|
||||||
|
alert.setView(input);
|
||||||
|
input.requestFocus();
|
||||||
|
alert.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
|
||||||
|
public void onClick(DialogInterface dialog, int whichButton) {
|
||||||
|
String reason = input.getText().toString();
|
||||||
|
DeleteTask deleteTask = new DeleteTask(getActivity(), media, reason);
|
||||||
|
deleteTask.execute();
|
||||||
|
enableDeleteButton(false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
alert.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
|
||||||
|
public void onClick(DialogInterface dialog, int whichButton) {
|
||||||
|
}
|
||||||
|
});
|
||||||
|
AlertDialog d = alert.create();
|
||||||
|
input.addTextChangedListener(new TextWatcher() {
|
||||||
|
private void handleText() {
|
||||||
|
final Button okButton = d.getButton(AlertDialog.BUTTON_POSITIVE);
|
||||||
|
if (input.getText().length() == 0) {
|
||||||
|
okButton.setEnabled(false);
|
||||||
|
} else {
|
||||||
|
okButton.setEnabled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
AlertDialog.Builder alert = new AlertDialog.Builder(getActivity());
|
@Override
|
||||||
alert.setMessage("Why should this file be deleted?");
|
public void afterTextChanged(Editable arg0) {
|
||||||
final EditText input = new EditText(getActivity());
|
handleText();
|
||||||
alert.setView(input);
|
}
|
||||||
input.requestFocus();
|
|
||||||
alert.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
|
|
||||||
public void onClick(DialogInterface dialog, int whichButton) {
|
|
||||||
String reason = input.getText().toString();
|
|
||||||
DeleteTask deleteTask = new DeleteTask(getActivity(), media, reason);
|
|
||||||
deleteTask.execute();
|
|
||||||
enableDeleteButton(false);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
alert.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
|
|
||||||
public void onClick(DialogInterface dialog, int whichButton) {
|
|
||||||
}
|
|
||||||
});
|
|
||||||
AlertDialog d = alert.create();
|
|
||||||
input.addTextChangedListener(new TextWatcher() {
|
|
||||||
private void handleText() {
|
|
||||||
final Button okButton = d.getButton(AlertDialog.BUTTON_POSITIVE);
|
|
||||||
if (input.getText().length() == 0) {
|
|
||||||
okButton.setEnabled(false);
|
|
||||||
} else {
|
|
||||||
okButton.setEnabled(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void afterTextChanged(Editable arg0) {
|
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
|
||||||
handleText();
|
}
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
|
public void onTextChanged(CharSequence s, int start, int before, int count) {
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
d.show();
|
||||||
|
d.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@OnClick(R.id.seeMore)
|
||||||
public void onTextChanged(CharSequence s, int start, int before, int count) {
|
public void onSeeMoreClicked(){
|
||||||
}
|
if(nominatedForDeletion.getVisibility()== VISIBLE) {
|
||||||
});
|
openWebBrowser(media.getFilePageTitle().getMobileUri().toString());
|
||||||
d.show();
|
|
||||||
d.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (nominatedforDeletion.getVisibility() == VISIBLE){
|
|
||||||
seeMore.setOnClickListener(v -> {
|
|
||||||
openWebBrowser(media.getFilePageTitle().getMobileUri().toString());
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -488,11 +502,11 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment {
|
||||||
private void checkDeletion(Media media){
|
private void checkDeletion(Media media){
|
||||||
if (media.getRequestedDeletion()){
|
if (media.getRequestedDeletion()){
|
||||||
delete.setVisibility(GONE);
|
delete.setVisibility(GONE);
|
||||||
nominatedforDeletion.setVisibility(VISIBLE);
|
nominatedForDeletion.setVisibility(VISIBLE);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
delete.setVisibility(VISIBLE);
|
delete.setVisibility(VISIBLE);
|
||||||
nominatedforDeletion.setVisibility(GONE);
|
nominatedForDeletion.setVisibility(GONE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,8 @@ import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import butterknife.BindView;
|
||||||
|
import butterknife.ButterKnife;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.inject.Named;
|
import javax.inject.Named;
|
||||||
|
|
||||||
|
|
@ -53,7 +55,8 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple
|
||||||
@Named("default_preferences")
|
@Named("default_preferences")
|
||||||
SharedPreferences prefs;
|
SharedPreferences prefs;
|
||||||
|
|
||||||
private ViewPager pager;
|
@BindView(R.id.mediaDetailsPager)
|
||||||
|
ViewPager pager;
|
||||||
private Boolean editable;
|
private Boolean editable;
|
||||||
private boolean isFeaturedImage;
|
private boolean isFeaturedImage;
|
||||||
|
|
||||||
|
|
@ -72,7 +75,7 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple
|
||||||
ViewGroup container,
|
ViewGroup container,
|
||||||
Bundle savedInstanceState) {
|
Bundle savedInstanceState) {
|
||||||
View view = inflater.inflate(R.layout.fragment_media_detail_pager, container, false);
|
View view = inflater.inflate(R.layout.fragment_media_detail_pager, container, false);
|
||||||
pager = (ViewPager) view.findViewById(R.id.mediaDetailsPager);
|
ButterKnife.bind(this,view);
|
||||||
pager.addOnPageChangeListener(this);
|
pager.addOnPageChangeListener(this);
|
||||||
|
|
||||||
final MediaDetailAdapter adapter = new MediaDetailAdapter(getChildFragmentManager());
|
final MediaDetailAdapter adapter = new MediaDetailAdapter(getChildFragmentManager());
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue