blob: a60d8b6e33e9e240d28727c13cc8de01f879dcfd [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.
import {CustomElement} from 'chrome://resources/js/custom_element.js';
import {AlertIndicatorElement} from './alert_indicator.js';
import {TabAlertState} from './tabs_api_proxy.js';
export class AlertIndicatorsElement extends CustomElement {
static get template() {
return `{__html_template__}`;
}
constructor() {
super();
/** @private {!HTMLElement} */
this.containerEl_ = /** @type {!HTMLElement} */ (this.$('#container'));
const audioIndicator = new AlertIndicatorElement();
const recordingIndicator = new AlertIndicatorElement();
/** @private {!Map<!TabAlertState, !AlertIndicatorElement>} */
this.alertIndicators_ = new Map([
[TabAlertState.MEDIA_RECORDING, recordingIndicator],
[TabAlertState.TAB_CAPTURING, new AlertIndicatorElement()],
[TabAlertState.AUDIO_PLAYING, audioIndicator],
[TabAlertState.AUDIO_MUTING, audioIndicator],
[TabAlertState.BLUETOOTH_CONNECTED, new AlertIndicatorElement()],
[TabAlertState.USB_CONNECTED, new AlertIndicatorElement()],
[TabAlertState.HID_CONNECTED, new AlertIndicatorElement()],
[TabAlertState.SERIAL_CONNECTED, new AlertIndicatorElement()],
[TabAlertState.PIP_PLAYING, new AlertIndicatorElement()],
[TabAlertState.DESKTOP_CAPTURING, recordingIndicator],
[TabAlertState.VR_PRESENTING_IN_HEADSET, new AlertIndicatorElement()],
]);
}
/**
* @param {!Array<!TabAlertState>} alertStates
* @return {!Promise<number>} A promise that resolves with the number of
* AlertIndicatorElements that are currently visible.
*/
updateAlertStates(alertStates) {
const alertIndicators =
alertStates.map(alertState => this.alertIndicators_.get(alertState));
let alertIndicatorCount = 0;
for (const [index, alertState] of alertStates.entries()) {
const alertIndicator = alertIndicators[/** @type {number} */ (index)];
// Don't show unsupported indicators.
if (!alertIndicator) {
continue;
}
// If the same indicator appears earlier in the list of alert indicators,
// that indicates that there is a higher priority alert state that
// should display for the shared indicator.
if (alertIndicators.indexOf(alertIndicator) < index) {
continue;
}
// Always update alert state to ensure the correct icon is displayed.
alertIndicator.alertState = alertState;
this.containerEl_.insertBefore(
alertIndicator, this.containerEl_.children[alertIndicatorCount]);
// Only fade in if this is just being added to the DOM.
alertIndicator.show();
alertIndicatorCount++;
}
const animationPromises = Array.from(this.containerEl_.children)
.slice(alertIndicatorCount)
.map(indicator => indicator.hide());
return Promise.all(animationPromises)
.then(
() => {
return this.containerEl_.childElementCount;
},
() => {
// A failure in the animation promises means an animation was
// canceled and therefore there is a new set of alertStates
// being animated.
});
}
}
customElements.define('tabstrip-alert-indicators', AlertIndicatorsElement);