-
Notifications
You must be signed in to change notification settings - Fork 254
/
ReactNativeAudioStreamingModule.java
125 lines (103 loc) · 3.62 KB
/
ReactNativeAudioStreamingModule.java
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
package com.audioStreaming;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.util.Log;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.modules.core.DeviceEventManagerModule;
import javax.annotation.Nullable;
public class ReactNativeAudioStreamingModule extends ReactContextBaseJavaModule
implements ServiceConnection {
public static final String SHOULD_SHOW_NOTIFICATION = "showInAndroidNotifications";
private ReactApplicationContext context;
private Class<?> clsActivity;
private static Signal signal;
private Intent bindIntent;
private String streamingURL;
private boolean shouldShowNotification;
public ReactNativeAudioStreamingModule(ReactApplicationContext reactContext) {
super(reactContext);
this.context = reactContext;
}
public ReactApplicationContext getReactApplicationContextModule() {
return this.context;
}
public Class<?> getClassActivity() {
if (this.clsActivity == null) {
this.clsActivity = getCurrentActivity().getClass();
}
return this.clsActivity;
}
public void stopOncall() {
this.signal.stop();
}
public Signal getSignal() {
return signal;
}
public void sendEvent(ReactContext reactContext, String eventName, @Nullable WritableMap params) {
this.context.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
.emit(eventName, params);
}
@Override public String getName() {
return "ReactNativeAudioStreaming";
}
@Override public void initialize() {
super.initialize();
try {
bindIntent = new Intent(this.context, Signal.class);
this.context.bindService(bindIntent, this, Context.BIND_AUTO_CREATE);
} catch (Exception e) {
Log.e("ERROR", e.getMessage());
}
}
@Override public void onServiceConnected(ComponentName className, IBinder service) {
signal = ((Signal.RadioBinder) service).getService();
signal.setData(this.context, this);
WritableMap params = Arguments.createMap();
sendEvent(this.getReactApplicationContextModule(), "streamingOpen", params);
}
@Override public void onServiceDisconnected(ComponentName className) {
signal = null;
}
@ReactMethod public void play(String streamingURL, ReadableMap options) {
this.streamingURL = streamingURL;
this.shouldShowNotification =
options.hasKey(SHOULD_SHOW_NOTIFICATION) && options.getBoolean(SHOULD_SHOW_NOTIFICATION);
signal.setURLStreaming(streamingURL); // URL of MP3 or AAC stream
playInternal();
}
private void playInternal() {
signal.play();
if (shouldShowNotification) {
signal.showNotification();
}
}
@ReactMethod public void stop() {
signal.stop();
}
@ReactMethod public void pause() {
// Not implemented on aac
this.stop();
}
@ReactMethod public void resume() {
// Not implemented on aac
playInternal();
}
@ReactMethod public void destroyNotification() {
signal.exitNotification();
}
@ReactMethod public void getStatus(Callback callback) {
WritableMap state = Arguments.createMap();
state.putString("status", signal != null && signal.isPlaying ? Mode.PLAYING : Mode.STOPPED);
callback.invoke(null, state);
}
}