Added Android code
[wl-app.git] / Android / app / src / main / java / com / moiseum / wolnelektury / view / book / list / BooksListAdapter.java
1 package com.moiseum.wolnelektury.view.book.list;
2
3 import android.content.Context;
4 import android.content.res.Resources;
5 import android.graphics.Color;
6 import android.support.annotation.NonNull;
7 import android.text.SpannableString;
8 import android.text.style.AbsoluteSizeSpan;
9 import android.text.style.ForegroundColorSpan;
10 import android.text.style.RelativeSizeSpan;
11 import android.view.View;
12 import android.view.ViewGroup;
13 import android.widget.ImageButton;
14 import android.widget.ImageView;
15 import android.widget.RelativeLayout;
16 import android.widget.TextView;
17
18 import com.bumptech.glide.Glide;
19 import com.bumptech.glide.load.engine.DiskCacheStrategy;
20 import com.moiseum.wolnelektury.R;
21 import com.moiseum.wolnelektury.base.WLApplication;
22 import com.moiseum.wolnelektury.components.recycler.RecyclerAdapter;
23 import com.moiseum.wolnelektury.components.recycler.ViewHolder;
24 import com.moiseum.wolnelektury.connection.RestClient;
25 import com.moiseum.wolnelektury.connection.models.BookModel;
26 import com.moiseum.wolnelektury.utils.SharedPreferencesUtils;
27
28 import butterknife.BindView;
29
30 /**
31  * Created by piotrostrowski on 16.11.2017.
32  */
33
34 public class BooksListAdapter extends RecyclerAdapter<BookModel, BooksListAdapter.BookViewHolder> {
35
36         public interface BooksListDeletionListener {
37                 void onDeleteBookClicked(BookModel book, int position);
38         }
39
40         private BooksListDeletionListener listener;
41         private View.OnClickListener deleteButtonClick = new View.OnClickListener() {
42                 @Override
43                 public void onClick(View v) {
44                         if (listener != null) {
45                                 int position = (int) v.getTag();
46                                 BookModel book = getItem(position);
47                                 listener.onDeleteBookClicked(book, position);
48                         }
49                 }
50         };
51
52         public BooksListAdapter(Context context) {
53                 super(context, RecyclerAdapter.Selection.NONE);
54         }
55
56         @Override
57         protected String getItemId(BookModel item) {
58                 return item.getSlug();
59         }
60
61         @NonNull
62         @Override
63         public BookViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
64                 return new BookViewHolder(inflate(R.layout.list_search, parent));
65         }
66
67         @Override
68         public void onBindViewHolder(BookViewHolder viewHolder, int position) {
69                 super.onBindViewHolder(viewHolder, position);
70                 viewHolder.ibDeleteEbook.setTag(position);
71                 viewHolder.ibDeleteEbook.setOnClickListener(deleteButtonClick);
72         }
73
74         public void setOnDeleteListener(BooksListDeletionListener listener) {
75                 this.listener = listener;
76         }
77
78         static class BookViewHolder extends ViewHolder<BookModel> {
79
80                 @BindView(R.id.ivBookCover)
81                 ImageView ivBookCover;
82                 @BindView(R.id.tvBookAuthor)
83                 TextView tvBookAuthor;
84                 @BindView(R.id.tvBookTitle)
85                 TextView tvBookTitle;
86                 @BindView(R.id.tvBookEpoch)
87                 TextView tvBookEpoch;
88                 @BindView(R.id.tvBookGenre)
89                 TextView tvBookGenre;
90                 @BindView(R.id.tvBookKind)
91                 TextView tvBookKind;
92                 @BindView(R.id.ibDeleteEbook)
93                 ImageButton ibDeleteEbook;
94                 @BindView(R.id.ivEbook)
95                 ImageView ivEbook;
96                 @BindView(R.id.tvEbookReaden)
97                 TextView tvEbookReaden;
98                 @BindView(R.id.ivAudioBook)
99                 ImageView ivAudioBook;
100                 @BindView(R.id.tvAudioBookReaden)
101                 TextView tvAudioBookReaden;
102                 private final SharedPreferencesUtils preferences = WLApplication.getInstance().getPreferences();
103
104                 BookViewHolder(View view) {
105                         super(view);
106                 }
107
108                 @Override
109                 public void bind(BookModel item, boolean selected) {
110                         if (item.getCoverThumb() != null) {
111                                 String coverUrl = item.getCoverThumb();
112                                 if (!coverUrl.contains(RestClient.MEDIA_URL) && !coverUrl.contains(RestClient.MEDIA_URL_HTTPS)) {
113                                         coverUrl = RestClient.MEDIA_URL_HTTPS + coverUrl;
114                                 }
115                                 Glide.with(getContext()).load(coverUrl).placeholder(R.drawable.list_nocover).diskCacheStrategy(DiskCacheStrategy.ALL).dontTransform().into(ivBookCover);
116                         } else {
117                                 ivBookCover.setImageResource(R.drawable.list_nocover);
118                         }
119                         tvBookAuthor.setText(item.getAuthor());
120                         tvBookTitle.setText(item.getTitle());
121                         tvBookEpoch.setText(item.getEpoch());
122                         tvBookGenre.setText(item.getGenre());
123                         tvBookKind.setText(item.getKind());
124                         ibDeleteEbook.setVisibility(item.isDeletable() ? View.VISIBLE : View.GONE);
125                         if (item.getCurrentChapter() != 0 && item.getTotalChapters() != 0) {
126                                 SpannableString progressSpannable = spanStringSize(item, false, R.string.reading_progress);
127                                 tvEbookReaden.setVisibility(View.VISIBLE);
128                                 tvEbookReaden.setText(progressSpannable);
129                         } else {
130                                 tvEbookReaden.setVisibility(View.GONE);
131                         }
132                         if (item.isHasAudio()) {
133                                 ivAudioBook.setVisibility(View.VISIBLE);
134                                 if (item.getCurrentAudioChapter() != 0 && item.getTotalAudioChapters() != 0) {
135                                         SpannableString progressSpannable = spanStringSize(item, true, R.string.listening_progress);
136                                         tvAudioBookReaden.setVisibility(View.VISIBLE);
137                                         tvAudioBookReaden.setText(progressSpannable);
138                                 } else {
139                                         tvAudioBookReaden.setVisibility(View.GONE);
140                                 }
141                         } else {
142                                 ivAudioBook.setVisibility(View.GONE);
143                                 tvAudioBookReaden.setVisibility(View.GONE);
144                         }
145                 }
146
147                 private SpannableString spanStringSize(BookModel item, boolean isAudioPart, int resourceId) {
148                         float currentChapter = isAudioPart ? (float) item.getCurrentAudioChapter() : (float) item.getCurrentChapter();
149                         float totalChapter = isAudioPart ? (float) item.getTotalAudioChapters() : (float) item.getTotalChapters();
150                         int progress = (int) ((currentChapter / totalChapter) * 100.f);
151
152                         String progressText = getContext().getString(resourceId, progress);
153                         SpannableString progressSpannable = new SpannableString(progressText.toUpperCase());
154                         int size = ((int) getContext().getResources().getDimension(R.dimen.list_title_text_size));
155                         progressSpannable.setSpan(new AbsoluteSizeSpan(size), progressText.indexOf(" "), progressText.length() - 1, 0); // set size
156                         return progressSpannable;
157                 }
158         }
159 }