package org.wikipedia.readinglist;
import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Typeface;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.StyleRes;
import android.support.v4.widget.TextViewCompat;
import android.support.v7.widget.PopupMenu;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;
import com.facebook.drawee.drawable.ScalingUtils;
import com.facebook.drawee.view.SimpleDraweeView;
import org.wikipedia.R;
import org.wikipedia.views.ViewUtil;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
public class ReadingListItemView extends FrameLayout {
public interface Callback {
void onClick(@NonNull ReadingList readingList);
void onRename(@NonNull ReadingList readingList);
void onEditDescription(@NonNull ReadingList readingList);
void onDelete(@NonNull ReadingList readingList);
}
@BindView(R.id.item_title) TextView titleView;
@BindView(R.id.item_count) TextView countView;
@BindView(R.id.item_description) TextView descriptionView;
@BindView(R.id.item_overflow_menu)View overflowButton;
@BindView(R.id.item_image_container) View imageContainer;
@BindView(R.id.item_image_1) SimpleDraweeView imageView1;
@BindView(R.id.item_image_2) SimpleDraweeView imageView2;
@BindView(R.id.item_image_3) SimpleDraweeView imageView3;
@BindView(R.id.item_image_4) SimpleDraweeView imageView4;
@Nullable private Callback callback;
@Nullable private ReadingList readingList;
private boolean showDescriptionEmptyHint;
public ReadingListItemView(Context context) {
super(context);
init();
}
public ReadingListItemView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public ReadingListItemView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public ReadingListItemView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init();
}
public void setReadingList(@NonNull ReadingList readingList) {
this.readingList = readingList;
countView.setText(readingList.getPages().size() == 1
? getResources().getString(R.string.reading_list_item_count_singular)
: String.format(getResources().getString(R.string.reading_list_item_count_plural), readingList.getPages().size()));
updateDetails();
if (imageContainer.getVisibility() == VISIBLE) {
getThumbnails();
}
}
public void setCallback(@Nullable Callback callback) {
this.callback = callback;
}
public void setOverflowButtonVisible(boolean visible) {
overflowButton.setVisibility(visible ? VISIBLE : GONE);
}
public void setThumbnailVisible(boolean visible) {
imageContainer.setVisibility(visible ? VISIBLE : GONE);
}
public void setShowDescriptionEmptyHint(boolean show) {
showDescriptionEmptyHint = show;
updateDetails();
}
public void setTitleTextAppearance(@StyleRes int id) {
TextViewCompat.setTextAppearance(titleView, id);
}
@OnClick void onClick(View view) {
if (callback != null && readingList != null) {
callback.onClick(readingList);
}
}
@OnClick(R.id.item_overflow_menu) void showOverflowMenu(View anchorView) {
PopupMenu menu = new PopupMenu(getContext(), anchorView);
menu.getMenuInflater().inflate(R.menu.menu_reading_list_item, menu.getMenu());
menu.setOnMenuItemClickListener(new OverflowMenuClickListener());
menu.show();
}
private void init() {
inflate(getContext(), R.layout.item_reading_list, this);
ButterKnife.bind(this);
setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
setClickable(true);
clearThumbnails();
}
private void getThumbnails() {
ReadingListPageDetailFetcher.updateInfo(readingList, new ReadingListPageDetailFetcher.Callback() {
@Override public void success() {
if (getWindowToken() == null) {
return;
}
updateThumbnails();
}
@Override public void failure(@NonNull Throwable e) {
}
});
updateThumbnails();
}
private void updateDetails() {
if (readingList == null) {
return;
}
titleView.setText(TextUtils.isEmpty(readingList.getTitle())
? getResources().getString(R.string.reading_list_untitled)
: readingList.getTitle());
if (TextUtils.isEmpty(readingList.getDescription()) && showDescriptionEmptyHint) {
descriptionView.setText(getContext().getString(R.string.reading_list_no_description));
descriptionView.setTypeface(descriptionView.getTypeface(), Typeface.ITALIC);
} else {
descriptionView.setText(readingList.getDescription());
descriptionView.setTypeface(descriptionView.getTypeface(), Typeface.NORMAL);
}
}
private void clearThumbnails() {
ViewUtil.loadImageUrlInto(imageView1, null);
imageView1.getHierarchy().setFailureImage(null);
ViewUtil.loadImageUrlInto(imageView2, null);
imageView2.getHierarchy().setFailureImage(null);
ViewUtil.loadImageUrlInto(imageView3, null);
imageView3.getHierarchy().setFailureImage(null);
ViewUtil.loadImageUrlInto(imageView4, null);
imageView4.getHierarchy().setFailureImage(null);
}
private void updateThumbnails() {
clearThumbnails();
int thumbIndex = 0;
if (readingList.getPages().size() > thumbIndex) {
loadThumbnail(imageView1, readingList.getPages().get(thumbIndex).thumbnailUrl());
}
if (readingList.getPages().size() > ++thumbIndex) {
loadThumbnail(imageView2, readingList.getPages().get(thumbIndex).thumbnailUrl());
}
if (readingList.getPages().size() > ++thumbIndex) {
loadThumbnail(imageView3, readingList.getPages().get(thumbIndex).thumbnailUrl());
}
if (readingList.getPages().size() > ++thumbIndex) {
loadThumbnail(imageView4, readingList.getPages().get(thumbIndex).thumbnailUrl());
}
}
private void loadThumbnail(@NonNull SimpleDraweeView view, @Nullable String url) {
if (TextUtils.isEmpty(url)) {
view.getHierarchy().setFailureImage(R.drawable.ic_image_gray_24dp,
ScalingUtils.ScaleType.FIT_CENTER);
} else {
ViewUtil.loadImageUrlInto(view, url);
}
}
private class OverflowMenuClickListener implements PopupMenu.OnMenuItemClickListener {
@Override public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_reading_list_rename:
if (callback != null && readingList != null) {
callback.onRename(readingList);
return true;
}
break;
case R.id.menu_reading_list_edit_description:
if (callback != null && readingList != null) {
callback.onEditDescription(readingList);
return true;
}
break;
case R.id.menu_reading_list_delete:
if (callback != null && readingList != null) {
callback.onDelete(readingList);
return true;
}
break;
default:
break;
}
return false;
}
}
}