1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
|
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_APPS_BROWSER_INSTANCE_BROWSER_APP_INSTANCE_REGISTRY_H_
#define CHROME_BROWSER_APPS_BROWSER_INSTANCE_BROWSER_APP_INSTANCE_REGISTRY_H_
#include <memory>
#include <set>
#include <string>
#include "base/memory/raw_ref.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "base/scoped_observation.h"
#include "chrome/browser/apps/browser_instance/browser_app_instance.h"
#include "chrome/browser/apps/browser_instance/browser_app_instance_map.h"
#include "chrome/browser/apps/browser_instance/browser_app_instance_observer.h"
#include "chrome/browser/apps/browser_instance/browser_app_instance_tracker.h"
#include "ui/aura/window.h"
#include "ui/wm/public/activation_change_observer.h"
#include "ui/wm/public/activation_client.h"
namespace apps {
// Aggregates app events for SWAs received from the |BrowserAppInstanceTracker|.
class BrowserAppInstanceRegistry
: public BrowserAppInstanceObserver,
public wm::ActivationChangeObserver {
public:
explicit BrowserAppInstanceRegistry(
BrowserAppInstanceTracker& ash_instance_tracker);
~BrowserAppInstanceRegistry() override;
// Get a single app instance by ID.
const BrowserAppInstance* GetAppInstanceById(base::UnguessableToken id) const;
// Get a single browser window instance by ID.
const BrowserWindowInstance* GetBrowserWindowInstanceById(
base::UnguessableToken id) const;
// Get all instances of apps that are hosted on |window|.
const std::set<const BrowserAppInstance*> GetBrowserAppInstancesByWindow(
const aura::Window* window) const;
// Get a single instance that corresponds to |window|.
const BrowserWindowInstance* GetBrowserWindowInstanceByWindow(
const aura::Window* window) const;
// Get a single window by instance ID.
// Returns a nullptr if instance identified by |id| does not exist.
aura::Window* GetWindowByInstanceId(const base::UnguessableToken& id) const;
template <typename PredicateT>
const BrowserAppInstance* FindAppInstanceIf(PredicateT predicate) const {
const BrowserAppInstance* instance =
FindInstanceIf(ash_instance_tracker_->app_tab_instances_, predicate);
if (instance) {
return instance;
}
return FindInstanceIf(ash_instance_tracker_->app_window_instances_,
predicate);
}
template <typename PredicateT>
std::set<const BrowserAppInstance*> SelectAppInstances(
PredicateT predicate) const {
std::set<const BrowserAppInstance*> result;
SelectInstances(result, ash_instance_tracker_->app_tab_instances_,
predicate);
SelectInstances(result, ash_instance_tracker_->app_window_instances_,
predicate);
return result;
}
template <typename PredicateT>
const BrowserWindowInstance* FindWindowInstanceIf(
PredicateT predicate) const {
return FindInstanceIf(ash_instance_tracker_->window_instances_, predicate);
}
template <typename PredicateT>
std::set<const BrowserWindowInstance*> SelectWindowInstances(
PredicateT predicate) const {
std::set<const BrowserWindowInstance*> result;
SelectInstances(result, ash_instance_tracker_->window_instances_,
predicate);
return result;
}
bool IsAppRunning(const std::string& app_id) const;
bool IsAshBrowserRunning() const;
// Activate the given instance within its tabstrip.
// If the instance lives in its own window, this will have no effect.
void ActivateTabInstance(const base::UnguessableToken& id);
// Activate an app or a browser window instance.
// Does nothing if the instance identified by |id| does not exist.
void ActivateInstance(const base::UnguessableToken& id);
// Minimize the window of an app or a browser window instance.
// Does nothing if the instance identified by |id| does not exist.
void MinimizeInstance(const base::UnguessableToken& id);
// Check if an app or a browser window instance is active.
// Returns false if the instance identified by |id| does not exist.
bool IsInstanceActive(const base::UnguessableToken& id) const;
void AddObserver(BrowserAppInstanceObserver* observer) {
observers_.AddObserver(observer);
}
void RemoveObserver(BrowserAppInstanceObserver* observer) {
observers_.RemoveObserver(observer);
}
// Runs notifications for all existing instances.
void NotifyExistingInstances(BrowserAppInstanceObserver* observer);
// BrowserAppInstanceObserver overrides:
void OnBrowserWindowAdded(
const apps::BrowserWindowInstance& instance) override;
void OnBrowserWindowUpdated(
const apps::BrowserWindowInstance& instance) override;
void OnBrowserWindowRemoved(
const apps::BrowserWindowInstance& instance) override;
void OnBrowserAppAdded(const apps::BrowserAppInstance& instance) override;
void OnBrowserAppUpdated(const apps::BrowserAppInstance& instance) override;
void OnBrowserAppRemoved(const apps::BrowserAppInstance& instance) override;
// wm::ActivationChangeObserver overrides:
void OnWindowActivated(ActivationReason reason,
aura::Window* gained_active,
aura::Window* lost_active) override;
private:
void MaybeStartActivationObservation(aura::Window* window);
const raw_ref<BrowserAppInstanceTracker> ash_instance_tracker_;
bool is_activation_observed_ = false;
base::ObserverList<BrowserAppInstanceObserver, true>::Unchecked observers_{
base::ObserverListPolicy::EXISTING_ONLY};
base::ScopedObservation<BrowserAppInstanceTracker, BrowserAppInstanceObserver>
tracker_observation_{this};
base::WeakPtrFactory<BrowserAppInstanceRegistry> weak_ptr_factory_{this};
};
} // namespace apps
#endif // CHROME_BROWSER_APPS_BROWSER_INSTANCE_BROWSER_APP_INSTANCE_REGISTRY_H_
|