clean participant device name with new sdk api
use utils fonction to set me display name in call grid
This commit is contained in:
parent
9f5350c0e0
commit
e6fe32cfee
10 changed files with 15 additions and 98 deletions
|
|
@ -45,12 +45,6 @@ void AccountProxy::resetDefaultAccount() {
|
||||||
emit this->defaultAccountChanged(); // Warn the UI
|
emit this->defaultAccountChanged(); // Warn the UI
|
||||||
}
|
}
|
||||||
|
|
||||||
AccountGui *AccountProxy::findAccountByAddress(const QString &address) {
|
|
||||||
auto model = getListModel<AccountList>();
|
|
||||||
if (model) return new AccountGui(model->findAccountByAddress(address));
|
|
||||||
else return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
AccountGui *AccountProxy::firstAccount() {
|
AccountGui *AccountProxy::firstAccount() {
|
||||||
auto model = getListModel<AccountList>();
|
auto model = getListModel<AccountList>();
|
||||||
if (model) return model->firstAccount();
|
if (model) return model->firstAccount();
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,6 @@ public:
|
||||||
|
|
||||||
AccountGui *getDefaultAccount(); // Get a new object from List or give the stored one.
|
AccountGui *getDefaultAccount(); // Get a new object from List or give the stored one.
|
||||||
void resetDefaultAccount(); // Reset the default account to let UI build its new object if needed.
|
void resetDefaultAccount(); // Reset the default account to let UI build its new object if needed.
|
||||||
Q_INVOKABLE AccountGui *findAccountByAddress(const QString &address);
|
|
||||||
Q_INVOKABLE AccountGui *firstAccount();
|
Q_INVOKABLE AccountGui *firstAccount();
|
||||||
|
|
||||||
bool getHaveAccount() const;
|
bool getHaveAccount() const;
|
||||||
|
|
|
||||||
|
|
@ -43,8 +43,6 @@ ConferenceCore::ConferenceCore(const std::shared_ptr<linphone::Conference> &conf
|
||||||
auto activeSpeaker = conference->getActiveSpeakerParticipantDevice();
|
auto activeSpeaker = conference->getActiveSpeakerParticipantDevice();
|
||||||
if (activeSpeaker) {
|
if (activeSpeaker) {
|
||||||
mActiveSpeakerDevice = ParticipantDeviceCore::create(activeSpeaker);
|
mActiveSpeakerDevice = ParticipantDeviceCore::create(activeSpeaker);
|
||||||
auto participant = conference->findParticipant(activeSpeaker->getAddress());
|
|
||||||
if (participant) mActiveSpeaker = ParticipantCore::create(participant);
|
|
||||||
}
|
}
|
||||||
mIsLocalScreenSharing = mConferenceModel->isLocalScreenSharing();
|
mIsLocalScreenSharing = mConferenceModel->isLocalScreenSharing();
|
||||||
mIsScreenSharingEnabled = mConferenceModel->isScreenSharingEnabled();
|
mIsScreenSharingEnabled = mConferenceModel->isScreenSharingEnabled();
|
||||||
|
|
@ -66,15 +64,7 @@ void ConferenceCore::setSelf(QSharedPointer<ConferenceCore> me) {
|
||||||
[this](const std::shared_ptr<linphone::Conference> &conference,
|
[this](const std::shared_ptr<linphone::Conference> &conference,
|
||||||
const std::shared_ptr<linphone::ParticipantDevice> &participantDevice) {
|
const std::shared_ptr<linphone::ParticipantDevice> &participantDevice) {
|
||||||
auto device = ParticipantDeviceCore::create(participantDevice);
|
auto device = ParticipantDeviceCore::create(participantDevice);
|
||||||
QSharedPointer<ParticipantCore> participantCore;
|
mConferenceModelConnection->invokeToCore([this, device]() { setActiveSpeakerDevice(device); });
|
||||||
if (participantDevice) {
|
|
||||||
auto participant = conference->findParticipant(participantDevice->getAddress());
|
|
||||||
if (participant) participantCore = ParticipantCore::create(participant);
|
|
||||||
}
|
|
||||||
mConferenceModelConnection->invokeToCore([this, device, participantCore]() {
|
|
||||||
setActiveSpeaker(participantCore);
|
|
||||||
setActiveSpeakerDevice(device);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
mConferenceModelConnection->makeConnectToModel(
|
mConferenceModelConnection->makeConnectToModel(
|
||||||
|
|
@ -82,27 +72,17 @@ void ConferenceCore::setSelf(QSharedPointer<ConferenceCore> me) {
|
||||||
[this](const std::shared_ptr<linphone::Conference> &conference, linphone::Conference::State newState) {
|
[this](const std::shared_ptr<linphone::Conference> &conference, linphone::Conference::State newState) {
|
||||||
int count = mConferenceModel->getParticipantDeviceCount();
|
int count = mConferenceModel->getParticipantDeviceCount();
|
||||||
mConferenceModelConnection->invokeToCore([this, count]() { setParticipantDeviceCount(count); });
|
mConferenceModelConnection->invokeToCore([this, count]() { setParticipantDeviceCount(count); });
|
||||||
if (newState == linphone::Conference::State::Created && !mActiveSpeaker) {
|
if (newState == linphone::Conference::State::Created) {
|
||||||
if (auto participantDevice = conference->getActiveSpeakerParticipantDevice()) {
|
if (auto participantDevice = conference->getActiveSpeakerParticipantDevice()) {
|
||||||
auto device = ParticipantDeviceCore::create(participantDevice);
|
auto device = ParticipantDeviceCore::create(participantDevice);
|
||||||
QSharedPointer<ParticipantCore> participantCore;
|
mConferenceModelConnection->invokeToCore([this, device]() { setActiveSpeakerDevice(device); });
|
||||||
auto participant = conference->findParticipant(participantDevice->getAddress());
|
|
||||||
if (participant) participantCore = ParticipantCore::create(participant);
|
|
||||||
mConferenceModelConnection->invokeToCore([this, device, participantCore]() {
|
|
||||||
setActiveSpeaker(participantCore);
|
|
||||||
setActiveSpeakerDevice(device);
|
|
||||||
});
|
|
||||||
} else if (conference->getParticipantDeviceList().size() > 1) {
|
} else if (conference->getParticipantDeviceList().size() > 1) {
|
||||||
for (auto &device : conference->getParticipantDeviceList()) {
|
for (auto &device : conference->getParticipantDeviceList()) {
|
||||||
if (!ToolModel::isMe(device->getAddress())) {
|
if (!ToolModel::isMe(device->getAddress())) {
|
||||||
auto activeSpeakerDevice = ParticipantDeviceCore::create(device);
|
auto activeSpeakerDevice = ParticipantDeviceCore::create(device);
|
||||||
QSharedPointer<ParticipantCore> participantCore;
|
|
||||||
auto participant = conference->findParticipant(device->getAddress());
|
auto participant = conference->findParticipant(device->getAddress());
|
||||||
if (participant) participantCore = ParticipantCore::create(participant);
|
mConferenceModelConnection->invokeToCore(
|
||||||
mConferenceModelConnection->invokeToCore([this, activeSpeakerDevice, participantCore]() {
|
[this, activeSpeakerDevice]() { setActiveSpeakerDevice(activeSpeakerDevice); });
|
||||||
setActiveSpeaker(participantCore);
|
|
||||||
setActiveSpeakerDevice(activeSpeakerDevice);
|
|
||||||
});
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -115,25 +95,14 @@ void ConferenceCore::setSelf(QSharedPointer<ConferenceCore> me) {
|
||||||
[this](const std::shared_ptr<linphone::Conference> &conference, int count) {
|
[this](const std::shared_ptr<linphone::Conference> &conference, int count) {
|
||||||
if (auto participantDevice = conference->getActiveSpeakerParticipantDevice()) {
|
if (auto participantDevice = conference->getActiveSpeakerParticipantDevice()) {
|
||||||
auto device = ParticipantDeviceCore::create(participantDevice);
|
auto device = ParticipantDeviceCore::create(participantDevice);
|
||||||
QSharedPointer<ParticipantCore> participantCore;
|
|
||||||
auto participant = conference->findParticipant(participantDevice->getAddress());
|
|
||||||
if (participant) participantCore = ParticipantCore::create(participant);
|
|
||||||
setActiveSpeakerDevice(device);
|
setActiveSpeakerDevice(device);
|
||||||
mConferenceModelConnection->invokeToCore([this, device, participantCore]() {
|
mConferenceModelConnection->invokeToCore([this, device]() { setActiveSpeakerDevice(device); });
|
||||||
setActiveSpeaker(participantCore);
|
|
||||||
setActiveSpeakerDevice(device);
|
|
||||||
});
|
|
||||||
} else if (conference->getParticipantDeviceList().size() > 1) {
|
} else if (conference->getParticipantDeviceList().size() > 1) {
|
||||||
for (auto &device : conference->getParticipantDeviceList()) {
|
for (auto &device : conference->getParticipantDeviceList()) {
|
||||||
if (!ToolModel::isMe(device->getAddress())) {
|
if (!ToolModel::isMe(device->getAddress())) {
|
||||||
auto activeSpeaker = ParticipantDeviceCore::create(device);
|
auto activeSpeaker = ParticipantDeviceCore::create(device);
|
||||||
QSharedPointer<ParticipantCore> participantCore;
|
mConferenceModelConnection->invokeToCore(
|
||||||
auto participant = conference->findParticipant(device->getAddress());
|
[this, activeSpeaker]() { setActiveSpeakerDevice(activeSpeaker); });
|
||||||
if (participant) participantCore = ParticipantCore::create(participant);
|
|
||||||
mConferenceModelConnection->invokeToCore([this, activeSpeaker, participantCore]() {
|
|
||||||
setActiveSpeaker(participantCore);
|
|
||||||
setActiveSpeakerDevice(activeSpeaker);
|
|
||||||
});
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -233,10 +202,6 @@ ParticipantDeviceCore *ConferenceCore::getActiveSpeakerDevice() const {
|
||||||
return mActiveSpeakerDevice.get();
|
return mActiveSpeakerDevice.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
ParticipantGui *ConferenceCore::getActiveSpeakerGui() const {
|
|
||||||
return mActiveSpeaker ? new ParticipantGui(mActiveSpeaker) : nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
ParticipantDeviceGui *ConferenceCore::getActiveSpeakerDeviceGui() const {
|
ParticipantDeviceGui *ConferenceCore::getActiveSpeakerDeviceGui() const {
|
||||||
return mActiveSpeakerDevice ? new ParticipantDeviceGui(mActiveSpeakerDevice) : nullptr;
|
return mActiveSpeakerDevice ? new ParticipantDeviceGui(mActiveSpeakerDevice) : nullptr;
|
||||||
}
|
}
|
||||||
|
|
@ -252,11 +217,3 @@ void ConferenceCore::setActiveSpeakerDevice(const QSharedPointer<ParticipantDevi
|
||||||
emit activeSpeakerDeviceChanged();
|
emit activeSpeakerDeviceChanged();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConferenceCore::setActiveSpeaker(const QSharedPointer<ParticipantCore> &participant) {
|
|
||||||
if (mActiveSpeaker != participant) {
|
|
||||||
mActiveSpeaker = participant;
|
|
||||||
qDebug() << log().arg("Changing active speaker to %1").arg(participant ? participant->getSipAddress() : "None");
|
|
||||||
emit activeSpeakerChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,6 @@ public:
|
||||||
Q_PROPERTY(bool isScreenSharingEnabled MEMBER mIsScreenSharingEnabled WRITE setIsScreenSharingEnabled NOTIFY
|
Q_PROPERTY(bool isScreenSharingEnabled MEMBER mIsScreenSharingEnabled WRITE setIsScreenSharingEnabled NOTIFY
|
||||||
isScreenSharingEnabledChanged)
|
isScreenSharingEnabledChanged)
|
||||||
Q_PROPERTY(int participantDeviceCount READ getParticipantDeviceCount NOTIFY participantDeviceCountChanged)
|
Q_PROPERTY(int participantDeviceCount READ getParticipantDeviceCount NOTIFY participantDeviceCountChanged)
|
||||||
Q_PROPERTY(ParticipantGui *activeSpeaker READ getActiveSpeakerGui NOTIFY activeSpeakerChanged)
|
|
||||||
Q_PROPERTY(
|
Q_PROPERTY(
|
||||||
ParticipantDeviceGui *activeSpeakerDevice READ getActiveSpeakerDeviceGui NOTIFY activeSpeakerDeviceChanged)
|
ParticipantDeviceGui *activeSpeakerDevice READ getActiveSpeakerDeviceGui NOTIFY activeSpeakerDeviceChanged)
|
||||||
Q_PROPERTY(ParticipantGui *me READ getMeGui)
|
Q_PROPERTY(ParticipantGui *me READ getMeGui)
|
||||||
|
|
@ -73,9 +72,7 @@ public:
|
||||||
|
|
||||||
ParticipantDeviceCore *getActiveSpeakerDevice() const;
|
ParticipantDeviceCore *getActiveSpeakerDevice() const;
|
||||||
ParticipantDeviceGui *getActiveSpeakerDeviceGui() const;
|
ParticipantDeviceGui *getActiveSpeakerDeviceGui() const;
|
||||||
ParticipantGui *getActiveSpeakerGui() const;
|
|
||||||
void setActiveSpeakerDevice(const QSharedPointer<ParticipantDeviceCore> &device);
|
void setActiveSpeakerDevice(const QSharedPointer<ParticipantDeviceCore> &device);
|
||||||
void setActiveSpeaker(const QSharedPointer<ParticipantCore> &participant);
|
|
||||||
ParticipantGui *getMeGui() const;
|
ParticipantGui *getMeGui() const;
|
||||||
|
|
||||||
void setIsReady(bool state);
|
void setIsReady(bool state);
|
||||||
|
|
@ -92,7 +89,6 @@ signals:
|
||||||
void isLocalScreenSharingChanged();
|
void isLocalScreenSharingChanged();
|
||||||
void isScreenSharingEnabledChanged();
|
void isScreenSharingEnabledChanged();
|
||||||
void participantDeviceCountChanged();
|
void participantDeviceCountChanged();
|
||||||
void activeSpeakerChanged();
|
|
||||||
void activeSpeakerDeviceChanged();
|
void activeSpeakerDeviceChanged();
|
||||||
void subjectChanged();
|
void subjectChanged();
|
||||||
void isRecordingChanged();
|
void isRecordingChanged();
|
||||||
|
|
@ -102,7 +98,6 @@ signals:
|
||||||
private:
|
private:
|
||||||
QSharedPointer<SafeConnection<ConferenceCore, ConferenceModel>> mConferenceModelConnection;
|
QSharedPointer<SafeConnection<ConferenceCore, ConferenceModel>> mConferenceModelConnection;
|
||||||
std::shared_ptr<ConferenceModel> mConferenceModel;
|
std::shared_ptr<ConferenceModel> mConferenceModel;
|
||||||
QSharedPointer<ParticipantCore> mActiveSpeaker;
|
|
||||||
QSharedPointer<ParticipantDeviceCore> mActiveSpeakerDevice;
|
QSharedPointer<ParticipantDeviceCore> mActiveSpeakerDevice;
|
||||||
QSharedPointer<ParticipantCore> mMe;
|
QSharedPointer<ParticipantCore> mMe;
|
||||||
int mParticipantDeviceCount = 0;
|
int mParticipantDeviceCount = 0;
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,9 @@ ParticipantDeviceCore::ParticipantDeviceCore(const std::shared_ptr<linphone::Par
|
||||||
auto deviceAddress = device->getAddress();
|
auto deviceAddress = device->getAddress();
|
||||||
mUniqueAddress = Utils::coreStringToAppString(deviceAddress->asString());
|
mUniqueAddress = Utils::coreStringToAppString(deviceAddress->asString());
|
||||||
mAddress = Utils::coreStringToAppString(deviceAddress->asStringUriOnly());
|
mAddress = Utils::coreStringToAppString(deviceAddress->asStringUriOnly());
|
||||||
mDisplayName = Utils::coreStringToAppString(deviceAddress->getDisplayName());
|
// the display name of the device himself may be the uncleaned sip uri
|
||||||
|
// Use the participant name instead
|
||||||
|
mDisplayName = Utils::coreStringToAppString(device->getParticipant()->getAddress()->getDisplayName());
|
||||||
if (mDisplayName.isEmpty()) {
|
if (mDisplayName.isEmpty()) {
|
||||||
mDisplayName = ToolModel::getDisplayName(mAddress);
|
mDisplayName = ToolModel::getDisplayName(mAddress);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -132,30 +132,6 @@ VariantObject *Utils::findLocalAccountByAddress(const QString &address) {
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
VariantObject *Utils::findParticipantFromDevice(QString conferenceAddress, QString deviceAddress) {
|
|
||||||
VariantObject *data = new VariantObject("findParticipantFromDevice");
|
|
||||||
if (!data) return nullptr;
|
|
||||||
data->makeRequest([conferenceAddress, deviceAddress]() {
|
|
||||||
auto linCall = ToolModel::getCallByRemoteAddress(conferenceAddress);
|
|
||||||
if (linCall) {
|
|
||||||
auto linConf = linCall->getConference();
|
|
||||||
if (linConf) {
|
|
||||||
auto linAddress = ToolModel::interpretUrl(deviceAddress);
|
|
||||||
if (linAddress) {
|
|
||||||
auto participant = linConf->findParticipant(linAddress);
|
|
||||||
if (participant) {
|
|
||||||
auto participantCore = ParticipantCore::create(participant);
|
|
||||||
return QVariant::fromValue(new ParticipantGui(participantCore));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return QVariant();
|
|
||||||
});
|
|
||||||
data->requestValue();
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Utils::createCall(const QString &sipAddress,
|
void Utils::createCall(const QString &sipAddress,
|
||||||
QVariantMap options,
|
QVariantMap options,
|
||||||
LinphoneEnums::MediaEncryption mediaEncryption,
|
LinphoneEnums::MediaEncryption mediaEncryption,
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,6 @@ public:
|
||||||
Q_INVOKABLE static QString getFamilyNameFromFullName(const QString &fullName);
|
Q_INVOKABLE static QString getFamilyNameFromFullName(const QString &fullName);
|
||||||
Q_INVOKABLE static QString getInitials(const QString &username); // Support UTF32
|
Q_INVOKABLE static QString getInitials(const QString &username); // Support UTF32
|
||||||
Q_INVOKABLE static VariantObject *findLocalAccountByAddress(const QString &address);
|
Q_INVOKABLE static VariantObject *findLocalAccountByAddress(const QString &address);
|
||||||
Q_INVOKABLE static VariantObject *findParticipantFromDevice(QString conferenceAddress, QString deviceAddress);
|
|
||||||
|
|
||||||
Q_INVOKABLE static void
|
Q_INVOKABLE static void
|
||||||
createCall(const QString &sipAddress,
|
createCall(const QString &sipAddress,
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,6 @@ Item {
|
||||||
call: mainItem.call
|
call: mainItem.call
|
||||||
displayAll: !mainItem.conference
|
displayAll: !mainItem.conference
|
||||||
participantDevice: mainItem.conference && mainItem.conference.core.activeSpeakerDevice
|
participantDevice: mainItem.conference && mainItem.conference.core.activeSpeakerDevice
|
||||||
participant: mainItem.conference && mainItem.conference.core.activeSpeaker
|
|
||||||
property var address: participantDevice && participantDevice.core.address
|
property var address: participantDevice && participantDevice.core.address
|
||||||
videoEnabled: (participantDevice && participantDevice.core.videoEnabled) || (!participantDevice && call && call.core.remoteVideoEnabled)
|
videoEnabled: (participantDevice && participantDevice.core.videoEnabled) || (!participantDevice && call && call.core.remoteVideoEnabled)
|
||||||
qmlName: 'AS'
|
qmlName: 'AS'
|
||||||
|
|
@ -78,8 +77,6 @@ Item {
|
||||||
anchors.bottomMargin: 15 * DefaultStyle.dp// Spacing
|
anchors.bottomMargin: 15 * DefaultStyle.dp// Spacing
|
||||||
qmlName: 'S_'+index
|
qmlName: 'S_'+index
|
||||||
visible: parent.visible
|
visible: parent.visible
|
||||||
property var participantObj: mainItem.call && $modelData ? UtilsCpp.findParticipantFromDevice(mainItem.call.core.remoteAddress, $modelData.core.address) : null
|
|
||||||
participant: participantObj ? participantObj.value : null
|
|
||||||
participantDevice: $modelData
|
participantDevice: $modelData
|
||||||
displayAll: false
|
displayAll: false
|
||||||
displayPresence: false
|
displayPresence: false
|
||||||
|
|
|
||||||
|
|
@ -45,12 +45,11 @@ Mosaic {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
qmlName: 'G_'+index
|
qmlName: 'G_'+index
|
||||||
call: grid.call && !grid.call.core.isConference ? grid.call : null
|
call: grid.call && !grid.call.core.isConference ? grid.call : null
|
||||||
account: index == 0 ? accountProxy.findAccountByAddress(mainItem.localAddress) : null
|
property var accountObj: UtilsCpp.findLocalAccountByAddress(mainItem.localAddress)
|
||||||
|
account: (index == 0 && accountObj) ? accountObj.value : null
|
||||||
displayAll: false
|
displayAll: false
|
||||||
displayPresence: false
|
displayPresence: false
|
||||||
participantDevice: avatarCell.currentDevice
|
participantDevice: avatarCell.currentDevice
|
||||||
property var participantObj: (mainItem.call && avatarCell.currentDevice) ? UtilsCpp.findParticipantFromDevice(mainItem.call.core.remoteAddress, avatarCell.currentDevice.core.address) : null
|
|
||||||
participant: participantObj ? participantObj.value : null
|
|
||||||
Component.onCompleted: console.log(qmlName + " is " +(call ? call.core.remoteAddress : currentDevice ? currentDevice.core.address : 'addr_NotDefined'))
|
Component.onCompleted: console.log(qmlName + " is " +(call ? call.core.remoteAddress : currentDevice ? currentDevice.core.address : 'addr_NotDefined'))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,6 @@ Item {
|
||||||
property var callState: call && call.core.state || undefined
|
property var callState: call && call.core.state || undefined
|
||||||
property AccountGui account: null
|
property AccountGui account: null
|
||||||
property ParticipantDeviceGui participantDevice: null
|
property ParticipantDeviceGui participantDevice: null
|
||||||
property ParticipantGui participant: null
|
|
||||||
property bool displayBorder : participantDevice && participantDevice.core.isSpeaking || false
|
property bool displayBorder : participantDevice && participantDevice.core.isSpeaking || false
|
||||||
property alias displayPresence: avatar.displayPresence
|
property alias displayPresence: avatar.displayPresence
|
||||||
property color color: DefaultStyle.grey_600
|
property color color: DefaultStyle.grey_600
|
||||||
|
|
@ -46,8 +45,8 @@ Item {
|
||||||
property string localName: localNameObj ? localNameObj.value : ""
|
property string localName: localNameObj ? localNameObj.value : ""
|
||||||
property string displayName: account
|
property string displayName: account
|
||||||
? account.core.displayName
|
? account.core.displayName
|
||||||
: participant
|
: participantDevice
|
||||||
? participant.core.displayName
|
? participantDevice.core.displayName
|
||||||
: call
|
: call
|
||||||
? previewEnabled
|
? previewEnabled
|
||||||
? localName
|
? localName
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue