123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- // Copyright 2017 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #ifndef ASH_SYSTEM_BLUETOOTH_BLUETOOTH_POWER_CONTROLLER_H_
- #define ASH_SYSTEM_BLUETOOTH_BLUETOOTH_POWER_CONTROLLER_H_
- #include "ash/ash_export.h"
- #include "ash/public/cpp/session/session_observer.h"
- #include "base/containers/queue.h"
- #include "components/prefs/pref_change_registrar.h"
- #include "components/user_manager/user_type.h"
- #include "device/bluetooth/bluetooth_adapter.h"
- #include "device/bluetooth/chromeos/bluetooth_utils.h"
- class PrefRegistrySimple;
- class PrefService;
- namespace ash {
- // Listens to changes of bluetooth power preferences and apply them to the
- // device. Also initializes the bluetooth power during system startup
- // and user session startup.
- //
- // This should be the only entity controlling bluetooth power. All other code
- // outside ash that wants to control bluetooth power should set user pref
- // setting instead.
- class ASH_EXPORT BluetoothPowerController
- : public SessionObserver,
- public device::BluetoothAdapter::Observer {
- public:
- explicit BluetoothPowerController(PrefService* local_state);
- BluetoothPowerController(const BluetoothPowerController&) = delete;
- BluetoothPowerController& operator=(const BluetoothPowerController&) = delete;
- ~BluetoothPowerController() override;
- // Changes the bluetooth power setting to |enabled|.
- void SetBluetoothEnabled(bool enabled);
- static void RegisterLocalStatePrefs(PrefRegistrySimple* registry);
- static void RegisterProfilePrefs(PrefRegistrySimple* registry);
- // Sets the primary user's bluetooth power pref. Setting the pref will also
- // trigger the change of the bluetooth power. This method can only be called
- // when the primary user is the active user, otherwise the operation is
- // ignored.
- void SetPrimaryUserBluetoothPowerSetting(bool enabled);
- // Called when BluetoothAdapterFactory::GetAdapter is ready to pass the
- // adapter pointer.
- void InitializeOnAdapterReady(
- scoped_refptr<device::BluetoothAdapter> adapter);
- // SessionObserver:
- void OnActiveUserPrefServiceChanged(PrefService* pref_service) override;
- // BluetoothAdapter::Observer:
- void AdapterPresentChanged(device::BluetoothAdapter* adapter,
- bool present) override;
- device::BluetoothAdapter* bluetooth_adapter_for_test() {
- return bluetooth_adapter_.get();
- }
- private:
- friend class BluetoothPowerControllerTest;
- void StartWatchingActiveUserPrefsChanges();
- void StartWatchingLocalStatePrefsChanges();
- void StopWatchingActiveUserPrefsChanges();
- void OnBluetoothPowerActiveUserPrefChanged();
- void OnBluetoothPowerLocalStatePrefChanged();
- // At primary user session startup, apply the user's bluetooth power setting
- // or set the default if the user doesn't have the setting yet.
- void ApplyBluetoothPrimaryUserPref();
- // At login screen startup, apply the local state bluetooth power setting
- // or set the default if the device doesn't have the setting yet.
- void ApplyBluetoothLocalStatePref();
- // Sets the bluetooth power, may defer the operation if bluetooth adapter
- // is not yet ready.
- void SetBluetoothPower(bool enabled);
- // Sets the bluetooth power given the ready adapter.
- void SetBluetoothPowerOnAdapterReady();
- // Called by dbus:: on completion of the D-Bus method call to set power state
- // on the device.
- void OnSetBluetoothPower(device::PoweredStateOperation power_operation,
- bool success);
- using BluetoothTask = base::OnceClosure;
- // If adapter is ready run the task right now, otherwise add the task
- // to the queue which will be executed when bluetooth adapter is ready.
- void RunBluetoothTaskWhenAdapterReady(BluetoothTask task);
- // Triggers running all pending bluetooth adapter-dependent tasks.
- void TriggerRunPendingBluetoothTasks();
- // Runs the next pending bluetooth task. This will trigger another
- // RunNextPendingBluetoothTask when the current task is finished. It will stop
- // executing the next task when the adapter becomes not present or the queue
- // has been empty.
- void RunNextPendingBluetoothTask();
- // Sets the pref value based on current bluetooth power state. May defer
- // the operation if bluetooth adapter is not ready yet.
- void SavePrefValue(PrefService* prefs, const char* pref_name);
- // Sets the pref value based on current bluetooth power state, given the ready
- // bluetooth adapter.
- void SavePrefValueOnAdapterReady(PrefService* prefs, const char* pref_name);
- // Decides whether to apply bluetooth setting based on user type.
- // Returns true if the user type represents a human individual, currently this
- // includes: regular, child, supervised, or active directory. The other types
- // do not represent human account so those account should follow system-wide
- // bluetooth setting instead.
- bool ShouldApplyUserBluetoothSetting(user_manager::UserType user_type) const;
- // Remembers whether we have ever applied the primary user's bluetooth
- // setting. If this variable is true, we will ignore any active user change
- // event since we know that the primary user's bluetooth setting has been
- // applied.
- bool is_primary_user_bluetooth_applied_ = false;
- PrefService* active_user_pref_service_ = nullptr;
- PrefService* local_state_ = nullptr;
- // Contains pending tasks which depend on the availability of bluetooth
- // adapter.
- base::queue<BluetoothTask> pending_bluetooth_tasks_;
- // The registrar used to watch prefs changes in the above
- // |active_user_pref_service_| from outside ash.
- // NOTE: Prefs are how Chrome communicates changes to the bluetooth power
- // settings controlled by this class from the WebUI settings.
- std::unique_ptr<PrefChangeRegistrar> active_user_pref_change_registrar_;
- std::unique_ptr<PrefChangeRegistrar> local_state_pref_change_registrar_;
- // True indicates that pending_bluetooth_tasks_ is being executed and
- // waiting for complete callback.
- bool pending_tasks_busy_ = false;
- // If not empty this indicates the pending target bluetooth power to be set.
- // This needs to be tracked so that we can combine multiple pending power
- // change requests.
- absl::optional<bool> pending_bluetooth_power_target_;
- scoped_refptr<device::BluetoothAdapter> bluetooth_adapter_;
- base::WeakPtrFactory<BluetoothPowerController> weak_ptr_factory_{this};
- };
- } // namespace ash
- #endif // ASH_SYSTEM_BLUETOOTH_BLUETOOTH_POWER_CONTROLLER_H_
|