blob: f4937f612901afc8b4ae4e02b914d6d9f2dc4752 [file] [log] [blame]
// Copyright 2019 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_NETWORK_ACTIVE_NETWORK_ICON_H_
#define ASH_SYSTEM_NETWORK_ACTIVE_NETWORK_ICON_H_
#include <memory>
#include <vector>
#include "ash/ash_export.h"
#include "ash/system/network/network_icon.h"
#include "base/macros.h"
#include "base/optional.h"
#include "base/strings/string16.h"
#include "base/time/time.h"
#include "chromeos/network/network_state_handler_observer.h"
namespace chromeos {
class NetworkState;
class NetworkStateHandler;
} // namespace chromeos
namespace gfx {
class ImageSkia;
} // namespace gfx
namespace ash {
// Tracks changes to the active networks and provides an interface to
// network_icon for the default network. This class supports two interfaces:
// * Single: A single icon is shown to represent the active network state.
// * Dual: One or two icons are shown to represent the active network state:
// ** Primary: The state of the primary active network. If Cellular, a
// a technology badge is used to represent the network.
// ** Cellular (enabled devices only): The state of the Cellular connection if
// available regardless of whether it is the active network.
// NOTE : GetSingleDefaultImage and GetDefaultLabel are partially tested in
// network_icon_unittest.cc, and partially in active_network_icon_unittest.cc.
// TODO(stevenjb): Move all test coverage to active_network_icon_unittest.cc and
// test Dual icon methods.
class ASH_EXPORT ActiveNetworkIcon
: public chromeos::NetworkStateHandlerObserver {
public:
ActiveNetworkIcon();
~ActiveNetworkIcon() override;
// Returns the label for the primary active network..
base::string16 GetDefaultLabel(network_icon::IconType icon_type);
// Single image mode. Returns a network icon (which may be empty) and sets
// |animating| if provided.
gfx::ImageSkia GetSingleImage(network_icon::IconType icon_type,
bool* animating);
// Dual image mode. Returns the primary icon (which may be empty) and sets
// |animating| if provided.
gfx::ImageSkia GetDualImagePrimary(network_icon::IconType icon_type,
bool* animating);
// Dual image mode. Returns the Cellular icon (which may be empty) and sets
// |animating| if provided.
gfx::ImageSkia GetDualImageCellular(network_icon::IconType icon_type,
bool* animating);
void InitForTesting(chromeos::NetworkStateHandler* network_state_handler);
private:
void InitializeNetworkStateHandler(chromeos::NetworkStateHandler* handler);
void ShutdownNetworkStateHandler();
gfx::ImageSkia GetDefaultImageImpl(
const base::Optional<network_icon::NetworkIconState>& default_network,
network_icon::IconType icon_type,
bool* animating);
// Called when there is no default network., Provides an empty or disabled
// wifi icon and sets |animating| if provided to false.
gfx::ImageSkia GetDefaultImageForNoNetwork(network_icon::IconType icon_type,
bool* animating);
void UpdateActiveNetworks();
void SetCellularUninitializedMsg();
// chromeos::NetworkStateHandlerObserver
void DeviceListChanged() override;
void DevicePropertiesUpdated(const chromeos::DeviceState* device) override;
void ActiveNetworksChanged(const std::vector<const chromeos::NetworkState*>&
active_networks) override;
void OnShuttingDown() override;
chromeos::NetworkStateHandler* network_state_handler_ = nullptr;
base::Optional<network_icon::NetworkIconState> default_network_;
base::Optional<network_icon::NetworkIconState> active_non_cellular_;
base::Optional<network_icon::NetworkIconState> active_cellular_;
base::Optional<network_icon::NetworkIconState> active_vpn_;
int cellular_uninitialized_msg_ = 0;
base::Time uninitialized_state_time_;
DISALLOW_COPY_AND_ASSIGN(ActiveNetworkIcon);
};
} // namespace ash
#endif // ASH_SYSTEM_NETWORK_ACTIVE_NETWORK_ICON_H_