diff --git a/bower.json b/bower.json index 1cd6689..ca86664 100644 --- a/bower.json +++ b/bower.json @@ -45,6 +45,7 @@ "angular-utf8-base64": "^0.0.5", "angular-local-storage": "^0.2.7", "angular-notification": "775ee861c1737b284588bcb878ba1f4e43c70c97", + "angular-ui-notification": "^0.2.0", "angular-bittorrent-peerid": "^1.0.2", "angular-busy": "^4.1.3", "angular-promise-buttons": "^0.1.14", diff --git a/src/index.html b/src/index.html index 3e3e9ef..d19425a 100644 --- a/src/index.html +++ b/src/index.html @@ -21,6 +21,7 @@ + @@ -276,6 +277,7 @@ + diff --git a/src/langs/zh_CN.json b/src/langs/zh_CN.json index 89c70b9..489eda3 100644 --- a/src/langs/zh_CN.json +++ b/src/langs/zh_CN.json @@ -1,6 +1,7 @@ { "Simplified Chinese": "简体中文", "Operation Succeeded": "操作成功", + "Connection Succeeded": "连接成功", "Error": "错误", "OK": "确定", "Confirm": "确认", diff --git a/src/scripts/config/configuration.js b/src/scripts/config/configuration.js index 75da414..6dd7a36 100644 --- a/src/scripts/config/configuration.js +++ b/src/scripts/config/configuration.js @@ -1,7 +1,7 @@ (function () { 'use strict'; - angular.module('ariaNg').config(['$translateProvider', 'localStorageServiceProvider', 'ariaNgConstants', function ($translateProvider, localStorageServiceProvider, ariaNgConstants) { + angular.module('ariaNg').config(['$translateProvider', 'localStorageServiceProvider', 'NotificationProvider', 'ariaNgConstants', function ($translateProvider, localStorageServiceProvider, NotificationProvider, ariaNgConstants) { localStorageServiceProvider .setPrefix(ariaNgConstants.appPrefix) .setStorageType('localStorage') @@ -14,5 +14,9 @@ .preferredLanguage('en') .fallbackLanguage('en') .useSanitizeValueStrategy('escapeParameters'); + + NotificationProvider.setOptions({ + delay: ariaNgConstants.notificationInPageTimeout + }); }]); })(); diff --git a/src/scripts/config/constants.js b/src/scripts/config/constants.js index 2b50b9e..c6aeada 100644 --- a/src/scripts/config/constants.js +++ b/src/scripts/config/constants.js @@ -8,7 +8,8 @@ globalStatStorageCapacity: 120, taskStatStorageCapacity: 300, lazySaveTimeout: 500, - errorTooltipDelay: 200 + errorTooltipDelay: 200, + notificationInPageTimeout: 2000 }).constant('ariaNgFileTypes', { video: [ '.3gp', diff --git a/src/scripts/config/defaultLanguage.js b/src/scripts/config/defaultLanguage.js index b16cefc..b7a921e 100644 --- a/src/scripts/config/defaultLanguage.js +++ b/src/scripts/config/defaultLanguage.js @@ -5,6 +5,7 @@ $translateProvider.translations('en', { 'English': 'English', 'Operation Succeeded': 'Operation Succeeded', + 'Connection Succeeded': 'Connection Succeeded', 'Error': 'Error', 'OK': 'OK', 'Confirm': 'Confirm', diff --git a/src/scripts/core/app.js b/src/scripts/core/app.js index 783ac26..170f247 100644 --- a/src/scripts/core/app.js +++ b/src/scripts/core/app.js @@ -14,6 +14,7 @@ 'ab-base64', 'LocalStorageModule', 'notification', + 'ui-notification', 'angularBittorrentPeerid', 'cgBusy', 'angularPromiseButtons', diff --git a/src/scripts/core/root.js b/src/scripts/core/root.js index 30af4a6..b5cd0a6 100644 --- a/src/scripts/core/root.js +++ b/src/scripts/core/root.js @@ -154,6 +154,12 @@ } }; + aria2TaskService.onFirstSuccess(function () { + ariaNgNotificationService.notifyInPage('', 'Connection Succeeded', { + type: 'success' + }); + }); + aria2TaskService.onTaskCompleted(function (event) { ariaNgNotificationService.notifyTaskComplete(event.task); }); diff --git a/src/scripts/services/aria2RpcService.js b/src/scripts/services/aria2RpcService.js index 4da1738..9d3edfa 100644 --- a/src/scripts/services/aria2RpcService.js +++ b/src/scripts/services/aria2RpcService.js @@ -3,8 +3,10 @@ angular.module('ariaNg').factory('aria2RpcService', ['$q', 'aria2RpcConstants', 'aria2RpcErrors', 'ariaNgCommonService', 'ariaNgSettingService', 'aria2HttpRpcService', 'aria2WebSocketRpcService', function ($q, aria2RpcConstants, aria2RpcErrors, ariaNgCommonService, ariaNgSettingService, aria2HttpRpcService, aria2WebSocketRpcService) { var rpcImplementService = ariaNgSettingService.isUseWebSocket() ? aria2WebSocketRpcService : aria2HttpRpcService; + var isConnected = false; var secret = ariaNgSettingService.getSecret(); + var onFirstSuccessCallbacks = []; var onDownloadStartCallbacks = []; var onDownloadPauseCallbacks = []; var onDownloadStopCallbacks = []; @@ -28,7 +30,7 @@ if (returnContextOnly) { return requestContext; } - + var uniqueId = ariaNgCommonService.generateUniqueId(); var requestBody = { @@ -63,6 +65,17 @@ }); }; + var fireFirstSuccessEvent = function () { + if (!angular.isArray(onFirstSuccessCallbacks) || onFirstSuccessCallbacks.length < 1) { + return; + } + + for (var i = 0; i < onFirstSuccessCallbacks.length; i++) { + var callback = onFirstSuccessCallbacks[i]; + callback(); + } + }; + var invokeMulti = function (methodFunc, contexts, callback) { var promises = []; @@ -123,6 +136,11 @@ var innerContext = arguments[1]; context.successCallback = function (id, result) { + if (!isConnected) { + isConnected = true; + fireFirstSuccessEvent(); + } + if (innerContext.callback) { innerContext.callback({ id: id, @@ -397,6 +415,9 @@ listMethods: function (context) { return invoke(buildRequestContext('system.listMethods', context)); }, + onFirstSuccess: function (context) { + onFirstSuccessCallbacks.push(context.callback); + }, onDownloadStart: function (context) { onDownloadStartCallbacks.push(context.callback); }, diff --git a/src/scripts/services/aria2TaskService.js b/src/scripts/services/aria2TaskService.js index 4b29307..a8776c6 100644 --- a/src/scripts/services/aria2TaskService.js +++ b/src/scripts/services/aria2TaskService.js @@ -204,7 +204,7 @@ return peers; }; - var createEventCallback = function (getTaskStatusFunc, callback, type) { + var createTaskEventCallback = function (getTaskStatusFunc, callback, type) { return function (event) { var context = { type: type, @@ -472,13 +472,22 @@ callback: callback }); }, + onFirstSuccess: function (callback) { + if (!callback) { + return; + } + + aria2RpcService.onFirstSuccess({ + callback: callback + }); + }, onTaskCompleted: function (callback) { if (!callback) { return; } aria2RpcService.onDownloadComplete({ - callback: createEventCallback(this.getTaskStatus, callback, 'completed') + callback: createTaskEventCallback(this.getTaskStatus, callback, 'completed') }); }, onBtTaskCompleted: function (callback) { @@ -487,7 +496,7 @@ } aria2RpcService.onBtDownloadComplete({ - callback: createEventCallback(this.getTaskStatus, callback, 'btcompleted') + callback: createTaskEventCallback(this.getTaskStatus, callback, 'btcompleted') }); }, onTaskErrorOccur: function (callback) { @@ -496,7 +505,7 @@ } aria2RpcService.onDownloadError({ - callback: createEventCallback(this.getTaskStatus, callback, 'error') + callback: createTaskEventCallback(this.getTaskStatus, callback, 'error') }); }, processDownloadTasks: function (tasks) { diff --git a/src/scripts/services/ariaNgNotificationService.js b/src/scripts/services/ariaNgNotificationService.js index 7e463e0..ede48c5 100644 --- a/src/scripts/services/ariaNgNotificationService.js +++ b/src/scripts/services/ariaNgNotificationService.js @@ -1,7 +1,7 @@ (function () { 'use strict'; - angular.module('ariaNg').factory('ariaNgNotificationService', ['$notification', '$translate', 'ariaNgSettingService', function ($notification, $translate, ariaNgSettingService) { + angular.module('ariaNg').factory('ariaNgNotificationService', ['$notification', '$translate', 'Notification', 'ariaNgSettingService', function ($notification, $translate, Notification, ariaNgSettingService) { var isSupportBrowserNotification = $notification.isSupported; var isPermissionGranted = function (permission) { @@ -37,21 +37,50 @@ } }); }, - notify: function (title, content) { + notifyViaBrowser: function (title, content) { if (isSupportBrowserNotification && ariaNgSettingService.getBrowserNotification()) { $notification($translate.instant(title), { body: $translate.instant(content) }); } }, + notifyInPage: function (title, content, options) { + if (!options) { + options = {}; + } + + if (title) { + title = $translate.instant(title); + } + + if (content) { + content = $translate.instant(content); + } + + if (!content) { + options.message = title; + } else { + options.title = title; + options.message = content; + } + + if (!options.type || !Notification[options.type]) { + options.type = 'primary'; + } + + Notification[options.type](options); + }, notifyTaskComplete: function (task) { - this.notify('Download Completed', (task && task.taskName ? task.taskName : '')); + this.notifyViaBrowser('Download Completed', (task && task.taskName ? task.taskName : '')); }, notifyBtTaskComplete: function (task) { - this.notify('BT Download Completed', (task && task.taskName ? task.taskName : '')); + this.notifyViaBrowser('BT Download Completed', (task && task.taskName ? task.taskName : '')); }, notifyTaskError: function (task) { - this.notify('Download Error', (task && task.taskName ? task.taskName : '')); + this.notifyViaBrowser('Download Error', (task && task.taskName ? task.taskName : '')); + }, + clearNotificationInPage: function () { + Notification.clearAll(); } } }]);