Added Android code
[wl-app.git] / Android / app / src / main / java / com / moiseum / wolnelektury / components / ProgressRecyclerView.java
1 package com.moiseum.wolnelektury.components;
2
3 import android.content.Context;
4 import android.content.res.TypedArray;
5 import android.support.annotation.NonNull;
6 import android.support.annotation.Nullable;
7 import android.support.annotation.StringRes;
8 import android.support.v7.widget.RecyclerView;
9 import android.util.AttributeSet;
10 import android.view.LayoutInflater;
11 import android.view.View;
12 import android.widget.FrameLayout;
13 import android.widget.ImageButton;
14 import android.widget.ProgressBar;
15 import android.widget.TextView;
16
17 import com.moiseum.wolnelektury.R;
18 import com.moiseum.wolnelektury.components.recycler.RecyclerAdapter;
19
20 import java.util.List;
21
22 import butterknife.BindView;
23 import butterknife.ButterKnife;
24 import butterknife.OnClick;
25
26 /**
27  * @author golonkos
28  */
29
30 public class ProgressRecyclerView<T> extends FrameLayout {
31
32         public interface ProgressRecycleViewRetryListener {
33                 void onRetryClicked();
34         }
35
36         @BindView(R.id.rvList)
37         RecyclerView rvList;
38         @BindView(R.id.tvEmpty)
39         TextView tvEmpty;
40         @BindView(R.id.pbLoading)
41         ProgressBar pbLoading;
42         @BindView(R.id.ibRetry)
43         ImageButton ibRetry;
44
45         private RecyclerAdapter<T, ?> adapter;
46         private ProgressRecycleViewRetryListener listener;
47
48         public ProgressRecyclerView(@NonNull Context context) {
49                 this(context, null);
50         }
51
52         public ProgressRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs) {
53                 this(context, attrs, 0);
54         }
55
56         public ProgressRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
57                 super(context, attrs, defStyleAttr);
58                 init(attrs);
59         }
60
61         private void init(AttributeSet attrs) {
62                 View view = LayoutInflater.from(getContext()).inflate(R.layout.progress_recyclerview, this, true);
63                 ButterKnife.bind(this, view);
64
65                 TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.ProgressRecyclerView);
66                 try {
67                         if (a.hasValue(R.styleable.ProgressRecyclerView_emptyText)) {
68                                 tvEmpty.setText(a.getString(R.styleable.ProgressRecyclerView_emptyText));
69                         }
70                 } finally {
71                         a.recycle();
72                 }
73         }
74
75         public void setAdapter(RecyclerAdapter<T, ?> adapter) {
76                 this.adapter = adapter;
77                 rvList.setAdapter(adapter);
78         }
79
80         public void setItems(List<T> items) {
81                 if (adapter == null) {
82                         throw new UnsupportedOperationException("Adapter not set");
83                 }
84                 adapter.setItems(items);
85                 tvEmpty.setVisibility(items.isEmpty() ? VISIBLE : GONE);
86         }
87
88         public void addItems(List<T> items) {
89                 if (adapter == null) {
90                         throw new UnsupportedOperationException("Adapter not set");
91                 }
92                 if (items.size() > 0) {
93                         adapter.addItems(items);
94                 }
95         }
96
97         public void setProgressVisible(boolean visible) {
98                 pbLoading.setVisibility(visible ? VISIBLE : GONE);
99                 if (visible) {
100                         tvEmpty.setVisibility(GONE);
101                 }
102         }
103
104         public void showRetryButton(ProgressRecycleViewRetryListener listener) {
105                 this.listener = listener;
106                 tvEmpty.setVisibility(GONE);
107                 ibRetry.setVisibility(VISIBLE);
108         }
109
110         public void setEmptyText(@StringRes int stringResId) {
111                 tvEmpty.setText(stringResId);
112         }
113
114         public void setLayoutManager(RecyclerView.LayoutManager layoutManager) {
115                 rvList.setLayoutManager(layoutManager);
116         }
117
118         public void setHasFixedSize(boolean fixedSize) {
119                 rvList.setHasFixedSize(fixedSize);
120         }
121
122         public void addOnScrollListener(RecyclerView.OnScrollListener listener) {
123                 rvList.addOnScrollListener(listener);
124         }
125
126         public void removeOnScrollListener(RecyclerView.OnScrollListener listener) {
127                 rvList.removeOnScrollListener(listener);
128         }
129
130         @OnClick(R.id.ibRetry)
131         public void retryButtonClick() {
132                 if (listener != null) {
133                         listener.onRetryClicked();
134                 }
135                 ibRetry.setVisibility(GONE);
136         }
137
138         public void updateEmptyViewVisibility() {
139                 tvEmpty.setVisibility(ibRetry.getVisibility() == GONE && adapter.getItems().isEmpty() ? VISIBLE : GONE);
140         }
141 }