Added Android support and redesigned the API - #32

Open
Guichaguri wants to merge 2 commits into
shi11:masterfrom
Guichaguri:master
Open

Added Android support and redesigned the API#32
Guichaguri wants to merge 2 commits into
shi11:masterfrom
Guichaguri:master

Conversation

@Guichaguri

@GuichaguriGuichaguri commented Sep 6, 2016

Copy link
Copy Markdown

Here it is the Android Support with the new API.

Lock screen
Notification

This implementation works with Android 4.X and greater. Most of the properties are not visible, but they are for integration with smart watches, cars, etc.

The lock screen wallpaper only changes in Android 5.X and greater.

API Functions supported by Android:

// All properties in updateActions are optional and defaults to falsewindow.remoteControls.updateActions({play: true,pause: true,stop: false,seekTo: false,skipToNext: true,skipToPrevious: true,rate: false,volume: true},successCallback,errorCallback);window.remoteControls.updateMetadata({title: 'Prime Time of Your Life',// Required (String)artist: 'Daft Punk',// Required (String)album: 'Human After All',// Optional (String)cover: 'http://i.imgur.com/HDDlamS.jpg',// Optional (URL/Path)description: '',// Optional (String)color: 0xd85656,// Optional (Color Number from 0x000000 to 0xFFFFFF)genre: 'Industrial Rock, Noise Rock',// Optional (String)date: '2006-06-17T00:00:00Z',// Optional (String)rating: 77,// Optional (Percentage from 0 to 100)duration: 239// Optional (Number)},successCallback,errorCallback);window.remoteControls.updatePlayback({state: 0,// Required (-1: Error, 0: Stopped, 1: Playing, 2: Paused, 3: Buffering)volume: 100,// Optional (Percentage from 0 to 100)speed: 1,// Optional (Number. 1: Normal speed)elapsedTime: 103,// Optional (Number from 0 to duration)bufferedTime: 200// Optional (Number from 0 to duration)},successCallback,errorCallback);window.addEventListener("remotecontrols",function(event){switch(event.action){case'play':
case'pause':
case'stop':
case'next':
case'previous':
// Handle regular buttonsbreak;case'volume':
// Change the volumeconsole.log(event.volume);// Percentagebreak;case'seek':
// Change the playback positionconsole.log(event.position);// A number from 0 to "duration"break;case'rate':
// Change the ratingconsole.log(event.rating);// Percentagebreak;}});

@Guichaguri

Guichaguri commented Sep 6, 2016

Copy link
Copy Markdown
Author

For iOS development, you should know that the new event handler is the same from cordova-plugin-battery-status, since the sendJavascript function is now deprecated.

Since using OS icons is not recommended as they can be removed or renamed, I've included five icons from Material Icons, which are Apache 2.0 licensed, but I can change back to OS icons if you don't want to include assets.

And also, window.remoteControls.updateMetadata(null, successCallback, errorCallback); disables the notification and the media buttons

The code is a little messy, but it works. Just let me know if it needs any API changes for iOS.

@GuichaguriGuichaguri mentioned this pull request Sep 6, 2016
@shi11

shi11 commented Sep 7, 2016

Copy link
Copy Markdown
Owner

Sweet @Guichaguri! From my initial read through, it looks good. There will need to be an update to the Obj-C updateMetadata function to handle the object that's passed in rather than the array thats currently used. Hopefully I can put a little time towards it tomorrow. Thanks again for picking up the ball and running with it.

@Guichaguri

Copy link
Copy Markdown
Author

I just noticed the java files were outside the src folder. Fixed it, should work as expected now

@LukePulverenti

Copy link
Copy Markdown

Does this work with the app in the background for an extended period of time? What happens if the cordova activity is paused while the app is in the background? Most apps nowadays play media from a background service, and then use the service for notification interaction, thereby decoupling it from the activity.

@Guichaguri

Copy link
Copy Markdown
Author

@LukePulverenti I can't remember how I made it, I also don't use Cordova anymore.
I've been using React Native as it has much better performance than Cordova, I've made the whole Android side for the react-native-music-control and now I'm working on a module combining audio, media controls and chromecast, the way it should have been since the start

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Guichaguri@shi11@LukePulverenti@RekarBotany
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Added Android support and redesigned the API - #32

Open
Guichaguri wants to merge 2 commits into
shi11:masterfrom
Guichaguri:master
Open

Added Android support and redesigned the API#32
Guichaguri wants to merge 2 commits into
shi11:masterfrom
Guichaguri:master

Conversation

@Guichaguri

@GuichaguriGuichaguri commented Sep 6, 2016

Copy link
Copy Markdown

Here it is the Android Support with the new API.

Lock screen
Notification

This implementation works with Android 4.X and greater. Most of the properties are not visible, but they are for integration with smart watches, cars, etc.

The lock screen wallpaper only changes in Android 5.X and greater.

API Functions supported by Android:

// All properties in updateActions are optional and defaults to falsewindow.remoteControls.updateActions({play: true,pause: true,stop: false,seekTo: false,skipToNext: true,skipToPrevious: true,rate: false,volume: true},successCallback,errorCallback);window.remoteControls.updateMetadata({title: 'Prime Time of Your Life',// Required (String)artist: 'Daft Punk',// Required (String)album: 'Human After All',// Optional (String)cover: 'http://i.imgur.com/HDDlamS.jpg',// Optional (URL/Path)description: '',// Optional (String)color: 0xd85656,// Optional (Color Number from 0x000000 to 0xFFFFFF)genre: 'Industrial Rock, Noise Rock',// Optional (String)date: '2006-06-17T00:00:00Z',// Optional (String)rating: 77,// Optional (Percentage from 0 to 100)duration: 239// Optional (Number)},successCallback,errorCallback);window.remoteControls.updatePlayback({state: 0,// Required (-1: Error, 0: Stopped, 1: Playing, 2: Paused, 3: Buffering)volume: 100,// Optional (Percentage from 0 to 100)speed: 1,// Optional (Number. 1: Normal speed)elapsedTime: 103,// Optional (Number from 0 to duration)bufferedTime: 200// Optional (Number from 0 to duration)},successCallback,errorCallback);window.addEventListener("remotecontrols",function(event){switch(event.action){case'play':
case'pause':
case'stop':
case'next':
case'previous':
// Handle regular buttonsbreak;case'volume':
// Change the volumeconsole.log(event.volume);// Percentagebreak;case'seek':
// Change the playback positionconsole.log(event.position);// A number from 0 to "duration"break;case'rate':
// Change the ratingconsole.log(event.rating);// Percentagebreak;}});

@Guichaguri

Guichaguri commented Sep 6, 2016

Copy link
Copy Markdown
Author

For iOS development, you should know that the new event handler is the same from cordova-plugin-battery-status, since the sendJavascript function is now deprecated.

Since using OS icons is not recommended as they can be removed or renamed, I've included five icons from Material Icons, which are Apache 2.0 licensed, but I can change back to OS icons if you don't want to include assets.

And also, window.remoteControls.updateMetadata(null, successCallback, errorCallback); disables the notification and the media buttons

The code is a little messy, but it works. Just let me know if it needs any API changes for iOS.

@GuichaguriGuichaguri mentioned this pull request Sep 6, 2016
@shi11

shi11 commented Sep 7, 2016

Copy link
Copy Markdown
Owner

Sweet @Guichaguri! From my initial read through, it looks good. There will need to be an update to the Obj-C updateMetadata function to handle the object that's passed in rather than the array thats currently used. Hopefully I can put a little time towards it tomorrow. Thanks again for picking up the ball and running with it.

@Guichaguri

Copy link
Copy Markdown
Author

I just noticed the java files were outside the src folder. Fixed it, should work as expected now

@LukePulverenti

Copy link
Copy Markdown

Does this work with the app in the background for an extended period of time? What happens if the cordova activity is paused while the app is in the background? Most apps nowadays play media from a background service, and then use the service for notification interaction, thereby decoupling it from the activity.

@Guichaguri

Copy link
Copy Markdown
Author

@LukePulverenti I can't remember how I made it, I also don't use Cordova anymore.
I've been using React Native as it has much better performance than Cordova, I've made the whole Android side for the react-native-music-control and now I'm working on a module combining audio, media controls and chromecast, the way it should have been since the start

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Guichaguri@shi11@LukePulverenti@RekarBotany
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Added Android support and redesigned the API - #32

Open
Guichaguri wants to merge 2 commits into
shi11:masterfrom
Guichaguri:master
Open

Added Android support and redesigned the API#32
Guichaguri wants to merge 2 commits into
shi11:masterfrom
Guichaguri:master

Conversation

@Guichaguri

@GuichaguriGuichaguri commented Sep 6, 2016

Copy link
Copy Markdown

Here it is the Android Support with the new API.

Lock screen
Notification

This implementation works with Android 4.X and greater. Most of the properties are not visible, but they are for integration with smart watches, cars, etc.

The lock screen wallpaper only changes in Android 5.X and greater.

API Functions supported by Android:

// All properties in updateActions are optional and defaults to falsewindow.remoteControls.updateActions({play: true,pause: true,stop: false,seekTo: false,skipToNext: true,skipToPrevious: true,rate: false,volume: true},successCallback,errorCallback);window.remoteControls.updateMetadata({title: 'Prime Time of Your Life',// Required (String)artist: 'Daft Punk',// Required (String)album: 'Human After All',// Optional (String)cover: 'http://i.imgur.com/HDDlamS.jpg',// Optional (URL/Path)description: '',// Optional (String)color: 0xd85656,// Optional (Color Number from 0x000000 to 0xFFFFFF)genre: 'Industrial Rock, Noise Rock',// Optional (String)date: '2006-06-17T00:00:00Z',// Optional (String)rating: 77,// Optional (Percentage from 0 to 100)duration: 239// Optional (Number)},successCallback,errorCallback);window.remoteControls.updatePlayback({state: 0,// Required (-1: Error, 0: Stopped, 1: Playing, 2: Paused, 3: Buffering)volume: 100,// Optional (Percentage from 0 to 100)speed: 1,// Optional (Number. 1: Normal speed)elapsedTime: 103,// Optional (Number from 0 to duration)bufferedTime: 200// Optional (Number from 0 to duration)},successCallback,errorCallback);window.addEventListener("remotecontrols",function(event){switch(event.action){case'play':
case'pause':
case'stop':
case'next':
case'previous':
// Handle regular buttonsbreak;case'volume':
// Change the volumeconsole.log(event.volume);// Percentagebreak;case'seek':
// Change the playback positionconsole.log(event.position);// A number from 0 to "duration"break;case'rate':
// Change the ratingconsole.log(event.rating);// Percentagebreak;}});

@Guichaguri

Guichaguri commented Sep 6, 2016

Copy link
Copy Markdown
Author

For iOS development, you should know that the new event handler is the same from cordova-plugin-battery-status, since the sendJavascript function is now deprecated.

Since using OS icons is not recommended as they can be removed or renamed, I've included five icons from Material Icons, which are Apache 2.0 licensed, but I can change back to OS icons if you don't want to include assets.

And also, window.remoteControls.updateMetadata(null, successCallback, errorCallback); disables the notification and the media buttons

The code is a little messy, but it works. Just let me know if it needs any API changes for iOS.

@GuichaguriGuichaguri mentioned this pull request Sep 6, 2016
@shi11

shi11 commented Sep 7, 2016

Copy link
Copy Markdown
Owner

Sweet @Guichaguri! From my initial read through, it looks good. There will need to be an update to the Obj-C updateMetadata function to handle the object that's passed in rather than the array thats currently used. Hopefully I can put a little time towards it tomorrow. Thanks again for picking up the ball and running with it.

@Guichaguri

Copy link
Copy Markdown
Author

I just noticed the java files were outside the src folder. Fixed it, should work as expected now

@LukePulverenti

Copy link
Copy Markdown

Does this work with the app in the background for an extended period of time? What happens if the cordova activity is paused while the app is in the background? Most apps nowadays play media from a background service, and then use the service for notification interaction, thereby decoupling it from the activity.

@Guichaguri

Copy link
Copy Markdown
Author

@LukePulverenti I can't remember how I made it, I also don't use Cordova anymore.
I've been using React Native as it has much better performance than Cordova, I've made the whole Android side for the react-native-music-control and now I'm working on a module combining audio, media controls and chromecast, the way it should have been since the start

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Guichaguri@shi11@LukePulverenti@RekarBotany
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Added Android support and redesigned the API - #32

Open
Guichaguri wants to merge 2 commits into
shi11:masterfrom
Guichaguri:master
Open

Added Android support and redesigned the API#32
Guichaguri wants to merge 2 commits into
shi11:masterfrom
Guichaguri:master

Conversation

@Guichaguri

@GuichaguriGuichaguri commented Sep 6, 2016

Copy link
Copy Markdown

Here it is the Android Support with the new API.

Lock screen
Notification

This implementation works with Android 4.X and greater. Most of the properties are not visible, but they are for integration with smart watches, cars, etc.

The lock screen wallpaper only changes in Android 5.X and greater.

API Functions supported by Android:

// All properties in updateActions are optional and defaults to falsewindow.remoteControls.updateActions({play: true,pause: true,stop: false,seekTo: false,skipToNext: true,skipToPrevious: true,rate: false,volume: true},successCallback,errorCallback);window.remoteControls.updateMetadata({title: 'Prime Time of Your Life',// Required (String)artist: 'Daft Punk',// Required (String)album: 'Human After All',// Optional (String)cover: 'http://i.imgur.com/HDDlamS.jpg',// Optional (URL/Path)description: '',// Optional (String)color: 0xd85656,// Optional (Color Number from 0x000000 to 0xFFFFFF)genre: 'Industrial Rock, Noise Rock',// Optional (String)date: '2006-06-17T00:00:00Z',// Optional (String)rating: 77,// Optional (Percentage from 0 to 100)duration: 239// Optional (Number)},successCallback,errorCallback);window.remoteControls.updatePlayback({state: 0,// Required (-1: Error, 0: Stopped, 1: Playing, 2: Paused, 3: Buffering)volume: 100,// Optional (Percentage from 0 to 100)speed: 1,// Optional (Number. 1: Normal speed)elapsedTime: 103,// Optional (Number from 0 to duration)bufferedTime: 200// Optional (Number from 0 to duration)},successCallback,errorCallback);window.addEventListener("remotecontrols",function(event){switch(event.action){case'play':
case'pause':
case'stop':
case'next':
case'previous':
// Handle regular buttonsbreak;case'volume':
// Change the volumeconsole.log(event.volume);// Percentagebreak;case'seek':
// Change the playback positionconsole.log(event.position);// A number from 0 to "duration"break;case'rate':
// Change the ratingconsole.log(event.rating);// Percentagebreak;}});

@Guichaguri

Guichaguri commented Sep 6, 2016

Copy link
Copy Markdown
Author

For iOS development, you should know that the new event handler is the same from cordova-plugin-battery-status, since the sendJavascript function is now deprecated.

Since using OS icons is not recommended as they can be removed or renamed, I've included five icons from Material Icons, which are Apache 2.0 licensed, but I can change back to OS icons if you don't want to include assets.

And also, window.remoteControls.updateMetadata(null, successCallback, errorCallback); disables the notification and the media buttons

The code is a little messy, but it works. Just let me know if it needs any API changes for iOS.

@GuichaguriGuichaguri mentioned this pull request Sep 6, 2016
@shi11

shi11 commented Sep 7, 2016

Copy link
Copy Markdown
Owner

Sweet @Guichaguri! From my initial read through, it looks good. There will need to be an update to the Obj-C updateMetadata function to handle the object that's passed in rather than the array thats currently used. Hopefully I can put a little time towards it tomorrow. Thanks again for picking up the ball and running with it.

@Guichaguri

Copy link
Copy Markdown
Author

I just noticed the java files were outside the src folder. Fixed it, should work as expected now

@LukePulverenti

Copy link
Copy Markdown

Does this work with the app in the background for an extended period of time? What happens if the cordova activity is paused while the app is in the background? Most apps nowadays play media from a background service, and then use the service for notification interaction, thereby decoupling it from the activity.

@Guichaguri

Copy link
Copy Markdown
Author

@LukePulverenti I can't remember how I made it, I also don't use Cordova anymore.
I've been using React Native as it has much better performance than Cordova, I've made the whole Android side for the react-native-music-control and now I'm working on a module combining audio, media controls and chromecast, the way it should have been since the start

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Guichaguri@shi11@LukePulverenti@RekarBotany
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Added Android support and redesigned the API - #32

Open
Guichaguri wants to merge 2 commits into
shi11:masterfrom
Guichaguri:master
Open

Added Android support and redesigned the API#32
Guichaguri wants to merge 2 commits into
shi11:masterfrom
Guichaguri:master

Conversation

@Guichaguri

@GuichaguriGuichaguri commented Sep 6, 2016

Copy link
Copy Markdown

Here it is the Android Support with the new API.

Lock screen
Notification

This implementation works with Android 4.X and greater. Most of the properties are not visible, but they are for integration with smart watches, cars, etc.

The lock screen wallpaper only changes in Android 5.X and greater.

API Functions supported by Android:

// All properties in updateActions are optional and defaults to falsewindow.remoteControls.updateActions({play: true,pause: true,stop: false,seekTo: false,skipToNext: true,skipToPrevious: true,rate: false,volume: true},successCallback,errorCallback);window.remoteControls.updateMetadata({title: 'Prime Time of Your Life',// Required (String)artist: 'Daft Punk',// Required (String)album: 'Human After All',// Optional (String)cover: 'http://i.imgur.com/HDDlamS.jpg',// Optional (URL/Path)description: '',// Optional (String)color: 0xd85656,// Optional (Color Number from 0x000000 to 0xFFFFFF)genre: 'Industrial Rock, Noise Rock',// Optional (String)date: '2006-06-17T00:00:00Z',// Optional (String)rating: 77,// Optional (Percentage from 0 to 100)duration: 239// Optional (Number)},successCallback,errorCallback);window.remoteControls.updatePlayback({state: 0,// Required (-1: Error, 0: Stopped, 1: Playing, 2: Paused, 3: Buffering)volume: 100,// Optional (Percentage from 0 to 100)speed: 1,// Optional (Number. 1: Normal speed)elapsedTime: 103,// Optional (Number from 0 to duration)bufferedTime: 200// Optional (Number from 0 to duration)},successCallback,errorCallback);window.addEventListener("remotecontrols",function(event){switch(event.action){case'play':
case'pause':
case'stop':
case'next':
case'previous':
// Handle regular buttonsbreak;case'volume':
// Change the volumeconsole.log(event.volume);// Percentagebreak;case'seek':
// Change the playback positionconsole.log(event.position);// A number from 0 to "duration"break;case'rate':
// Change the ratingconsole.log(event.rating);// Percentagebreak;}});

@Guichaguri

Guichaguri commented Sep 6, 2016

Copy link
Copy Markdown
Author

For iOS development, you should know that the new event handler is the same from cordova-plugin-battery-status, since the sendJavascript function is now deprecated.

Since using OS icons is not recommended as they can be removed or renamed, I've included five icons from Material Icons, which are Apache 2.0 licensed, but I can change back to OS icons if you don't want to include assets.

And also, window.remoteControls.updateMetadata(null, successCallback, errorCallback); disables the notification and the media buttons

The code is a little messy, but it works. Just let me know if it needs any API changes for iOS.

@GuichaguriGuichaguri mentioned this pull request Sep 6, 2016
@shi11

shi11 commented Sep 7, 2016

Copy link
Copy Markdown
Owner

Sweet @Guichaguri! From my initial read through, it looks good. There will need to be an update to the Obj-C updateMetadata function to handle the object that's passed in rather than the array thats currently used. Hopefully I can put a little time towards it tomorrow. Thanks again for picking up the ball and running with it.

@Guichaguri

Copy link
Copy Markdown
Author

I just noticed the java files were outside the src folder. Fixed it, should work as expected now

@LukePulverenti

Copy link
Copy Markdown

Does this work with the app in the background for an extended period of time? What happens if the cordova activity is paused while the app is in the background? Most apps nowadays play media from a background service, and then use the service for notification interaction, thereby decoupling it from the activity.

@Guichaguri

Copy link
Copy Markdown
Author

@LukePulverenti I can't remember how I made it, I also don't use Cordova anymore.
I've been using React Native as it has much better performance than Cordova, I've made the whole Android side for the react-native-music-control and now I'm working on a module combining audio, media controls and chromecast, the way it should have been since the start

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Guichaguri@shi11@LukePulverenti@RekarBotany
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Added Android support and redesigned the API - #32

Open
Guichaguri wants to merge 2 commits into
shi11:masterfrom
Guichaguri:master
Open

Added Android support and redesigned the API#32
Guichaguri wants to merge 2 commits into
shi11:masterfrom
Guichaguri:master

Conversation

@Guichaguri

@GuichaguriGuichaguri commented Sep 6, 2016

Copy link
Copy Markdown

Here it is the Android Support with the new API.

Lock screen
Notification

This implementation works with Android 4.X and greater. Most of the properties are not visible, but they are for integration with smart watches, cars, etc.

The lock screen wallpaper only changes in Android 5.X and greater.

API Functions supported by Android:

// All properties in updateActions are optional and defaults to falsewindow.remoteControls.updateActions({play: true,pause: true,stop: false,seekTo: false,skipToNext: true,skipToPrevious: true,rate: false,volume: true},successCallback,errorCallback);window.remoteControls.updateMetadata({title: 'Prime Time of Your Life',// Required (String)artist: 'Daft Punk',// Required (String)album: 'Human After All',// Optional (String)cover: 'http://i.imgur.com/HDDlamS.jpg',// Optional (URL/Path)description: '',// Optional (String)color: 0xd85656,// Optional (Color Number from 0x000000 to 0xFFFFFF)genre: 'Industrial Rock, Noise Rock',// Optional (String)date: '2006-06-17T00:00:00Z',// Optional (String)rating: 77,// Optional (Percentage from 0 to 100)duration: 239// Optional (Number)},successCallback,errorCallback);window.remoteControls.updatePlayback({state: 0,// Required (-1: Error, 0: Stopped, 1: Playing, 2: Paused, 3: Buffering)volume: 100,// Optional (Percentage from 0 to 100)speed: 1,// Optional (Number. 1: Normal speed)elapsedTime: 103,// Optional (Number from 0 to duration)bufferedTime: 200// Optional (Number from 0 to duration)},successCallback,errorCallback);window.addEventListener("remotecontrols",function(event){switch(event.action){case'play':
case'pause':
case'stop':
case'next':
case'previous':
// Handle regular buttonsbreak;case'volume':
// Change the volumeconsole.log(event.volume);// Percentagebreak;case'seek':
// Change the playback positionconsole.log(event.position);// A number from 0 to "duration"break;case'rate':
// Change the ratingconsole.log(event.rating);// Percentagebreak;}});

@Guichaguri

Guichaguri commented Sep 6, 2016

Copy link
Copy Markdown
Author

For iOS development, you should know that the new event handler is the same from cordova-plugin-battery-status, since the sendJavascript function is now deprecated.

Since using OS icons is not recommended as they can be removed or renamed, I've included five icons from Material Icons, which are Apache 2.0 licensed, but I can change back to OS icons if you don't want to include assets.

And also, window.remoteControls.updateMetadata(null, successCallback, errorCallback); disables the notification and the media buttons

The code is a little messy, but it works. Just let me know if it needs any API changes for iOS.

@GuichaguriGuichaguri mentioned this pull request Sep 6, 2016
@shi11

shi11 commented Sep 7, 2016

Copy link
Copy Markdown
Owner

Sweet @Guichaguri! From my initial read through, it looks good. There will need to be an update to the Obj-C updateMetadata function to handle the object that's passed in rather than the array thats currently used. Hopefully I can put a little time towards it tomorrow. Thanks again for picking up the ball and running with it.

@Guichaguri

Copy link
Copy Markdown
Author

I just noticed the java files were outside the src folder. Fixed it, should work as expected now

@LukePulverenti

Copy link
Copy Markdown

Does this work with the app in the background for an extended period of time? What happens if the cordova activity is paused while the app is in the background? Most apps nowadays play media from a background service, and then use the service for notification interaction, thereby decoupling it from the activity.

@Guichaguri

Copy link
Copy Markdown
Author

@LukePulverenti I can't remember how I made it, I also don't use Cordova anymore.
I've been using React Native as it has much better performance than Cordova, I've made the whole Android side for the react-native-music-control and now I'm working on a module combining audio, media controls and chromecast, the way it should have been since the start

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Guichaguri@shi11@LukePulverenti@RekarBotany
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Added Android support and redesigned the API - #32

Open
Guichaguri wants to merge 2 commits into
shi11:masterfrom
Guichaguri:master
Open

Added Android support and redesigned the API#32
Guichaguri wants to merge 2 commits into
shi11:masterfrom
Guichaguri:master

Conversation

@Guichaguri

@GuichaguriGuichaguri commented Sep 6, 2016

Copy link
Copy Markdown

Here it is the Android Support with the new API.

Lock screen
Notification

This implementation works with Android 4.X and greater. Most of the properties are not visible, but they are for integration with smart watches, cars, etc.

The lock screen wallpaper only changes in Android 5.X and greater.

API Functions supported by Android:

// All properties in updateActions are optional and defaults to falsewindow.remoteControls.updateActions({play: true,pause: true,stop: false,seekTo: false,skipToNext: true,skipToPrevious: true,rate: false,volume: true},successCallback,errorCallback);window.remoteControls.updateMetadata({title: 'Prime Time of Your Life',// Required (String)artist: 'Daft Punk',// Required (String)album: 'Human After All',// Optional (String)cover: 'http://i.imgur.com/HDDlamS.jpg',// Optional (URL/Path)description: '',// Optional (String)color: 0xd85656,// Optional (Color Number from 0x000000 to 0xFFFFFF)genre: 'Industrial Rock, Noise Rock',// Optional (String)date: '2006-06-17T00:00:00Z',// Optional (String)rating: 77,// Optional (Percentage from 0 to 100)duration: 239// Optional (Number)},successCallback,errorCallback);window.remoteControls.updatePlayback({state: 0,// Required (-1: Error, 0: Stopped, 1: Playing, 2: Paused, 3: Buffering)volume: 100,// Optional (Percentage from 0 to 100)speed: 1,// Optional (Number. 1: Normal speed)elapsedTime: 103,// Optional (Number from 0 to duration)bufferedTime: 200// Optional (Number from 0 to duration)},successCallback,errorCallback);window.addEventListener("remotecontrols",function(event){switch(event.action){case'play':
case'pause':
case'stop':
case'next':
case'previous':
// Handle regular buttonsbreak;case'volume':
// Change the volumeconsole.log(event.volume);// Percentagebreak;case'seek':
// Change the playback positionconsole.log(event.position);// A number from 0 to "duration"break;case'rate':
// Change the ratingconsole.log(event.rating);// Percentagebreak;}});

@Guichaguri

Guichaguri commented Sep 6, 2016

Copy link
Copy Markdown
Author

For iOS development, you should know that the new event handler is the same from cordova-plugin-battery-status, since the sendJavascript function is now deprecated.

Since using OS icons is not recommended as they can be removed or renamed, I've included five icons from Material Icons, which are Apache 2.0 licensed, but I can change back to OS icons if you don't want to include assets.

And also, window.remoteControls.updateMetadata(null, successCallback, errorCallback); disables the notification and the media buttons

The code is a little messy, but it works. Just let me know if it needs any API changes for iOS.

@GuichaguriGuichaguri mentioned this pull request Sep 6, 2016
@shi11

shi11 commented Sep 7, 2016

Copy link
Copy Markdown
Owner

Sweet @Guichaguri! From my initial read through, it looks good. There will need to be an update to the Obj-C updateMetadata function to handle the object that's passed in rather than the array thats currently used. Hopefully I can put a little time towards it tomorrow. Thanks again for picking up the ball and running with it.

@Guichaguri

Copy link
Copy Markdown
Author

I just noticed the java files were outside the src folder. Fixed it, should work as expected now

@LukePulverenti

Copy link
Copy Markdown

Does this work with the app in the background for an extended period of time? What happens if the cordova activity is paused while the app is in the background? Most apps nowadays play media from a background service, and then use the service for notification interaction, thereby decoupling it from the activity.

@Guichaguri

Copy link
Copy Markdown
Author

@LukePulverenti I can't remember how I made it, I also don't use Cordova anymore.
I've been using React Native as it has much better performance than Cordova, I've made the whole Android side for the react-native-music-control and now I'm working on a module combining audio, media controls and chromecast, the way it should have been since the start

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Guichaguri@shi11@LukePulverenti@RekarBotany
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Added Android support and redesigned the API - #32

Open
Guichaguri wants to merge 2 commits into
shi11:masterfrom
Guichaguri:master
Open

Added Android support and redesigned the API#32
Guichaguri wants to merge 2 commits into
shi11:masterfrom
Guichaguri:master

Conversation

@Guichaguri

@GuichaguriGuichaguri commented Sep 6, 2016

Copy link
Copy Markdown

Here it is the Android Support with the new API.

Lock screen
Notification

This implementation works with Android 4.X and greater. Most of the properties are not visible, but they are for integration with smart watches, cars, etc.

The lock screen wallpaper only changes in Android 5.X and greater.

API Functions supported by Android:

// All properties in updateActions are optional and defaults to falsewindow.remoteControls.updateActions({play: true,pause: true,stop: false,seekTo: false,skipToNext: true,skipToPrevious: true,rate: false,volume: true},successCallback,errorCallback);window.remoteControls.updateMetadata({title: 'Prime Time of Your Life',// Required (String)artist: 'Daft Punk',// Required (String)album: 'Human After All',// Optional (String)cover: 'http://i.imgur.com/HDDlamS.jpg',// Optional (URL/Path)description: '',// Optional (String)color: 0xd85656,// Optional (Color Number from 0x000000 to 0xFFFFFF)genre: 'Industrial Rock, Noise Rock',// Optional (String)date: '2006-06-17T00:00:00Z',// Optional (String)rating: 77,// Optional (Percentage from 0 to 100)duration: 239// Optional (Number)},successCallback,errorCallback);window.remoteControls.updatePlayback({state: 0,// Required (-1: Error, 0: Stopped, 1: Playing, 2: Paused, 3: Buffering)volume: 100,// Optional (Percentage from 0 to 100)speed: 1,// Optional (Number. 1: Normal speed)elapsedTime: 103,// Optional (Number from 0 to duration)bufferedTime: 200// Optional (Number from 0 to duration)},successCallback,errorCallback);window.addEventListener("remotecontrols",function(event){switch(event.action){case'play':
case'pause':
case'stop':
case'next':
case'previous':
// Handle regular buttonsbreak;case'volume':
// Change the volumeconsole.log(event.volume);// Percentagebreak;case'seek':
// Change the playback positionconsole.log(event.position);// A number from 0 to "duration"break;case'rate':
// Change the ratingconsole.log(event.rating);// Percentagebreak;}});

@Guichaguri

Guichaguri commented Sep 6, 2016

Copy link
Copy Markdown
Author

For iOS development, you should know that the new event handler is the same from cordova-plugin-battery-status, since the sendJavascript function is now deprecated.

Since using OS icons is not recommended as they can be removed or renamed, I've included five icons from Material Icons, which are Apache 2.0 licensed, but I can change back to OS icons if you don't want to include assets.

And also, window.remoteControls.updateMetadata(null, successCallback, errorCallback); disables the notification and the media buttons

The code is a little messy, but it works. Just let me know if it needs any API changes for iOS.

@GuichaguriGuichaguri mentioned this pull request Sep 6, 2016
@shi11

shi11 commented Sep 7, 2016

Copy link
Copy Markdown
Owner

Sweet @Guichaguri! From my initial read through, it looks good. There will need to be an update to the Obj-C updateMetadata function to handle the object that's passed in rather than the array thats currently used. Hopefully I can put a little time towards it tomorrow. Thanks again for picking up the ball and running with it.

@Guichaguri

Copy link
Copy Markdown
Author

I just noticed the java files were outside the src folder. Fixed it, should work as expected now

@LukePulverenti

Copy link
Copy Markdown

Does this work with the app in the background for an extended period of time? What happens if the cordova activity is paused while the app is in the background? Most apps nowadays play media from a background service, and then use the service for notification interaction, thereby decoupling it from the activity.

@Guichaguri

Copy link
Copy Markdown
Author

@LukePulverenti I can't remember how I made it, I also don't use Cordova anymore.
I've been using React Native as it has much better performance than Cordova, I've made the whole Android side for the react-native-music-control and now I'm working on a module combining audio, media controls and chromecast, the way it should have been since the start

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Guichaguri@shi11@LukePulverenti@RekarBotany