From 30bec38c4f36254f26097f810aaf139e9a42a61d Mon Sep 17 00:00:00 2001
From: sgiehl <stefan@piwik.org>
Date: Sat, 20 Dec 2014 22:10:01 +0100
Subject: [PATCH] moved browser plugin reports to an own plugin 'DevicePlugins'

---
 config/global.ini.php                         |   1 +
 core/Updates/2.10.0-b10.php                   |  49 ++++++++++
 core/Version.php                              |   2 +-
 plugins/DevicePlugins/API.php                 |  90 ++++++++++++++++++
 plugins/DevicePlugins/Archiver.php            |  75 +++++++++++++++
 .../Columns/Plugin.php                        |   2 +-
 .../Columns/PluginCookie.php                  |   2 +-
 .../Columns/PluginDirector.php                |   2 +-
 .../Columns/PluginFlash.php                   |   2 +-
 .../Columns/PluginGears.php                   |   2 +-
 .../Columns/PluginJava.php                    |   2 +-
 .../Columns/PluginPdf.php                     |   2 +-
 .../Columns/PluginQuickTime.php               |   2 +-
 .../Columns/PluginRealPlayer.php              |   2 +-
 .../Columns/PluginSilverlight.php             |   2 +-
 .../Columns/PluginWindowsMedia.php            |   2 +-
 plugins/DevicePlugins/DevicePlugins.php       |  48 ++++++++++
 plugins/DevicePlugins/Reports/Base.php        |  32 +++++++
 .../Reports/GetPlugin.php                     |  14 +--
 .../Visitor.php                               |   4 +-
 plugins/DevicePlugins/functions.php           |  20 ++++
 .../images/plugins/cookie.gif                 | Bin
 .../images/plugins/director.gif               | Bin
 .../images/plugins/flash.gif                  | Bin
 .../images/plugins/gears.gif                  | Bin
 .../images/plugins/java.gif                   | Bin
 .../images/plugins/pdf.gif                    | Bin
 .../images/plugins/quicktime.gif              | Bin
 .../images/plugins/realplayer.gif             | Bin
 .../images/plugins/silverlight.gif            | Bin
 .../images/plugins/windowsmedia.gif           | Bin
 plugins/DevicePlugins/lang/en.json            |  10 ++
 .../templates/_dataTableViz_visitorLog.twig   |   4 +-
 .../Live/templates/getSingleVisitSummary.twig |   2 +-
 plugins/UserSettings/API.php                  |  50 +---------
 plugins/UserSettings/Archiver.php             |  25 -----
 plugins/UserSettings/Controller.php           |   2 +-
 plugins/UserSettings/UserSettings.php         |  11 +--
 plugins/UserSettings/functions.php            |   8 --
 plugins/UserSettings/lang/en.json             |   7 +-
 tests/PHPUnit/Unit/DeprecatedMethodsTest.php  |   1 +
 41 files changed, 359 insertions(+), 118 deletions(-)
 create mode 100644 core/Updates/2.10.0-b10.php
 create mode 100644 plugins/DevicePlugins/API.php
 create mode 100644 plugins/DevicePlugins/Archiver.php
 rename plugins/{UserSettings => DevicePlugins}/Columns/Plugin.php (87%)
 rename plugins/{UserSettings => DevicePlugins}/Columns/PluginCookie.php (94%)
 rename plugins/{UserSettings => DevicePlugins}/Columns/PluginDirector.php (94%)
 rename plugins/{UserSettings => DevicePlugins}/Columns/PluginFlash.php (94%)
 rename plugins/{UserSettings => DevicePlugins}/Columns/PluginGears.php (94%)
 rename plugins/{UserSettings => DevicePlugins}/Columns/PluginJava.php (94%)
 rename plugins/{UserSettings => DevicePlugins}/Columns/PluginPdf.php (93%)
 rename plugins/{UserSettings => DevicePlugins}/Columns/PluginQuickTime.php (94%)
 rename plugins/{UserSettings => DevicePlugins}/Columns/PluginRealPlayer.php (94%)
 rename plugins/{UserSettings => DevicePlugins}/Columns/PluginSilverlight.php (94%)
 rename plugins/{UserSettings => DevicePlugins}/Columns/PluginWindowsMedia.php (94%)
 create mode 100644 plugins/DevicePlugins/DevicePlugins.php
 create mode 100644 plugins/DevicePlugins/Reports/Base.php
 rename plugins/{UserSettings => DevicePlugins}/Reports/GetPlugin.php (73%)
 rename plugins/{UserSettings => DevicePlugins}/Visitor.php (93%)
 create mode 100644 plugins/DevicePlugins/functions.php
 rename plugins/{UserSettings => DevicePlugins}/images/plugins/cookie.gif (100%)
 rename plugins/{UserSettings => DevicePlugins}/images/plugins/director.gif (100%)
 rename plugins/{UserSettings => DevicePlugins}/images/plugins/flash.gif (100%)
 rename plugins/{UserSettings => DevicePlugins}/images/plugins/gears.gif (100%)
 rename plugins/{UserSettings => DevicePlugins}/images/plugins/java.gif (100%)
 rename plugins/{UserSettings => DevicePlugins}/images/plugins/pdf.gif (100%)
 rename plugins/{UserSettings => DevicePlugins}/images/plugins/quicktime.gif (100%)
 rename plugins/{UserSettings => DevicePlugins}/images/plugins/realplayer.gif (100%)
 rename plugins/{UserSettings => DevicePlugins}/images/plugins/silverlight.gif (100%)
 rename plugins/{UserSettings => DevicePlugins}/images/plugins/windowsmedia.gif (100%)
 create mode 100644 plugins/DevicePlugins/lang/en.json

diff --git a/config/global.ini.php b/config/global.ini.php
index 5f6626ee63..c140cf21c9 100644
--- a/config/global.ini.php
+++ b/config/global.ini.php
@@ -754,6 +754,7 @@ Plugins[] = Contents
 Plugins[] = TestRunner
 Plugins[] = BulkTracking
 Plugins[] = Resolution
+Plugins[] = DevicePlugins
 
 [PluginsInstalled]
 PluginsInstalled[] = Login
diff --git a/core/Updates/2.10.0-b10.php b/core/Updates/2.10.0-b10.php
new file mode 100644
index 0000000000..3628719ccd
--- /dev/null
+++ b/core/Updates/2.10.0-b10.php
@@ -0,0 +1,49 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+
+namespace Piwik\Updates;
+
+use Piwik\DataAccess\ArchiveTableCreator;
+use Piwik\Updater;
+use Piwik\Updates;
+
+class Updates_2_10_0_b10 extends Updates
+{
+
+    static function getSql()
+    {
+        $sqls = array();
+
+        $archiveTables = ArchiveTableCreator::getTablesArchivesInstalled();
+
+        $archiveBlobTables = array_filter($archiveTables, function($name) {
+            return ArchiveTableCreator::getTypeFromTableName($name) == ArchiveTableCreator::BLOB_TABLE;
+        });
+
+        foreach ($archiveBlobTables as $table) {
+
+            $sqls["UPDATE " . $table . " SET name = 'DevicePlugins_plugin' WHERE name = 'UserSettings_plugin'"] = false;
+        }
+
+        return $sqls;
+    }
+
+    static function update()
+    {
+        $pluginManager = \Piwik\Plugin\Manager::getInstance();
+
+        try {
+            $pluginManager->activatePlugin('DevicePlugins');
+        } catch(\Exception $e) {
+        }
+
+        Updater::updateDatabase(__FILE__, self::getSql());
+    }
+
+}
diff --git a/core/Version.php b/core/Version.php
index 5edf0e5dba..334d7bf818 100644
--- a/core/Version.php
+++ b/core/Version.php
@@ -20,5 +20,5 @@ final class Version
      * The current Piwik version.
      * @var string
      */
-    const VERSION = '2.10.0-b9';
+    const VERSION = '2.10.0-b10';
 }
diff --git a/plugins/DevicePlugins/API.php b/plugins/DevicePlugins/API.php
new file mode 100644
index 0000000000..c49839e8ae
--- /dev/null
+++ b/plugins/DevicePlugins/API.php
@@ -0,0 +1,90 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\DevicePlugins;
+
+use Piwik\Archive;
+use Piwik\DataTable;
+use Piwik\Metrics;
+use Piwik\Piwik;
+use Piwik\Plugins\DevicesDetection\Archiver AS DDArchiver;
+use Piwik\Plugins\CoreHome\Columns\Metrics\VisitsPercent;
+
+/**
+ * @see plugins/DevicePlugins/functions.php
+ */
+require_once PIWIK_INCLUDE_PATH . '/plugins/DevicePlugins/functions.php';
+
+/**
+ * The DevicePlugins API lets you access reports about device plugins such as browser plugins.
+ *
+ * @method static \Piwik\Plugins\DevicePlugins\API getInstance()
+ */
+class API extends \Piwik\Plugin\API
+{
+    protected function getDataTable($name, $idSite, $period, $date, $segment)
+    {
+        Piwik::checkUserHasViewAccess($idSite);
+        $archive = Archive::build($idSite, $period, $date, $segment);
+        $dataTable = $archive->getDataTable($name);
+        $dataTable->filter('Sort', array(Metrics::INDEX_NB_VISITS));
+        $dataTable->queueFilter('ReplaceColumnNames');
+        $dataTable->queueFilter('ReplaceSummaryRowLabel');
+        return $dataTable;
+    }
+
+    public function getPlugin($idSite, $period, $date, $segment = false)
+    {
+        // fetch all archive data required
+        $dataTable = $this->getDataTable(Archiver::PLUGIN_RECORD_NAME, $idSite, $period, $date, $segment);
+        $browserTypes = $this->getDataTable(DDArchiver::BROWSER_ENGINE_RECORD_NAME, $idSite, $period, $date, $segment);
+        $archive = Archive::build($idSite, $period, $date, $segment);
+        $visitsSums = $archive->getDataTableFromNumeric('nb_visits');
+
+        // check whether given tables are arrays
+        if ($dataTable instanceof DataTable\Map) {
+            $dataTableMap = $dataTable->getDataTables();
+            $browserTypesArray = $browserTypes->getDataTables();
+            $visitSumsArray = $visitsSums->getDataTables();
+        } else {
+            $dataTableMap = array($dataTable);
+            $browserTypesArray = array($browserTypes);
+            $visitSumsArray = array($visitsSums);
+        }
+
+        // walk through the results and calculate the percentage
+        foreach ($dataTableMap as $key => $table) {
+            // Calculate percentage, but ignore IE users because plugin detection doesn't work on IE
+            $ieVisits = 0;
+
+            $ieStats = $browserTypesArray[$key]->getRowFromLabel('Trident');
+            if ($ieStats !== false) {
+                $ieVisits = $ieStats->getColumn(Metrics::INDEX_NB_VISITS);
+            }
+
+            // get according visitsSum
+            $visits = $visitSumsArray[$key];
+            if ($visits->getRowsCount() == 0) {
+                $visitsSumTotal = 0;
+            } else {
+                $visitsSumTotal = (float) $visits->getFirstRow()->getColumn('nb_visits');
+            }
+
+            $visitsSum = $visitsSumTotal - $ieVisits;
+
+            $extraProcessedMetrics = $table->getMetadata(DataTable::EXTRA_PROCESSED_METRICS_METADATA_NAME);
+            $extraProcessedMetrics[] = new VisitsPercent($visitsSum);
+            $table->setMetadata(DataTable::EXTRA_PROCESSED_METRICS_METADATA_NAME, $extraProcessedMetrics);
+        }
+
+        $dataTable->queueFilter('ColumnCallbackAddMetadata', array('label', 'logo', __NAMESPACE__ . '\getPluginsLogo'));
+        $dataTable->queueFilter('ColumnCallbackReplace', array('label', 'ucfirst'));
+
+        return $dataTable;
+    }
+}
diff --git a/plugins/DevicePlugins/Archiver.php b/plugins/DevicePlugins/Archiver.php
new file mode 100644
index 0000000000..1b4b92213e
--- /dev/null
+++ b/plugins/DevicePlugins/Archiver.php
@@ -0,0 +1,75 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+
+namespace Piwik\Plugins\DevicePlugins;
+
+use Piwik\DataAccess\LogAggregator;
+use Piwik\DataTable;
+use Piwik\Metrics;
+
+require_once PIWIK_INCLUDE_PATH . '/plugins/DevicePlugins/functions.php';
+
+/**
+ * Archiver for DevicePlugins Plugin
+ *
+ * @see PluginsArchiver
+ */
+class Archiver extends \Piwik\Plugin\Archiver
+{
+    const PLUGIN_RECORD_NAME = 'DevicePlugins_plugin';
+
+    /**
+     * Daily archive of DevicePlugins report. Processes reports for Visits by plugins.
+     */
+    public function aggregateDayReport()
+    {
+        $this->aggregateByPlugin();
+    }
+
+    /**
+     * Period archiving: simply sums up daily archives
+     */
+    public function aggregateMultipleReports()
+    {
+        $dataTableRecords = array(
+            self::PLUGIN_RECORD_NAME,
+        );
+        $this->getProcessor()->aggregateDataTableRecords($dataTableRecords, $this->maximumRows);
+    }
+
+    protected function aggregateByPlugin()
+    {
+        $selects = array(
+            "sum(case log_visit.config_pdf when 1 then 1 else 0 end) as pdf",
+            "sum(case log_visit.config_flash when 1 then 1 else 0 end) as flash",
+            "sum(case log_visit.config_java when 1 then 1 else 0 end) as java",
+            "sum(case log_visit.config_director when 1 then 1 else 0 end) as director",
+            "sum(case log_visit.config_quicktime when 1 then 1 else 0 end) as quicktime",
+            "sum(case log_visit.config_realplayer when 1 then 1 else 0 end) as realplayer",
+            "sum(case log_visit.config_windowsmedia when 1 then 1 else 0 end) as windowsmedia",
+            "sum(case log_visit.config_gears when 1 then 1 else 0 end) as gears",
+            "sum(case log_visit.config_silverlight when 1 then 1 else 0 end) as silverlight",
+            "sum(case log_visit.config_cookie when 1 then 1 else 0 end) as cookie"
+        );
+
+        $query = $this->getLogAggregator()->queryVisitsByDimension(array(), false, $selects, $metrics = array());
+        $data = $query->fetch();
+        $cleanRow = LogAggregator::makeArrayOneColumn($data, Metrics::INDEX_NB_VISITS);
+        $table = DataTable::makeFromIndexedArray($cleanRow);
+        $this->insertTable(self::PLUGIN_RECORD_NAME, $table);
+    }
+
+    protected function insertTable($recordName, DataTable $table)
+    {
+        $report = $table->getSerialized($this->maximumRows, null, Metrics::INDEX_NB_VISITS);
+        return $this->getProcessor()->insertBlobRecord($recordName, $report);
+    }
+
+}
+
diff --git a/plugins/UserSettings/Columns/Plugin.php b/plugins/DevicePlugins/Columns/Plugin.php
similarity index 87%
rename from plugins/UserSettings/Columns/Plugin.php
rename to plugins/DevicePlugins/Columns/Plugin.php
index a6ecef0c29..0066c5ce19 100644
--- a/plugins/UserSettings/Columns/Plugin.php
+++ b/plugins/DevicePlugins/Columns/Plugin.php
@@ -6,7 +6,7 @@
  * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
  *
  */
-namespace Piwik\Plugins\UserSettings\Columns;
+namespace Piwik\Plugins\DevicePlugins\Columns;
 
 use Piwik\Columns\Dimension;
 use Piwik\Piwik;
diff --git a/plugins/UserSettings/Columns/PluginCookie.php b/plugins/DevicePlugins/Columns/PluginCookie.php
similarity index 94%
rename from plugins/UserSettings/Columns/PluginCookie.php
rename to plugins/DevicePlugins/Columns/PluginCookie.php
index 8af841ca52..935bd24333 100644
--- a/plugins/UserSettings/Columns/PluginCookie.php
+++ b/plugins/DevicePlugins/Columns/PluginCookie.php
@@ -6,7 +6,7 @@
  * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
  *
  */
-namespace Piwik\Plugins\UserSettings\Columns;
+namespace Piwik\Plugins\DevicePlugins\Columns;
 
 use Piwik\Common;
 use Piwik\Plugin\Dimension\VisitDimension;
diff --git a/plugins/UserSettings/Columns/PluginDirector.php b/plugins/DevicePlugins/Columns/PluginDirector.php
similarity index 94%
rename from plugins/UserSettings/Columns/PluginDirector.php
rename to plugins/DevicePlugins/Columns/PluginDirector.php
index 58019826ce..4e5b82d2fd 100644
--- a/plugins/UserSettings/Columns/PluginDirector.php
+++ b/plugins/DevicePlugins/Columns/PluginDirector.php
@@ -6,7 +6,7 @@
  * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
  *
  */
-namespace Piwik\Plugins\UserSettings\Columns;
+namespace Piwik\Plugins\DevicePlugins\Columns;
 
 use Piwik\Common;
 use Piwik\Plugin\Dimension\VisitDimension;
diff --git a/plugins/UserSettings/Columns/PluginFlash.php b/plugins/DevicePlugins/Columns/PluginFlash.php
similarity index 94%
rename from plugins/UserSettings/Columns/PluginFlash.php
rename to plugins/DevicePlugins/Columns/PluginFlash.php
index d691d200a4..70d9bbfe83 100644
--- a/plugins/UserSettings/Columns/PluginFlash.php
+++ b/plugins/DevicePlugins/Columns/PluginFlash.php
@@ -6,7 +6,7 @@
  * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
  *
  */
-namespace Piwik\Plugins\UserSettings\Columns;
+namespace Piwik\Plugins\DevicePlugins\Columns;
 
 use Piwik\Common;
 use Piwik\Plugin\Dimension\VisitDimension;
diff --git a/plugins/UserSettings/Columns/PluginGears.php b/plugins/DevicePlugins/Columns/PluginGears.php
similarity index 94%
rename from plugins/UserSettings/Columns/PluginGears.php
rename to plugins/DevicePlugins/Columns/PluginGears.php
index edf024877e..8d0584a937 100644
--- a/plugins/UserSettings/Columns/PluginGears.php
+++ b/plugins/DevicePlugins/Columns/PluginGears.php
@@ -6,7 +6,7 @@
  * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
  *
  */
-namespace Piwik\Plugins\UserSettings\Columns;
+namespace Piwik\Plugins\DevicePlugins\Columns;
 
 use Piwik\Common;
 use Piwik\Plugin\Dimension\VisitDimension;
diff --git a/plugins/UserSettings/Columns/PluginJava.php b/plugins/DevicePlugins/Columns/PluginJava.php
similarity index 94%
rename from plugins/UserSettings/Columns/PluginJava.php
rename to plugins/DevicePlugins/Columns/PluginJava.php
index 0db9b81778..9b316fda83 100644
--- a/plugins/UserSettings/Columns/PluginJava.php
+++ b/plugins/DevicePlugins/Columns/PluginJava.php
@@ -6,7 +6,7 @@
  * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
  *
  */
-namespace Piwik\Plugins\UserSettings\Columns;
+namespace Piwik\Plugins\DevicePlugins\Columns;
 
 use Piwik\Common;
 use Piwik\Plugin\Dimension\VisitDimension;
diff --git a/plugins/UserSettings/Columns/PluginPdf.php b/plugins/DevicePlugins/Columns/PluginPdf.php
similarity index 93%
rename from plugins/UserSettings/Columns/PluginPdf.php
rename to plugins/DevicePlugins/Columns/PluginPdf.php
index c50f92c53e..4f637e6d79 100644
--- a/plugins/UserSettings/Columns/PluginPdf.php
+++ b/plugins/DevicePlugins/Columns/PluginPdf.php
@@ -6,7 +6,7 @@
  * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
  *
  */
-namespace Piwik\Plugins\UserSettings\Columns;
+namespace Piwik\Plugins\DevicePlugins\Columns;
 
 use Piwik\Common;
 use Piwik\Plugin\Dimension\VisitDimension;
diff --git a/plugins/UserSettings/Columns/PluginQuickTime.php b/plugins/DevicePlugins/Columns/PluginQuickTime.php
similarity index 94%
rename from plugins/UserSettings/Columns/PluginQuickTime.php
rename to plugins/DevicePlugins/Columns/PluginQuickTime.php
index ea2f85ad0b..9f74f0191d 100644
--- a/plugins/UserSettings/Columns/PluginQuickTime.php
+++ b/plugins/DevicePlugins/Columns/PluginQuickTime.php
@@ -6,7 +6,7 @@
  * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
  *
  */
-namespace Piwik\Plugins\UserSettings\Columns;
+namespace Piwik\Plugins\DevicePlugins\Columns;
 
 use Piwik\Common;
 use Piwik\Plugin\Dimension\VisitDimension;
diff --git a/plugins/UserSettings/Columns/PluginRealPlayer.php b/plugins/DevicePlugins/Columns/PluginRealPlayer.php
similarity index 94%
rename from plugins/UserSettings/Columns/PluginRealPlayer.php
rename to plugins/DevicePlugins/Columns/PluginRealPlayer.php
index b8e17c605c..902bac086b 100644
--- a/plugins/UserSettings/Columns/PluginRealPlayer.php
+++ b/plugins/DevicePlugins/Columns/PluginRealPlayer.php
@@ -6,7 +6,7 @@
  * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
  *
  */
-namespace Piwik\Plugins\UserSettings\Columns;
+namespace Piwik\Plugins\DevicePlugins\Columns;
 
 use Piwik\Common;
 use Piwik\Plugin\Dimension\VisitDimension;
diff --git a/plugins/UserSettings/Columns/PluginSilverlight.php b/plugins/DevicePlugins/Columns/PluginSilverlight.php
similarity index 94%
rename from plugins/UserSettings/Columns/PluginSilverlight.php
rename to plugins/DevicePlugins/Columns/PluginSilverlight.php
index f917c3d296..a9381a35ee 100644
--- a/plugins/UserSettings/Columns/PluginSilverlight.php
+++ b/plugins/DevicePlugins/Columns/PluginSilverlight.php
@@ -6,7 +6,7 @@
  * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
  *
  */
-namespace Piwik\Plugins\UserSettings\Columns;
+namespace Piwik\Plugins\DevicePlugins\Columns;
 
 use Piwik\Common;
 use Piwik\Plugin\Dimension\VisitDimension;
diff --git a/plugins/UserSettings/Columns/PluginWindowsMedia.php b/plugins/DevicePlugins/Columns/PluginWindowsMedia.php
similarity index 94%
rename from plugins/UserSettings/Columns/PluginWindowsMedia.php
rename to plugins/DevicePlugins/Columns/PluginWindowsMedia.php
index 02e7088ce0..3ae32f8ab3 100644
--- a/plugins/UserSettings/Columns/PluginWindowsMedia.php
+++ b/plugins/DevicePlugins/Columns/PluginWindowsMedia.php
@@ -6,7 +6,7 @@
  * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
  *
  */
-namespace Piwik\Plugins\UserSettings\Columns;
+namespace Piwik\Plugins\DevicePlugins\Columns;
 
 use Piwik\Common;
 use Piwik\Plugin\Dimension\VisitDimension;
diff --git a/plugins/DevicePlugins/DevicePlugins.php b/plugins/DevicePlugins/DevicePlugins.php
new file mode 100644
index 0000000000..afe8abf950
--- /dev/null
+++ b/plugins/DevicePlugins/DevicePlugins.php
@@ -0,0 +1,48 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\DevicePlugins;
+
+use Piwik\Piwik;
+use Piwik\Plugins\CoreVisualizations\Visualizations\Graph;
+use Piwik\Plugins\CoreVisualizations\Visualizations\HtmlTable;
+
+/**
+ *
+ */
+class DevicePlugins extends \Piwik\Plugin
+{
+    /**
+     * @see Piwik\Plugin::getListHooksRegistered
+     */
+    public function getListHooksRegistered()
+    {
+        return array(
+            'Metrics.getDefaultMetricTranslations' => 'addMetricTranslations',
+            'Live.getAllVisitorDetails'            => 'extendVisitorDetails',
+        );
+    }
+
+    public function extendVisitorDetails(&$visitor, $details)
+    {
+        $instance = new Visitor($details);
+
+        $visitor['plugins']                  = $instance->getPlugins();
+        $visitor['pluginsIcons']             = $instance->getPluginIcons();
+    }
+
+    public function addMetricTranslations(&$translations)
+    {
+        $metrics = array(
+            'nb_visits_percentage' => Piwik::translate('General_ColumnPercentageVisits')
+        );
+
+        $translations = array_merge($translations, $metrics);
+    }
+
+}
diff --git a/plugins/DevicePlugins/Reports/Base.php b/plugins/DevicePlugins/Reports/Base.php
new file mode 100644
index 0000000000..cb075958be
--- /dev/null
+++ b/plugins/DevicePlugins/Reports/Base.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\DevicePlugins\Reports;
+
+use Piwik\Plugin\ViewDataTable;
+use Piwik\Plugins\CoreVisualizations\Visualizations\Graph;
+
+abstract class Base extends \Piwik\Plugin\Report
+{
+    protected function init()
+    {
+        $this->category = 'UserSettings_VisitorSettings';
+    }
+
+    protected function getBasicDevicePluginsDisplayProperties(ViewDataTable $view)
+    {
+        $view->config->show_search = false;
+        $view->config->show_exclude_low_population = false;
+
+        $view->requestConfig->filter_limit = 5;
+
+        if ($view->isViewDataTableId(Graph::ID)) {
+            $view->config->max_graph_elements = 5;
+        }
+    }
+}
diff --git a/plugins/UserSettings/Reports/GetPlugin.php b/plugins/DevicePlugins/Reports/GetPlugin.php
similarity index 73%
rename from plugins/UserSettings/Reports/GetPlugin.php
rename to plugins/DevicePlugins/Reports/GetPlugin.php
index e9512c4256..151bf3e1a6 100644
--- a/plugins/UserSettings/Reports/GetPlugin.php
+++ b/plugins/DevicePlugins/Reports/GetPlugin.php
@@ -6,11 +6,11 @@
  * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
  *
  */
-namespace Piwik\Plugins\UserSettings\Reports;
+namespace Piwik\Plugins\DevicePlugins\Reports;
 
 use Piwik\Piwik;
 use Piwik\Plugin\ViewDataTable;
-use Piwik\Plugins\UserSettings\Columns\Plugin;
+use Piwik\Plugins\DevicePlugins\Columns\Plugin;
 
 class GetPlugin extends Base
 {
@@ -18,18 +18,18 @@ class GetPlugin extends Base
     {
         parent::init();
         $this->dimension     = new Plugin();
-        $this->name          = Piwik::translate('UserSettings_WidgetPlugins');
-        $this->documentation = Piwik::translate('UserSettings_WidgetPluginsDocumentation', '<br />');
+        $this->name          = Piwik::translate('DevicePlugins_WidgetPlugins');
+        $this->documentation = Piwik::translate('DevicePlugins_WidgetPluginsDocumentation', '<br />');
         $this->metrics       = array('nb_visits');
         $this->constantRowsCount = true;
         $this->processedMetrics = array('nb_visits_percentage');
         $this->order = 4;
-        $this->widgetTitle  = 'UserSettings_WidgetPlugins';
+        $this->widgetTitle  = 'DevicePlugins_WidgetPlugins';
     }
 
     public function configureView(ViewDataTable $view)
     {
-        $this->getBasicUserSettingsDisplayProperties($view);
+        $this->getBasicDevicePluginsDisplayProperties($view);
 
         $view->config->addTranslations(array(
             'label'                => $this->dimension->getName(),
@@ -43,7 +43,7 @@ class GetPlugin extends Base
         $view->config->show_all_views_icons    = false;
         $view->config->show_table_all_columns  = false;
         $view->config->columns_to_display  = array('label', 'nb_visits_percentage', 'nb_visits');
-        $view->config->show_footer_message = Piwik::translate('UserSettings_PluginDetectionDoesNotWorkInIE');
+        $view->config->show_footer_message = Piwik::translate('DevicePlugins_PluginDetectionDoesNotWorkInIE');
 
         $view->requestConfig->filter_sort_column = 'nb_visits_percentage';
         $view->requestConfig->filter_sort_order  = 'desc';
diff --git a/plugins/UserSettings/Visitor.php b/plugins/DevicePlugins/Visitor.php
similarity index 93%
rename from plugins/UserSettings/Visitor.php
rename to plugins/DevicePlugins/Visitor.php
index e399cba3ac..501e241a50 100644
--- a/plugins/UserSettings/Visitor.php
+++ b/plugins/DevicePlugins/Visitor.php
@@ -6,9 +6,9 @@
  * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
  *
  */
-namespace Piwik\Plugins\UserSettings;
+namespace Piwik\Plugins\DevicePlugins;
 
-require_once PIWIK_INCLUDE_PATH . '/plugins/UserSettings/functions.php';
+require_once PIWIK_INCLUDE_PATH . '/plugins/DevicePlugins/functions.php';
 
 class Visitor
 {
diff --git a/plugins/DevicePlugins/functions.php b/plugins/DevicePlugins/functions.php
new file mode 100644
index 0000000000..4cf77ab120
--- /dev/null
+++ b/plugins/DevicePlugins/functions.php
@@ -0,0 +1,20 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+
+namespace Piwik\Plugins\DevicePlugins;
+
+use Piwik\Piwik;
+
+function getPluginsLogo($label)
+{
+    if ($label == Piwik::translate('General_Others')) {
+        return false;
+    }
+    return 'plugins/DevicePlugins/images/plugins/' . $label . '.gif';
+}
diff --git a/plugins/UserSettings/images/plugins/cookie.gif b/plugins/DevicePlugins/images/plugins/cookie.gif
similarity index 100%
rename from plugins/UserSettings/images/plugins/cookie.gif
rename to plugins/DevicePlugins/images/plugins/cookie.gif
diff --git a/plugins/UserSettings/images/plugins/director.gif b/plugins/DevicePlugins/images/plugins/director.gif
similarity index 100%
rename from plugins/UserSettings/images/plugins/director.gif
rename to plugins/DevicePlugins/images/plugins/director.gif
diff --git a/plugins/UserSettings/images/plugins/flash.gif b/plugins/DevicePlugins/images/plugins/flash.gif
similarity index 100%
rename from plugins/UserSettings/images/plugins/flash.gif
rename to plugins/DevicePlugins/images/plugins/flash.gif
diff --git a/plugins/UserSettings/images/plugins/gears.gif b/plugins/DevicePlugins/images/plugins/gears.gif
similarity index 100%
rename from plugins/UserSettings/images/plugins/gears.gif
rename to plugins/DevicePlugins/images/plugins/gears.gif
diff --git a/plugins/UserSettings/images/plugins/java.gif b/plugins/DevicePlugins/images/plugins/java.gif
similarity index 100%
rename from plugins/UserSettings/images/plugins/java.gif
rename to plugins/DevicePlugins/images/plugins/java.gif
diff --git a/plugins/UserSettings/images/plugins/pdf.gif b/plugins/DevicePlugins/images/plugins/pdf.gif
similarity index 100%
rename from plugins/UserSettings/images/plugins/pdf.gif
rename to plugins/DevicePlugins/images/plugins/pdf.gif
diff --git a/plugins/UserSettings/images/plugins/quicktime.gif b/plugins/DevicePlugins/images/plugins/quicktime.gif
similarity index 100%
rename from plugins/UserSettings/images/plugins/quicktime.gif
rename to plugins/DevicePlugins/images/plugins/quicktime.gif
diff --git a/plugins/UserSettings/images/plugins/realplayer.gif b/plugins/DevicePlugins/images/plugins/realplayer.gif
similarity index 100%
rename from plugins/UserSettings/images/plugins/realplayer.gif
rename to plugins/DevicePlugins/images/plugins/realplayer.gif
diff --git a/plugins/UserSettings/images/plugins/silverlight.gif b/plugins/DevicePlugins/images/plugins/silverlight.gif
similarity index 100%
rename from plugins/UserSettings/images/plugins/silverlight.gif
rename to plugins/DevicePlugins/images/plugins/silverlight.gif
diff --git a/plugins/UserSettings/images/plugins/windowsmedia.gif b/plugins/DevicePlugins/images/plugins/windowsmedia.gif
similarity index 100%
rename from plugins/UserSettings/images/plugins/windowsmedia.gif
rename to plugins/DevicePlugins/images/plugins/windowsmedia.gif
diff --git a/plugins/DevicePlugins/lang/en.json b/plugins/DevicePlugins/lang/en.json
new file mode 100644
index 0000000000..0e8b452a8a
--- /dev/null
+++ b/plugins/DevicePlugins/lang/en.json
@@ -0,0 +1,10 @@
+{
+    "DevicePlugins": {
+        "BrowserWithNoPluginsEnabled": "%1$s with no plugins enabled",
+        "BrowserWithPluginsEnabled": "%1$s with plugins %2$s enabled",
+        "PluginDescription": "Reports browser plugins",
+        "PluginDetectionDoesNotWorkInIE": "Note: Plugins detection doesn't work in Internet Explorer. This report is only based on non-IE browsers.",
+        "WidgetPlugins": "Browser Plugins",
+        "WidgetPluginsDocumentation": "This report shows which browser plugins your visitors had enabled. This information might be important for choosing the right way to deliver your content."
+    }
+}
\ No newline at end of file
diff --git a/plugins/Live/templates/_dataTableViz_visitorLog.twig b/plugins/Live/templates/_dataTableViz_visitorLog.twig
index 535fd2a1ce..74a2c4ab04 100644
--- a/plugins/Live/templates/_dataTableViz_visitorLog.twig
+++ b/plugins/Live/templates/_dataTableViz_visitorLog.twig
@@ -31,9 +31,9 @@
         {% if visitor.getColumn('countryFlag') %}<img src="{{ visitor.getColumn('countryFlag') }}" title="{{ visitor.getColumn('location') }}, Provider {{ visitor.getColumn('providerName') }}"/>{% endif %}
         &nbsp;
         {% if visitor.getColumn('plugins') %}
-            {% if visitor.getColumn('browserIcon') %}<img src="{{ visitor.getColumn('browserIcon') }}" title="{{ 'UserSettings_BrowserWithPluginsEnabled'|translate(visitor.getColumn('browserName'),visitor.getColumn('plugins')) }}"/>{% endif %}
+            {% if visitor.getColumn('browserIcon') %}<img src="{{ visitor.getColumn('browserIcon') }}" title="{{ 'DevicePlugins_BrowserWithPluginsEnabled'|translate(visitor.getColumn('browserName'),visitor.getColumn('plugins')) }}"/>{% endif %}
         {% else %}
-            {% if visitor.getColumn('browserIcon') %}<img src="{{ visitor.getColumn('browserIcon') }}" title="{{ 'UserSettings_BrowserWithNoPluginsEnabled'|translate(visitor.getColumn('browserName')) }}"/>{% endif %}
+            {% if visitor.getColumn('browserIcon') %}<img src="{{ visitor.getColumn('browserIcon') }}" title="{{ 'DevicePlugins_BrowserWithNoPluginsEnabled'|translate(visitor.getColumn('browserName')) }}"/>{% endif %}
         {% endif %}
         {% if visitor.getColumn('operatingSystemIcon') %}&nbsp;
         <img src="{{ visitor.getColumn('operatingSystemIcon') }}"
diff --git a/plugins/Live/templates/getSingleVisitSummary.twig b/plugins/Live/templates/getSingleVisitSummary.twig
index a515b0dff6..c35c6ef09b 100644
--- a/plugins/Live/templates/getSingleVisitSummary.twig
+++ b/plugins/Live/templates/getSingleVisitSummary.twig
@@ -25,7 +25,7 @@
         </li>
         <li>
             {% if visitData.browserName is defined %}
-            <div class="visitor-profile-browser" title="{% if visitData.plugins is defined %}{{ 'UserSettings_BrowserWithPluginsEnabled'|translate(visitData.browserName, visitData.plugins) }}{% else %}{{ 'UserSettings_BrowserWithNoPluginsEnabled'|translate(visitData.browserName) }}{% endif %}">
+            <div class="visitor-profile-browser" title="{% if visitData.plugins is defined %}{{ 'DevicePlugins_BrowserWithPluginsEnabled'|translate(visitData.browserName, visitData.plugins) }}{% else %}{{ 'DevicePlugins_BrowserWithNoPluginsEnabled'|translate(visitData.browserName) }}{% endif %}">
                 {% if visitData.browserIcon is defined %}<img src="{{ visitData.browserIcon }}"/>{% endif %}<span>{{ visitData.browserName|split(' ')[0] }}</span>
             </div>
             {% endif %}
diff --git a/plugins/UserSettings/API.php b/plugins/UserSettings/API.php
index 9f3649d3ba..d2703489a4 100644
--- a/plugins/UserSettings/API.php
+++ b/plugins/UserSettings/API.php
@@ -109,54 +109,12 @@ class API extends \Piwik\Plugin\API
         return $this->getDevicesDetectorApi()->getBrowserEngines($idSite, $period, $date, $segment);
     }
 
+    /**
+     * @deprecated since 2.10.0   See {@link Piwik\Plugins\DevicePlugins\API} for new implementation.
+     */
     public function getPlugin($idSite, $period, $date, $segment = false)
     {
-        // fetch all archive data required
-        $dataTable = $this->getDataTable(Archiver::PLUGIN_RECORD_NAME, $idSite, $period, $date, $segment);
-        $browserTypes = $this->getDataTable(DDArchiver::BROWSER_ENGINE_RECORD_NAME, $idSite, $period, $date, $segment);
-        $archive = Archive::build($idSite, $period, $date, $segment);
-        $visitsSums = $archive->getDataTableFromNumeric('nb_visits');
-
-        // check whether given tables are arrays
-        if ($dataTable instanceof DataTable\Map) {
-            $dataTableMap = $dataTable->getDataTables();
-            $browserTypesArray = $browserTypes->getDataTables();
-            $visitSumsArray = $visitsSums->getDataTables();
-        } else {
-            $dataTableMap = array($dataTable);
-            $browserTypesArray = array($browserTypes);
-            $visitSumsArray = array($visitsSums);
-        }
-
-        // walk through the results and calculate the percentage
-        foreach ($dataTableMap as $key => $table) {
-            // Calculate percentage, but ignore IE users because plugin detection doesn't work on IE
-            $ieVisits = 0;
-
-            $ieStats = $browserTypesArray[$key]->getRowFromLabel('Trident');
-            if ($ieStats !== false) {
-                $ieVisits = $ieStats->getColumn(Metrics::INDEX_NB_VISITS);
-            }
-
-            // get according visitsSum
-            $visits = $visitSumsArray[$key];
-            if ($visits->getRowsCount() == 0) {
-                $visitsSumTotal = 0;
-            } else {
-                $visitsSumTotal = (float) $visits->getFirstRow()->getColumn('nb_visits');
-            }
-
-            $visitsSum = $visitsSumTotal - $ieVisits;
-
-            $extraProcessedMetrics = $table->getMetadata(DataTable::EXTRA_PROCESSED_METRICS_METADATA_NAME);
-            $extraProcessedMetrics[] = new VisitsPercent($visitsSum);
-            $table->setMetadata(DataTable::EXTRA_PROCESSED_METRICS_METADATA_NAME, $extraProcessedMetrics);
-        }
-
-        $dataTable->queueFilter('ColumnCallbackAddMetadata', array('label', 'logo', __NAMESPACE__ . '\getPluginsLogo'));
-        $dataTable->queueFilter('ColumnCallbackReplace', array('label', 'ucfirst'));
-
-        return $dataTable;
+        return \Piwik\Plugins\DevicePlugins\API::getInstance()->getPlugin($idSite, $period, $date, $segment);
     }
 
     public function getLanguage($idSite, $period, $date, $segment = false)
diff --git a/plugins/UserSettings/Archiver.php b/plugins/UserSettings/Archiver.php
index a9b67a135c..54f0034c41 100644
--- a/plugins/UserSettings/Archiver.php
+++ b/plugins/UserSettings/Archiver.php
@@ -25,7 +25,6 @@ require_once PIWIK_INCLUDE_PATH . '/plugins/UserSettings/functions.php';
 class Archiver extends \Piwik\Plugin\Archiver
 {
     const LANGUAGE_RECORD_NAME = 'UserSettings_language';
-    const PLUGIN_RECORD_NAME = 'UserSettings_plugin';
 
     const LANGUAGE_DIMENSION = "log_visit.location_browser_lang";
 
@@ -35,7 +34,6 @@ class Archiver extends \Piwik\Plugin\Archiver
      */
     public function aggregateDayReport()
     {
-        $this->aggregateByPlugin();
         $this->aggregateByLanguage();
     }
 
@@ -45,34 +43,11 @@ class Archiver extends \Piwik\Plugin\Archiver
     public function aggregateMultipleReports()
     {
         $dataTableRecords = array(
-            self::PLUGIN_RECORD_NAME,
             self::LANGUAGE_RECORD_NAME,
         );
         $this->getProcessor()->aggregateDataTableRecords($dataTableRecords, $this->maximumRows);
     }
 
-    protected function aggregateByPlugin()
-    {
-        $selects = array(
-            "sum(case log_visit.config_pdf when 1 then 1 else 0 end) as pdf",
-            "sum(case log_visit.config_flash when 1 then 1 else 0 end) as flash",
-            "sum(case log_visit.config_java when 1 then 1 else 0 end) as java",
-            "sum(case log_visit.config_director when 1 then 1 else 0 end) as director",
-            "sum(case log_visit.config_quicktime when 1 then 1 else 0 end) as quicktime",
-            "sum(case log_visit.config_realplayer when 1 then 1 else 0 end) as realplayer",
-            "sum(case log_visit.config_windowsmedia when 1 then 1 else 0 end) as windowsmedia",
-            "sum(case log_visit.config_gears when 1 then 1 else 0 end) as gears",
-            "sum(case log_visit.config_silverlight when 1 then 1 else 0 end) as silverlight",
-            "sum(case log_visit.config_cookie when 1 then 1 else 0 end) as cookie"
-        );
-
-        $query = $this->getLogAggregator()->queryVisitsByDimension(array(), false, $selects, $metrics = array());
-        $data = $query->fetch();
-        $cleanRow = LogAggregator::makeArrayOneColumn($data, Metrics::INDEX_NB_VISITS);
-        $table = DataTable::makeFromIndexedArray($cleanRow);
-        $this->insertTable(self::PLUGIN_RECORD_NAME, $table);
-    }
-
     protected function aggregateByLanguage()
     {
         $query = $this->getLogAggregator()->queryVisitsByDimension(array("label" => self::LANGUAGE_DIMENSION));
diff --git a/plugins/UserSettings/Controller.php b/plugins/UserSettings/Controller.php
index 8c64ede3da..bb21c40fd2 100644
--- a/plugins/UserSettings/Controller.php
+++ b/plugins/UserSettings/Controller.php
@@ -10,7 +10,7 @@ namespace Piwik\Plugins\UserSettings;
 
 use Piwik\Plugins\Resolution\Reports\GetConfiguration;
 use Piwik\Plugins\UserSettings\Reports\GetLanguage;
-use Piwik\Plugins\UserSettings\Reports\GetPlugin;
+use Piwik\Plugins\DevicePlugins\Reports\GetPlugin;
 use Piwik\Plugins\Resolution\Reports\GetResolution;
 use Piwik\View;
 
diff --git a/plugins/UserSettings/UserSettings.php b/plugins/UserSettings/UserSettings.php
index 7596227de5..cb034c7d94 100644
--- a/plugins/UserSettings/UserSettings.php
+++ b/plugins/UserSettings/UserSettings.php
@@ -24,7 +24,6 @@ class UserSettings extends \Piwik\Plugin
     {
         return array(
             'Metrics.getDefaultMetricTranslations' => 'addMetricTranslations',
-            'Live.getAllVisitorDetails'            => 'extendVisitorDetails',
             'Request.getRenamedModuleAndAction'    => 'renameDeprecatedModuleAndAction',
         );
     }
@@ -55,14 +54,10 @@ class UserSettings extends \Piwik\Plugin
         if ($module == 'UserSettings' && ($action == 'getResolution' || $action == 'getConfiguration')) {
             $module = 'Resolution';
         }
-    }
-
-    public function extendVisitorDetails(&$visitor, $details)
-    {
-        $instance = new Visitor($details);
 
-        $visitor['plugins']                  = $instance->getPlugins();
-        $visitor['pluginsIcons']             = $instance->getPluginIcons();
+        if ($module == 'UserSettings' && $action == 'getPlugin') {
+            $module = 'DevicePlugins';
+        }
     }
 
     public function addMetricTranslations(&$translations)
diff --git a/plugins/UserSettings/functions.php b/plugins/UserSettings/functions.php
index c50e84146e..f00f717ea3 100644
--- a/plugins/UserSettings/functions.php
+++ b/plugins/UserSettings/functions.php
@@ -12,14 +12,6 @@ namespace Piwik\Plugins\UserSettings;
 use Piwik\Piwik;
 use Piwik\Tracker\Request;
 
-function getPluginsLogo($oldLabel)
-{
-    if ($oldLabel == Piwik::translate('General_Others')) {
-        return false;
-    }
-    return 'plugins/UserSettings/images/plugins/' . $oldLabel . '.gif';
-}
-
 /**
  * Returns the given language code to translated language name
  *
diff --git a/plugins/UserSettings/lang/en.json b/plugins/UserSettings/lang/en.json
index f5240dc9e2..de1005438b 100644
--- a/plugins/UserSettings/lang/en.json
+++ b/plugins/UserSettings/lang/en.json
@@ -1,8 +1,6 @@
 {
     "UserSettings": {
         "BrowserLanguage": "Browser language",
-        "BrowserWithNoPluginsEnabled": "%1$s with no plugins enabled",
-        "BrowserWithPluginsEnabled": "%1$s with plugins %2$s enabled",
         "Language_aa": "Afar",
         "Language_ab": "Abkhazian",
         "Language_ae": "Avestan",
@@ -189,9 +187,6 @@
         "Language_zu": "Zulu",
         "LanguageCode": "Language code",
         "PluginDescription": "Reports various User Settings: Browser, Browser Family, Operating System, Plugins, Resolution, Global Settings.",
-        "PluginDetectionDoesNotWorkInIE": "Note: Plugins detection doesn't work in Internet Explorer. This report is only based on non-IE browsers.",
-        "VisitorSettings": "Visitor Settings",
-        "WidgetPlugins": "Browser Plugins",
-        "WidgetPluginsDocumentation": "This report shows which browser plugins your visitors had enabled. This information might be important for choosing the right way to deliver your content."
+        "VisitorSettings": "Visitor Settings"
     }
 }
\ No newline at end of file
diff --git a/tests/PHPUnit/Unit/DeprecatedMethodsTest.php b/tests/PHPUnit/Unit/DeprecatedMethodsTest.php
index 4cbb8e0b08..94e265c9a1 100644
--- a/tests/PHPUnit/Unit/DeprecatedMethodsTest.php
+++ b/tests/PHPUnit/Unit/DeprecatedMethodsTest.php
@@ -64,6 +64,7 @@ class DeprecatedMethodsTest extends \PHPUnit_Framework_TestCase
         $this->assertDeprecatedMethodIsRemoved('Piwik\Plugins\UserSettings\API', 'getMobileVsDesktop', $validTill);
         $this->assertDeprecatedMethodIsRemoved('Piwik\Plugins\UserSettings\API', 'getResolution', $validTill);
         $this->assertDeprecatedMethodIsRemoved('Piwik\Plugins\UserSettings\API', 'getConfiguration', $validTill);
+        $this->assertDeprecatedMethodIsRemoved('Piwik\Plugins\UserSettings\API', 'getPlugin', $validTill);
         $this->assertDeprecatedMethodIsRemoved('Piwik\Plugins\UserSettings\UserSettings', 'renameDeprecatedModuleAndAction', $validTill);
 
         $this->assertDeprecatedMethodIsRemovedInPiwik3('\Piwik\Menu\MenuAbstract', 'add');
-- 
GitLab