diff --git a/src/index.ts b/src/index.ts index 3b7fe0779..752babfc2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -70,6 +70,7 @@ import { NativeStorage } from './plugins/nativestorage'; import { Market } from './plugins/market'; import { MediaPlugin } from './plugins/media'; import { Mixpanel } from './plugins/mixpanel'; +import { MusicControls } from './plugins/music-controls'; import { Network } from './plugins/network'; import { NFC } from './plugins/nfc'; import { OneSignal } from './plugins/onesignal'; @@ -181,6 +182,7 @@ InAppPurchase, Insomnia, Instagram, Keyboard, +MusicControls, NativeAudio, NativeStorage, Network, @@ -271,6 +273,7 @@ window['IonicNative'] = { MediaCapture: MediaCapture, MediaPlugin: MediaPlugin, Mixpanel: Mixpanel, + MusicControls: MusicControls, NativeAudio: NativeAudio, NativePageTransitions: NativePageTransitions, NativeStorage: NativeStorage, diff --git a/src/plugins/music-controls.ts b/src/plugins/music-controls.ts new file mode 100644 index 000000000..2cdcb40e5 --- /dev/null +++ b/src/plugins/music-controls.ts @@ -0,0 +1,128 @@ +import {Plugin, Cordova} from './plugin'; +import {Observable} from 'rxjs/Observable'; +/** + * @name MusicControls + * @description + * Music controls for Cordova applications. + * Display a 'media' notification with play/pause, previous, next buttons, allowing the user to control the play. + * Handle also headset event (plug, unplug, headset button). + * + * @usage + * ``` + * import {MusicControls} from 'ionic-native'; + * + * MusicControls.create({ + * track : 'Time is Running Out', // optional, default : '' + * artist : 'Muse', // optional, default : '' + * cover : 'albums/absolution.jpg', // optional, default : nothing + * // cover can be a local path (use fullpath 'file:///storage/emulated/...', or only 'my_image.jpg' if my_image.jpg is in the www folder of your app) + * // or a remote url ('http://...', 'https://...', 'ftp://...') + * isPlaying : true, // optional, default : true + * dismissable : true, // optional, default : false + * + * // hide previous/next/close buttons: + * hasPrev : false, // show previous button, optional, default: true + * hasNext : false, // show next button, optional, default: true + * hasClose : true, // show close button, optional, default: false + * + * // Android only, optional + * // text displayed in the status bar when the notification (and the ticker) are updated + * ticker : 'Now playing "Time is Running Out"' + * }); + * + * MusicControls.subscribe().subscribe(action => { + * + * switch(action) { + * case 'music-controls-next': + * // Do something + * break; + * case 'music-controls-previous': + * // Do something + * break; + * case 'music-controls-pause': + * // Do something + * break; + * case 'music-controls-play': + * // Do something + * break; + * case 'music-controls-destroy': + * // Do something + * break; + * + * // Headset events (Android only) + * case 'music-controls-media-button' : + * // Do something + * break; + * case 'music-controls-headset-unplugged': + * // Do something + * break; + * case 'music-controls-headset-plugged': + * // Do something + * break; + * default: + * break; + * } + * + * }); + * + * MusicControls.listen(); // activates the observable above + * + * MusicControls.updateIsPlaying(true); + * + * + * ``` + */ +@Plugin({ + plugin: 'cordova-plugin-music-controls', + pluginRef: 'MusicControls', + repo: 'https://github.com/homerours/cordova-music-controls-plugin' +}) +export class MusicControls { + /** + * Create the media controls + * @param options {MusicControlsOptions} + * @returns {Promise} + */ + @Cordova() + static create(options: MusicControlsOptions): Promise {return; } + + /** + * Destroy the media controller + * @returns {Promise} + */ + @Cordova() + static destroy(): Promise {return; } + + /** + * Subscribe to the events of the media controller + * @returns {Observable} + */ + @Cordova({ + observable: true + }) + static subscribe(): Observable {return; } + + /** + * Start listening for events, this enables the Observable from the subscribe method + */ + @Cordova({sync: true}) + static listen(): void {} + + /** + * Toggle play/pause: + * @param isPlaying {boolean} + */ + @Cordova({sync: true}) + static updateIsPlaying(isPlaying: boolean): void {} +} +export interface MusicControlsOptions { + track: string; + artist: string; + cover: string; + isPlaying: boolean; + dismissable: boolean; + hasPrev: boolean; + hasNext: boolean; + hasClose: boolean; + ticker: string; +}