ionic-chromecast 0.0.3 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -1
- package/android/src/main/AndroidManifest.xml +5 -0
- package/android/src/main/java/com/fabianacevedo/ionicchromecast/CastOptionsProvider.java +10 -11
- package/android/src/main/java/com/fabianacevedo/ionicchromecast/IonicChromecast.java +383 -211
- package/android/src/main/java/com/fabianacevedo/ionicchromecast/IonicChromecastPlugin.java +120 -206
- package/dist/docs.json +10 -0
- package/dist/esm/definitions.d.ts +7 -0
- package/dist/esm/definitions.js.map +1 -1
- package/dist/esm/web.d.ts +4 -0
- package/dist/esm/web.js +4 -0
- package/dist/esm/web.js.map +1 -1
- package/dist/plugin.cjs.js +4 -0
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.js +4 -0
- package/dist/plugin.js.map +1 -1
- package/package.json +5 -2
|
@@ -8,30 +8,21 @@ import com.getcapacitor.annotation.CapacitorPlugin;
|
|
|
8
8
|
|
|
9
9
|
import android.text.TextUtils;
|
|
10
10
|
import com.google.android.gms.cast.CastMediaControlIntent;
|
|
11
|
+
import com.google.android.gms.cast.framework.CastSession;
|
|
12
|
+
import com.google.android.gms.cast.framework.Session;
|
|
13
|
+
import com.google.android.gms.cast.framework.SessionManager;
|
|
14
|
+
import com.google.android.gms.cast.framework.SessionManagerListener;
|
|
11
15
|
import androidx.appcompat.app.AppCompatActivity;
|
|
12
16
|
import androidx.mediarouter.app.MediaRouteChooserDialog;
|
|
13
17
|
import androidx.mediarouter.media.MediaRouteSelector;
|
|
14
18
|
import androidx.mediarouter.media.MediaRouter;
|
|
15
19
|
import android.content.DialogInterface;
|
|
16
20
|
|
|
17
|
-
// New imports for Cast session/media events
|
|
18
|
-
import com.google.android.gms.cast.framework.CastContext;
|
|
19
|
-
import com.google.android.gms.cast.framework.CastSession;
|
|
20
|
-
import com.google.android.gms.cast.framework.SessionManagerListener;
|
|
21
|
-
import com.google.android.gms.cast.framework.media.RemoteMediaClient;
|
|
22
|
-
|
|
23
21
|
@CapacitorPlugin(name = "IonicChromecast")
|
|
24
22
|
public class IonicChromecastPlugin extends Plugin {
|
|
25
23
|
|
|
26
24
|
private IonicChromecast implementation = new IonicChromecast();
|
|
27
|
-
|
|
28
|
-
// Session/media listeners
|
|
29
25
|
private SessionManagerListener<CastSession> sessionListener;
|
|
30
|
-
private RemoteMediaClient.Callback mediaCallback;
|
|
31
|
-
|
|
32
|
-
// MediaRouter for route selection observation
|
|
33
|
-
private MediaRouter mediaRouter;
|
|
34
|
-
private MediaRouter.Callback mediaRouterCallback;
|
|
35
26
|
|
|
36
27
|
/**
|
|
37
28
|
* Initialize the Google Cast SDK
|
|
@@ -50,279 +41,202 @@ public class IonicChromecastPlugin extends Plugin {
|
|
|
50
41
|
|
|
51
42
|
JSObject ret = new JSObject();
|
|
52
43
|
ret.put("success", success);
|
|
44
|
+
String initError = implementation.getLastError();
|
|
45
|
+
if (initError != null && !initError.isEmpty()) {
|
|
46
|
+
ret.put("error", initError);
|
|
47
|
+
}
|
|
53
48
|
|
|
54
49
|
if (success) {
|
|
55
|
-
|
|
56
|
-
try {
|
|
57
|
-
CastContext cc = implementation.getCastContext();
|
|
58
|
-
if (cc != null) {
|
|
59
|
-
// Remove previous listener if any
|
|
60
|
-
if (sessionListener != null) {
|
|
61
|
-
cc.getSessionManager().removeSessionManagerListener(sessionListener, CastSession.class);
|
|
62
|
-
}
|
|
63
|
-
sessionListener = new SessionManagerListener<CastSession>() {
|
|
64
|
-
@Override
|
|
65
|
-
public void onSessionStarted(CastSession session, String sessionId) {
|
|
66
|
-
com.getcapacitor.Logger.info("IonicChromecast", "⭐ onSessionStarted called! sessionId=" + sessionId);
|
|
67
|
-
JSObject data = new JSObject();
|
|
68
|
-
data.put("sessionId", sessionId);
|
|
69
|
-
notifyListeners("sessionStarted", data);
|
|
70
|
-
|
|
71
|
-
attachRemoteMediaClient(session);
|
|
72
|
-
}
|
|
73
|
-
@Override
|
|
74
|
-
public void onSessionResumed(CastSession session, boolean wasSuspended) {
|
|
75
|
-
com.getcapacitor.Logger.info("IonicChromecast", "⭐ onSessionResumed called!");
|
|
76
|
-
JSObject data = new JSObject();
|
|
77
|
-
data.put("resumed", true);
|
|
78
|
-
notifyListeners("sessionStarted", data);
|
|
79
|
-
|
|
80
|
-
attachRemoteMediaClient(session);
|
|
81
|
-
}
|
|
82
|
-
@Override public void onSessionEnded(CastSession session, int error) {
|
|
83
|
-
com.getcapacitor.Logger.info("IonicChromecast", "⭐ onSessionEnded called! error=" + error);
|
|
84
|
-
JSObject data = new JSObject();
|
|
85
|
-
data.put("errorCode", error);
|
|
86
|
-
notifyListeners("sessionEnded", data);
|
|
87
|
-
detachRemoteMediaClient(session);
|
|
88
|
-
}
|
|
89
|
-
@Override public void onSessionStarting(CastSession session) {
|
|
90
|
-
com.getcapacitor.Logger.info("IonicChromecast", "⭐ onSessionStarting called!");
|
|
91
|
-
}
|
|
92
|
-
@Override public void onSessionEnding(CastSession session) {
|
|
93
|
-
com.getcapacitor.Logger.info("IonicChromecast", "⭐ onSessionEnding called!");
|
|
94
|
-
}
|
|
95
|
-
@Override public void onSessionStartFailed(CastSession session, int error) {
|
|
96
|
-
com.getcapacitor.Logger.error("IonicChromecast", "⭐ onSessionStartFailed! error=" + error, null);
|
|
97
|
-
}
|
|
98
|
-
@Override public void onSessionResumeFailed(CastSession session, int error) {
|
|
99
|
-
com.getcapacitor.Logger.error("IonicChromecast", "⭐ onSessionResumeFailed! error=" + error, null);
|
|
100
|
-
}
|
|
101
|
-
@Override public void onSessionSuspended(CastSession session, int reason) {
|
|
102
|
-
com.getcapacitor.Logger.info("IonicChromecast", "⭐ onSessionSuspended! reason=" + reason);
|
|
103
|
-
}
|
|
104
|
-
@Override public void onSessionResuming(CastSession session, String sessionId) {
|
|
105
|
-
com.getcapacitor.Logger.info("IonicChromecast", "⭐ onSessionResuming! sessionId=" + sessionId);
|
|
106
|
-
}
|
|
107
|
-
};
|
|
108
|
-
cc.getSessionManager().addSessionManagerListener(sessionListener, CastSession.class);
|
|
109
|
-
com.getcapacitor.Logger.info("IonicChromecast", "✅ SessionManagerListener registered successfully");
|
|
110
|
-
}
|
|
111
|
-
} catch (Exception ignored) {}
|
|
112
|
-
|
|
50
|
+
setupSessionListener();
|
|
113
51
|
call.resolve(ret);
|
|
114
52
|
} else {
|
|
115
53
|
call.reject("Failed to initialize Cast SDK", ret);
|
|
116
54
|
}
|
|
117
55
|
}
|
|
118
56
|
|
|
119
|
-
private void
|
|
57
|
+
private void setupSessionListener() {
|
|
120
58
|
try {
|
|
121
|
-
|
|
122
|
-
if (
|
|
123
|
-
|
|
124
|
-
|
|
59
|
+
SessionManager sm = implementation.getCastContext() != null ? implementation.getCastContext().getSessionManager() : null;
|
|
60
|
+
if (sm == null) return;
|
|
61
|
+
|
|
62
|
+
if (sessionListener == null) {
|
|
63
|
+
sessionListener = new SessionManagerListener<CastSession>() {
|
|
64
|
+
@Override public void onSessionStarting(CastSession session) {
|
|
65
|
+
JSObject data = new JSObject();
|
|
66
|
+
data.put("state", "starting");
|
|
67
|
+
notifyListeners("sessionStarted", data);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
@Override public void onSessionStarted(CastSession session, String sessionId) {
|
|
71
|
+
JSObject data = new JSObject();
|
|
72
|
+
data.put("state", "started");
|
|
73
|
+
data.put("sessionId", sessionId);
|
|
74
|
+
notifyListeners("sessionStarted", data);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
@Override public void onSessionStartFailed(CastSession session, int i) {
|
|
78
|
+
JSObject data = new JSObject();
|
|
79
|
+
data.put("state", "startFailed");
|
|
80
|
+
data.put("code", i);
|
|
81
|
+
notifyListeners("sessionEnded", data);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
@Override public void onSessionEnding(CastSession session) {
|
|
85
|
+
JSObject data = new JSObject();
|
|
86
|
+
data.put("state", "ending");
|
|
87
|
+
notifyListeners("sessionEnded", data);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
@Override public void onSessionEnded(CastSession session, int i) {
|
|
91
|
+
JSObject data = new JSObject();
|
|
92
|
+
data.put("state", "ended");
|
|
93
|
+
data.put("code", i);
|
|
94
|
+
notifyListeners("sessionEnded", data);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
@Override public void onSessionResuming(CastSession session, String s) {}
|
|
98
|
+
@Override public void onSessionResumed(CastSession session, boolean b) {}
|
|
99
|
+
@Override public void onSessionResumeFailed(CastSession session, int i) {}
|
|
100
|
+
@Override public void onSessionSuspended(CastSession session, int i) {}
|
|
101
|
+
};
|
|
125
102
|
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
JSObject data = new JSObject();
|
|
130
|
-
data.put("status", "updated");
|
|
131
|
-
notifyListeners("playbackStatusChanged", data);
|
|
132
|
-
}
|
|
133
|
-
@Override
|
|
134
|
-
public void onMetadataUpdated() {
|
|
135
|
-
JSObject data = new JSObject();
|
|
136
|
-
data.put("status", "metadataUpdated");
|
|
137
|
-
notifyListeners("playbackStatusChanged", data);
|
|
138
|
-
}
|
|
139
|
-
};
|
|
140
|
-
rmc.registerCallback(mediaCallback);
|
|
103
|
+
|
|
104
|
+
sm.removeSessionManagerListener(sessionListener, CastSession.class);
|
|
105
|
+
sm.addSessionManagerListener(sessionListener, CastSession.class);
|
|
141
106
|
} catch (Exception ignored) {}
|
|
142
107
|
}
|
|
143
108
|
|
|
144
|
-
|
|
109
|
+
@Override
|
|
110
|
+
protected void handleOnDestroy() {
|
|
111
|
+
super.handleOnDestroy();
|
|
145
112
|
try {
|
|
146
|
-
|
|
147
|
-
if (
|
|
148
|
-
|
|
113
|
+
SessionManager sm = implementation.getCastContext() != null ? implementation.getCastContext().getSessionManager() : null;
|
|
114
|
+
if (sm != null && sessionListener != null) {
|
|
115
|
+
sm.removeSessionManagerListener(sessionListener, CastSession.class);
|
|
149
116
|
}
|
|
150
117
|
} catch (Exception ignored) {}
|
|
151
118
|
}
|
|
152
119
|
|
|
153
|
-
@PluginMethod
|
|
154
|
-
public void echo(PluginCall call) {
|
|
155
|
-
String value = call.getString("value");
|
|
156
|
-
|
|
157
|
-
JSObject ret = new JSObject();
|
|
158
|
-
ret.put("value", implementation.echo(value));
|
|
159
|
-
call.resolve(ret);
|
|
160
|
-
}
|
|
161
|
-
|
|
162
120
|
/**
|
|
163
|
-
*
|
|
121
|
+
* Muestra el selector nativo de dispositivos Cast
|
|
164
122
|
*/
|
|
165
123
|
@PluginMethod
|
|
166
124
|
public void requestSession(PluginCall call) {
|
|
167
|
-
|
|
168
|
-
if (!implementation.isInitialized()) {
|
|
125
|
+
if (!implementation.isInitialized() || implementation.getCastContext() == null) {
|
|
169
126
|
JSObject err = new JSObject();
|
|
170
127
|
err.put("success", false);
|
|
171
|
-
err.put("message", "Cast SDK not initialized
|
|
128
|
+
err.put("message", "Cast SDK not initialized");
|
|
172
129
|
call.reject("Failed to request Cast session", err);
|
|
173
130
|
return;
|
|
174
131
|
}
|
|
175
132
|
|
|
176
133
|
getActivity().runOnUiThread(() -> {
|
|
177
134
|
try {
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
135
|
+
// Si hay una sesión con otro appId, termínala para forzar el receiver actual
|
|
136
|
+
try {
|
|
137
|
+
SessionManager sm = implementation.getCastContext().getSessionManager();
|
|
138
|
+
CastSession current = sm != null ? sm.getCurrentCastSession() : null;
|
|
139
|
+
String wantedApp = CastOptionsProvider.sReceiverApplicationId;
|
|
140
|
+
String currentApp = (current != null && current.getApplicationMetadata() != null) ? current.getApplicationMetadata().getApplicationId() : "";
|
|
141
|
+
if (current != null && current.isConnected() && wantedApp != null && !wantedApp.isEmpty() && !wantedApp.equals(currentApp)) {
|
|
142
|
+
sm.endCurrentSession(true);
|
|
143
|
+
}
|
|
144
|
+
} catch (Exception ignored) {}
|
|
186
145
|
|
|
187
|
-
com.getcapacitor.Logger.info("IonicChromecast", "🚀 Showing Cast device selector via MediaRouteChooserDialog...");
|
|
188
|
-
|
|
189
|
-
// Use MediaRouteChooserDialog - the proper way (as per caprockapps implementation)
|
|
190
146
|
AppCompatActivity activity = (AppCompatActivity) getActivity();
|
|
191
|
-
|
|
192
147
|
String receiverId = CastOptionsProvider.sReceiverApplicationId;
|
|
193
|
-
if (TextUtils.isEmpty(receiverId))
|
|
194
|
-
|
|
195
|
-
}
|
|
196
|
-
|
|
148
|
+
if (TextUtils.isEmpty(receiverId)) receiverId = "CC1AD845";
|
|
149
|
+
|
|
197
150
|
MediaRouteSelector selector = new MediaRouteSelector.Builder()
|
|
198
151
|
.addControlCategory(CastMediaControlIntent.categoryForCast(receiverId))
|
|
199
152
|
.build();
|
|
200
|
-
|
|
153
|
+
|
|
201
154
|
MediaRouteChooserDialog chooserDialog = new MediaRouteChooserDialog(activity, androidx.appcompat.R.style.Theme_AppCompat_NoActionBar);
|
|
202
155
|
chooserDialog.setRouteSelector(selector);
|
|
203
156
|
chooserDialog.setCanceledOnTouchOutside(true);
|
|
204
157
|
chooserDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
|
|
205
|
-
@Override
|
|
206
|
-
public void onCancel(DialogInterface dialog) {
|
|
207
|
-
com.getcapacitor.Logger.info("IonicChromecast", "User cancelled Cast device selection");
|
|
208
|
-
}
|
|
158
|
+
@Override public void onCancel(DialogInterface dialog) {}
|
|
209
159
|
});
|
|
210
|
-
|
|
211
|
-
// Show the dialog
|
|
212
160
|
chooserDialog.show();
|
|
213
|
-
|
|
214
|
-
com.getcapacitor.Logger.info("IonicChromecast", "✅ Cast device selector dialog displayed");
|
|
215
161
|
|
|
216
162
|
JSObject ret = new JSObject();
|
|
217
163
|
ret.put("success", true);
|
|
218
|
-
ret.put("message", "Cast chooser displayed
|
|
164
|
+
ret.put("message", "Cast chooser displayed");
|
|
219
165
|
call.resolve(ret);
|
|
220
166
|
} catch (Exception e) {
|
|
221
|
-
com.getcapacitor.Logger.error("IonicChromecast", "❌ Error showing Cast chooser: " + e.getMessage(), e);
|
|
222
167
|
JSObject err = new JSObject();
|
|
223
168
|
err.put("success", false);
|
|
224
|
-
err.put("message", "Error showing
|
|
169
|
+
err.put("message", "Error showing chooser: " + e.getMessage());
|
|
225
170
|
call.reject("Failed to request Cast session", err);
|
|
226
171
|
}
|
|
227
172
|
});
|
|
228
173
|
}
|
|
229
174
|
|
|
230
175
|
/**
|
|
231
|
-
*
|
|
176
|
+
* Estado de sesión activa
|
|
232
177
|
*/
|
|
233
178
|
@PluginMethod
|
|
234
179
|
public void isSessionActive(PluginCall call) {
|
|
235
180
|
boolean active = implementation.isSessionActive();
|
|
236
181
|
JSObject ret = new JSObject();
|
|
237
182
|
ret.put("active", active);
|
|
238
|
-
if (active) {
|
|
239
|
-
ret.put("message", "There is an active Cast session.");
|
|
240
|
-
} else {
|
|
241
|
-
ret.put("message", "No active Cast session.");
|
|
242
|
-
}
|
|
243
183
|
call.resolve(ret);
|
|
244
184
|
}
|
|
245
185
|
|
|
246
186
|
/**
|
|
247
|
-
*
|
|
187
|
+
* Carga media en el dispositivo
|
|
248
188
|
*/
|
|
249
189
|
@PluginMethod
|
|
250
|
-
public void
|
|
251
|
-
|
|
190
|
+
public void loadMedia(PluginCall call) {
|
|
191
|
+
String url = call.getString("url");
|
|
192
|
+
JSObject metadataObj = call.getObject("metadata");
|
|
193
|
+
|
|
194
|
+
String title = metadataObj != null ? metadataObj.getString("title") : null;
|
|
195
|
+
String subtitle = metadataObj != null ? metadataObj.getString("subtitle") : null;
|
|
196
|
+
String contentType = metadataObj != null ? metadataObj.getString("contentType") : null;
|
|
197
|
+
String imageUrl = null;
|
|
198
|
+
if (metadataObj != null && metadataObj.has("images")) {
|
|
199
|
+
try { imageUrl = metadataObj.getJSONArray("images").optString(0, null); } catch (Exception ignore) {}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
boolean ok = implementation.loadMedia(url, title, subtitle, imageUrl, contentType);
|
|
252
203
|
JSObject ret = new JSObject();
|
|
253
|
-
ret.put("
|
|
254
|
-
|
|
255
|
-
|
|
204
|
+
ret.put("success", ok);
|
|
205
|
+
String err = implementation.getLastError();
|
|
206
|
+
if (err != null && !err.isEmpty()) ret.put("error", err);
|
|
207
|
+
if (ok) {
|
|
208
|
+
call.resolve(ret);
|
|
256
209
|
} else {
|
|
257
|
-
|
|
210
|
+
call.reject("Failed to load media", ret);
|
|
258
211
|
}
|
|
259
|
-
call.resolve(ret);
|
|
260
212
|
}
|
|
261
213
|
|
|
262
214
|
/**
|
|
263
|
-
*
|
|
215
|
+
* Finaliza la sesión Cast activa
|
|
264
216
|
*/
|
|
265
217
|
@PluginMethod
|
|
266
|
-
public void
|
|
267
|
-
|
|
268
|
-
JSObject metadataObj = call.getObject("metadata");
|
|
269
|
-
|
|
270
|
-
com.getcapacitor.Logger.info("IonicChromecast", "📥 loadMedia called with URL: " + url);
|
|
271
|
-
com.getcapacitor.Logger.info("IonicChromecast", "📥 metadata object: " + (metadataObj != null ? metadataObj.toString() : "null"));
|
|
272
|
-
|
|
273
|
-
// Extract metadata fields
|
|
274
|
-
String title = null;
|
|
275
|
-
String subtitle = null;
|
|
276
|
-
String imageUrl = null;
|
|
277
|
-
String contentType = null;
|
|
278
|
-
|
|
279
|
-
if (metadataObj != null) {
|
|
280
|
-
title = metadataObj.getString("title");
|
|
281
|
-
subtitle = metadataObj.getString("subtitle");
|
|
282
|
-
contentType = metadataObj.getString("contentType");
|
|
283
|
-
|
|
284
|
-
com.getcapacitor.Logger.info("IonicChromecast", "📥 Extracted - title: " + title + ", subtitle: " + subtitle + ", contentType: " + contentType);
|
|
285
|
-
|
|
286
|
-
// Get the first image if available
|
|
287
|
-
if (metadataObj.has("images")) {
|
|
288
|
-
try {
|
|
289
|
-
imageUrl = metadataObj.getJSONArray("images").optString(0, null);
|
|
290
|
-
com.getcapacitor.Logger.info("IonicChromecast", "📥 Extracted imageUrl: " + imageUrl);
|
|
291
|
-
} catch (Exception e) {
|
|
292
|
-
// Ignore if images array is malformed
|
|
293
|
-
com.getcapacitor.Logger.error("IonicChromecast", "Error parsing images array", e);
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
boolean success = implementation.loadMedia(url, title, subtitle, imageUrl, contentType);
|
|
299
|
-
|
|
218
|
+
public void endSession(PluginCall call) {
|
|
219
|
+
boolean ended = implementation.endSession();
|
|
300
220
|
JSObject ret = new JSObject();
|
|
301
|
-
ret.put("success",
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
221
|
+
ret.put("success", ended);
|
|
222
|
+
String err = implementation.getLastError();
|
|
223
|
+
if (err != null && !err.isEmpty()) ret.put("error", err);
|
|
224
|
+
|
|
225
|
+
if (ended) {
|
|
305
226
|
call.resolve(ret);
|
|
306
227
|
} else {
|
|
307
|
-
|
|
308
|
-
notifyListeners("mediaError", ret);
|
|
309
|
-
call.reject("Failed to send media", ret);
|
|
228
|
+
call.reject("Failed to end session", ret);
|
|
310
229
|
}
|
|
311
230
|
}
|
|
312
231
|
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
try {
|
|
323
|
-
if (mediaRouter != null && mediaRouterCallback != null) {
|
|
324
|
-
mediaRouter.removeCallback(mediaRouterCallback);
|
|
325
|
-
}
|
|
326
|
-
} catch (Exception ignored) {}
|
|
232
|
+
/**
|
|
233
|
+
* Revisa si hay dispositivos disponibles
|
|
234
|
+
*/
|
|
235
|
+
@PluginMethod
|
|
236
|
+
public void areDevicesAvailable(PluginCall call) {
|
|
237
|
+
boolean available = implementation.areDevicesAvailable();
|
|
238
|
+
JSObject ret = new JSObject();
|
|
239
|
+
ret.put("available", available);
|
|
240
|
+
call.resolve(ret);
|
|
327
241
|
}
|
|
328
242
|
}
|
package/dist/docs.json
CHANGED
|
@@ -93,6 +93,16 @@
|
|
|
93
93
|
],
|
|
94
94
|
"slug": "loadmedia"
|
|
95
95
|
},
|
|
96
|
+
{
|
|
97
|
+
"name": "endSession",
|
|
98
|
+
"signature": "() => Promise<{ success: boolean; message?: string; }>",
|
|
99
|
+
"parameters": [],
|
|
100
|
+
"returns": "Promise<{ success: boolean; message?: string | undefined; }>",
|
|
101
|
+
"tags": [],
|
|
102
|
+
"docs": "End the current Cast session (Android only)",
|
|
103
|
+
"complexTypes": [],
|
|
104
|
+
"slug": "endsession"
|
|
105
|
+
},
|
|
96
106
|
{
|
|
97
107
|
"name": "addListener",
|
|
98
108
|
"signature": "(eventName: ChromecastEventType, listenerFunc: (event: ChromecastEvent) => void) => PluginListenerHandle",
|
|
@@ -70,6 +70,13 @@ export interface IonicChromecastPlugin {
|
|
|
70
70
|
success: boolean;
|
|
71
71
|
message?: string;
|
|
72
72
|
}>;
|
|
73
|
+
/**
|
|
74
|
+
* End the current Cast session (Android only)
|
|
75
|
+
*/
|
|
76
|
+
endSession(): Promise<{
|
|
77
|
+
success: boolean;
|
|
78
|
+
message?: string;
|
|
79
|
+
}>;
|
|
73
80
|
/**
|
|
74
81
|
* Listen to Chromecast events (Android only)
|
|
75
82
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/definitions.ts"],"names":[],"mappings":"","sourcesContent":["export interface InitializeOptions {\n /**\n * The receiver application ID for Google Cast\n * Use \"CC1AD845\" for the default media receiver\n */\n receiverApplicationId: string;\n}\n\nexport interface RequestSessionResult {\n success: boolean;\n message?: string;\n}\n\nexport interface SessionStatusResult {\n active: boolean;\n message?: string;\n}\n\nexport interface DevicesAvailableResult {\n available: boolean;\n message?: string;\n}\n\nexport interface MediaMetadata {\n title?: string;\n subtitle?: string;\n images?: string[]; // URLs to images\n studio?: string;\n contentType?: string; // e.g. 'video/mp4'\n duration?: number; // in seconds\n [key: string]: any; // allow extra optional metadata\n}\n\nexport interface LoadMediaOptions {\n url: string;\n metadata?: MediaMetadata;\n}\n\nexport interface PluginListenerHandle {\n remove: () => Promise<void>;\n}\n\nexport type ChromecastEventType =\n | 'sessionStarted'\n | 'sessionEnded'\n | 'mediaLoaded'\n | 'mediaError'\n | 'deviceAvailable'\n | 'deviceUnavailable'\n | 'volumeChanged'\n | 'playbackStatusChanged';\n\nexport interface ChromecastEvent {\n type: ChromecastEventType;\n data?: any;\n}\n\nexport interface IonicChromecastPlugin {\n /**\n * Initialize the Google Cast SDK\n * Must be called before any other Cast operations\n */\n initialize(options: InitializeOptions): Promise<{ success: boolean }>;\n\n echo(options: { value: string }): Promise<{ value: string }>;\n\n /**\n * Request a Cast session (Android only)\n */\n requestSession(): Promise<RequestSessionResult>;\n\n /**\n * Check if there is an active Cast session (Android only)\n */\n isSessionActive(): Promise<SessionStatusResult>;\n\n /**\n * Check if there are available Cast devices (Android only)\n */\n areDevicesAvailable(): Promise<DevicesAvailableResult>;\n\n /**\n * Load media on the Cast device (Android only)\n */\n loadMedia(options: LoadMediaOptions): Promise<{ success: boolean; message?: string }>;\n\n /**\n * Listen to Chromecast events (Android only)\n */\n addListener(\n eventName: ChromecastEventType,\n listenerFunc: (event: ChromecastEvent) => void\n ): PluginListenerHandle;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/definitions.ts"],"names":[],"mappings":"","sourcesContent":["export interface InitializeOptions {\n /**\n * The receiver application ID for Google Cast\n * Use \"CC1AD845\" for the default media receiver\n */\n receiverApplicationId: string;\n}\n\nexport interface RequestSessionResult {\n success: boolean;\n message?: string;\n}\n\nexport interface SessionStatusResult {\n active: boolean;\n message?: string;\n}\n\nexport interface DevicesAvailableResult {\n available: boolean;\n message?: string;\n}\n\nexport interface MediaMetadata {\n title?: string;\n subtitle?: string;\n images?: string[]; // URLs to images\n studio?: string;\n contentType?: string; // e.g. 'video/mp4'\n duration?: number; // in seconds\n [key: string]: any; // allow extra optional metadata\n}\n\nexport interface LoadMediaOptions {\n url: string;\n metadata?: MediaMetadata;\n}\n\nexport interface PluginListenerHandle {\n remove: () => Promise<void>;\n}\n\nexport type ChromecastEventType =\n | 'sessionStarted'\n | 'sessionEnded'\n | 'mediaLoaded'\n | 'mediaError'\n | 'deviceAvailable'\n | 'deviceUnavailable'\n | 'volumeChanged'\n | 'playbackStatusChanged';\n\nexport interface ChromecastEvent {\n type: ChromecastEventType;\n data?: any;\n}\n\nexport interface IonicChromecastPlugin {\n /**\n * Initialize the Google Cast SDK\n * Must be called before any other Cast operations\n */\n initialize(options: InitializeOptions): Promise<{ success: boolean }>;\n\n echo(options: { value: string }): Promise<{ value: string }>;\n\n /**\n * Request a Cast session (Android only)\n */\n requestSession(): Promise<RequestSessionResult>;\n\n /**\n * Check if there is an active Cast session (Android only)\n */\n isSessionActive(): Promise<SessionStatusResult>;\n\n /**\n * Check if there are available Cast devices (Android only)\n */\n areDevicesAvailable(): Promise<DevicesAvailableResult>;\n\n /**\n * Load media on the Cast device (Android only)\n */\n loadMedia(options: LoadMediaOptions): Promise<{ success: boolean; message?: string }>;\n\n /**\n * End the current Cast session (Android only)\n */\n endSession(): Promise<{ success: boolean; message?: string }>;\n\n /**\n * Listen to Chromecast events (Android only)\n */\n addListener(\n eventName: ChromecastEventType,\n listenerFunc: (event: ChromecastEvent) => void\n ): PluginListenerHandle;\n}\n"]}
|
package/dist/esm/web.d.ts
CHANGED
|
@@ -28,5 +28,9 @@ export declare class IonicChromecastWeb extends WebPlugin implements IonicChrome
|
|
|
28
28
|
success: boolean;
|
|
29
29
|
message?: string;
|
|
30
30
|
}>;
|
|
31
|
+
endSession(): Promise<{
|
|
32
|
+
success: boolean;
|
|
33
|
+
message?: string;
|
|
34
|
+
}>;
|
|
31
35
|
addListener(_eventName: ChromecastEventType, _listenerFunc: (event: ChromecastEvent) => void): Promise<PluginListenerHandle> & PluginListenerHandle;
|
|
32
36
|
}
|
package/dist/esm/web.js
CHANGED
|
@@ -25,6 +25,10 @@ export class IonicChromecastWeb extends WebPlugin {
|
|
|
25
25
|
console.warn('loadMedia() is not supported on web.');
|
|
26
26
|
return { success: false, message: 'Media casting only available on Android.' };
|
|
27
27
|
}
|
|
28
|
+
async endSession() {
|
|
29
|
+
console.warn('endSession() is not supported on web.');
|
|
30
|
+
return { success: false, message: 'Session control only available on Android.' };
|
|
31
|
+
}
|
|
28
32
|
addListener(_eventName, _listenerFunc) {
|
|
29
33
|
console.warn('addListener() is not supported on web.');
|
|
30
34
|
const handle = {
|
package/dist/esm/web.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAU5C,MAAM,OAAO,kBAAmB,SAAQ,SAAS;IAE/C,KAAK,CAAC,UAAU,CAAC,OAA0B;QACzC,OAAO,CAAC,GAAG,CAAC,iDAAiD,EAAE,OAAO,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAC;QACzF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAA0B;QACnC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,OAAO,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;QAC1D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,mDAAmD,EAAE,CAAC;IAC1F,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,OAAO,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QAC3D,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,8CAA8C,EAAE,CAAC;IACpF,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,OAAO,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QAC/D,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,6CAA6C,EAAE,CAAC;IACtF,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,CAAkC;QAChD,OAAO,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QACrD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,0CAA0C,EAAE,CAAC;IACjF,CAAC;IACD,WAAW,CACT,UAA+B,EAC/B,aAA+C;QAE/C,OAAO,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG;YACb,MAAM,EAAE,KAAK,IAAI,EAAE;gBACjB,WAAW;YACb,CAAC;SACF,CAAC;QACF,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;IACxD,CAAC;CACF","sourcesContent":["import { WebPlugin } from '@capacitor/core';\n\nimport type {\n InitializeOptions,\n IonicChromecastPlugin,\n ChromecastEventType,\n ChromecastEvent,\n PluginListenerHandle,\n} from './definitions';\n\nexport class IonicChromecastWeb extends WebPlugin implements IonicChromecastPlugin {\n \n async initialize(options: InitializeOptions): Promise<{ success: boolean }> {\n console.log('Cast SDK initialize called on web with options:', options);\n console.warn('Google Cast SDK is not supported on web. This is a no-op implementation.');\n return { success: false };\n }\n\n async echo(options: { value: string }): Promise<{ value: string }> {\n console.log('ECHO', options);\n return options;\n }\n\n async requestSession(): Promise<{ success: boolean; message?: string }> {\n console.warn('requestSession() is not supported on web.');\n return { success: false, message: 'Google Cast session is only available on Android.' };\n }\n\n async isSessionActive(): Promise<{ active: boolean; message?: string }> {\n console.warn('isSessionActive() is not supported on web.');\n return { active: false, message: 'Session detection only available on Android.' };\n }\n\n async areDevicesAvailable(): Promise<{ available: boolean; message?: string }> {\n console.warn('areDevicesAvailable() is not supported on web.');\n return { available: false, message: 'Device detection only available on Android.' };\n }\n\n async loadMedia(_: { url: string; metadata?: any }): Promise<{ success: boolean; message?: string }> {\n console.warn('loadMedia() is not supported on web.');\n return { success: false, message: 'Media casting only available on Android.' };\n }\n addListener(\n _eventName: ChromecastEventType,\n _listenerFunc: (event: ChromecastEvent) => void\n ): Promise<PluginListenerHandle> & PluginListenerHandle {\n console.warn('addListener() is not supported on web.');\n const handle = {\n remove: async () => {\n /* no-op */\n }\n };\n return Object.assign(Promise.resolve(handle), handle);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAU5C,MAAM,OAAO,kBAAmB,SAAQ,SAAS;IAE/C,KAAK,CAAC,UAAU,CAAC,OAA0B;QACzC,OAAO,CAAC,GAAG,CAAC,iDAAiD,EAAE,OAAO,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAC;QACzF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAA0B;QACnC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,OAAO,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;QAC1D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,mDAAmD,EAAE,CAAC;IAC1F,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,OAAO,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QAC3D,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,8CAA8C,EAAE,CAAC;IACpF,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,OAAO,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QAC/D,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,6CAA6C,EAAE,CAAC;IACtF,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,CAAkC;QAChD,OAAO,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QACrD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,0CAA0C,EAAE,CAAC;IACjF,CAAC;IAED,KAAK,CAAC,UAAU;QACd,OAAO,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;QACtD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,4CAA4C,EAAE,CAAC;IACnF,CAAC;IACD,WAAW,CACT,UAA+B,EAC/B,aAA+C;QAE/C,OAAO,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG;YACb,MAAM,EAAE,KAAK,IAAI,EAAE;gBACjB,WAAW;YACb,CAAC;SACF,CAAC;QACF,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;IACxD,CAAC;CACF","sourcesContent":["import { WebPlugin } from '@capacitor/core';\n\nimport type {\n InitializeOptions,\n IonicChromecastPlugin,\n ChromecastEventType,\n ChromecastEvent,\n PluginListenerHandle,\n} from './definitions';\n\nexport class IonicChromecastWeb extends WebPlugin implements IonicChromecastPlugin {\n \n async initialize(options: InitializeOptions): Promise<{ success: boolean }> {\n console.log('Cast SDK initialize called on web with options:', options);\n console.warn('Google Cast SDK is not supported on web. This is a no-op implementation.');\n return { success: false };\n }\n\n async echo(options: { value: string }): Promise<{ value: string }> {\n console.log('ECHO', options);\n return options;\n }\n\n async requestSession(): Promise<{ success: boolean; message?: string }> {\n console.warn('requestSession() is not supported on web.');\n return { success: false, message: 'Google Cast session is only available on Android.' };\n }\n\n async isSessionActive(): Promise<{ active: boolean; message?: string }> {\n console.warn('isSessionActive() is not supported on web.');\n return { active: false, message: 'Session detection only available on Android.' };\n }\n\n async areDevicesAvailable(): Promise<{ available: boolean; message?: string }> {\n console.warn('areDevicesAvailable() is not supported on web.');\n return { available: false, message: 'Device detection only available on Android.' };\n }\n\n async loadMedia(_: { url: string; metadata?: any }): Promise<{ success: boolean; message?: string }> {\n console.warn('loadMedia() is not supported on web.');\n return { success: false, message: 'Media casting only available on Android.' };\n }\n\n async endSession(): Promise<{ success: boolean; message?: string }> {\n console.warn('endSession() is not supported on web.');\n return { success: false, message: 'Session control only available on Android.' };\n }\n addListener(\n _eventName: ChromecastEventType,\n _listenerFunc: (event: ChromecastEvent) => void\n ): Promise<PluginListenerHandle> & PluginListenerHandle {\n console.warn('addListener() is not supported on web.');\n const handle = {\n remove: async () => {\n /* no-op */\n }\n };\n return Object.assign(Promise.resolve(handle), handle);\n }\n}\n"]}
|
package/dist/plugin.cjs.js
CHANGED
|
@@ -32,6 +32,10 @@ class IonicChromecastWeb extends core.WebPlugin {
|
|
|
32
32
|
console.warn('loadMedia() is not supported on web.');
|
|
33
33
|
return { success: false, message: 'Media casting only available on Android.' };
|
|
34
34
|
}
|
|
35
|
+
async endSession() {
|
|
36
|
+
console.warn('endSession() is not supported on web.');
|
|
37
|
+
return { success: false, message: 'Session control only available on Android.' };
|
|
38
|
+
}
|
|
35
39
|
addListener(_eventName, _listenerFunc) {
|
|
36
40
|
console.warn('addListener() is not supported on web.');
|
|
37
41
|
const handle = {
|
package/dist/plugin.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.cjs.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nconst IonicChromecast = registerPlugin('IonicChromecast', {\n web: () => import('./web').then((m) => new m.IonicChromecastWeb()),\n});\nexport * from './definitions';\nexport { IonicChromecast };\n//# sourceMappingURL=index.js.map","import { WebPlugin } from '@capacitor/core';\nexport class IonicChromecastWeb extends WebPlugin {\n async initialize(options) {\n console.log('Cast SDK initialize called on web with options:', options);\n console.warn('Google Cast SDK is not supported on web. This is a no-op implementation.');\n return { success: false };\n }\n async echo(options) {\n console.log('ECHO', options);\n return options;\n }\n async requestSession() {\n console.warn('requestSession() is not supported on web.');\n return { success: false, message: 'Google Cast session is only available on Android.' };\n }\n async isSessionActive() {\n console.warn('isSessionActive() is not supported on web.');\n return { active: false, message: 'Session detection only available on Android.' };\n }\n async areDevicesAvailable() {\n console.warn('areDevicesAvailable() is not supported on web.');\n return { available: false, message: 'Device detection only available on Android.' };\n }\n async loadMedia(_) {\n console.warn('loadMedia() is not supported on web.');\n return { success: false, message: 'Media casting only available on Android.' };\n }\n addListener(_eventName, _listenerFunc) {\n console.warn('addListener() is not supported on web.');\n const handle = {\n remove: async () => {\n /* no-op */\n }\n };\n return Object.assign(Promise.resolve(handle), handle);\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":";;;;AACK,MAAC,eAAe,GAAGA,mBAAc,CAAC,iBAAiB,EAAE;AAC1D,IAAI,GAAG,EAAE,MAAM,mDAAe,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,kBAAkB,EAAE,CAAC;AACtE,CAAC;;ACFM,MAAM,kBAAkB,SAASC,cAAS,CAAC;AAClD,IAAI,MAAM,UAAU,CAAC,OAAO,EAAE;AAC9B,QAAQ,OAAO,CAAC,GAAG,CAAC,iDAAiD,EAAE,OAAO,CAAC;AAC/E,QAAQ,OAAO,CAAC,IAAI,CAAC,0EAA0E,CAAC;AAChG,QAAQ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE;AACjC,IAAI;AACJ,IAAI,MAAM,IAAI,CAAC,OAAO,EAAE;AACxB,QAAQ,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;AACpC,QAAQ,OAAO,OAAO;AACtB,IAAI;AACJ,IAAI,MAAM,cAAc,GAAG;AAC3B,QAAQ,OAAO,CAAC,IAAI,CAAC,2CAA2C,CAAC;AACjE,QAAQ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,mDAAmD,EAAE;AAC/F,IAAI;AACJ,IAAI,MAAM,eAAe,GAAG;AAC5B,QAAQ,OAAO,CAAC,IAAI,CAAC,4CAA4C,CAAC;AAClE,QAAQ,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,8CAA8C,EAAE;AACzF,IAAI;AACJ,IAAI,MAAM,mBAAmB,GAAG;AAChC,QAAQ,OAAO,CAAC,IAAI,CAAC,gDAAgD,CAAC;AACtE,QAAQ,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,6CAA6C,EAAE;AAC3F,IAAI;AACJ,IAAI,MAAM,SAAS,CAAC,CAAC,EAAE;AACvB,QAAQ,OAAO,CAAC,IAAI,CAAC,sCAAsC,CAAC;AAC5D,QAAQ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,0CAA0C,EAAE;AACtF,IAAI;AACJ,IAAI,WAAW,CAAC,UAAU,EAAE,aAAa,EAAE;AAC3C,QAAQ,OAAO,CAAC,IAAI,CAAC,wCAAwC,CAAC;AAC9D,QAAQ,MAAM,MAAM,GAAG;AACvB,YAAY,MAAM,EAAE,YAAY;AAChC;AACA,YAAY;AACZ,SAAS;AACT,QAAQ,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;AAC7D,IAAI;AACJ;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"plugin.cjs.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nconst IonicChromecast = registerPlugin('IonicChromecast', {\n web: () => import('./web').then((m) => new m.IonicChromecastWeb()),\n});\nexport * from './definitions';\nexport { IonicChromecast };\n//# sourceMappingURL=index.js.map","import { WebPlugin } from '@capacitor/core';\nexport class IonicChromecastWeb extends WebPlugin {\n async initialize(options) {\n console.log('Cast SDK initialize called on web with options:', options);\n console.warn('Google Cast SDK is not supported on web. This is a no-op implementation.');\n return { success: false };\n }\n async echo(options) {\n console.log('ECHO', options);\n return options;\n }\n async requestSession() {\n console.warn('requestSession() is not supported on web.');\n return { success: false, message: 'Google Cast session is only available on Android.' };\n }\n async isSessionActive() {\n console.warn('isSessionActive() is not supported on web.');\n return { active: false, message: 'Session detection only available on Android.' };\n }\n async areDevicesAvailable() {\n console.warn('areDevicesAvailable() is not supported on web.');\n return { available: false, message: 'Device detection only available on Android.' };\n }\n async loadMedia(_) {\n console.warn('loadMedia() is not supported on web.');\n return { success: false, message: 'Media casting only available on Android.' };\n }\n async endSession() {\n console.warn('endSession() is not supported on web.');\n return { success: false, message: 'Session control only available on Android.' };\n }\n addListener(_eventName, _listenerFunc) {\n console.warn('addListener() is not supported on web.');\n const handle = {\n remove: async () => {\n /* no-op */\n }\n };\n return Object.assign(Promise.resolve(handle), handle);\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":";;;;AACK,MAAC,eAAe,GAAGA,mBAAc,CAAC,iBAAiB,EAAE;AAC1D,IAAI,GAAG,EAAE,MAAM,mDAAe,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,kBAAkB,EAAE,CAAC;AACtE,CAAC;;ACFM,MAAM,kBAAkB,SAASC,cAAS,CAAC;AAClD,IAAI,MAAM,UAAU,CAAC,OAAO,EAAE;AAC9B,QAAQ,OAAO,CAAC,GAAG,CAAC,iDAAiD,EAAE,OAAO,CAAC;AAC/E,QAAQ,OAAO,CAAC,IAAI,CAAC,0EAA0E,CAAC;AAChG,QAAQ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE;AACjC,IAAI;AACJ,IAAI,MAAM,IAAI,CAAC,OAAO,EAAE;AACxB,QAAQ,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;AACpC,QAAQ,OAAO,OAAO;AACtB,IAAI;AACJ,IAAI,MAAM,cAAc,GAAG;AAC3B,QAAQ,OAAO,CAAC,IAAI,CAAC,2CAA2C,CAAC;AACjE,QAAQ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,mDAAmD,EAAE;AAC/F,IAAI;AACJ,IAAI,MAAM,eAAe,GAAG;AAC5B,QAAQ,OAAO,CAAC,IAAI,CAAC,4CAA4C,CAAC;AAClE,QAAQ,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,8CAA8C,EAAE;AACzF,IAAI;AACJ,IAAI,MAAM,mBAAmB,GAAG;AAChC,QAAQ,OAAO,CAAC,IAAI,CAAC,gDAAgD,CAAC;AACtE,QAAQ,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,6CAA6C,EAAE;AAC3F,IAAI;AACJ,IAAI,MAAM,SAAS,CAAC,CAAC,EAAE;AACvB,QAAQ,OAAO,CAAC,IAAI,CAAC,sCAAsC,CAAC;AAC5D,QAAQ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,0CAA0C,EAAE;AACtF,IAAI;AACJ,IAAI,MAAM,UAAU,GAAG;AACvB,QAAQ,OAAO,CAAC,IAAI,CAAC,uCAAuC,CAAC;AAC7D,QAAQ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,4CAA4C,EAAE;AACxF,IAAI;AACJ,IAAI,WAAW,CAAC,UAAU,EAAE,aAAa,EAAE;AAC3C,QAAQ,OAAO,CAAC,IAAI,CAAC,wCAAwC,CAAC;AAC9D,QAAQ,MAAM,MAAM,GAAG;AACvB,YAAY,MAAM,EAAE,YAAY;AAChC;AACA,YAAY;AACZ,SAAS;AACT,QAAQ,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;AAC7D,IAAI;AACJ;;;;;;;;;"}
|
package/dist/plugin.js
CHANGED
|
@@ -31,6 +31,10 @@ var capacitorIonicChromecast = (function (exports, core) {
|
|
|
31
31
|
console.warn('loadMedia() is not supported on web.');
|
|
32
32
|
return { success: false, message: 'Media casting only available on Android.' };
|
|
33
33
|
}
|
|
34
|
+
async endSession() {
|
|
35
|
+
console.warn('endSession() is not supported on web.');
|
|
36
|
+
return { success: false, message: 'Session control only available on Android.' };
|
|
37
|
+
}
|
|
34
38
|
addListener(_eventName, _listenerFunc) {
|
|
35
39
|
console.warn('addListener() is not supported on web.');
|
|
36
40
|
const handle = {
|
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nconst IonicChromecast = registerPlugin('IonicChromecast', {\n web: () => import('./web').then((m) => new m.IonicChromecastWeb()),\n});\nexport * from './definitions';\nexport { IonicChromecast };\n//# sourceMappingURL=index.js.map","import { WebPlugin } from '@capacitor/core';\nexport class IonicChromecastWeb extends WebPlugin {\n async initialize(options) {\n console.log('Cast SDK initialize called on web with options:', options);\n console.warn('Google Cast SDK is not supported on web. This is a no-op implementation.');\n return { success: false };\n }\n async echo(options) {\n console.log('ECHO', options);\n return options;\n }\n async requestSession() {\n console.warn('requestSession() is not supported on web.');\n return { success: false, message: 'Google Cast session is only available on Android.' };\n }\n async isSessionActive() {\n console.warn('isSessionActive() is not supported on web.');\n return { active: false, message: 'Session detection only available on Android.' };\n }\n async areDevicesAvailable() {\n console.warn('areDevicesAvailable() is not supported on web.');\n return { available: false, message: 'Device detection only available on Android.' };\n }\n async loadMedia(_) {\n console.warn('loadMedia() is not supported on web.');\n return { success: false, message: 'Media casting only available on Android.' };\n }\n addListener(_eventName, _listenerFunc) {\n console.warn('addListener() is not supported on web.');\n const handle = {\n remove: async () => {\n /* no-op */\n }\n };\n return Object.assign(Promise.resolve(handle), handle);\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":";;;AACK,UAAC,eAAe,GAAGA,mBAAc,CAAC,iBAAiB,EAAE;IAC1D,IAAI,GAAG,EAAE,MAAM,mDAAe,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,kBAAkB,EAAE,CAAC;IACtE,CAAC;;ICFM,MAAM,kBAAkB,SAASC,cAAS,CAAC;IAClD,IAAI,MAAM,UAAU,CAAC,OAAO,EAAE;IAC9B,QAAQ,OAAO,CAAC,GAAG,CAAC,iDAAiD,EAAE,OAAO,CAAC;IAC/E,QAAQ,OAAO,CAAC,IAAI,CAAC,0EAA0E,CAAC;IAChG,QAAQ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE;IACjC,IAAI;IACJ,IAAI,MAAM,IAAI,CAAC,OAAO,EAAE;IACxB,QAAQ,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IACpC,QAAQ,OAAO,OAAO;IACtB,IAAI;IACJ,IAAI,MAAM,cAAc,GAAG;IAC3B,QAAQ,OAAO,CAAC,IAAI,CAAC,2CAA2C,CAAC;IACjE,QAAQ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,mDAAmD,EAAE;IAC/F,IAAI;IACJ,IAAI,MAAM,eAAe,GAAG;IAC5B,QAAQ,OAAO,CAAC,IAAI,CAAC,4CAA4C,CAAC;IAClE,QAAQ,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,8CAA8C,EAAE;IACzF,IAAI;IACJ,IAAI,MAAM,mBAAmB,GAAG;IAChC,QAAQ,OAAO,CAAC,IAAI,CAAC,gDAAgD,CAAC;IACtE,QAAQ,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,6CAA6C,EAAE;IAC3F,IAAI;IACJ,IAAI,MAAM,SAAS,CAAC,CAAC,EAAE;IACvB,QAAQ,OAAO,CAAC,IAAI,CAAC,sCAAsC,CAAC;IAC5D,QAAQ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,0CAA0C,EAAE;IACtF,IAAI;IACJ,IAAI,WAAW,CAAC,UAAU,EAAE,aAAa,EAAE;IAC3C,QAAQ,OAAO,CAAC,IAAI,CAAC,wCAAwC,CAAC;IAC9D,QAAQ,MAAM,MAAM,GAAG;IACvB,YAAY,MAAM,EAAE,YAAY;IAChC;IACA,YAAY;IACZ,SAAS;IACT,QAAQ,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAC7D,IAAI;IACJ;;;;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"plugin.js","sources":["esm/index.js","esm/web.js"],"sourcesContent":["import { registerPlugin } from '@capacitor/core';\nconst IonicChromecast = registerPlugin('IonicChromecast', {\n web: () => import('./web').then((m) => new m.IonicChromecastWeb()),\n});\nexport * from './definitions';\nexport { IonicChromecast };\n//# sourceMappingURL=index.js.map","import { WebPlugin } from '@capacitor/core';\nexport class IonicChromecastWeb extends WebPlugin {\n async initialize(options) {\n console.log('Cast SDK initialize called on web with options:', options);\n console.warn('Google Cast SDK is not supported on web. This is a no-op implementation.');\n return { success: false };\n }\n async echo(options) {\n console.log('ECHO', options);\n return options;\n }\n async requestSession() {\n console.warn('requestSession() is not supported on web.');\n return { success: false, message: 'Google Cast session is only available on Android.' };\n }\n async isSessionActive() {\n console.warn('isSessionActive() is not supported on web.');\n return { active: false, message: 'Session detection only available on Android.' };\n }\n async areDevicesAvailable() {\n console.warn('areDevicesAvailable() is not supported on web.');\n return { available: false, message: 'Device detection only available on Android.' };\n }\n async loadMedia(_) {\n console.warn('loadMedia() is not supported on web.');\n return { success: false, message: 'Media casting only available on Android.' };\n }\n async endSession() {\n console.warn('endSession() is not supported on web.');\n return { success: false, message: 'Session control only available on Android.' };\n }\n addListener(_eventName, _listenerFunc) {\n console.warn('addListener() is not supported on web.');\n const handle = {\n remove: async () => {\n /* no-op */\n }\n };\n return Object.assign(Promise.resolve(handle), handle);\n }\n}\n//# sourceMappingURL=web.js.map"],"names":["registerPlugin","WebPlugin"],"mappings":";;;AACK,UAAC,eAAe,GAAGA,mBAAc,CAAC,iBAAiB,EAAE;IAC1D,IAAI,GAAG,EAAE,MAAM,mDAAe,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,kBAAkB,EAAE,CAAC;IACtE,CAAC;;ICFM,MAAM,kBAAkB,SAASC,cAAS,CAAC;IAClD,IAAI,MAAM,UAAU,CAAC,OAAO,EAAE;IAC9B,QAAQ,OAAO,CAAC,GAAG,CAAC,iDAAiD,EAAE,OAAO,CAAC;IAC/E,QAAQ,OAAO,CAAC,IAAI,CAAC,0EAA0E,CAAC;IAChG,QAAQ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE;IACjC,IAAI;IACJ,IAAI,MAAM,IAAI,CAAC,OAAO,EAAE;IACxB,QAAQ,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IACpC,QAAQ,OAAO,OAAO;IACtB,IAAI;IACJ,IAAI,MAAM,cAAc,GAAG;IAC3B,QAAQ,OAAO,CAAC,IAAI,CAAC,2CAA2C,CAAC;IACjE,QAAQ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,mDAAmD,EAAE;IAC/F,IAAI;IACJ,IAAI,MAAM,eAAe,GAAG;IAC5B,QAAQ,OAAO,CAAC,IAAI,CAAC,4CAA4C,CAAC;IAClE,QAAQ,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,8CAA8C,EAAE;IACzF,IAAI;IACJ,IAAI,MAAM,mBAAmB,GAAG;IAChC,QAAQ,OAAO,CAAC,IAAI,CAAC,gDAAgD,CAAC;IACtE,QAAQ,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,6CAA6C,EAAE;IAC3F,IAAI;IACJ,IAAI,MAAM,SAAS,CAAC,CAAC,EAAE;IACvB,QAAQ,OAAO,CAAC,IAAI,CAAC,sCAAsC,CAAC;IAC5D,QAAQ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,0CAA0C,EAAE;IACtF,IAAI;IACJ,IAAI,MAAM,UAAU,GAAG;IACvB,QAAQ,OAAO,CAAC,IAAI,CAAC,uCAAuC,CAAC;IAC7D,QAAQ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,4CAA4C,EAAE;IACxF,IAAI;IACJ,IAAI,WAAW,CAAC,UAAU,EAAE,aAAa,EAAE;IAC3C,QAAQ,OAAO,CAAC,IAAI,CAAC,wCAAwC,CAAC;IAC9D,QAAQ,MAAM,MAAM,GAAG;IACvB,YAAY,MAAM,EAAE,YAAY;IAChC;IACA,YAAY;IACZ,SAAS;IACT,QAAQ,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAC7D,IAAI;IACJ;;;;;;;;;;;;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ionic-chromecast",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.5",
|
|
4
4
|
"description": "Capacitor plugin for Google Cast SDK (Chromecast) integration with Android support",
|
|
5
5
|
"main": "dist/plugin.cjs.js",
|
|
6
6
|
"module": "dist/esm/index.js",
|
|
@@ -50,7 +50,10 @@
|
|
|
50
50
|
"build": "npm run clean && npm run docgen && tsc && rollup -c rollup.config.mjs",
|
|
51
51
|
"clean": "rimraf ./dist",
|
|
52
52
|
"watch": "tsc --watch",
|
|
53
|
-
"prepublishOnly": "npm run build"
|
|
53
|
+
"prepublishOnly": "npm run build",
|
|
54
|
+
"android:run": "cd example-app && npm install && npm run build && npx cap sync android && npx cap run android",
|
|
55
|
+
"android:serve": "cd example-app && npm install && npm run dev -- --host --port 5173",
|
|
56
|
+
"android:run:live": "cd example-app && npm install && npx cap sync android && npx cap run android --livereload --external --livereload-url=http://localhost:5173"
|
|
54
57
|
},
|
|
55
58
|
"devDependencies": {
|
|
56
59
|
"@capacitor/android": "^7.0.0",
|