diff --git a/client/client.pro b/client/client.pro
index b6b00330..c972acc8 100644
--- a/client/client.pro
+++ b/client/client.pro
@@ -75,7 +75,8 @@ HEADERS += \
logger.h \
loghandler.h \
loglevel.h \
- constants.h
+ constants.h \
+ platforms/ios/QRCodeReader.h
SOURCES += \
configurators/cloak_configurator.cpp \
@@ -126,8 +127,8 @@ SOURCES += \
vpnconnection.cpp \
protocols/vpnprotocol.cpp \
logger.cpp \
- loghandler.cpp
-
+ loghandler.cpp \
+ platforms/ios/QRCodeReader.cpp
RESOURCES += \
resources.qrc
@@ -296,10 +297,12 @@ ios {
platforms/ios/bigint.h \
platforms/ios/bigintipv6addr.h \
platforms/ios/ipaddress.h \
- platforms/ios/ipaddressrange.h \
- platforms/ios/QRCodeReader.h
+ platforms/ios/ipaddressrange.h
- SOURCES += \
+ SOURCES -= \
+ platforms/ios/QRCodeReader.cpp
+
+ SOURCES += \
protocols/ios_vpnprotocol.mm \
platforms/ios/iosnotificationhandler.mm \
platforms/ios/json.cpp \
diff --git a/client/platforms/ios/QRCodeReader.cpp b/client/platforms/ios/QRCodeReader.cpp
new file mode 100644
index 00000000..c422a0e7
--- /dev/null
+++ b/client/platforms/ios/QRCodeReader.cpp
@@ -0,0 +1,14 @@
+#include "QRCodeReader.h"
+
+QRCodeReader::QRCodeReader()
+{
+
+}
+
+QRect QRCodeReader::cameraSize() {
+ return QRect();
+}
+
+void QRCodeReader::startReading() {}
+void QRCodeReader::stopReading() {}
+void QRCodeReader::setCameraSize(QRect) {};
diff --git a/client/resources.qrc b/client/resources.qrc
index cb7877ff..db61db33 100644
--- a/client/resources.qrc
+++ b/client/resources.qrc
@@ -157,5 +157,6 @@
images/svg/control_point_black_24dp.svg
images/svg/settings_suggest_black_24dp.svg
ui/qml/Controls/SvgButtonType.qml
+ ui/qml/Pages/PageQrDecoderIos.qml
diff --git a/client/ui/pages.h b/client/ui/pages.h
index b111679a..d74c64a6 100644
--- a/client/ui/pages.h
+++ b/client/ui/pages.h
@@ -24,7 +24,7 @@ enum class Page {Start = 0, NewServer, NewServerProtocols, Vpn,
Wizard, WizardLow, WizardMedium, WizardHigh, WizardVpnMode, ServerConfiguringProgress,
GeneralSettings, AppSettings, NetworkSettings, ServerSettings,
ServerContainers, ServersList, ShareConnection, Sites,
- ProtocolSettings, ProtocolShare, QrDecoder, About};
+ ProtocolSettings, ProtocolShare, QrDecoder, QrDecoderIos, About};
Q_ENUM_NS(Page)
static void declareQmlPageEnum() {
diff --git a/client/ui/qml/Pages/PageQrDecoder.qml b/client/ui/qml/Pages/PageQrDecoder.qml
index ead2dde3..f432b742 100644
--- a/client/ui/qml/Pages/PageQrDecoder.qml
+++ b/client/ui/qml/Pages/PageQrDecoder.qml
@@ -3,7 +3,6 @@ import QtQuick.Controls 2.12
import PageEnum 1.0
import QtMultimedia 5.5
import QZXing 3.2
-import QRCodeReader 1.0
import "./"
import "../Controls"
@@ -27,7 +26,7 @@ PageBase {
}
Connections {
- target: QrDecoderLogic
+ target: Qt.platform.os != "ios" ? QrDecoderLogic : nil
function onStartDecode() {
console.debug("Starting QR decoder")
loader.sourceComponent = component
@@ -53,125 +52,108 @@ PageBase {
Item {
anchors.fill: parent
- QRCodeReader {
- id: qrCodeReader
-
- onCodeReaded: {
- QrDecoderLogic.onDetectedQrCode(code)
+ Camera
+ {
+ id:camera
+ focus {
+ focusMode: CameraFocus.FocusContinuous
+ focusPointMode: CameraFocus.FocusPointAuto
}
-
- Component.onCompleted: {
- qrCodeReader.setCameraSize(Qt.rect(loader.x,
- loader.y,
- loader.width,
- loader.height))
- qrCodeReader.startReading()
- }
- Component.onDestruction: qrCodeReader.stopReading()
}
-// Camera
-// {
-// id:camera
-// focus {
-// focusMode: CameraFocus.FocusContinuous
-// focusPointMode: CameraFocus.FocusPointAuto
-// }
-// }
-
-// VideoOutput
-// {
-// id: videoOutput
-// source: camera
-// anchors.top: parent.top
-// anchors.bottom: parent.bottom
-// anchors.left: parent.left
-// anchors.right: parent.right
-// autoOrientation: true
-// fillMode: VideoOutput.PreserveAspectFit
-// filters: [ zxingFilter ]
+ VideoOutput
+ {
+ id: videoOutput
+ source: camera
+ anchors.top: parent.top
+ anchors.bottom: parent.bottom
+ anchors.left: parent.left
+ anchors.right: parent.right
+ autoOrientation: true
+ fillMode: VideoOutput.PreserveAspectFit
+ filters: [ zxingFilter ]
-// Rectangle {
-// color: "black"
-// opacity: 0.5
-// width: videoOutput.contentRect.width * 0.15
-// height: videoOutput.contentRect.height
-// x: (videoOutput.width - videoOutput.contentRect.width)/2
-// anchors.verticalCenter: videoOutput.verticalCenter
-// }
+ Rectangle {
+ color: "black"
+ opacity: 0.5
+ width: videoOutput.contentRect.width * 0.15
+ height: videoOutput.contentRect.height
+ x: (videoOutput.width - videoOutput.contentRect.width)/2
+ anchors.verticalCenter: videoOutput.verticalCenter
+ }
-// Rectangle {
-// color: "black"
-// opacity: 0.5
-// width: videoOutput.contentRect.width * 0.15
-// height: videoOutput.contentRect.height
-// x: videoOutput.width/2 + videoOutput.contentRect.width/2 - videoOutput.contentRect.width * 0.15
-// anchors.verticalCenter: videoOutput.verticalCenter
-// }
+ Rectangle {
+ color: "black"
+ opacity: 0.5
+ width: videoOutput.contentRect.width * 0.15
+ height: videoOutput.contentRect.height
+ x: videoOutput.width/2 + videoOutput.contentRect.width/2 - videoOutput.contentRect.width * 0.15
+ anchors.verticalCenter: videoOutput.verticalCenter
+ }
-// Rectangle {
-// color: "black"
-// opacity: 0.5
-// width: videoOutput.contentRect.width * 0.7
-// height: videoOutput.contentRect.height * 0.15
-// x: (videoOutput.width - videoOutput.contentRect.width)/2 + videoOutput.contentRect.width * 0.15
-// y: (videoOutput.height - videoOutput.contentRect.height)/2
-// }
+ Rectangle {
+ color: "black"
+ opacity: 0.5
+ width: videoOutput.contentRect.width * 0.7
+ height: videoOutput.contentRect.height * 0.15
+ x: (videoOutput.width - videoOutput.contentRect.width)/2 + videoOutput.contentRect.width * 0.15
+ y: (videoOutput.height - videoOutput.contentRect.height)/2
+ }
-// Rectangle {
-// color: "black"
-// opacity: 0.5
-// width: videoOutput.contentRect.width * 0.7
-// height: videoOutput.contentRect.height * 0.15
-// x: (videoOutput.width - videoOutput.contentRect.width)/2 + videoOutput.contentRect.width * 0.15
-// y: videoOutput.height/2 + videoOutput.contentRect.height/2 - videoOutput.contentRect.height * 0.15
-// }
+ Rectangle {
+ color: "black"
+ opacity: 0.5
+ width: videoOutput.contentRect.width * 0.7
+ height: videoOutput.contentRect.height * 0.15
+ x: (videoOutput.width - videoOutput.contentRect.width)/2 + videoOutput.contentRect.width * 0.15
+ y: videoOutput.height/2 + videoOutput.contentRect.height/2 - videoOutput.contentRect.height * 0.15
+ }
-// LabelType {
-// width: parent.width
-// text: qsTr("Decoded QR chunks " + QrDecoderLogic.receivedChunksCount + "/" + QrDecoderLogic.totalChunksCount)
-// horizontalAlignment: Text.AlignLeft
-// visible: QrDecoderLogic.totalChunksCount > 0
-// anchors.horizontalCenter: videoOutput.horizontalCenter
-// y: videoOutput.height/2 + videoOutput.contentRect.height/2
-// }
-// }
+ LabelType {
+ width: parent.width
+ text: qsTr("Decoded QR chunks " + QrDecoderLogic.receivedChunksCount + "/" + QrDecoderLogic.totalChunksCount)
+ horizontalAlignment: Text.AlignLeft
+ visible: QrDecoderLogic.totalChunksCount > 0
+ anchors.horizontalCenter: videoOutput.horizontalCenter
+ y: videoOutput.height/2 + videoOutput.contentRect.height/2
+ }
+ }
-// QZXingFilter
-// {
-// id: zxingFilter
-// orientation: videoOutput.orientation
-// captureRect: {
-// // setup bindings
-// videoOutput.contentRect;
-// videoOutput.sourceRect;
-// return videoOutput.mapRectToSource(videoOutput.mapNormalizedRectToItem(Qt.rect(
-// 0.15, 0.15, 0.7, 0.7 //0, 0, 1.0, 1.0
-// )));
-// }
+ QZXingFilter
+ {
+ id: zxingFilter
+ orientation: videoOutput.orientation
+ captureRect: {
+ // setup bindings
+ videoOutput.contentRect;
+ videoOutput.sourceRect;
+ return videoOutput.mapRectToSource(videoOutput.mapNormalizedRectToItem(Qt.rect(
+ 0.15, 0.15, 0.7, 0.7 //0, 0, 1.0, 1.0
+ )));
+ }
-// decoder {
-// enabledDecoders: QZXing.DecoderFormat_QR_CODE
+ decoder {
+ enabledDecoders: QZXing.DecoderFormat_QR_CODE
-// onTagFound: {
-// QrDecoderLogic.onDetectedQrCode(tag)
-// }
+ onTagFound: {
+ QrDecoderLogic.onDetectedQrCode(tag)
+ }
-// tryHarder: true
-// }
+ tryHarder: true
+ }
-// property int framesDecoded: 0
-// property real timePerFrameDecode: 0
+ property int framesDecoded: 0
+ property real timePerFrameDecode: 0
-// onDecodingFinished:
-// {
-// timePerFrameDecode = (decodeTime + framesDecoded * timePerFrameDecode) / (framesDecoded + 1);
-// framesDecoded++;
-// if(succeeded)
-// console.log("frame finished: " + succeeded, decodeTime, timePerFrameDecode, framesDecoded);
-// }
-// }
+ onDecodingFinished:
+ {
+ timePerFrameDecode = (decodeTime + framesDecoded * timePerFrameDecode) / (framesDecoded + 1);
+ framesDecoded++;
+ if(succeeded)
+ console.log("frame finished: " + succeeded, decodeTime, timePerFrameDecode, framesDecoded);
+ }
+ }
}
diff --git a/client/ui/qml/Pages/PageQrDecoderIos.qml b/client/ui/qml/Pages/PageQrDecoderIos.qml
new file mode 100644
index 00000000..7dd077dd
--- /dev/null
+++ b/client/ui/qml/Pages/PageQrDecoderIos.qml
@@ -0,0 +1,76 @@
+import QtQuick 2.12
+import QtQuick.Controls 2.12
+import PageEnum 1.0
+import QRCodeReader 1.0
+
+import "./"
+import "../Controls"
+import "../Config"
+
+PageBase {
+ id: root
+ page: PageEnum.QrDecoderIos
+ logic: QrDecoderLogic
+
+ onDeactivated: {
+ console.debug("Stopping QR decoder")
+ loader.sourceComponent = undefined
+ }
+
+ BackButton {
+ }
+ Caption {
+ id: caption
+ text: qsTr("Import configuration")
+ }
+
+ Connections {
+ target: Qt.platform.os == "ios" ? QrDecoderLogic : nil
+ function onStartDecode() {
+ console.debug("Starting QR decoder")
+ loader.sourceComponent = component
+ }
+ function onStopDecode() {
+ console.debug("Stopping QR decoder")
+ loader.sourceComponent = undefined
+ }
+ }
+
+ Loader {
+ id: loader
+
+ anchors.top: caption.bottom
+ anchors.bottom: parent.bottom
+ anchors.left: parent.left
+ anchors.right: parent.right
+ }
+
+ Component {
+ id: component
+
+ Item {
+ anchors.fill: parent
+
+ QRCodeReader {
+ id: qrCodeReader
+
+ onCodeReaded: {
+ QrDecoderLogic.onDetectedQrCode(code)
+ }
+
+ Component.onCompleted: {
+ qrCodeReader.setCameraSize(Qt.rect(loader.x,
+ loader.y,
+ loader.width,
+ loader.height))
+ qrCodeReader.startReading()
+ }
+ Component.onDestruction: qrCodeReader.stopReading()
+ }
+
+ }
+
+ }
+
+
+}
diff --git a/client/ui/qml/Pages/PageStart.qml b/client/ui/qml/Pages/PageStart.qml
index 26fc5e5f..3ff11a86 100644
--- a/client/ui/qml/Pages/PageStart.qml
+++ b/client/ui/qml/Pages/PageStart.qml
@@ -135,7 +135,11 @@ PageBase {
text: qsTr("Scan QR code")
visible: StartPageLogic.pushButtonConnectVisible
onClicked: {
- UiLogic.goToPage(PageEnum.QrDecoder)
+ if (Qt.platform.os == "ios") {
+ UiLogic.goToPage(PageEnum.QrDecoderIos)
+ } else {
+ UiLogic.goToPage(PageEnum.QrDecoder)
+ }
}
enabled: StartPageLogic.pushButtonConnectEnabled
}