summaryrefslogtreecommitdiff
path: root/app/src/main/java/de/danoeh/antennapod/view/EmptyViewHandler.java
blob: 1516c4eb62130c83103bdeb7340f0c9ad929a454 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package de.danoeh.antennapod.view;

import android.content.Context;
import android.graphics.drawable.Drawable;
import androidx.annotation.AttrRes;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import de.danoeh.antennapod.R;

public class EmptyViewHandler {
    private boolean layoutAdded = false;
    private RecyclerView recyclerView;
    private RecyclerView.Adapter adapter;

    private final Context context;
    private final View emptyView;
    private final TextView tvTitle;
    private final TextView tvMessage;
    private final ImageView ivIcon;

    public EmptyViewHandler(Context context) {
        emptyView = View.inflate(context, R.layout.empty_view_layout, null);
        this.context = context;
        tvTitle = emptyView.findViewById(R.id.emptyViewTitle);
        tvMessage = emptyView.findViewById(R.id.emptyViewMessage);
        ivIcon = emptyView.findViewById(R.id.emptyViewIcon);
    }

    public void setTitle(int title) {
        tvTitle.setText(title);
    }

    public void setMessage(int message) {
        tvMessage.setText(message);
    }

    public void setIcon(@AttrRes int iconAttr) {
        TypedValue typedValue = new TypedValue();
        context.getTheme().resolveAttribute(iconAttr, typedValue, true);
        Drawable d = ContextCompat.getDrawable(context, typedValue.resourceId);
        ivIcon.setImageDrawable(d);
        ivIcon.setVisibility(View.VISIBLE);
    }

    public void hide() {
        emptyView.setVisibility(View.GONE);
    }

    public void attachToListView(ListView listView) {
        if (layoutAdded) {
            throw new IllegalStateException("Can not attach to ListView multiple times");
        }
        layoutAdded = true;
        ((ViewGroup) listView.getParent()).addView(emptyView);
        listView.setEmptyView(emptyView);
    }

    public void attachToRecyclerView(RecyclerView recyclerView) {
        if (layoutAdded) {
            throw new IllegalStateException("Can not attach to ListView multiple times");
        }
        layoutAdded = true;
        this.recyclerView = recyclerView;
        ViewGroup parent = ((ViewGroup) recyclerView.getParent());
        parent.addView(emptyView);
        updateAdapter(recyclerView.getAdapter());

        if (parent instanceof RelativeLayout) {
            RelativeLayout.LayoutParams layoutParams =
                    (RelativeLayout.LayoutParams)emptyView.getLayoutParams();
            layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
            emptyView.setLayoutParams(layoutParams);
        }
    }

    public void updateAdapter(RecyclerView.Adapter adapter) {
        if (this.adapter != null) {
            this.adapter.unregisterAdapterDataObserver(adapterObserver);
        }
        this.adapter = adapter;
        if (adapter != null) {
            adapter.registerAdapterDataObserver(adapterObserver);
        }
        updateVisibility();
    }

    private final SimpleAdapterDataObserver adapterObserver = new SimpleAdapterDataObserver() {
        @Override
        public void anythingChanged() {
            updateVisibility();
        }
    };

    private void updateVisibility() {
        boolean empty;
        if (adapter == null) {
            empty = true;
        } else {
            empty = adapter.getItemCount() == 0;
        }
        recyclerView.setVisibility(empty ? View.GONE : View.VISIBLE);
        emptyView.setVisibility(empty ? View.VISIBLE : View.GONE);
    }
}