--- /dev/null
+<?php
+
+namespace Drupal\outside_in;
+
+use Drupal\Core\Routing\AdminContext;
+use Drupal\Core\Routing\RouteMatchInterface;
+use Drupal\Core\Session\AccountInterface;
+
+/**
+ * Manages information related to Settings Tray.
+ */
+class OutsideInManager implements OutsideInManagerInterface {
+
+ /**
+ * The admin context service.
+ *
+ * @var \Drupal\Core\Routing\AdminContext
+ */
+ protected $adminContext;
+
+ /**
+ * The current route match.
+ *
+ * @var \Drupal\Core\Routing\RouteMatchInterface
+ */
+ protected $routeMatch;
+
+ /**
+ * The current account.
+ *
+ * @var \Drupal\Core\Session\AccountInterface
+ */
+ protected $account;
+
+ /**
+ * OutsideInManager constructor.
+ *
+ * @param \Drupal\Core\Routing\AdminContext $admin_context
+ * The admin context service.
+ * @param \Drupal\Core\Routing\RouteMatchInterface $route_match
+ * The current route match.
+ * @param \Drupal\Core\Session\AccountInterface $account
+ * The current account.
+ */
+ public function __construct(AdminContext $admin_context, RouteMatchInterface $route_match, AccountInterface $account) {
+ $this->adminContext = $admin_context;
+ $this->routeMatch = $route_match;
+ $this->account = $account;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function isApplicable() {
+ // Remove on Admin routes.
+ $is_admin_route = $this->adminContext->isAdminRoute();
+
+ // Remove on Block Demo page.
+ $is_admin_demo_route = $this->routeMatch->getRouteName() === 'block.admin_demo';
+
+ // @todo Check if there is actually a different admin theme.
+ // https://www.drupal.org/node/2784853
+ return $this->account->hasPermission('administer blocks') && !$is_admin_route && !$is_admin_demo_route;
+ }
+
+}