diff --git a/dashboard-ui/mypreferenceswebclient.html b/dashboard-ui/mypreferenceswebclient.html index fc9aaac31f..9acf27c9f4 100644 --- a/dashboard-ui/mypreferenceswebclient.html +++ b/dashboard-ui/mypreferenceswebclient.html @@ -192,6 +192,16 @@
${LabelEnableItemPreviewsHelp}
+ +
+
+
+
+ + +
+
+
diff --git a/dashboard-ui/scripts/librarybrowser.js b/dashboard-ui/scripts/librarybrowser.js index 9ce49b885a..614d74b0ad 100644 --- a/dashboard-ui/scripts/librarybrowser.js +++ b/dashboard-ui/scripts/librarybrowser.js @@ -1831,21 +1831,22 @@ return '
' + Globalize.translate('HeaderOffline') + '
'; } - try { + if (item.Type == 'Episode') { + try { - var date = parseISO8601Date(item.PremiereDate, { toLocal: true }); + var date = parseISO8601Date(item.PremiereDate, { toLocal: true }); + + if (item.PremiereDate && (new Date().getTime() < date.getTime())) { + return '
' + Globalize.translate('HeaderUnaired') + '
'; + } + } catch (err) { - if (item.PremiereDate && (new Date().getTime() < date.getTime())) { - return '
' + Globalize.translate('HeaderUnaired') + '
'; } - } catch (err) { + return '
' + Globalize.translate('HeaderMissing') + '
'; } - if (item.IsFolder) { - return ''; - } - return '
' + Globalize.translate('HeaderMissing') + '
'; + return ''; }, getPlayedIndicatorHtml: function (item) { diff --git a/dashboard-ui/scripts/librarymenu.js b/dashboard-ui/scripts/librarymenu.js index 45004c5582..1058fe6e6b 100644 --- a/dashboard-ui/scripts/librarymenu.js +++ b/dashboard-ui/scripts/librarymenu.js @@ -33,7 +33,12 @@ html += ''; - if (!$.browser.mobile) { + //if (AppInfo.isNativeApp && $.browser.android) + //{ + // html += ''; + //} + + if (!$.browser.mobile && !AppInfo.isTouchPreferred) { html += ''; } @@ -94,8 +99,27 @@ // Have to wait for document ready here because otherwise // we may see the jQM redirect back and forth problem $(initViewMenuBarHeadroom); + + //$('.headerButtonViewMenu').off('click', onViewButtonClick).on('click', onViewButtonClick); } + //function onViewButtonClick() { + + // var html = '
'; + + + // html += '
'; + + // $(document.body).append(html); + + // var elem = $('.appViewMenuPanel').panel({}).trigger('create').panel("open").on("panelclose", function () { + + // $(this).off("panelclose").remove(); + // }); + + + //} + function initViewMenuBarHeadroom() { // grab an element diff --git a/dashboard-ui/scripts/mediacontroller.js b/dashboard-ui/scripts/mediacontroller.js index 8e543e0521..6745e54aba 100644 --- a/dashboard-ui/scripts/mediacontroller.js +++ b/dashboard-ui/scripts/mediacontroller.js @@ -508,7 +508,7 @@ Dashboard.loadLocalAssetManager().done(function () { - var serverInfo = ApiClient.serverInfo().Id; + var serverInfo = ApiClient.serverInfo(); if (serverInfo.Id) { var localMediaSource = window.LocalAssetManager.getLocalMediaSource(serverInfo.Id, itemId); diff --git a/dashboard-ui/scripts/mypreferenceswebclient.js b/dashboard-ui/scripts/mypreferenceswebclient.js index 6059cafd46..5b7bc5f11d 100644 --- a/dashboard-ui/scripts/mypreferenceswebclient.js +++ b/dashboard-ui/scripts/mypreferenceswebclient.js @@ -18,6 +18,7 @@ $('#selectEnableItemPreviews', page).val(AppSettings.enableItemPreviews().toString().toLowerCase()).selectmenu("refresh"); $('#chkEnableLibraryTileNames', page).checked(displayPreferences.CustomPrefs.enableLibraryTileNames != '0').checkboxradio("refresh"); + $('#chkEnableFullScreen', page).checked(AppSettings.enableFullScreen().toString().toLowerCase() == 'true').checkboxradio("refresh"); Dashboard.hideLoadingMsg(); } @@ -52,6 +53,7 @@ AppSettings.maxChromecastBitrate($('#selectMaxChromecastBitrate', page).val()); AppSettings.enableItemPreviews($('#selectEnableItemPreviews', page).val() == 'true'); + AppSettings.enableFullScreen($('#chkEnableFullScreen', page).checked()); var userId = getParameterByName('userId') || Dashboard.getCurrentUserId(); @@ -100,6 +102,12 @@ $('.labelGenericExternalPlayers', page).show(); $('.labelNativeExternalPlayers', page).hide(); } + + if (AppInfo.supportsFullScreen) { + $('.fldFullscreen', page).show(); + } else { + $('.fldFullscreen', page).hide(); + } }); })(jQuery, window, document); \ No newline at end of file diff --git a/dashboard-ui/scripts/site.js b/dashboard-ui/scripts/site.js index 434988d984..ee86337624 100644 --- a/dashboard-ui/scripts/site.js +++ b/dashboard-ui/scripts/site.js @@ -1626,6 +1626,7 @@ var AppInfo = {}; } else { apiClient = new MediaBrowser.ApiClient(Logger, Dashboard.serverAddress(), AppInfo.appName, AppInfo.appVersion, AppInfo.deviceName, AppInfo.deviceId); + apiClient.enableAutomaticNetworking = false; ConnectionManager.addApiClient(apiClient); } diff --git a/dashboard-ui/thirdparty/apiclient/apiclient.js b/dashboard-ui/thirdparty/apiclient/apiclient.js index d9917e76df..b6dd7b6ad3 100644 --- a/dashboard-ui/thirdparty/apiclient/apiclient.js +++ b/dashboard-ui/thirdparty/apiclient/apiclient.js @@ -173,7 +173,7 @@ } } - if (!self.enableAutomaticNetwork || self.connectionMode == null) { + if (self.enableAutomaticNetworking === false || request.type != "GET") { logger.log('Requesting url without automatic networking: ' + request.url); return AjaxApi.ajax(request).fail(onRequestFail); } @@ -230,7 +230,7 @@ logger.log("Reconnect succeeeded to " + url); - self.connectionMode = connectionMode; + self.serverInfo().LastConnectionMode = connectionMode; self.serverAddress(url); deferred.resolve(); @@ -257,7 +257,7 @@ var deferred = DeferredBuilder.Deferred(); setTimeout(function () { - tryReconnectInternal(deferred, self.connectionMode, 0); + tryReconnectInternal(deferred, self.serverInfo().LastConnectionMode, 0); }, 500); return deferred.promise(); } @@ -271,7 +271,9 @@ if (replaceUrl) { - var baseUrl = MediaBrowser.ServerInfo.getServerAddress(self.serverInfo(), self.connectionMode); + var currentServerInfo = self.serverInfo(); + + var baseUrl = MediaBrowser.ServerInfo.getServerAddress(currentServerInfo, currentServerInfo.LastConnectionMode); request.url = replaceServerAddress(request.url, baseUrl); } @@ -360,7 +362,7 @@ return url; }; - self.enableAutomaticNetworking = function (server, connectionMode, serverUrl) { + self.updateServerInfo = function (server, connectionMode) { if (server == null) { throw new Error('server cannot be null'); @@ -370,16 +372,11 @@ throw new Error('connectionMode cannot be null'); } - if (!serverUrl) { - throw new Error('serverUrl cannot be null or empty'); - } - - logger.log('Begin enableAutomaticNetworking'); + logger.log('Begin updateServerInfo'); self.serverInfo(server); - self.connectionMode = connectionMode; - self.enableAutomaticNetwork = true; + var serverUrl = MediaBrowser.ServerInfo.getServerAddress(connectionMode); logger.log('Setting server address to ' + serverUrl); self.serverAddress(serverUrl); }; diff --git a/dashboard-ui/thirdparty/apiclient/connectionmanager.js b/dashboard-ui/thirdparty/apiclient/connectionmanager.js index a29f44b75d..6a737cdfa8 100644 --- a/dashboard-ui/thirdparty/apiclient/connectionmanager.js +++ b/dashboard-ui/thirdparty/apiclient/connectionmanager.js @@ -221,19 +221,28 @@ } var credentials = credentialProvider.credentials(); - var server = credentials.Servers.filter(function (s) { + var servers = credentials.Servers.filter(function (s) { return stringEqualsIgnoreCase(s.Id, serverId); - })[0]; + }); + + if (!servers.length) { + throw new Error('Server not found: ' + serverId); + } + + var server = servers[0]; return getOrAddApiClient(server, server.LastConnectionMode); }; function onAuthenticated(apiClient, result, options, saveCredentials) { - var server = apiClient.serverInfo(); - var credentials = credentialProvider.credentials(); + var servers = credentials.Servers.filter(function (s) { + return s.Id == result.ServerId; + }); + + var server = servers.length ? servers[0] : apiClient.serverInfo(); server.DateLastAccessed = new Date().getTime(); server.Id = result.ServerId; @@ -942,7 +951,7 @@ MediaBrowser.ConnectionState.ServerSignIn; result.Servers.push(server); - result.ApiClient.enableAutomaticNetworking(server, connectionMode, MediaBrowser.ServerInfo.getServerAddress(server, connectionMode)); + result.ApiClient.updateServerInfo(server, connectionMode); if (result.State == MediaBrowser.ConnectionState.SignedIn) { afterConnected(result.ApiClient, options); diff --git a/dashboard-ui/thirdparty/cordova/android/iap.js b/dashboard-ui/thirdparty/cordova/android/iap.js index 16fd22553a..82038233f9 100644 --- a/dashboard-ui/thirdparty/cordova/android/iap.js +++ b/dashboard-ui/thirdparty/cordova/android/iap.js @@ -3,7 +3,7 @@ var unlockId = "com.mb.android.unlock"; var updatedProducts = []; - function updateProductInfo(id, owned) { + function updateProductInfo(id, owned, price) { updatedProducts = updatedProducts.filter(function (r) { return r.id != id; @@ -11,7 +11,8 @@ var product = { id: id, - owned: owned + owned: owned, + price: price }; updatedProducts.push(product); @@ -19,12 +20,6 @@ Events.trigger(IapManager, 'productupdated', [product]); } - function hasPurchased(id) { - var product = getProduct(id); - - return product != null && product.owned; - } - function getProduct(id) { var products = updatedProducts.filter(function (r) { return r.id == id; @@ -55,7 +50,7 @@ window.IapManager = { isPurchaseAvailable: isPurchaseAvailable, - hasPurchased: hasPurchased, + getProductInfo: getProduct, updateProduct: updateProductInfo, beginPurchase: beginPurchase, onPurchaseComplete: onPurchaseComplete diff --git a/dashboard-ui/thirdparty/cordova/iap.js b/dashboard-ui/thirdparty/cordova/iap.js index 428d1e28a0..b092bd74ef 100644 --- a/dashboard-ui/thirdparty/cordova/iap.js +++ b/dashboard-ui/thirdparty/cordova/iap.js @@ -1,15 +1,19 @@ (function () { var unlockAlias = "premium features"; + var unlockAppProductId = 'appunlock'; + var updatedProducts = []; - function updateProductInfo(p) { + function updateProductInfo(product) { updatedProducts = updatedProducts.filter(function (r) { - return r.id != p.id; + return r.id != product.id; }); - updatedProducts.push(p); + updatedProducts.push(product); + + Events.trigger(IapManager, 'productupdated', [product]); } function normalizeId(id) { @@ -31,20 +35,15 @@ return products.length ? products[0] : null; } - function hasPurchased(id) { - var product = getProduct(id); - - return product != null && product.owned; - } - function isPurchaseAvailable(id) { var product = getProduct(id); - return product != null && product.canPurchase; + return product != null && product.valid /*&& product.canPurchase*/; } function beginPurchase(id) { - + id = normalizeId(id); + store.order(id); } function validateProduct(product, callback) { @@ -80,22 +79,33 @@ // iOS store.register({ - id: "appunlock", + id: unlockAppProductId, alias: unlockAlias, type: store.NON_CONSUMABLE }); // When purchase of the full version is approved, // show some logs and finish the transaction. - store.when(unlockAlias).approved(function (order) { + store.when(unlockAppProductId).approved(function (order) { log('You just unlocked the FULL VERSION!'); + alert('approved'); order.finish(); }); + store.when(unlockAppProductId).verified(function (p) { + alert('verified'); + log("verified"); + p.finish(); + }); + // The play button can only be accessed when the user // owns the full version. - store.when(unlockAlias).updated(function (product) { + store.when(unlockAppProductId).updated(function (product) { + if (product.loaded && product.valid && product.state == store.APPROVED) { + console.log('finishing previously created transaction'); + product.finish(); + } updateProductInfo(product); }); @@ -114,7 +124,7 @@ window.IapManager = { isPurchaseAvailable: isPurchaseAvailable, - hasPurchased: hasPurchased, + getProductInfo: getProduct, beginPurchase: beginPurchase }; diff --git a/dashboard-ui/thirdparty/cordova/registrationservices.js b/dashboard-ui/thirdparty/cordova/registrationservices.js index 34f1d6e7ce..fc195a0d93 100644 --- a/dashboard-ui/thirdparty/cordova/registrationservices.js +++ b/dashboard-ui/thirdparty/cordova/registrationservices.js @@ -13,7 +13,7 @@ return "com.mb.android.unlock"; } - return 'premiumunlock'; + return 'appunlock'; } function validatePlayback(deferred) { @@ -24,20 +24,12 @@ return; } - validateFeature({ - - id: getPremiumUnlockFeatureId() - - }, deferred); + validateFeature(getPremiumUnlockFeatureId(), deferred); } function validateLiveTV(deferred) { - validateFeature({ - - id: getPremiumUnlockFeatureId() - - }, deferred); + validateFeature(getPremiumUnlockFeatureId(), deferred); } function getRegistrationInfo(feature, enableSupporterUnlock) { @@ -50,17 +42,20 @@ return ConnectionManager.getRegistrationInfo(feature, ApiClient); } - function validateFeature(info, deferred) { + function validateFeature(id, deferred) { - if (IapManager.hasPurchased(info.id)) { + var info = IapManager.getProductInfo(id) || {}; + + if (info.owned) { deferred.resolve(); return; } var productInfo = { enableSupporterUnlock: isAndroid(), - enableAppUnlock: IapManager.isPurchaseAvailable(info.id), - id: info.id + enableAppUnlock: IapManager.isPurchaseAvailable(id), + id: id, + price: info.price }; var prefix = isAndroid() ? 'android' : 'ios'; @@ -89,7 +84,7 @@ html += '
'; - html += '
'; + html += '
'; html += '

' + Globalize.translate('HeaderUnlockApp') + '

'; @@ -116,7 +111,12 @@ } if (info.enableAppUnlock) { - html += ''; + + var unlockText = Globalize.translate('ButtonUnlockWithPurchase'); + if (info.price) { + unlockText = Globalize.translate('ButtonUnlockPrice', info.price); + } + html += ''; } if (info.enableSupporterUnlock) { @@ -125,7 +125,7 @@ html += ''; - html += ''; + html += '
'; html += '
'; html += ''; @@ -155,10 +155,9 @@ currentDisplayingProductInfo = info; currentDisplayingDeferred = deferred; - $('.inAppPurchaseForm', elem).on('submit', function () { + $('.btnAppUnlock', elem).on('click', function () { IapManager.beginPurchase(info.id); - return false; }); $('.btnCancel', elem).on('click', function () { @@ -166,12 +165,7 @@ clearCurrentDisplayingInfo(); cancelInAppPurchase(); - // For testing purposes - if (!info.enableSupporterUnlock && !info.enableAppUnlock) { - deferred.resolve(); - } else { - deferred.reject(); - } + deferred.reject(); }); $('.btnSignInSupporter', elem).on('click', function () { @@ -238,9 +232,9 @@ } if (isAndroid()) { - requirejs(['thirdparty/cordova/android/iap', onIapManagerLoaded]); + requirejs(['thirdparty/cordova/android/iap'], onIapManagerLoaded); } else { - requirejs(['thirdparty/cordova/iap', onIapManagerLoaded]); + requirejs(['thirdparty/cordova/iap'], onIapManagerLoaded); } })(); \ No newline at end of file