Skip to content

Commit f8ee7e0

Browse files
committed
fix(android): snackbar supports ESM
1 parent b58c7a4 commit f8ee7e0

File tree

5 files changed

+97
-52
lines changed

5 files changed

+97
-52
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
2+
dependencies {
3+
def androidXAppCompatVersion = project.hasProperty("androidXAppCompatVersion") ? project.androidXAppCompatVersion : "1.1.0"
4+
def androidXMaterial = project.hasProperty("androidXMaterial") ? project.androidXMaterial : "1.1.0"
5+
6+
compile "androidx.appcompat:appcompat:$androidXAppCompatVersion"
7+
compile "com.google.android.material:material:$androidXMaterial"
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.nativescript.material.snackbar;
2+
3+
import android.content.Context;
4+
import com.google.android.material.snackbar.Snackbar;
5+
6+
public class SnackCallback extends
7+
com.google.android.material.snackbar.BaseTransientBottomBar.BaseCallback<com.google.android.material.snackbar.Snackbar> {
8+
public interface SnackCallbackListener {
9+
public void onDismissed(Snackbar snackbar, int event);
10+
11+
public void onShown(Snackbar snackbar);
12+
}
13+
14+
SnackCallbackListener listener;
15+
16+
public SnackCallback() {
17+
super();
18+
}
19+
20+
public void setListener(SnackCallbackListener listener) {
21+
this.listener = listener;
22+
}
23+
24+
@Override
25+
public void onDismissed(Snackbar snackbar, int event) {
26+
if (listener != null) {
27+
listener.onDismissed(snackbar, event);
28+
}
29+
}
30+
31+
@Override
32+
public void onShown(Snackbar snackbar) {
33+
if (listener != null) {
34+
listener.onShown(snackbar);
35+
}
36+
}
37+
38+
}

src/snackbar/snackbar-common.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -52,17 +52,18 @@ export interface SnackBarOptions {
5252
}
5353

5454
export enum DismissReasons {
55-
SWIPE = 'Swipe',
56-
ACTION = 'Action',
57-
TIMEOUT = 'Timeout',
58-
MANUAL = 'Manual',
59-
CONSECUTIVE = 'Consecutive',
60-
UNKNOWN = 'Unknown'
55+
SWIPE = 'swipe',
56+
ACTION = 'action',
57+
TIMEOUT = 'timeout',
58+
MANUAL = 'manual',
59+
CONSECUTIVE = 'consecutive',
60+
UNKNOWN = 'unknown'
6161
}
6262

6363
export enum SnackBarAction {
64-
NONE = 'None',
65-
DISMISS = 'Dismiss'
64+
ACTION = 'action',
65+
NONE = 'none',
66+
DISMISS = 'dismiss'
6667
}
6768

6869
export abstract class SnackBarBase {

src/snackbar/snackbar.android.ts

Lines changed: 27 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -105,24 +105,43 @@ export class SnackBar extends SnackBarBase {
105105
}
106106
if (resolve) {
107107
const listener = new android.view.View.OnClickListener({
108-
onClick: args => {
108+
onClick: (args) => {
109109
resolve({
110-
command: 'Action',
110+
command: SnackBarAction.ACTION,
111111
reason: _getReason(1),
112-
event: args
112+
event: args,
113113
});
114114
if (this._snackbarCallback) {
115115
(this._snackbarCallback as any).cb = null;
116116
this._snackbarCallback = null;
117117
}
118118
this._snackbar = null;
119-
}
119+
},
120120
});
121121

122122
// set the action text, click listener
123123
this._snackbar.setAction(options.actionText, listener);
124-
initializeSnackCallback();
125-
const cb = (this._snackbarCallback = new SnackCallback());
124+
125+
const callbackListener = new com.nativescript.material.snackbar.SnackCallback.SnackCallbackListener({
126+
onDismissed(snackbar: com.google.android.material.snackbar.Snackbar, event: number) {
127+
// if the dismiss was not caused by the action button click listener
128+
const resolve = (cb as any).resolve;
129+
if (event !== com.google.android.material.snackbar.BaseTransientBottomBar.BaseCallback.DISMISS_EVENT_ACTION && resolve) {
130+
resolve({
131+
command: SnackBarAction.DISMISS,
132+
reason: _getReason(event),
133+
event: event,
134+
});
135+
(cb as any).resolve.resolve = null;
136+
}
137+
(cb as any).nListener = null;
138+
},
139+
140+
onShown(snackbar: com.google.android.material.snackbar.Snackbar) {},
141+
});
142+
const cb = (this._snackbarCallback = new com.nativescript.material.snackbar.SnackCallback());
143+
cb.setListener(callbackListener);
144+
(cb as any).nListener = callbackListener; // handles the resolve of the promise
126145
(cb as any).resolve = resolve; // handles the resolve of the promise
127146
this._snackbar.addCallback(cb);
128147
}
@@ -158,7 +177,7 @@ export class SnackBar extends SnackBarBase {
158177
setTimeout(() => {
159178
resolve({
160179
action: SnackBarAction.DISMISS,
161-
reason: _getReason(3)
180+
reason: _getReason(3),
162181
});
163182
}, 200);
164183
this._snackbar = null;
@@ -168,49 +187,13 @@ export class SnackBar extends SnackBarBase {
168187
} else {
169188
resolve({
170189
action: SnackBarAction.NONE,
171-
message: 'No actionbar to dismiss'
190+
message: 'No actionbar to dismiss',
172191
});
173192
}
174193
});
175194
}
176195
}
177196

178-
let SnackCallback: SnackCallback;
179-
180-
interface SnackCallback {
181-
// resolve: Function;
182-
new (): com.google.android.material.snackbar.BaseTransientBottomBar.BaseCallback<com.google.android.material.snackbar.Snackbar>;
183-
}
184-
function initializeSnackCallback() {
185-
if (SnackCallback) {
186-
return;
187-
}
188-
189-
class SnackCallbackImpl extends com.google.android.material.snackbar.BaseTransientBottomBar.BaseCallback<com.google.android.material.snackbar.Snackbar> {
190-
public resolve: Function = null;
191-
192-
constructor() {
193-
super();
194-
return global.__native(this);
195-
}
196-
197-
onDismissed(snackbar: com.google.android.material.snackbar.Snackbar, event: number) {
198-
// if the dismiss was not caused by the action button click listener
199-
if (event !== com.google.android.material.snackbar.BaseTransientBottomBar.BaseCallback.DISMISS_EVENT_ACTION && this.resolve) {
200-
this.resolve({
201-
command: 'Dismiss',
202-
reason: _getReason(event),
203-
event: event
204-
});
205-
this.resolve = null;
206-
}
207-
}
208-
209-
onShown(snackbar: com.google.android.material.snackbar.Snackbar) {}
210-
}
211-
212-
SnackCallback = SnackCallbackImpl;
213-
}
214197
export function showSnack(options: SnackBarOptions) {
215198
return new SnackBar().showSnack(options);
216199
}

src/typings/extensions.android.d.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,21 @@ declare namespace com {
1111
fullClearFocus();
1212
}
1313
}
14+
export namespace snackbar {
15+
class SnackCallback extends com.google.android.material.snackbar.BaseTransientBottomBar.BaseCallback<com.google.android.material.snackbar.Snackbar> {
16+
public setListener(listener: SnackCallback.SnackCallbackListener);
17+
}
18+
namespace SnackCallback {
19+
class SnackCallbackListener {
20+
constructor(implementation: {
21+
onDismissed(snackbar: com.google.android.material.snackbar.Snackbar, event: number): void;
22+
onShown(snackbar: com.google.android.material.snackbar.Snackbar): void;
23+
});
24+
public onDismissed(snackbar: com.google.android.material.snackbar.Snackbar, event: number): void;
25+
public onShown(snackbar: com.google.android.material.snackbar.Snackbar): void;
26+
}
27+
}
28+
}
1429
export namespace bottomsheet {
1530
class BottomSheetDialogFragment extends com.google.android.material.bottomsheet.BottomSheetDialogFragment {
1631
public setListener(listener: BottomSheetDialogFragment.BottomSheetDialogFragmentListener);

0 commit comments

Comments
 (0)