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.
@@ -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
- // Attach session listener to emit events
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 attachRemoteMediaClient(CastSession session) {
57
+ private void setupSessionListener() {
120
58
  try {
121
- RemoteMediaClient rmc = session != null ? session.getRemoteMediaClient() : null;
122
- if (rmc == null) return;
123
- if (mediaCallback != null) {
124
- rmc.unregisterCallback(mediaCallback);
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
- mediaCallback = new RemoteMediaClient.Callback() {
127
- @Override
128
- public void onStatusUpdated() {
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
- private void detachRemoteMediaClient(CastSession session) {
109
+ @Override
110
+ protected void handleOnDestroy() {
111
+ super.handleOnDestroy();
145
112
  try {
146
- RemoteMediaClient rmc = session != null ? session.getRemoteMediaClient() : null;
147
- if (rmc != null && mediaCallback != null) {
148
- rmc.unregisterCallback(mediaCallback);
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
- * Request a Cast session from JavaScript - Uses Cast SDK's built-in device picker
121
+ * Muestra el selector nativo de dispositivos Cast
164
122
  */
165
123
  @PluginMethod
166
124
  public void requestSession(PluginCall call) {
167
- // Ensure Cast SDK initialized
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. Call initialize() first.");
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
- CastContext cc = implementation.getCastContext();
179
- if (cc == null) {
180
- JSObject err = new JSObject();
181
- err.put("success", false);
182
- err.put("message", "CastContext is null");
183
- call.reject("Failed to request Cast session", err);
184
- return;
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
- receiverId = "CC1AD845";
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 Cast chooser: " + e.getMessage());
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
- * Check if there is an active Cast session from JavaScript
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
- * Check if there are available Cast devices from JavaScript
187
+ * Carga media en el dispositivo
248
188
  */
249
189
  @PluginMethod
250
- public void areDevicesAvailable(PluginCall call) {
251
- boolean available = implementation.areDevicesAvailable();
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("available", available);
254
- if (available) {
255
- ret.put("message", "There are Cast devices available.");
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
- ret.put("message", "No Cast devices available.");
210
+ call.reject("Failed to load media", ret);
258
211
  }
259
- call.resolve(ret);
260
212
  }
261
213
 
262
214
  /**
263
- * Load media on the Cast device from JavaScript
215
+ * Finaliza la sesión Cast activa
264
216
  */
265
217
  @PluginMethod
266
- public void loadMedia(PluginCall call) {
267
- String url = call.getString("url");
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", success);
302
- if (success) {
303
- ret.put("message", "Media sent to Cast device.");
304
- notifyListeners("mediaLoaded", ret);
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
- ret.put("message", "Failed to send media. Check session and device.");
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
- @Override
314
- protected void handleOnDestroy() {
315
- super.handleOnDestroy();
316
- try {
317
- CastContext cc = implementation.getCastContext();
318
- if (cc != null && sessionListener != null) {
319
- cc.getSessionManager().removeSessionManagerListener(sessionListener, CastSession.class);
320
- }
321
- } catch (Exception ignored) {}
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 = {
@@ -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"]}
@@ -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 = {
@@ -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 = {
@@ -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",
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",