diff --git a/android-sources/AndroidManifest.xml b/android/AndroidManifest.xml similarity index 99% rename from android-sources/AndroidManifest.xml rename to android/AndroidManifest.xml index 650953d..6c2852d 100644 --- a/android-sources/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -72,5 +72,5 @@ - + diff --git a/android-sources/build.gradle b/android/build.gradle similarity index 97% rename from android-sources/build.gradle rename to android/build.gradle index 443a800..36ab286 100644 --- a/android-sources/build.gradle +++ b/android/build.gradle @@ -74,4 +74,8 @@ android { minSdkVersion = qtMinSdkVersion targetSdkVersion = qtTargetSdkVersion } + + lintOptions { + checkReleaseBuilds false + } } diff --git a/android-sources/gradle.properties b/android/gradle.properties similarity index 100% rename from android-sources/gradle.properties rename to android/gradle.properties diff --git a/android-sources/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from android-sources/gradle/wrapper/gradle-wrapper.jar rename to android/gradle/wrapper/gradle-wrapper.jar diff --git a/android-sources/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from android-sources/gradle/wrapper/gradle-wrapper.properties rename to android/gradle/wrapper/gradle-wrapper.properties diff --git a/android-sources/gradlew b/android/gradlew similarity index 100% rename from android-sources/gradlew rename to android/gradlew diff --git a/android-sources/gradlew.bat b/android/gradlew.bat similarity index 100% rename from android-sources/gradlew.bat rename to android/gradlew.bat diff --git a/android-sources/res/drawable-hdpi/icon.png b/android/res/drawable-hdpi/icon.png similarity index 100% rename from android-sources/res/drawable-hdpi/icon.png rename to android/res/drawable-hdpi/icon.png diff --git a/android-sources/res/drawable-ldpi/icon.png b/android/res/drawable-ldpi/icon.png similarity index 100% rename from android-sources/res/drawable-ldpi/icon.png rename to android/res/drawable-ldpi/icon.png diff --git a/android-sources/res/drawable-mdpi/icon.png b/android/res/drawable-mdpi/icon.png similarity index 100% rename from android-sources/res/drawable-mdpi/icon.png rename to android/res/drawable-mdpi/icon.png diff --git a/android-sources/res/values/libs.xml b/android/res/values/libs.xml similarity index 100% rename from android-sources/res/values/libs.xml rename to android/res/values/libs.xml diff --git a/blueROCK.pro b/blueROCK.pro index 120941a..6224de8 100644 --- a/blueROCK.pro +++ b/blueROCK.pro @@ -37,20 +37,23 @@ qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target +# Add version to define +DEFINES += APP_VERSION=\"\\\"$${VERSION}\\\"\" + HEADERS += \ headers/appsettings.h \ headers/serverconn.h DISTFILES += \ CHANGELOG.md \ - android-sources/AndroidManifest.xml \ - android-sources/build.gradle \ - android-sources/gradle.properties \ - android-sources/gradle/wrapper/gradle-wrapper.jar \ - android-sources/gradle/wrapper/gradle-wrapper.properties \ - android-sources/gradlew \ - android-sources/gradlew.bat \ - android-sources/res/values/libs.xml + android/AndroidManifest.xml \ + android/build.gradle \ + android/gradle.properties \ + android/gradle/wrapper/gradle-wrapper.jar \ + android/gradle/wrapper/gradle-wrapper.properties \ + android/gradlew \ + android/gradlew.bat \ + android/res/values/libs.xml android { QT += androidextras @@ -70,10 +73,10 @@ android { ANDROID_VERSION_NAME = $$VERSION ANDROID_VERSION_CODE = $$droidVersionCode($$ANDROID_VERSION_NAME) + message(Android version code: $$ANDROID_VERSION_CODE) include(/home/dorian/Android/Sdk/android_openssl/openssl.pri) - ANDROID_ABIS = armeabi-v7a arm64-v8a - ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android-sources + ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android } ios { @@ -81,5 +84,6 @@ ios { xcode_product_bundle_identifier_setting.value = "de.itsblue.bluerock" } +# this has to be the last line! ANDROID_ABIS = armeabi-v7a arm64-v8a diff --git a/resources/qml/Components/DisclaimerDialog.qml b/resources/qml/Components/DisclaimerDialog.qml new file mode 100644 index 0000000..c96c3cf --- /dev/null +++ b/resources/qml/Components/DisclaimerDialog.qml @@ -0,0 +1,53 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Controls.Material 2.15 + +Dialog { + id: control + + title: "" + property string content: "" + + parent: Overlay.overlay + + x: (parent.width - width) * 0.5 + y: (parent.height - height) * 0.5 + + width: parent.width * 0.8 + height: implicitHeight + + modal: true + + standardButtons: Dialog.Close + + header: Label { + text: control.title + visible: control.title + elide: Label.ElideRight + padding: 24 + bottomPadding: 0 + font.bold: true + font.pixelSize: 16 + background: Rectangle { + radius: 2 + color: control.Material.dialogColor + clip: true + } + onLinkActivated: { + Qt.openUrlExternally(link) + } + } + + contentItem: Label { + wrapMode: Text.Wrap + + width: control.width * 0.8 + height: implicitHeight + + text: control.content + + onLinkActivated: { + Qt.openUrlExternally(link) + } + } +} diff --git a/resources/qml/Components/SpeedFlowChartLocker.qml b/resources/qml/Components/SpeedFlowChartLocker.qml index b72ea2d..4418db4 100644 --- a/resources/qml/Components/SpeedFlowChartLocker.qml +++ b/resources/qml/Components/SpeedFlowChartLocker.qml @@ -40,7 +40,7 @@ Rectangle { anchors { fill: parent topMargin: parent.height * 0.05 - bottomMargin: parent.height * 0.1 + bottomMargin: parent.height * 0.05 rightMargin: parent.width * 0.1 + 20 leftMargin: parent.width * 0.1 + 20 } @@ -54,7 +54,7 @@ Rectangle { Layout.preferredHeight: height Layout.preferredWidth: width - width: lockedLayout.height * 0.1 + width: lockedLayout.height * 0.05 height: width mipmap: true @@ -92,10 +92,34 @@ Rectangle { enabled: speedFlowChartProduct.status === Product.Registered text: speedFlowChartProduct.status === Product.Registered ? "Buy now for " + speedFlowChartProduct.price - : qsTr("this item is currently unavailable") + : qsTr("This item is currently unavailable") icon.name: "buy" onClicked: speedFlowChartProduct.purchase() } + RowLayout { + + Button { + id: restorePurchaseButton + Layout.alignment: Layout.Center + visible: speedFlowChartProduct.status === Product.Registered + + flat: true + text: "restore purchase" + + onClicked: inAppProductStore.restorePurchases() + } + + Button { + id: contactSupportButton + Layout.alignment: Layout.Center + + flat: true + text: "contact support" + + onClicked: Qt.openUrlExternally("mailto:contact@itsblue.de") + } + + } } } diff --git a/resources/qml/Components/SpeedFlowChartPopup.qml b/resources/qml/Components/SpeedFlowChartPopup.qml index fcd8297..989bb42 100644 --- a/resources/qml/Components/SpeedFlowChartPopup.qml +++ b/resources/qml/Components/SpeedFlowChartPopup.qml @@ -8,7 +8,7 @@ Rectangle { property var flowchartData: ({}) // always unlock in debug mode - property bool unlocked: appSettings.read("speedBackendPurchase") === "1" || QT_DEBUG + property bool unlocked: appSettings.read("speedBackendPurchase") === "1" state: "hidden" @@ -23,17 +23,8 @@ Rectangle { color: Material.background - onStateChanged: { - if(state === "visible" && unlocked) { - speedFlowChartLoader.sourceComponent = speedFlowChartComponent - } - else if(state === "visible" && !unlocked) { - speedFlowChartLoader.sourceComponent = speedFlowChartLockerComponent - } - else { - speedFlowChartLoader.sourceComponent = undefined - } - } + onStateChanged: reloadState() + onUnlockedChanged: reloadState() function toggle() { if(control.state === "hidden"){ @@ -48,14 +39,26 @@ Rectangle { return control.state === "visible" } + function reloadState() { + if(state === "visible" && unlocked) { + speedFlowChartLoader.sourceComponent = speedFlowChartComponent + } + else if(state === "visible" && !unlocked) { + speedFlowChartLoader.sourceComponent = speedFlowChartLockerComponent + } + else { + speedFlowChartLoader.sourceComponent = undefined + } + } + Connections { target: speedFlowChartProduct function onPurchaseRestored() { - control.unlocked = appSettings.read("speedBackendPurchase") === "1" ? "unlocked":"locked" + control.unlocked = appSettings.read("speedBackendPurchase") === "1" } function onPurchaseSucceeded() { - control.unlocked = appSettings.read("speedBackendPurchase") === "1" ? "unlocked":"locked" + control.unlocked = appSettings.read("speedBackendPurchase") === "1" } } diff --git a/resources/qml/Pages/StartPage.qml b/resources/qml/Pages/StartPage.qml index 0d3ce8e..3e0d5ca 100644 --- a/resources/qml/Pages/StartPage.qml +++ b/resources/qml/Pages/StartPage.qml @@ -83,18 +83,33 @@ Page { } - ToolButton { - id: ifscDisclaimerButton - + RowLayout { anchors { horizontalCenter: parent.horizontalCenter bottom: bottomDigitalrockDisclaimerLabel.top } - text: "WHERE ARE THE IFSC RESULTS?" - font.bold: true + Button { + id: ifscDisclaimerButton - onClicked: ifscDisclaimerDialog.open() + flat: true + font.bold: true + font.pixelSize: 15 + + text: "Where are the IFSC results?" + + onClicked: ifscDisclaimerDialog.open() + } + + Button { + flat: true + + font.pixelSize: 15 + + text: "About blueROCK" + + onClicked: aboutBluerockDisclaimerDialog.open() + } } Label { @@ -120,37 +135,23 @@ Page { } } - Dialog { + + DisclaimerDialog { id: ifscDisclaimerDialog - - parent: Overlay.overlay - - x: (parent.width - width) * 0.5 - y: (parent.height - height) * 0.5 - - width: parent.width * 0.8 - height: implicitHeight - title: "Where are the IFSC results?" - modal: true + content: "Unfortunately, the IFSC has restricted the access to their data and is not willing to share results with blueROCK anymore. " + + "Because of this, blueROCK is no longer able to access and display IFSC results.

" + + "You can find current IFSC results over here and on their website." + } - standardButtons: Dialog.Close + DisclaimerDialog { + id: aboutBluerockDisclaimerDialog + title: "blueROCK v" + APP_VERSION + "
By Itsblue Development" + content: "This app was built using the Qt Framework " + + "licensed under the GNU lgplV3 license.

"+ - contentItem: Label { - wrapMode: Text.Wrap - - width: ifscDisclaimerDialog.width * 0.8 - height: implicitHeight - - text: - "Unfortunately, the IFSC has restricted the access to their data and is not willing to share results with blueROCK anymore. " + - "Because of this, blueROCK is no longer able to access and display IFSC results.

" + - "You can find current IFSC results over here and on their website." - - onLinkActivated: { - Qt.openUrlExternally(link) - } - } + "This app is open source and licensed under the GNU agplV3 license," + + "the source code can be found here." } diff --git a/resources/qml/main.qml b/resources/qml/main.qml index e0f650f..fbbafd4 100644 --- a/resources/qml/main.qml +++ b/resources/qml/main.qml @@ -478,9 +478,15 @@ Window { } Store { + id: inAppProductStore + Product { id: speedFlowChartProduct - identifier: "speed_flowchart" + //identifier: "speed_flowchart" + identifier: "android.test.purchased" + //identifier: "android.test.canceled" + //identifier: "android.test.refunded" + type: Product.Unlockable onPurchaseRestored: { diff --git a/resources/qml/qml.qrc b/resources/qml/qml.qrc index 2305758..81bf996 100644 --- a/resources/qml/qml.qrc +++ b/resources/qml/qml.qrc @@ -25,5 +25,6 @@ Components/SpeedFlowChartLocker.qml Components/SpeedFlowChartPopup.qml Components/BlueRockBadge.qml + Components/DisclaimerDialog.qml diff --git a/sources/main.cpp b/sources/main.cpp index 193c314..e099c5c 100644 --- a/sources/main.cpp +++ b/sources/main.cpp @@ -48,6 +48,8 @@ int main(int argc, char *argv[]) engine.rootContext()->setContextProperty("QT_DEBUG", false); #endif + engine.rootContext()->setContextProperty("APP_VERSION", APP_VERSION); + engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); if (engine.rootObjects().isEmpty()) return -1;