-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathSnackBars.java
More file actions
144 lines (126 loc) · 5.28 KB
/
Copy pathSnackBars.java
File metadata and controls
144 lines (126 loc) · 5.28 KB
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
package com.dds.common.snack;
import android.content.ServiceConnection;
import android.net.Uri;
import android.os.Build;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.CheckResult;
import androidx.browser.customtabs.CustomTabsSession;
import com.google.android.material.snackbar.BaseTransientBottomBar;
import com.google.android.material.snackbar.Snackbar;
import com.dds.common.R;
/**
* @author dds
*/
public class SnackBars {
private static final int DEFAULT_DURATION = 10_000;
private static final int KMaxLines = 3;
@CheckResult
public static Snackbar make(final View coordinator, final int text_res, final Additional... additional) {
final Snackbar snackbar = Snackbar.make(coordinator, text_res, Snackbar.LENGTH_LONG);
for (final Additional add : additional) if (add != null) add.invoke(snackbar);
return tweak(snackbar);
}
@CheckResult
public static Snackbar make(final View coordinator, final CharSequence text, final Additional... additional) {
final Snackbar snackbar = Snackbar.make(coordinator, text, Snackbar.LENGTH_LONG);
for (final Additional add : additional) if (add != null) add.invoke(snackbar);
return tweak(snackbar);
}
@CheckResult
public static Additional lastsForever() {
return new Additional() {
@Override
public void invoke(Snackbar snackbar) {
snackbar.setDuration(BaseTransientBottomBar.LENGTH_LONG);
}
};
}
@CheckResult
public static Additional whenSwiped(final Runnable callback) {
return new Additional() {
@Override
public void invoke(Snackbar snackbar) {
snackbar.addCallback(new Snackbar.Callback() {
@Override
public void onDismissed(final Snackbar snackbar, final int event) {
if (event == DISMISS_EVENT_SWIPE) callback.run();
}
});
}
};
}
@CheckResult
public static Additional withAction(final int label_res, final View.OnClickListener listener) {
return new Additional() {
@Override
public void invoke(Snackbar snackbar) {
snackbar.setAction(label_res, listener);
}
};
}
@CheckResult
public static Additional withAction(final CharSequence label, final View.OnClickListener listener) {
return new Additional() {
@Override
public void invoke(Snackbar snackbar) {
snackbar.setAction(label, listener);
}
};
}
@CheckResult
public static Additional withLink(final int text_res, final Uri uri) {
return new Additional() {
@Override
public void invoke(Snackbar snackbar) {
withLink(snackbar.getView().getContext().getText(text_res), uri).invoke(snackbar);
}
};
}
@CheckResult
public static Additional withLink(final CharSequence text, final Uri uri) {
return new Additional() {
@Override
public void invoke(final Snackbar snackbar) {
snackbar.setAction(text, new View.OnClickListener() {
@Override
public void onClick(View v) {
WebContent.view(v.getContext(), uri);
}
}); // Default action before pre-cache
snackbar.getView().addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
@Override
public void onViewAttachedToWindow(final View snackbar_view) {
mConnection = WebContent.preload(snackbar_view.getContext(), uri,
new WebContent.OnSessionReadyListener() {
@Override
public void onSessionReady(final CustomTabsSession session) {
snackbar.setAction(text, new View.OnClickListener() {
@Override
public void onClick(View v) {
WebContent.view(v.getContext(), uri, session, null);
}
});
}
});
}
@Override
public void onViewDetachedFromWindow(final View v) {
if (mConnection != null) v.getContext().unbindService(mConnection);
}
private ServiceConnection mConnection;
});
}
};
}
private static Snackbar tweak(final Snackbar snackbar) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) snackbar.getView().setZ(999);
final TextView msg_view = snackbar.getView().findViewById(R.id.snackbar_text);
msg_view.setMaxLines(KMaxLines); // Extend max lines
msg_view.setTextColor(0xffffffff); // Workaround the light theme conflict
return snackbar;
}
public interface Additional {
void invoke(Snackbar instance);
}
}