diff --git a/CHANGELOG.md b/CHANGELOG.md index 173f715..9d74633 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ [#63](https://git.project-insanity.org/onny/nextcloud-app-radio/issues/63) @onny - Add icon categories [#](https://git.project-insanity.org/onny/nextcloud-app-radio/commit/b7e711955b90f388a5e340ab582461fd39df8969) @onny +- Add volume icon + [#](https://git.project-insanity.org/onny/nextcloud-app-radio/commit/07ce3e5aebd5e5b5bf91e3aae996441ae9268402) @onny ### Fixed - Fix styling issue (overflow hidden) player area diff --git a/appinfo/routes.php b/appinfo/routes.php index a868912..d76bf6e 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -17,7 +17,9 @@ return [ ['name' => 'page#categories', 'url' => '/', 'verb' => 'GET'], ['name' => 'page#top', 'url' => '/', 'verb' => 'GET'], ['name' => 'settings#getMenuState', 'url' => '/getMenuState', 'verb' => 'GET'], + ['name' => 'settings#getVolumeState', 'url' => '/getVolumeState', 'verb' => 'GET'], ['name' => 'settings#saveMenuState', 'url' => '/saveMenuState', 'verb' => 'POST'], + ['name' => 'settings#saveVolumeState', 'url' => '/saveVolumeState', 'verb' => 'POST'], ['name' => 'station_api#preflighted_cors', 'url' => '/api/0.1/{path}', 'verb' => 'OPTIONS', 'requirements' => ['path' => '.+']] ] diff --git a/controller/settingscontroller.php b/controller/settingscontroller.php index 3fbb3a2..dfcb3d6 100644 --- a/controller/settingscontroller.php +++ b/controller/settingscontroller.php @@ -51,4 +51,37 @@ class SettingsController extends Controller { return $response; } + /** + * Save volume for current user + * + * @NoAdminRequired + * @return array response + */ + public function getVolumeState() { + $volume_state = $this->appConfig->getUserValue('volume_state', $this->userId); + $response = array( + 'status' => 'success', + 'data' => array('message' => 'User volume saved successfully.'), + 'volume_state' => $volume_state + ); + return $response; + } + + /** + * Save volume for current user + * + * @NoAdminRequired + * @param $menu_state string + * @return array response + */ + public function saveVolumeState($volume_state) { + $this->appConfig->setUserValue('volume_state', $this->userId, $volume_state); + $response = array( + 'status' => 'success', + 'data' => array('message' => 'User volume saved successfully.'), + 'volume_state' => $volume_state + ); + return $response; + } + } diff --git a/js/main.js b/js/main.js index 8ac4d73..145b3b0 100644 --- a/js/main.js +++ b/js/main.js @@ -377,6 +377,22 @@ $(function(){ switch_menu(0); }); + function debounce(func, wait, immediate) { + var timeout; + return function() { + var context = this, + args = arguments; + var later = function() { + timeout = null; + if (!immediate) func.apply(context, args); + }; + var callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + if (callNow) func.apply(context, args); + }; + }; + // Volume slider $('#volumeslider').slider({ orientation: "horizontal", @@ -387,7 +403,6 @@ $(function(){ animate: true, step: .1, slide: function(e, ui) { - player.volume = ui.value; if (ui.value < 0.2) { $("#volumeicon").removeClass(); $("#volumeicon").attr("class","silent"); @@ -403,6 +418,57 @@ $(function(){ } }); + $("#volumeslider").on("slidestop", debounce(function(e, ui) { + player.volume = ui.value; + save_volume_state(ui.value); + }, 700) + ); + + function load_volume_state() { + var volume_state = 0; + var baseUrl = OC.generateUrl('/apps/radio/getVolumeState'); + $.get(baseUrl, function ( data ) { + if ("volume_state" in data) { + volume_state = data["volume_state"]; + if (volume_state == "") { + player.volume = 1; + $('#volumeslider').slider('value',1); + } else { + player.volume = Number(volume_state); + $('#volumeslider').slider('value',Number(volume_state)); + if (volume_state < 0.2) { + $("#volumeicon").removeClass(); + $("#volumeicon").attr("class","silent"); + } + if (volume_state > 0.5) { + $("#volumeicon").removeClass(); + $("#volumeicon").attr("class","full"); + } + if (volume_state < 0.5 && volume_state > 0.2) { + $("#volumeicon").removeClass(); + $("#volumeicon").attr("class","mid"); + } + } + } + return true; + }); + } + + function save_volume_state(volume_state) { + var baseUrl = OC.generateUrl('/apps/radio/saveVolumeState'); + var settings = { + "volume_state": volume_state + }; + $.ajax({ + url: baseUrl, + method: 'POST', + contentType: 'application/json', + data: JSON.stringify(settings) + }).done(function(data){ + return true; + }); + } + // On app start, load top list if(window.location.hash) { var hash = String(window.location.hash.replace('#','')); @@ -424,4 +490,7 @@ $(function(){ load_menu_state(); }; + // Load volume state + load_volume_state(); + });