blob: 56127c11e477ddb98e8599c1daa4c913711695ee [file] [log] [blame]
// Copyright 2020 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 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
import 'chrome://resources/cr_elements/shared_vars_css.m.js';
import './ui_trigger_list_object.js';
import './shared_style.js';
import {WebUIListenerBehavior} from 'chrome://resources/js/web_ui_listener_behavior.m.js';
import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {NearbyUiTriggerBrowserProxy} from './nearby_ui_trigger_browser_proxy.js';
import {NearbyShareStates, ShareTarget, ShareTargetDiscoveryChange, ShareTargetSelectOption, StatusCode, TimestampedMessage, TransferMetadataStatus} from './types.js';
Polymer({
is: 'ui-trigger-tab',
_template: html`{__html_template__}`,
behaviors: [
WebUIListenerBehavior,
],
properties: {
/** @private {!Array<!TimestampedMessage>} */
uiTriggerObjectList_: {
type: Array,
value: [],
},
/** @private {!Array<!ShareTargetSelectOption>} */
shareTargetSelectOptionList_: {
type: Array,
value: [],
},
/** @private {string} ID of the selected ShareTarget or ''*/
selectedShareTargetId_: String,
},
/** @private {?NearbyUiTriggerBrowserProxy}*/
browserProxy_: null,
/**
* Initialize |browserProxy_|,|selectedShareTargetId_|, and
* |shareTargetSelectOptionList_|.
* @override
*/
created() {
this.browserProxy_ = NearbyUiTriggerBrowserProxy.getInstance();
},
/**
* When the page is initialized, notify the C++ layer to allow JavaScript and
* initialize WebUI Listeners.
* @override
*/
attached() {
this.addWebUIListener(
'transfer-updated',
transferUpdate => this.onTransferUpdateAdded_(transferUpdate));
this.addWebUIListener(
'share-target-discovered',
shareTarget => this.onShareTargetDiscovered_(shareTarget));
this.addWebUIListener(
'share-target-lost',
shareTarget => this.onShareTargetLost_(shareTarget));
this.addWebUIListener(
'on-status-code-returned',
statusCode => this.onStatusCodeReturned_(statusCode));
this.addWebUIListener(
'share-target-map-updated',
shareTargetMapUpdate =>
this.onShareTargetMapChanged_(shareTargetMapUpdate));
this.browserProxy_.initialize();
},
/**
* Triggers RegisterSendSurface with Foreground as Send state.
* @private
*/
onRegisterSendSurfaceForegroundClicked_() {
this.browserProxy_.registerSendSurfaceForeground().then(
statusCode => this.onStatusCodeReturned_(statusCode));
},
/**
* Triggers RegisterSendSurface with Background as Send state.
* @private
*/
onRegisterSendSurfaceBackgroundClicked_() {
this.browserProxy_.registerSendSurfaceBackground().then(
statusCode => this.onStatusCodeReturned_(statusCode));
},
/**
* Triggers UnregisterSendSurface.
* @private
*/
onUnregisterSendSurfaceClicked_() {
this.browserProxy_.unregisterSendSurface().then(
statusCode => this.onStatusCodeReturned_(statusCode));
},
/**
* Triggers RegisterReceiveSurface with Foreground as Receive state.
* @private
*/
onRegisterReceiveSurfaceForegroundClicked_() {
this.browserProxy_.registerReceiveSurfaceForeground().then(
statusCode => this.onStatusCodeReturned_(statusCode));
},
/**
* Triggers RegisterReceiveSurface with Background as Receive state.
* @private
*/
onRegisterReceiveSurfaceBackgroundClicked_() {
this.browserProxy_.registerReceiveSurfaceBackground().then(
statusCode => this.onStatusCodeReturned_(statusCode));
},
/**
* Triggers UnregisterReceiveSurface.
* @private
*/
onUnregisterReceiveSurfaceClicked_() {
this.browserProxy_.unregisterReceiveSurface().then(
statusCode => this.onStatusCodeReturned_(statusCode));
},
/**
* Logs status code returned by triggered events.
* @param {!StatusCode} statusCode
* @private
*/
onStatusCodeReturned_(statusCode) {
const message =
statusCode.triggerEvent + ' Result: ' + statusCode.statusCode;
const time = statusCode.time;
this.unshift('uiTriggerObjectList_', {'message': message, 'time': time});
},
/**
* Updates state variables based on the dictionary returned once triggered
* by |GetState|.
* @param {!NearbyShareStates} currentStates
* @private
*/
onCurrentStatesReturned_(currentStates) {
const time = currentStates.time;
const message =
`Is Scanning? : ${currentStates.isScanning}\nIs Transferring? : ${
currentStates.isTransferring}\nIs Receiving? : ${
currentStates.isReceiving}\nIs Sending? : ${
currentStates.isSending}\nIs Connecting? : ${
currentStates.isConnecting}\nIs In High Visibility? : ${
currentStates.isInHighVisibility}`;
this.unshift('uiTriggerObjectList_', {'message': message, 'time': time});
},
/**
* Triggers sendText with selected |shareTargetId|.
* @private
*/
onSendTextClicked_() {
this.browserProxy_.sendText(this.selectedShareTargetId_)
.then(statusCode => this.onStatusCodeReturned_(statusCode));
},
/**
* Triggers Accept with selected |shareTargetId|.
* @private
*/
onAcceptClicked_() {
this.browserProxy_.accept(this.selectedShareTargetId_);
},
/**
* Triggers Reject with selected |shareTargetId|.
* @private
*/
onRejectClicked_() {
this.browserProxy_.reject(this.selectedShareTargetId_);
},
/**
* Triggers Cancel with selected |shareTargetId|.
* @private
*/
onCancelClicked_() {
this.browserProxy_.cancel(this.selectedShareTargetId_);
},
/**
* Triggers Open with selected |shareTargetId|.
* @private
*/
onOpenClicked_() {
this.browserProxy_.open(this.selectedShareTargetId_);
},
/**
* Triggers GetState to retrieve current states and update display
* accordingly.
* @private
*/
onGetStatesClicked_() {
this.browserProxy_.getState().then(
currentStates => this.onCurrentStatesReturned_(currentStates));
},
/**
* Updates |selectedShareTargetId_| with the new selected option.
* @private
*/
onSelectChange_() {
this.selectedShareTargetId_ =
this.shadowRoot.querySelector('#share-select').selectedOptions[0].value;
},
/**
* Parses an array of ShareTargets and adds to the JavaScript list
* |shareTargetSelectOptionList_| to be displayed in select list.
* @param {!Array<!ShareTarget>} shareTargetMapUpdate
* @private
*/
onShareTargetMapChanged_(shareTargetMapUpdate) {
this.shareTargetSelectOptionList_ = [];
shareTargetMapUpdate.forEach((shareTarget) => {
const name = `${shareTarget.deviceName} (${shareTarget.shareTargetId})`;
const value = shareTarget.shareTargetId;
const selected = value === this.selectedShareTargetId_;
this.push(
'shareTargetSelectOptionList_',
{'name': name, 'selected': selected, 'value': value});
});
},
/**
* Handles ShareTargets when they are discovered in the C++.
* @param {!ShareTarget} shareTarget
* @private
*/
onShareTargetDiscovered_(shareTarget) {
this.convertShareTargetToTimestampedMessageAndAppendToList_(
shareTarget, ShareTargetDiscoveryChange.DISCOVERED);
},
/**
* Handles ShareTargets when they are lost in the C++.
* @param {!ShareTarget} shareTarget
* @private
*/
onShareTargetLost_(shareTarget) {
this.convertShareTargetToTimestampedMessageAndAppendToList_(
shareTarget, ShareTargetDiscoveryChange.LOST);
},
/**
* Adds |transferUpdate| sent in from WebUI listener to the displayed list.
* @param {!TransferMetadataStatus} transferUpdate
* @private
*/
onTransferUpdateAdded_(transferUpdate) {
this.convertTransferUpdateTimestampedMessageAndAppendToList_(
transferUpdate);
},
/**
* Converts |transferUpdate| sent in to a generic object to be displayed.
* @param {!TransferMetadataStatus} transferUpdate
* @private
*/
convertTransferUpdateTimestampedMessageAndAppendToList_(transferUpdate) {
const time = transferUpdate.time;
const message =
`${transferUpdate.deviceName} (${transferUpdate.shareTargetId}): ${
transferUpdate.transferMetadataStatus}`;
this.unshift('uiTriggerObjectList_', {'message': message, 'time': time});
},
/**
* Converts |statusCode| sent in to a generic object to be displayed.
* @param {!StatusCode} statusCode
* @private
*/
convertStatusCodeToTimestampedMessageAndAppendToList_(statusCode) {
const time = statusCode.time;
const message = `${statusCode.triggerEvent} ${statusCode.statusCode}`;
this.unshift('uiTriggerObjectList_', {'message': message, 'time': time});
},
/**
* Converts |shareTarget| sent in to when discovered/lost a generic object to
* be displayed.
* @private
* @param {!ShareTarget} shareTarget
* @param {!ShareTargetDiscoveryChange} discoveryChange
*/
convertShareTargetToTimestampedMessageAndAppendToList_(
shareTarget, discoveryChange) {
const time = shareTarget.time;
const message = `${shareTarget.deviceName} (${shareTarget.shareTargetId}) ${
this.shareTargetDirectionToString_(discoveryChange)}`;
this.unshift('uiTriggerObjectList_', {'message': message, 'time': time});
},
/**
* Sets the string representation of ShareTargetDiscoveryChange
* |discoveryChange|.
* @private
* @param {!ShareTargetDiscoveryChange} discoveryChange
* @return
*/
shareTargetDirectionToString_(discoveryChange) {
switch (discoveryChange) {
case ShareTargetDiscoveryChange.DISCOVERED:
return 'discovered';
break;
case ShareTargetDiscoveryChange.LOST:
return 'lost';
break;
default:
break;
}
},
});