From 0e16aaeab9e488237fd7246d4c710dd0063386f0 Mon Sep 17 00:00:00 2001
From: Lukas Winkler <Findus23@users.noreply.github.com>
Date: Sun, 19 Feb 2017 08:50:16 +0100
Subject: [PATCH] Remove Smartbanners (#11301)

* remove jquery smartbanner

* add related_applications to manifest.json

https://developers.google.com/web/updates/2015/03/increasing-engagement-with-app-install-banners-in-chrome-for-android?hl=en#native

* remove googleplay icon

* remove smartbanner license
---
 LEGALNOTICE                                   |   4 -
 libs/jquery/MIT-LICENSE-smartbanner.txt       |  19 --
 libs/jquery/jquery.smartbanner.js             | 309 ------------------
 .../jquery/stylesheets/jquery.smartbanner.css |  28 --
 plugins/CoreHome/images/googleplay.png        | Bin 16550 -> 0 bytes
 plugins/CoreHome/javascripts/manifest.json    |  11 +-
 plugins/Login/templates/login.twig            |  10 -
 plugins/Morpheus/templates/layout.twig        |   1 -
 8 files changed, 9 insertions(+), 373 deletions(-)
 delete mode 100644 libs/jquery/MIT-LICENSE-smartbanner.txt
 delete mode 100644 libs/jquery/jquery.smartbanner.js
 delete mode 100644 libs/jquery/stylesheets/jquery.smartbanner.css
 delete mode 100644 plugins/CoreHome/images/googleplay.png

diff --git a/LEGALNOTICE b/LEGALNOTICE
index 1714d1b720..d4b1e6d51b 100644
--- a/LEGALNOTICE
+++ b/LEGALNOTICE
@@ -116,10 +116,6 @@ THIRD-PARTY COMPONENTS AND LIBRARIES
 	Link:  http://mths.be/placeholder
 	License:  Dual licensed: MIT (Expat) or GPL
 
-	Name:  jquery smartbanner
-	Link:  https://github.com/jasny/jquery.smartbanner
-	License:  Dual licensed: MIT (Expat)
-
 	Name:  json2.js
 	Link:  http://json.org/
 	License:  Public domain
diff --git a/libs/jquery/MIT-LICENSE-smartbanner.txt b/libs/jquery/MIT-LICENSE-smartbanner.txt
deleted file mode 100644
index 9a9270ddb2..0000000000
--- a/libs/jquery/MIT-LICENSE-smartbanner.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) Arnold Daniels <arnold@jasny.net>
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is furnished
-to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
\ No newline at end of file
diff --git a/libs/jquery/jquery.smartbanner.js b/libs/jquery/jquery.smartbanner.js
deleted file mode 100644
index 542242b7eb..0000000000
--- a/libs/jquery/jquery.smartbanner.js
+++ /dev/null
@@ -1,309 +0,0 @@
-/*!
- * jQuery Smart Banner
- * Copyright (c) 2012 Arnold Daniels <arnold@jasny.net>
- * Based on 'jQuery Smart Web App Banner' by Kurt Zenisek @ kzeni.com
- */
-!function ($) {
-    var SmartBanner = function (options) {
-        this.origHtmlMargin = parseFloat($('html').css('margin-top')) // Get the original margin-top of the HTML element so we can take that into account
-        this.options = $.extend({}, $.smartbanner.defaults, options)
-
-        var standalone = navigator.standalone // Check if it's already a standalone web app or running within a webui view of an app (not mobile safari)
-          , UA = navigator.userAgent
-
-        // Detect banner type (iOS or Android)
-        if (this.options.force) {
-            this.type = this.options.force
-        } else if (UA.match(/iPhone|iPod/i) != null || (UA.match(/iPad/) && this.options.iOSUniversalApp)) {
-            if (UA.match(/Safari/i) != null &&
-               (UA.match(/CriOS/i) != null ||
-               window.Number(UA.substr(UA.indexOf('OS ') + 3, 3).replace('_', '.')) < 6)) this.type = 'ios' // Check webview and native smart banner support (iOS 6+)
-        } else if (UA.match(/\bSilk\/(.*\bMobile Safari\b)?/) || UA.match(/\bKF\w/) || UA.match('Kindle Fire')) {
-            this.type = 'kindle'
-        } else if (UA.match(/Android/i) != null) {
-            this.type = 'android'
-        } else if (UA.match(/Windows NT 6.2/i) != null && UA.match(/Touch/i) !== null) {
-            this.type = 'windows'
-        }
-
-        // Don't show banner if device isn't iOS or Android, website is loaded in app or user dismissed banner
-        if (!this.type || standalone || this.getCookie('sb-closed') || this.getCookie('sb-installed')) {
-            return
-        }
-
-        // Calculate scale
-        this.scale = this.options.scale == 'auto' ? $(window).width() / window.screen.width : this.options.scale
-        if (this.scale < 1) this.scale = 1
-
-        // Get info from meta data
-        var meta = $(this.type == 'android' ? 'meta[name="google-play-app"]' :
-            this.type == 'ios' ? 'meta[name="apple-itunes-app"]' :
-            this.type == 'kindle' ? 'meta[name="kindle-fire-app"]' : 'meta[name="msApplication-ID"]');
-        if (meta.length == 0) return
-
-        // For Windows Store apps, get the PackageFamilyName for protocol launch
-        if (this.type == 'windows') {
-            this.pfn = $('meta[name="msApplication-PackageFamilyName"]').attr('content');
-            this.appId = meta.attr('content')[1]
-        } else {
-            this.appId = /app-id=([^\s,]+)/.exec(meta.attr('content'))[1]
-        }
-
-        this.title = this.options.title ? this.options.title : meta.data('title') || $('title').text().replace(/\s*[|\-·].*$/, '')
-        this.author = this.options.author ? this.options.author : meta.data('author') || ($('meta[name="author"]').length ? $('meta[name="author"]').attr('content') : window.location.hostname)
-        this.iconUrl = meta.data('icon-url');
-        this.price = meta.data('price');
-
-        // Create banner
-        this.create()
-        this.show()
-        this.listen()
-    }
-
-    SmartBanner.prototype = {
-
-        constructor: SmartBanner
-
-      , create: function() {
-            var iconURL
-              , link=(this.options.url ? this.options.url : (this.type == 'windows' ? 'ms-windows-store:PDP?PFN=' + this.pfn : (this.type == 'android' ? 'market://details?id=' : (this.type == 'kindle' ? 'amzn://apps/android?asin=' : 'https://itunes.apple.com/' + this.options.appStoreLanguage + '/app/id'))) + this.appId)
-              , price = this.price || this.options.price
-              , inStore=price ? price + ' - ' + (this.type == 'android' ? this.options.inGooglePlay : this.type == 'kindle' ? this.options.inAmazonAppStore : this.type == 'ios' ? this.options.inAppStore : this.options.inWindowsStore) : ''
-              , gloss=this.options.iconGloss === null ? (this.type=='ios') : this.options.iconGloss
-            if(this.options.url)
-              link = this.options.url
-            else {
-              if(this.type=='android') {
-                link = 'market://details?id=' + this.appId
-                if(this.options.GooglePlayParams)
-                  link = link + '&referrer=' + this.options.GooglePlayParams
-              }
-              else
-              link = 'https://itunes.apple.com/' + this.options.appStoreLanguage + '/app/id' + this.appId
-            }
-
-            var banner = '<div id="smartbanner" class="'+this.type+'"><div class="sb-container"><a href="#" class="sb-close">&times;</a><span class="sb-icon"></span><div class="sb-info"><strong>'+this.title+'</strong><span>'+this.author+'</span><span>'+inStore+'</span></div><a href="'+link+'" class="sb-button"><span>'+this.options.button+'</span></a></div></div>';
-            (this.options.layer) ? $(this.options.appendToSelector).append(banner) : $(this.options.appendToSelector).prepend(banner);
-
-            if (this.options.icon) {
-                iconURL = this.options.icon
-            } else if(this.iconUrl) {
-                iconURL = this.iconUrl;
-            } else if ($('link[rel="apple-touch-icon-precomposed"]').length > 0) {
-                iconURL = $('link[rel="apple-touch-icon-precomposed"]').attr('href')
-                if (this.options.iconGloss === null) gloss = false
-            } else if ($('link[rel="apple-touch-icon"]').length > 0) {
-                iconURL = $('link[rel="apple-touch-icon"]').attr('href')
-            } else if ($('meta[name="msApplication-TileImage"]').length > 0) {
-              iconURL = $('meta[name="msApplication-TileImage"]').attr('content')
-            } else if ($('meta[name="msapplication-TileImage"]').length > 0) { /* redundant because ms docs show two case usages */
-              iconURL = $('meta[name="msapplication-TileImage"]').attr('content')
-            }
-
-            if (iconURL) {
-                $('#smartbanner .sb-icon').css('background-image','url('+iconURL+')')
-                if (gloss) $('#smartbanner .sb-icon').addClass('gloss')
-            } else{
-                $('#smartbanner').addClass('no-icon')
-            }
-
-            this.bannerHeight = $('#smartbanner').outerHeight() + 2
-
-            if (this.scale > 1) {
-                $('#smartbanner')
-                    .css('top', parseFloat($('#smartbanner').css('top')) * this.scale)
-                    .css('height', parseFloat($('#smartbanner').css('height')) * this.scale)
-                    .hide()
-                $('#smartbanner .sb-container')
-                    .css('-webkit-transform', 'scale('+this.scale+')')
-                    .css('-msie-transform', 'scale('+this.scale+')')
-                    .css('-moz-transform', 'scale('+this.scale+')')
-                    .css('width', $(window).width() / this.scale)
-            }
-            $('#smartbanner').css('position', (this.options.layer) ? 'absolute' : 'static')
-        }
-
-      , listen: function () {
-            $('#smartbanner .sb-close').on('click',$.proxy(this.close, this))
-            $('#smartbanner .sb-button').on('click',$.proxy(this.install, this))
-        }
-
-      , show: function(callback) {
-            var banner = $('#smartbanner');
-            banner.stop();
-
-            if (this.options.layer) {
-                banner.animate({top: 0, display: 'block'}, this.options.speedIn).addClass('shown').show();
-                $('html').animate({marginTop: this.origHtmlMargin + (this.bannerHeight * this.scale)}, this.options.speedIn, 'swing', callback);
-            } else {
-                if ($.support.transition) {
-                    banner.animate({top:0},this.options.speedIn).addClass('shown');
-                    var transitionCallback = function() {
-                        $('html').removeClass('sb-animation');
-                        if (callback) {
-                            callback();
-                        }
-                    };
-                    $('html').addClass('sb-animation').one($.support.transition.end, transitionCallback).emulateTransitionEnd(this.options.speedIn).css('margin-top', this.origHtmlMargin+(this.bannerHeight*this.scale));
-                } else {
-                    banner.slideDown(this.options.speedIn).addClass('shown');
-                }
-            }
-        }
-
-      , hide: function(callback) {
-            var banner = $('#smartbanner');
-            banner.stop();
-
-            if (this.options.layer) {
-                banner.animate({top: -1 * this.bannerHeight * this.scale, display: 'block'}, this.options.speedIn).removeClass('shown');
-                $('html').animate({marginTop: this.origHtmlMargin}, this.options.speedIn, 'swing', callback);
-            } else {
-                if ($.support.transition) {
-                    banner.css('top', -1*this.bannerHeight*this.scale).removeClass('shown');
-                    var transitionCallback = function() {
-                        $('html').removeClass('sb-animation');
-                        if (callback) {
-                            callback();
-                        }
-                    };
-                    $('html').addClass('sb-animation').one($.support.transition.end, transitionCallback).emulateTransitionEnd(this.options.speedOut).css('margin-top', this.origHtmlMargin);
-                } else {
-                    banner.slideUp(this.options.speedOut).removeClass('shown');
-                }
-            }
-        }
-
-      , close: function(e) {
-            e.preventDefault()
-            this.hide()
-            this.setCookie('sb-closed','true',this.options.daysHidden);
-        }
-
-      , install: function(e) {
-			if (this.options.hideOnInstall) {
-				this.hide()
-			}
-            this.setCookie('sb-installed','true',this.options.daysReminder)
-        }
-
-      , setCookie: function(name, value, exdays) {
-            var exdate = new Date()
-            exdate.setDate(exdate.getDate()+exdays)
-            value=encodeURI(value)+((exdays==null)?'':'; expires='+exdate.toUTCString())
-            document.cookie=name+'='+value+'; path=/;'
-        }
-
-      , getCookie: function(name) {
-            var i,x,y,ARRcookies = document.cookie.split(";")
-            for(i=0;i<ARRcookies.length;i++) {
-                x = ARRcookies[i].substr(0,ARRcookies[i].indexOf("="))
-                y = ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1)
-                x = x.replace(/^\s+|\s+$/g,"")
-                if (x==name) {
-                    return decodeURI(y)
-                }
-            }
-            return null
-        }
-
-      // Demo only
-      , switchType: function() {
-          var that = this
-
-          this.hide(function () {
-              that.type = that.type == 'android' ? 'ios' : 'android'
-              var meta = $(that.type == 'android' ? 'meta[name="google-play-app"]' : 'meta[name="apple-itunes-app"]').attr('content')
-              that.appId = /app-id=([^\s,]+)/.exec(meta)[1]
-
-              $('#smartbanner').detach()
-              that.create()
-              that.show()
-          })
-      }
-    }
-
-    $.smartbanner = function (option) {
-        var $window = $(window)
-        , data = $window.data('smartbanner')
-        , options = typeof option == 'object' && option
-        if (!data) $window.data('smartbanner', (data = new SmartBanner(options)))
-        if (typeof option == 'string') data[option]()
-    }
-
-    // override these globally if you like (they are all optional)
-    $.smartbanner.defaults = {
-        title: null, // What the title of the app should be in the banner (defaults to <title>)
-        author: null, // What the author of the app should be in the banner (defaults to <meta name="author"> or hostname)
-        price: 'FREE', // Price of the app
-        appStoreLanguage: 'us', // Language code for App Store
-        inAppStore: 'On the App Store', // Text of price for iOS
-        inGooglePlay: 'In Google Play', // Text of price for Android
-        inAmazonAppStore: 'In the Amazon Appstore',
-        inWindowsStore: 'In the Windows Store', //Text of price for Windows
-        GooglePlayParams: null, // Aditional parameters for the market
-        icon: null, // The URL of the icon (defaults to <meta name="apple-touch-icon">)
-        iconGloss: null, // Force gloss effect for iOS even for precomposed
-        button: 'VIEW', // Text for the install button
-        url: null, // The URL for the button. Keep null if you want the button to link to the app store.
-        scale: 'auto', // Scale based on viewport size (set to 1 to disable)
-        speedIn: 300, // Show animation speed of the banner
-        speedOut: 400, // Close animation speed of the banner
-        daysHidden: 15, // Duration to hide the banner after being closed (0 = always show banner)
-        daysReminder: 90, // Duration to hide the banner after "VIEW" is clicked *separate from when the close button is clicked* (0 = always show banner)
-        force: null, // Choose 'ios', 'android' or 'windows'. Don't do a browser check, just always show this banner
-        hideOnInstall: true, // Hide the banner after "VIEW" is clicked.
-        layer: false, // Display as overlay layer or slide down the page
-        iOSUniversalApp: true, // If the iOS App is a universal app for both iPad and iPhone, display Smart Banner to iPad users, too.
-        appendToSelector: 'body' //Append the banner to a specific selector
-    }
-
-    $.smartbanner.Constructor = SmartBanner;
-
-
-    // ============================================================
-    // Bootstrap transition
-    // Copyright 2011-2014 Twitter, Inc.
-    // Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
-
-    function transitionEnd() {
-        var el = document.createElement('smartbanner')
-
-        var transEndEventNames = {
-            WebkitTransition: 'webkitTransitionEnd',
-            MozTransition: 'transitionend',
-            OTransition: 'oTransitionEnd otransitionend',
-            transition: 'transitionend'
-        }
-
-        for (var name in transEndEventNames) {
-            if (el.style[name] !== undefined) {
-                return {end: transEndEventNames[name]}
-            }
-        }
-
-        return false // explicit for ie8 (  ._.)
-    }
-
-    if ($.support.transition !== undefined)
-        return  // Prevent conflict with Twitter Bootstrap
-
-    // http://blog.alexmaccaw.com/css-transitions
-    $.fn.emulateTransitionEnd = function(duration) {
-        var called = false, $el = this
-        $(this).one($.support.transition.end, function() {
-            called = true
-        })
-        var callback = function() {
-            if (!called) $($el).trigger($.support.transition.end)
-        }
-        setTimeout(callback, duration)
-        return this
-    }
-
-    $(function() {
-        $.support.transition = transitionEnd()
-    })
-    // ============================================================
-
-}(window.jQuery);
diff --git a/libs/jquery/stylesheets/jquery.smartbanner.css b/libs/jquery/stylesheets/jquery.smartbanner.css
deleted file mode 100644
index ae4dd31381..0000000000
--- a/libs/jquery/stylesheets/jquery.smartbanner.css
+++ /dev/null
@@ -1,28 +0,0 @@
-#smartbanner { position:absolute; left:0; top:-82px; border-bottom:1px solid #e8e8e8; width:100%; height:78px; font-family:'Helvetica Neue',sans-serif; background:-webkit-linear-gradient(top, #f4f4f4 0%,#cdcdcd 100%); background-image: -ms-linear-gradient(top, #F4F4F4 0%, #CDCDCD 100%); background-image: -moz-linear-gradient(top, #F4F4F4 0%, #CDCDCD 100%); box-shadow:0 1px 2px rgba(0,0,0,0.5); z-index:9998; -webkit-font-smoothing:antialiased; overflow:hidden; -webkit-text-size-adjust:none; }
-#smartbanner, html.sb-animation {-webkit-transition: all .3s ease;}
-#smartbanner .sb-container { margin: 0 auto; }
-#smartbanner .sb-close { position:absolute; left:5px; top:5px; display:block; border:2px solid #fff; width:14px; height:14px; font-family:'ArialRoundedMTBold',Arial; font-size:15px; line-height:15px; text-align:center; color:#fff; background:#070707; text-decoration:none; text-shadow:none; border-radius:14px; box-shadow:0 2px 3px rgba(0,0,0,0.4); -webkit-font-smoothing:subpixel-antialiased; }
-#smartbanner .sb-close:active { font-size:13px; color:#aaa; }
-#smartbanner .sb-icon { position:absolute; left:30px; top:10px; display:block; width:57px; height:57px; background:rgba(0,0,0,0.6); background-size:cover; border-radius:10px; box-shadow:0 1px 3px rgba(0,0,0,0.3); }
-#smartbanner.no-icon .sb-icon { display:none; }
-#smartbanner .sb-info { position:absolute; left:98px; top:18px; width:44%; font-size:11px; line-height:1.2em; font-weight:bold; color:#6a6a6a; text-shadow:0 1px 0 rgba(255,255,255,0.8); }
-#smartbanner #smartbanner.no-icon .sb-info { left:34px; }
-#smartbanner .sb-info strong { display:block; font-size:13px; color:#4d4d4d; line-height: 18px; }
-#smartbanner .sb-info > span { display:block; }
-#smartbanner .sb-info em { font-style:normal; text-transform:uppercase; }
-#smartbanner .sb-button { position:absolute; right:20px; top:24px; border:1px solid #bfbfbf; padding: 0 10px; min-width: 10%; height:24px; font-size:14px; line-height:24px; text-align:center; font-weight:bold; color:#6a6a6a; background:-webkit-linear-gradient(top, #efefef 0%,#dcdcdc 100%); text-transform:uppercase; text-decoration:none; text-shadow:0 1px 0 rgba(255,255,255,0.8); border-radius:3px; box-shadow:0 1px 0 rgba(255,255,255,0.6),0 1px 0 rgba(255,255,255,0.7) inset; }
-#smartbanner .sb-button:active, #smartbanner .sb-button:hover { background:-webkit-linear-gradient(top, #dcdcdc 0%,#efefef 100%); }
-
-#smartbanner .sb-icon.gloss:after { content:''; position:absolute; left:0; top:-1px; border-top:1px solid rgba(255,255,255,0.8); width:100%; height:50%; background:-webkit-linear-gradient(top, rgba(255,255,255,0.7) 0%,rgba(255,255,255,0.2) 100%); border-radius:10px 10px 12px 12px; }
-
-#smartbanner.android { border-color:#212228; background: #3d3d3d url('dark_background_stripes.gif'); border-top: 5px solid #88B131; box-shadow: none; }
-#smartbanner.android .sb-close { border:0; width:17px; height:17px; line-height:17px; color:#b1b1b3; background:#1c1e21; text-shadow:0 1px 1px #000; box-shadow:0 1px 2px rgba(0,0,0,0.8) inset,0 1px 1px rgba(255,255,255,0.3); }
-#smartbanner.android .sb-close:active { color:#eee; }
-#smartbanner.android .sb-info { color:#ccc; text-shadow:0 1px 2px #000; }
-#smartbanner.android .sb-info strong { color:#fff; }
-#smartbanner.android .sb-button { min-width: 12%; border:1px solid #DDDCDC; padding:1px; color:#d1d1d1; background: none; border-radius: 0; box-shadow: none; }
-#smartbanner.android .sb-button span { text-align: center; display: block; padding: 0 10px; background-color: #42B6C9; background-image: -webkit-gradient(linear,0 0,0 100%,from(#42B6C9),to(#39A9BB)); background-image: -moz-linear-gradient(top,#42B6C9,#39A9BB); text-transform:none; text-shadow:none; box-shadow:none; }
-#smartbanner.android .sb-button:active, #smartbanner.android .sb-button:hover { background: none; }
-#smartbanner.android .sb-button:active span, #smartbanner.android .sb-button:hover span { background:#2AC7E1; }
-
-#smartbanner.windows .sb-icon { border-radius: 0px; }
diff --git a/plugins/CoreHome/images/googleplay.png b/plugins/CoreHome/images/googleplay.png
deleted file mode 100644
index fd150a6ba5cacb17c5cb9d264a54ae51477dd24b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 16550
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

diff --git a/plugins/CoreHome/javascripts/manifest.json b/plugins/CoreHome/javascripts/manifest.json
index 829fa0f62f..b161b3dadc 100644
--- a/plugins/CoreHome/javascripts/manifest.json
+++ b/plugins/CoreHome/javascripts/manifest.json
@@ -35,5 +35,12 @@
   ],
   "start_url": "../../../",
   "display": "standalone",
-  "orientation": "portrait"
-}
\ No newline at end of file
+  "orientation": "portrait",
+  "prefer_related_applications": true,
+  "related_applications": [
+    {
+      "platform": "play",
+      "id": "org.piwik.mobile2"
+    }
+  ]
+}
diff --git a/plugins/Login/templates/login.twig b/plugins/Login/templates/login.twig
index 6a124465a1..b8c2ae7693 100644
--- a/plugins/Login/templates/login.twig
+++ b/plugins/Login/templates/login.twig
@@ -8,16 +8,6 @@
     {{ parent() }}
 
     <script type="text/javascript" src="libs/bower_components/jquery-placeholder/jquery.placeholder.js"></script>
-    <script type="text/javascript" src="libs/jquery/jquery.smartbanner.js"></script>
-    <link rel="stylesheet" type="text/css" href="libs/jquery/stylesheets/jquery.smartbanner.css" />
-
-    <script type="text/javascript">
-        $(function () {
-            $('#form_login').focus();
-            $('input').placeholder();
-            $.smartbanner({title: "Piwik Mobile 2", author: "Piwik team", hideOnInstall: false, layer: true, icon: "plugins/CoreHome/images/googleplay.png"});
-        });
-    </script>
 {% endblock %}
 
 {% set title %}{{ 'Login_LogIn'|translate }}{% endset %}
diff --git a/plugins/Morpheus/templates/layout.twig b/plugins/Morpheus/templates/layout.twig
index 524d04389c..0cfaeb3efa 100644
--- a/plugins/Morpheus/templates/layout.twig
+++ b/plugins/Morpheus/templates/layout.twig
@@ -15,7 +15,6 @@
             <meta name="generator" content="Piwik - free/libre analytics platform"/>
             <meta name="description" content="{% block pageDescription %}{% endblock %}"/>
             <meta name="apple-itunes-app" content="app-id=737216887" />
-            <meta name="google-play-app" content="app-id=org.piwik.mobile2">
             {% block meta %}
                 <meta name="robots" content="noindex,nofollow">
             {% endblock %}
-- 
GitLab