Add revision: v1.14.1

1.14 1.14.1
Governikus 2018-03-28 15:10:51 +02:00
parent aa6c4e6a6a
commit 6c17e68e8e
1232 changed files with 7291 additions and 3924 deletions

16
.travis.yml 100644
View File

@ -0,0 +1,16 @@
language: shell
sudo: required
env:
matrix:
- CHECK=format
- CHECK=docs
install:
- sudo resources/travis/setup.sh $CHECK
script:
- sudo resources/travis/build.sh $CHECK
notifications:
email: false

View File

@ -1,4 +1,4 @@
Copyright (c) 2014-2016 Governikus GmbH & Co. KG
Copyright (c) 2014-2018 Governikus GmbH & Co. KG
Authors
@ -10,6 +10,7 @@ Ingo Weinhold
Giorgio Busatto
Jan Murawski
Lars Schmertmann
Jens Trillmann

View File

@ -33,7 +33,7 @@ ELSE()
ENDIF()
PROJECT(AusweisApp2 VERSION 1.14.0 LANGUAGES ${LANGUAGES})
PROJECT(AusweisApp2 VERSION 1.14.1 LANGUAGES ${LANGUAGES})
# Set TWEAK if not defined in PROJECT_VERSION above to
# have a valid tweak version without propagating it

View File

@ -8,7 +8,7 @@ Bitte lesen Sie zunächst die Allgemeinen Geschäftsbedingungen so wie die Lizen
Allgemeine Geschäftsbedingungen
§ 1 Nutzungsbedingungen und Datenschutzhinweis
(1) Diese Allgemeine Geschäftsbedingungen (AGB) des Bundes, vertreten durch das Bundesministerium des Innern (nachfolgend "Bund") und dem Nutzer gelten für die Überlassung und Nutzung der Software AusweisApp2 (nachfolgend AusweisApp2) und deren neue Versionen, die auf der Grundlage dieser Bedingungen überlassen werden.
(1) Diese Allgemeine Geschäftsbedingungen (AGB) des Bundes, vertreten durch das Bundesministerium des Innern, für Bau und Heimat (nachfolgend "Bund") und dem Nutzer gelten für die Überlassung und Nutzung der Software AusweisApp2 (nachfolgend AusweisApp2) und deren neue Versionen, die auf der Grundlage dieser Bedingungen überlassen werden.
(2) "Nutzer" im Sinne dieses Vertrages sind natürliche Personen.
§ 2 Vertragsgegenstand und Unentgeltlichkeit

85
appveyor.yml 100644
View File

@ -0,0 +1,85 @@
version: "{build}"
environment:
matrix:
- PlatformToolset: mingw-w64
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
QTPath: C:\Qt\5.9\mingw53_32
- PlatformToolset: v140
platform: x64
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
QTPath: C:\Qt\5.9\msvc2015_64
ARCHI: amd64
- PlatformToolset: v140
platform: Win32
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
QTPath: C:\Qt\5.9\msvc2015
ARCHI: x86
- PlatformToolset: v141
platform: x64
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
QTPath: C:\Qt\5.9\msvc2017_64
ARCHI: amd64
configuration:
- Release
#- Debug
install:
- if "%PlatformToolset%"=="mingw-w64" set PATH=C:\mingw-w64\i686-5.3.0-posix-dwarf-rt_v4-rev0\mingw32\bin;%PATH:C:\Program Files\Git\usr\bin;=%
- if "%PlatformToolset%"=="v140" call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" %archi%
- if "%PlatformToolset%"=="v141" call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" %archi%
build:
verbosity: minimal
before_build:
- ps: |
Write-Output "Configuration: $env:CONFIGURATION"
Write-Output "Platform: $env:PLATFORM"
$generator = switch ($env:PLATFORMTOOLSET)
{
"v141" {"Visual Studio 15 2017"}
"v140" {"Visual Studio 14 2015"}
"mingw-w64" {"MinGW Makefiles"}
}
if ($env:PLATFORM -eq "x64")
{
$generator = "$generator Win64"
}
build_script:
- cd "%APPVEYOR_BUILD_FOLDER%"
- set PATH=%QTPATH%;%QTPATH%/bin;%PATH%
- echo %PATH%
- mkdir _build
- cd _build
- ps: |
# Use -DFORCE_LEGACY_OPENSSL=ON to build with the available openssl 1.0.2 of the appveyor build image
# otherwise openssl 1.1.x is required with an additional download and build step
cmake -G "$generator" -DCMAKE_BUILD_TYPE="$env:CONFIGURATION" -DFORCE_LEGACY_OPENSSL=ON ..
if ($LastExitCode -ne 0) {
throw "Exec: $ErrorMessage"
}
& cmake --build . --target package --config $env:CONFIGURATION
if ($LastExitCode -ne 0) {
throw "Exec: $ErrorMessage"
}
test_script:
- cd "%APPVEYOR_BUILD_FOLDER%"/_build
- set PATH=%QTPATH%;%QTPATH%/bin;%PATH%
- echo %PATH%
- ctest -VV -C "%CONFIGURATION%"
on_finish:
- cd "%APPVEYOR_BUILD_FOLDER%"
- ps: |
$version = Select-String -Path .\CMakeLists.txt -Pattern "AusweisApp2 VERSION ([0-9.]+)" | % { $_.Matches[0].Groups[1].Value }
Update-AppveyorBuild -Version "$version-$env:APPVEYOR_BUILD_NUMBER"

View File

@ -18,7 +18,7 @@ IF(MAC OR LINUX OR WIN32)
ENDIF()
MESSAGE(STATUS "Processing: ${file}")
IF(NOT "${_system}" STREQUAL "SOURCES")
IF(NOT "${_system}" STREQUAL "src")
FILE(READ ${PACKAGING_DIR}/updater/Appcast.item.json.in item)
STRING(REPLACE "AusweisApp2-" "" APPCAST_FILE_VERSION ${file})

View File

@ -26,6 +26,7 @@ IF(MSVC)
IF(WARNINGS_ARE_ERRORS)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /WX")
ENDIF()
ADD_FLAG(/Qspectre)
ELSE()
ADD_DEFINITIONS(-DQT_STRICT_ITERATORS)
@ -61,9 +62,10 @@ ELSE()
IF(ANDROID)
SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffunction-sections -fdata-sections")
IF(CMAKE_COMPILER_IS_GNUCXX)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -finline-limit=64 -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -finline-limit=64")
ENDIF()
SET(CMAKE_CXX_VISIBILITY_PRESET hidden)
ENDIF()

View File

@ -54,6 +54,25 @@ FUNCTION(ADD_FLAG)
ENDFUNCTION()
FUNCTION(QUERY_QMAKE _out _var)
IF(NOT TARGET Qt5::qmake)
MESSAGE(WARNING "qmake not found")
RETURN()
ENDIF()
GET_TARGET_PROPERTY(qmake_bin Qt5::qmake LOCATION)
EXECUTE_PROCESS(COMMAND "${qmake_bin}" -query ${_var}
RESULT_VARIABLE _result
OUTPUT_VARIABLE _output
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
IF(_result EQUAL 0)
SET(${_out} "${_output}" PARENT_SCOPE)
ENDIF()
ENDFUNCTION()
FUNCTION(GET_FILE_MATCHER _result_remove _result_keep)
IF(NOT ANDROID)
LIST(APPEND matcher_remove "_android")

View File

@ -44,6 +44,10 @@ FOREACH(dest "" "share/qt" "share/qt5")
ENDIF()
ENDFOREACH()
IF(NOT QT_TRANSLATIONS_DIR)
QUERY_QMAKE(QT_TRANSLATIONS_DIR QT_INSTALL_TRANSLATIONS)
ENDIF()
MESSAGE(STATUS "QT_HOST_PREFIX: ${QT_HOST_PREFIX}")
MESSAGE(STATUS "QT_TRANSLATIONS_DIR: ${QT_TRANSLATIONS_DIR}")
@ -62,7 +66,7 @@ IF(MINGW AND NOT CMAKE_CROSSCOMPILING)
SET(tmp_crosscompile_enabled TRUE)
SET(CMAKE_CROSSCOMPILING ON)
ENDIF()
IF(QT_VENDOR STREQUAL "Governikus")
IF(QT_VENDOR STREQUAL "Governikus" OR FORCE_LEGACY_OPENSSL)
FIND_PACKAGE(OpenSSL 1.0.2 REQUIRED) # see openssl_rsa_psk.patch
ELSE()
FIND_PACKAGE(OpenSSL 1.1 REQUIRED)

View File

@ -3,6 +3,21 @@ CMAKE_MINIMUM_REQUIRED(VERSION 3.7.1)
SET(ANDROID_SDK $ENV{ANDROID_HOME})
SET(ANDROID_BUILD_TOOLS_REVISION $ENV{ANDROID_BUILD_TOOLS_REVISION})
IF(NOT EXISTS "${ANDROID_SDK}")
MESSAGE(FATAL_ERROR "Environment variable ANDROID_HOME is undefined")
ENDIF()
IF(NOT ANDROID_BUILD_TOOLS_REVISION)
SET(_android_build_tools_dir "${ANDROID_SDK}/build-tools")
FILE(GLOB build_tools ${_android_build_tools_dir}/*)
LIST(LENGTH build_tools build_tools_len)
IF(NOT build_tools_len EQUAL 1)
MESSAGE(FATAL_ERROR "Cannot determine ANDROID_BUILD_TOOLS_REVISION: ${_android_build_tools_dir}")
ENDIF()
GET_FILENAME_COMPONENT(ANDROID_BUILD_TOOLS_REVISION "${build_tools}" NAME)
ENDIF()
SET(CMAKE_SYSTEM_NAME Android)
SET(CMAKE_ANDROID_STL_TYPE gnustl_shared)

View File

@ -0,0 +1,68 @@
AusweisApp2 1.14.1
^^^^^^^^^^^^^^^^^^
**Releasedatum:** 28. März 2018
Anwender
""""""""
- Die Nutzung der PIN-Verwaltung ist nun auch mit der Funktion
"Smartphone als Kartenleser" möglich.
- Die mobile Startseite wurde überarbeitet.
- Beim Koppeln von zwei Geräten für die Funktion "Smartphone als Kartenleser"
wird nun eine einheitliche PIN-Tastatur verwendet.
- Während einer Authentisierung wird nun eine Fortschrittsanzeige
zusammen mit dem Namen des aktuellen Authentisierungsschrittes angezeigt.
- Während der Verwendung der Funktion "Smartphone als Kartenleser" wird auf
beiden Geräten jeweils der Name des verbundenen Gerätes angezeigt.
- Die Anzeige der unterstützten Kartenlesegeräte wurde optimiert.
- Das Koppeln für die Funktion "Smartphone als Kartenleser" ist jetzt während
eines Authentisierungsvorgangs möglich und führt nicht mehr zum Abbruch des
Vorgangs.
- Bei der Android-Version der AusweisApp2 ist es jetzt möglich, den Verlauf
zu deaktivieren und Einträge zu löschen.
- Die AusweisApp2 kommt nun auch beim erneuten Starten aus dem Launchpad oder
per Doppelklick in den Vordergrund. Voraussetzung ist, dass sie bereits
vorher gestartet wurde.
- Bei einem Update bleibt der Autostart-Eintrag erhalten.
- Bei der Android-Version wird die letzte Auswahl einer
Authentisierungsmethode (NFC, Bluetooth oder WLAN) nun als bevorzugte
Methode gespeichert.
- Bei der Android-Version wurden die Fehlermeldungen / Hinweise bei
Fehleingaben optimiert.
- Der Begriff "Handbuch" wurde gegen "Online-Hilfe" ausgetauscht und an
geeigneten Stellen wurden Verlinkungen eingefügt.
- Optimierung der Anzeige der Diensteanbieter im Anbieterverzeichnis
(macOS und Windows).
- Die Funktion "Smartphone als Kartenleser" unterstützt nun auch einen
mobilen Hotspot des selben Gerätes.
- Die Unterstützung von Bildschirmlesern wurde verbessert.
Entwickler
""""""""""
- Beim Aufruf von "eID-Client?status" wird nun auch
der Header "Access-Control-Allow-Origin" gesetzt.
- Im Protokoll wird nun auch das TLS-Zertifikat angezeigt,
welches einen Fehler verursacht.
- Es wird nun TLS-Session-Resumption beim Attached-eID erzwungen.
- Fehlercode bei fehlgeschlagenen Transmits korrigiert.

View File

@ -1,7 +1,13 @@
Abkündigungen
=============
Mit der Version 1.14.0 der AusweisApp2 wird die Unterstützung
Mit der Version 1.16.0 der AusweisApp2 wird die Unterstützung
folgender Systeme eingestellt.
- OS X 10.10
Mit der Version 1.14.0 der AusweisApp2 wurde die Unterstützung
folgender Systeme eingestellt.
- OS X 10.9

View File

@ -4,6 +4,7 @@ Release Notes
.. toctree::
:maxdepth: 1
1.14.1
1.14.0
announce
issues

View File

@ -22,8 +22,5 @@ Die nachfolgende Liste bezieht sich auf die aktuelle Version der AusweisApp2.
oder eine PIN-Änderung mit Komfort-Kartenlesegerät durchgeführt wird,
kann es unter Windows und macOS zu einem Absturz kommen.
- Die PIN-Änderung über ein Smartphone als Kartenlesegerät wird nicht
unterstützt.
- Unter Umständen kommt es zu Stabilitätsproblemen der NFC-Schnittstelle
auf Android.

View File

@ -6,6 +6,7 @@ Versionszweig 1.14
.. toctree::
:maxdepth: 1
1.14.1
1.14.0

View File

@ -29,9 +29,7 @@ secure connection to AusweisApp2.
with another session ID.
- An attacker cannot grab the session ID of the previous app because
AusweisApp2 uses multiple sources of secure random number generator and
provides an optional API for the app to provide additional random number
entropy.
AusweisApp2 uses multiple sources of secure random number generator.
- An attacker cannot fake AusweisApp2 for other apps because the connection
via AIDL is bound with package name "com.governikus.ausweisapp2". Google
@ -130,7 +128,7 @@ fingerprint of the authentic SDK certificate is the following:
.. code-block:: text
B0:2A:C7:6B:50:A4:97:AE:81:0A:EA:C2:25:98:18:7B:3D:42:90:27:7D:08:51:A7:FA:8E:1A:EA:5A:97:98:70
B0 2A C7 6B 50 A4 97 AE 81 0A EA C2 25 98 18 7B 3D 42 90 27 7D 08 51 A7 FA 8E 1A EA 5A 97 98 70
@ -637,11 +635,11 @@ are shown in code listing below.
class ForegroundDispatcher
{
private Activity mActivity;
private NfcAdapter mAdapter;
private PendingIntent mPendingIntent;
private IntentFilter[] mFilters;
private String[][] mTechLists;
private final Activity mActivity;
private final NfcAdapter mAdapter;
private final PendingIntent mPendingIntent;
private final IntentFilter[] mFilters;
private final String[][] mTechLists;
ForegroundDispatcher(Activity pActivity)
{

View File

@ -313,6 +313,7 @@ ExternalProject_Add(qt
${PATCH_CMD} -p1 ${PATCH_OPTIONS} ${PATCHES_DIR}/qt-Avoid-using-deprecated-APIs-on-iOS-10.0.patch &&
${PATCH_CMD} -p1 ${PATCH_OPTIONS} ${PATCHES_DIR}/qt-Add-IsoDep-to-the-techList-on-Android.patch &&
${PATCH_CMD} -p1 ${PATCH_OPTIONS} ${PATCHES_DIR}/qt-macOS-iOS-Fix-garbled-text-under-some-conditions.patch &&
${PATCH_CMD} -p1 ${PATCH_OPTIONS} ${PATCHES_DIR}/qt-Fix-reopening-on-macOS.patch &&
${CMAKE_COMMAND} -E touch qtbase/.gitignore
CONFIGURE_COMMAND ${QT_ENV} ${QT_CONFIGURE} ${QT_CONFIGURE_FLAGS} ${QT_CONFIGURE_FLAGS_SKIP_MODULES}
BUILD_COMMAND ${MAKE} ${MAKE_JOBS}

View File

@ -0,0 +1,49 @@
From d9c149dbc2021ed1e82cd34ae30dfd39f7d82a8d Mon Sep 17 00:00:00 2001
From: Jens Trillmann <jens.trillmann@governikus.de>
Date: Mon, 12 Mar 2018 12:06:05 +0100
Subject: [PATCH] Fix reopening on macOS
When a user reopens an application while the application is already
running, then macOS does not run the application a second time but
sends kAEReopenApplication to inform the running instance.
Qt ignores this event and the application does not open. To handle this
event a new event handler is registered. The application state is set
to Qt::ApplicationActive when the handler is called. An application that
wants to react to reopening has to react to QEvent::ApplicationActivate
in the running QApplication.
Change-Id: Ic3adeb6b334c85f36671c254657170c71a2dfb59
---
src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git x/qtbase/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm y/qtbase/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm
index a94e0dc517..ccf16addea 100644
--- x/qtbase/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm
+++ y/qtbase/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm
@@ -259,6 +259,10 @@ - (void) applicationWillFinishLaunching:(NSNotification *)notification
andSelector:@selector(appleEventQuit:withReplyEvent:)
forEventClass:kCoreEventClass
andEventID:kAEQuitApplication];
+ [eventManager setEventHandler:self
+ andSelector:@selector(appleEventReopen:withReplyEvent:)
+ forEventClass:kCoreEventClass
+ andEventID:kAEReopenApplication];
[eventManager setEventHandler:self
andSelector:@selector(getUrl:withReplyEvent:)
forEventClass:kInternetEventClass
@@ -438,4 +442,11 @@ - (void)appleEventQuit:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEv
[NSApp terminate:self];
}
+- (void)appleEventReopen:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)replyEvent
+{
+ Q_UNUSED(event);
+ Q_UNUSED(replyEvent);
+ QWindowSystemInterface::handleApplicationStateChanged(Qt::ApplicationActive, true);
+}
+
@end
--
2.14.3 (Apple Git-98)

View File

@ -85,5 +85,6 @@
<file>images/phone_bluetooth.svg</file>
<file>images/location_flag_de.svg</file>
<file>images/location_flag_en.svg</file>
<file>images/siteWithLogo.png</file>
</qresource>
</RCC>

View File

@ -2,9 +2,6 @@
<qresource prefix="/">
<file>html_templates/alreadyactive.html</file>
<file>html_templates/error.html</file>
<file>stylesheets/common.qss</file>
<file>stylesheets/macos.qss</file>
<file>stylesheets/windows.qss</file>
<file>stylesheets/desktop.qss</file>
<file>images/beta.svg</file>
<file>images/green_check_mark.svg</file>
@ -12,7 +9,6 @@
<file>images/MenuUnselected.png</file>
<file>images/MenuUnselectedDisabled.png</file>
<file>images/npa.ico</file>
<file>images/siteWithLogo.png</file>
<file>images/Logo_AutentApp2_2014.png</file>
<file>images/AppLogo_AutentApp2_2014.png</file>
<file>images/start_nPA_eAT.png</file>

View File

@ -21,11 +21,6 @@
<file>images/android/navigation/support.svg</file>
<file>images/android/navigation/bewerten.svg</file>
<file>images/android/navigation/teilen.svg</file>
<file>images/android/mdpi/haken.png</file>
<file>images/android/hdpi/haken.png</file>
<file>images/android/xhdpi/haken.png</file>
<file>images/android/xxhdpi/haken.png</file>
<file>images/android/xxxhdpi/haken.png</file>
<file>images/android/checkbox_0.svg</file>
<file>images/android/checkbox_1.svg</file>
<file>images/android/tabDivider.svg</file>

View File

@ -173,9 +173,7 @@
"selfAuthentication": {
"_comment_1": "TCTokenURL for self authentication (AusweisAuskunft)",
"url": "https://www.autentapp.de/AusweisAuskunft/WebServiceRequesterServlet?mode=xml",
"certDescr": "308202E0060A04007F00070301030101A10E0C0C442D547275737420476D6248A2181316687474703A2F2F7777772E642D74727573742E6E6574A3190C17476F7665726E696B757320476D6248202620436F2E4B47A41A131868747470733A2F2F7777772E617574656E746170702E6465A58202050C8202014E616D652C20416E7363687269667420756E6420452D4D61696C2D4164726573736520646573204469656E737465616E626965746572733A0D0A476F7665726E696B757320476D6248202620436F2E4B470D0A416D2046616C6C7475726D20390D0A3238333539204272656D656E0D0A6B6F6E74616B7440676F7665726E696B75732E636F6D0D0A0D0A4765736368C3A46674737A7765636B3A0D0A53656C6273746175736B756E66740D0A0D0A48696E7765697320617566206469652066C3BC722064656E204469656E737465616E626965746572207A757374C3A46E646967656E205374656C6C656E2C20646965206469652045696E68616C74756E672064657220566F7273636872696674656E207A756D20446174656E73636875747A206B6F6E74726F6C6C696572656E3A0D0A446572204C616E64657362656175667472616774652066C3BC7220446174656E73636875747A20756E6420496E666F726D6174696F6E736672656968656974206465722046726569656E2048616E73657374616474204272656D656E0D0A41726E647473747261C39F6520310D0A3237353730204272656D6572686176656E0D0A303432312F3336312D323031300D0A6F666669636540646174656E73636875747A2E6272656D656E2E64650D0A687474703A2F2F7777772E646174656E73636875747A2E6272656D656E2E64650D0AA7683166042029F04459C39E4B68C70AA3961FA7B1B40E8A49238446CFE606C56FF8DC0989F404203FFF612368211F69D460DFF157F541BEBC96217D7AF6C2D4F57BF6E4A126A86C04209D8EB0BDF36B19C4AF3147E57401FD792845F0413102A7BD784DF9418098BEBE",
"testUrl": "https://test.governikus-eid.de/AusweisAuskunft/WebServiceRequesterServlet?mode=xml",
"testCertDescr": "30820266060A04007F00070301030101A1160C14476F7665726E696B757320546573742044564341A21A1318687474703A2F2F7777772E676F7665726E696B75732E6465A31A0C18476F7665726E696B757320476D6248202620436F2E204B47A420131E68747470733A2F2F746573742E676F7665726E696B75732D6569642E6465A582014F0C82014B416E736368726966743A090D0A476F7665726E696B757320476D6248202620436F2E204B470D0A416D2046616C6C7475726D20390D0A3238333539204272656D656E090D0A0D0A452D4D61696C2D416472657373653A09686240626F732D6272656D656E2E6465090D0A0D0A5A7765636B20646573204175736C657365766F7267616E67733A0944656D6F6E7374726174696F6E20646573206549442D53657276696365090D0A0D0A5A757374C3A46E6469676520446174656E73636875747A61756673696368743A090D0A446965204C616E64657362656175667472616774652066C3BC7220446174656E73636875747A20756E6420496E666F726D6174696F6E736672656968656974206465722046726569656E2048616E73657374616474204272656D656E0D0A41726E647473747261C39F6520310D0A3237353730204272656D6572686176656EA64B134968747470733A2F2F746573742E676F7665726E696B75732D6569642E64653A3434332F417574656E742D44656D6F4170706C69636174696F6E2F5265636569766572536572766C6574A74631440420D2E54E1D26FC5DFC3408609831BBE4CFE3204365604849E7B094623566B54A760420E224D25B448DC054C023392CA11017751041D762F83D880895B3018D8EC2B290"
"testUrl": "https://test.governikus-eid.de/AusweisAuskunft/WebServiceRequesterServlet?mode=xml"
},
"updateServer": {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="96" height="96" viewBox="0 0 120 120" >
<g fill="#8e8e93">
<g fill="#ffffff">
<circle cx="60" cy="30" r="10"/>
<circle cx="60" cy="60" r="10"/>
<circle cx="60" cy="90" r="10"/>

Before

Width:  |  Height:  |  Size: 302 B

After

Width:  |  Height:  |  Size: 302 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

View File

@ -1,7 +1,7 @@
FROM scratch
MAINTAINER Governikus KG <ausweisapp2@governikus.com>
ARG version="3.6.2"
ARG version="3.7.0"
ARG arch="x86_64"
ADD alpine-minirootfs-$version-$arch.tar.gz /

View File

@ -7,7 +7,7 @@ RUN echo "[multilib]" >> /etc/pacman.conf && echo 'Include = /etc/pacman.d/mirro
RUN chown -R governikus: /var/cache/pacman/pkg/
ARG JENKINS_SWARM_VERSION=3.6
ARG JENKINS_SWARM_VERSION=3.8
ARG TINI_VERSION=0.16.1
RUN curl -L -o /sbin/tini https://github.com/krallin/tini/releases/download/v$TINI_VERSION/tini-static-muslc-amd64 && chmod 755 /sbin/tini && \
curl -L -o /swarm-client.jar https://repo.jenkins-ci.org/releases/org/jenkins-ci/plugins/swarm-client/$JENKINS_SWARM_VERSION/swarm-client-$JENKINS_SWARM_VERSION.jar
@ -25,8 +25,5 @@ RUN pacaur -Sy --noconfirm cmake ccache python2-hglib apache-ant jdk8-openjdk jr
android-platform-18 android-platform-21 android-platform-25 \
&& rm -rf /var/cache/pacman/pkg/* && rm -rf /home/governikus/.cache/pacaur
RUN pacman -Qi android-sdk-build-tools | grep Version | sed -E 's|.*r([0-9]+\.[0-9]\.[0-9]).*|export ANDROID_BUILD_TOOLS_REVISION=\1|' > /home/governikus/build_tools.sh
RUN echo '. /etc/profile ; . /home/governikus/build_tools.sh ;' >> /home/governikus/.profile
ENTRYPOINT ["/sbin/tini", "--"]
CMD sh -l -c /swarm.sh

View File

@ -4,7 +4,7 @@ MAINTAINER Governikus KG <ausweisapp2@governikus.com>
ENV NAME=Docs LABELS=Docs
# Clean up if texlive package is fixed in Alpine
RUN sed -i -e 's/v3.6/edge/' /etc/apk/repositories && \
RUN sed -i -e 's/v3.7/edge/' /etc/apk/repositories && \
echo '@testing http://dl-cdn.alpinelinux.org/alpine/edge/testing' >> /etc/apk/repositories && \
apk --no-cache add cmake make py2-sphinx py2-setuptools py2-pip py2-hglib icu-libs poppler zziplib texlive-full@testing && \
wget http://ftp.math.utah.edu/pub/tex/historic/systems/texlive/2016/texlive-20160523b-texmf.tar.xz && \

View File

@ -1,7 +1,7 @@
FROM alpine:latest
MAINTAINER Governikus KG <ausweisapp2@governikus.com>
ARG JENKINS_SWARM_VERSION=3.6
ARG JENKINS_SWARM_VERSION=3.8
ENV EXECUTOR=3 LABELS= NAME= PASSWORD=
RUN adduser governikus -s /bin/sh -D

View File

@ -11,7 +11,7 @@ fingerprints=${FINGERPRINTS:-68:21:59:5C:C0:B0:1F:78:FF:23:DE:D4:D8:05:0F:74:38:
/usr/bin/java \
-jar /swarm-client.jar \
-name $name \
-name $name-$HOSTNAME \
-mode $mode \
-executors $executor \
-labels "$labels" \
@ -19,5 +19,6 @@ fingerprints=${FINGERPRINTS:-68:21:59:5C:C0:B0:1F:78:FF:23:DE:D4:D8:05:0F:74:38:
-username $user \
-passwordEnvVariable PASSWORD \
-sslFingerprints $fingerprints \
-fsroot $dest
-fsroot $dest \
-disableClientsUniqueId

View File

@ -1,93 +0,0 @@
import common.Build
import static common.Constants.strip
def j = new Build
(
name: 'Analyze',
libraries: 'Linux',
label: 'Linux'
).generate(this)
j.with
{
wrappers
{
environmentVariables
{
env("QT_PLUGIN_PATH", '$WORKSPACE/libs/build/dist/plugins')
}
}
steps
{
shell('cd build; cmake ../source -DCMAKE_PREFIX_PATH=${WORKSPACE}/libs/build/dist -DCMAKE_CXX_COMPILER=c++-analyzer')
shell('cd build; make cloc.report')
shell('cd build; make cppcheck.report')
shell('''\
export LD_LIBRARY_PATH=$WORKSPACE/libs/build/dist/lib:$LD_LIBRARY_PATH
cd build; scan-build -o $WORKSPACE/build/result --keep-empty make ${MAKE_FLAGS}
'''.stripIndent().trim())
shell('cd build/result; mv * report')
}
publishers
{
tasks('source/**/*.cpp,source/**/*.h,source/**/*.m,source/**/*.mm,source/**/*.qml,source/**/*.js,source/**/*.cmake,source/**/CMakeLists.txt', '', 'FIXME', 'TODO', 'FINDME', true)
{
defaultEncoding('UTF-8')
}
warnings(['GNU Make + GNU C Compiler (gcc)'])
publishHtml
{
report('build/result/report')
{
reportName('Clang-Analyzer')
allowMissing(true)
keepAll(true)
alwaysLinkToLastBuild(false)
}
}
slocCount
{
pattern('build/cloc.xml')
encoding('UTF-8')
commentIsCode(false)
buildsInGraph(0)
ignoreBuildFailure(false)
}
}
configure
{
project -> project / 'publishers' << 'org.jenkinsci.plugins.cppcheck.CppcheckPublisher' {
cppcheckConfig {
pattern 'build/cppcheck*.xml'
ignoreBlankFiles 'false'
allowNoReport 'false'
configSeverityEvaluation {
threshold ''
newThreshold ''
failureThreshold ''
newFailureThreshold ''
healthy ''
unHealthy
severityError 'true'
severityWarning 'true'
severityStyle 'true'
severityPerformance 'true'
severityInformation 'true'
severityNoCategory 'false'
severityPortability 'false'
}
}
}
}
}

View File

@ -45,10 +45,21 @@ j.with
'''.stripIndent().trim())
shell('cd build; make gcovr')
shell('cd build; make cloc.report')
}
publishers
{
cobertura('build/gcovr.xml')
slocCount
{
pattern('build/cloc.xml')
encoding('UTF-8')
commentIsCode(false)
buildsInGraph(0)
ignoreBuildFailure(false)
}
}
}

View File

@ -4,7 +4,7 @@
<description></description>
<keepDependencies>false</keepDependencies>
<scm class="hudson.plugins.mercurial.MercurialSCM" plugin="mercurial@1.54">
<source>http://mercurial/AusweisApp2</source>
<source>https://hg.governikus.de/AusweisApp2</source>
<modules>resources/jenkins/dsl/</modules>
<revisionType>BRANCH</revisionType>
<revision>default</revision>

View File

@ -150,6 +150,8 @@
<!-- Normal Permissions -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.NFC"/>

View File

@ -64,13 +64,35 @@
<RegistryValue Type="string" Name="AusweisApp2-Firewall-Rule"
Value="v2.20|Action=Allow|Active=TRUE|Dir=Out|App=[INSTALL_ROOT][ProductName].exe|Name=AusweisApp2|Desc=AusweisApp2 firewall rule|"
KeyPath="no"/>
<RegistryValue Type="string" Name="AusweisApp2-Firewall-Rule-In"
Value="v2.20|Action=Allow|Active=TRUE|Dir=In|Protocol=17|LPort=24727|RA4=LocalSubnet|RA6=LocalSubnet|App=[INSTALL_ROOT][ProductName].exe|Name=AusweisApp2|Desc=Allow inbound udp connections for Smartphone as Cardreader.|Edge=TRUE|"
KeyPath="no"/>
</RegistryKey>
</Component>
</DirectoryRef>
<!-- ################################################################### -->
<!-- Add/remove SaC listening port to/from Windows Firewall -->
<!-- ################################################################### -->
<CustomAction Id="AddListeningPortWindowsFirewallSaC"
Directory="TARGETDIR"
ExeCommand="[SystemFolder]netsh.exe advfirewall firewall add rule name=AusweisApp2-Firewall-Rule-SaC-In dir=in action=allow description=&quot;Allow inbound udp connections for Smartphone as card reader.&quot; localip=any remoteip=localsubnet localport=24727 remoteport=any protocol=udp"
Execute="commit"
Impersonate="no"
Return="asyncWait" />
<InstallExecuteSequence>
<Custom Action="AddListeningPortWindowsFirewallSaC" Before="InstallFinalize">SYSTEMSETTINGS and NOT Installed</Custom>
</InstallExecuteSequence>
<CustomAction Id="DeleteListeningPortWindowsFirewallSaC"
Directory="TARGETDIR"
ExeCommand="[SystemFolder]netsh.exe advfirewall firewall delete rule name=AusweisApp2-Firewall-Rule-SaC-In"
Execute="commit"
Impersonate="no"
Return="asyncWait" />
<InstallExecuteSequence>
<Custom Action="DeleteListeningPortWindowsFirewallSaC" Before="InstallFinalize">Installed and Not REINSTALL</Custom>
</InstallExecuteSequence>
<!-- ############################# -->
<!-- Create desktop shortcut -->
<!-- ############################# -->

View File

@ -6,6 +6,7 @@ import Governikus.Global 1.0
SectionPage
{
id: baseItem
property string remoteDeviceId: ""
signal pinEntered()
onVisibleChanged: {
@ -29,8 +30,10 @@ SectionPage
anchors.verticalCenter: parent.verticalCenter
width: Utils.dp(58)
height: width
// because RowLayout uses implicitHeight that is based on sourceSize we have to explicitly set the sourceSize
sourceSize.height: baseItem.state === "REMOTE_PIN" ? Utils.dp(58) : 143
Layout.maximumWidth: width
source: "qrc:///images/NFCPhoneCard.png"
source: baseItem.state === "REMOTE_PIN" ? "qrc:///images/icon_remote.svg" : "qrc:///images/NFCPhoneCard.png"
fillMode: Image.PreserveAspectFit
}
@ -56,6 +59,7 @@ SectionPage
baseItem.state === "PIN_NEW" ? qsTr("Please enter a new 6-digit PIN of your choice.") :
baseItem.state === "PIN_NEW_AGAIN" ? qsTr("Please enter your new 6-digit PIN again.") :
baseItem.state === "PIN" ? qsTr("Please enter your personal PIN.") :
baseItem.state === "REMOTE_PIN" ? qsTr("Enter the pairing code shown on your other device to use it as a card reader.") :
/*"PIN_OR_TRANSPORT_PIN"*/ qsTr("Please enter your current PIN or your initial transport PIN first.")
) + settingsModel.translationTrigger
}
@ -108,6 +112,10 @@ SectionPage
numberModel.puk = pinField.text
baseItem.pinEntered()
break
case "REMOTE_PIN":
remoteServiceModel.connectToServer(remoteDeviceId, pinField.text)
baseItem.pinEntered()
break
}
}
}

View File

@ -23,6 +23,7 @@ Item {
TextInput {
id: echoField
color: Constants.secondary_text
verticalAlignment: TextInput.AlignVCenter
echoMode: TextInput.Password
font.pixelSize: Utils.sp(18)
@ -33,13 +34,17 @@ Item {
focus: false
validator: RegExpValidator {
regExp: baseItem.state === "PUK" ? /[0-9]{10}/ :
baseItem.state === "PIN_OR_TRANSPORT_PIN" ? /[0-9]{5,6}/ : /[0-9]{6}/ }
maximumLength: baseItem.state === "PUK" ? 10 : 6
baseItem.state === "PIN_OR_TRANSPORT_PIN" ? /[0-9]{5,6}/ :
baseItem.state === "REMOTE_PIN" ? /[0-9]{4}/ : /[0-9]{6}/
}
maximumLength: baseItem.state === "PUK" ? 10 :
baseItem.state === "REMOTE_PIN" ? 4 : 6
clip: true
}
TextInput {
id: sample
color: Constants.secondary_text
visible: false
echoMode: echoField.echoMode
font: echoField.font
@ -53,7 +58,8 @@ Item {
anchors.left: echoField.left
Repeater {
model: baseItem.state === "PUK" ? 10 : 6
model: baseItem.state === "PUK" ? 10 :
baseItem.state === "REMOTE_PIN" ? 4 : 6
delegate:
Rectangle {
width: sample.contentWidth - sample.font.letterSpacing

View File

@ -13,7 +13,7 @@ MouseArea {
anchors.centerIn: parent
font.pixelSize: Utils.sp(24)
wrapMode: Text.WordWrap
color: "black"
color: Constants.secondary_text
}
Image {

View File

@ -34,6 +34,7 @@ SectionPage {
text: titleText
}
Text {
color: Constants.secondary_text
width: parent.width
font.pixelSize: Constants.normal_font_size
wrapMode: Text.WordWrap
@ -69,6 +70,7 @@ SectionPage {
}
Text {
id: subtitle
color: Constants.secondary_text
anchors.left: parent.left
anchors.right: parent.right
text: qsTr("We are happy about every feedback on our software.") + settingsModel.translationTrigger

View File

@ -38,6 +38,7 @@ Item {
Text {
id: description
color: Gov.Constants.secondary_text
visible: text !== ""
anchors.verticalCenter: box.verticalCenter
font.pixelSize: Gov.Constants.normal_font_size

View File

@ -22,6 +22,7 @@ Item {
anchors.rightMargin: margin
font.pixelSize: Gov.Constants.normal_font_size
font.capitalization: fontUppercase
color: Gov.Constants.secondary_text
wrapMode: Text.WordWrap
onLinkActivated: parent.linkActivated(link)
}

View File

@ -10,7 +10,7 @@ Item {
readonly property color blue_dark: "#324d66"
readonly property color blue_light: "#659bcd"
readonly property color primary_text: "#ffffff"
readonly property color secondary_text: "#444444"
readonly property color secondary_text: "#4a4a4a"
readonly property color accent_color: "#7879b2"
readonly property color second_accent_color: "#a3cb7f"
readonly property int titlebar_font_size: Utils.sp(18)

View File

@ -5,10 +5,12 @@ import "."
/* Custom implementation to be replaced with template specialization of Qt.labs.controls Button*/
Rectangle {
id: rect
property alias text: textItem.text
property color buttonColor : Constants.blue
property int maxWidth: 0
property int preferedWidth: parent.width - 4 * Constants.component_spacing
property alias iconSource: icon.source
signal clicked
@ -17,13 +19,25 @@ Rectangle {
width: maxWidth > 0 ? Math.min(maxWidth, preferedWidth) : preferedWidth
clip: true
Image {
id: icon
visible: source.toString().length > 0
height: rect.height - Utils.dp(10)
width: height
anchors.left: rect.left
anchors.leftMargin: Utils.dp(5)
anchors.verticalCenter: rect.verticalCenter
}
Text {
id: textItem
anchors.centerIn: parent
color: enabled ? "white" : "#40000000"
opacity: mouseArea.containsMouse ? 0.5 : 1
anchors.leftMargin: icon.visible ? icon.width + icon.anchors.leftMargin : 0
font.pixelSize: Utils.dp(16)
}
MouseArea{
id: mouseArea
anchors.fill: parent

View File

@ -24,6 +24,7 @@ Item {
Text {
id: description
color: Constants.secondary_text
visible: text !== ""
anchors.verticalCenter: image.verticalCenter
font.pixelSize: Constants.normal_font_size

View File

@ -27,6 +27,7 @@ Item {
Text {
id: bodyText
color: Constants.secondary_text
anchors.top: labelText.bottom
anchors.left: parent.left
anchors.leftMargin: margin

View File

@ -15,6 +15,9 @@ Item {
readonly property color green: "#a3cb7f"
readonly property color red: "#cc0000"
readonly property color grey: "#8e8e93"
readonly property color lightgrey: "#d5d5dc"
readonly property color white: "#ffffff"
readonly property color black: "#000000"
readonly property color primary_text: Gov.PlatformConstants.primary_text
readonly property color secondary_text: Gov.PlatformConstants.secondary_text

View File

@ -29,6 +29,7 @@ MouseArea {
Text {
text: name
color: Gov.Constants.secondary_text
anchors.margins: Utils.dp(2)
anchors.top: parent.top

View File

@ -1,5 +1,5 @@
import QtQuick 2.5
import QtQuick.Controls 1.4
import QtQuick.Controls 2.2
import QtQuick.Controls.Styles 1.4
import QtQuick.Layouts 1.2
@ -8,12 +8,20 @@ import Governikus.TitleBar 1.0
import Governikus.Provider 1.0
SectionPage {
id: rootPage
property alias listViewModel: listView.model
property var selectedIndices: []
headerTitleBarAction: TitleBarAction { text: qsTr("History") + settingsModel.translationTrigger; font.bold: true }
rightTitleBarAction: HistoryContextMenu { historyReminderPopup: deleteHistoryConfirmationDialog }
HistoryViewConfirmationPopup {
id: deleteHistoryConfirmationDialog
baseItem: rootPage
}
Text {
color: Constants.secondary_text
anchors.centerIn: parent
text: qsTr("Currently there are no history entries.") + settingsModel.translationTrigger
wrapMode: Text.WordWrap

View File

@ -1,18 +1,27 @@
import QtQuick 2.5
import QtQuick.Controls 1.4
import QtQuick.Controls 2.2
import QtQuick.Controls.Styles 1.4
import QtQuick.Layouts 1.2
import QtQuick.Dialogs 1.2
import Governikus.Global 1.0
import Governikus.TitleBar 1.0
SectionPage {
id: rootPage
property alias listViewModel: listView.model
property var selectedIndices: []
headerTitleBarAction: TitleBarAction { text: qsTr("History") + settingsModel.translationTrigger; font.bold: true }
rightTitleBarAction: HistoryContextMenu { historyReminderPopup: deleteHistoryConfirmationDialog }
HistoryViewConfirmationPopup {
id: deleteHistoryConfirmationDialog
baseItem: rootPage
}
Text {
color: Constants.secondary_text
anchors.centerIn: parent
text: qsTr("Currently there are no history entries.") + settingsModel.translationTrigger
wrapMode: Text.WordWrap

View File

@ -62,6 +62,7 @@ SectionPage {
}
Text {
color: Constants.secondary_text
anchors.centerIn: parent
text: qsTr("Currently there are no history entries.") + settingsModel.translationTrigger
wrapMode: Text.WordWrap

View File

@ -61,6 +61,7 @@ SectionPage {
}
Text {
color: Constants.secondary_text
anchors.centerIn: parent
text: qsTr("Currently there are no history entries.") + settingsModel.translationTrigger
wrapMode: Text.WordWrap

View File

@ -0,0 +1,58 @@
import QtQuick 2.5
import QtGraphicalEffects 1.0
import Governikus.Global 1.0
MouseArea {
id: mouseArea
property alias text: textItem.text
property color buttonColor: Constants.white
readonly property int touchPadding: Utils.dp(3);
height: textItem.height + 2 * touchPadding
width: Math.max(textItem.implicitWidth + 2 * touchPadding, parent.width)
state: "normal"
states: [
State { name: "normal"; when: !mouseArea.pressed
PropertyChanges { target: darkLayer; width: 0 }
},
State { name: "pressed"; when: mouseArea.pressed
PropertyChanges { target: darkLayer; width: 2 * rect.width }
}
]
transitions: [
Transition {
from: "normal"; to: "pressed"; reversible: false
PropertyAnimation { target: darkLayer; property: "width"}
}
]
Rectangle {
id: rect
anchors.fill: parent
color: buttonColor
Item {
anchors.fill: parent
clip: true
Rectangle {
id: darkLayer
x: mouseArea.containsMouse ? mouseArea.mouseX - width * 0.5 : 0
height: parent.height
color: Constants.black
opacity: 0.2
}
}
}
Text {
id: textItem
color: Constants.secondary_text
anchors.left: rect.left
anchors.leftMargin: touchPadding
anchors.verticalCenter: rect.verticalCenter
font.pixelSize: Constants.titlebar_font_size
}
}

View File

@ -0,0 +1,103 @@
import QtQuick 2.7
import QtQuick.Controls 2.2
import Governikus.Global 1.0
MouseArea {
property var historyReminderPopup: HistoryViewConfirmationPopup { }
readonly property alias contentWidth: contextMenuButton.width
id: contextMenuButton
height: Constants.titlebar_height
width: height
anchors.right: parent ? parent.right : undefined
anchors.top: parent ? parent.top : undefined
anchors.verticalCenter: parent ? parent.verticalCenter : undefined
Image {
id: contextMenuIcon
height: Constants.titlebar_height - 2 * Constants.titlebar_padding
width: height
anchors.topMargin: Constants.titlebar_padding
anchors.right: parent.right
anchors.bottomMargin: Constants.titlebar_padding
source: "qrc:///images/android/navigation/versionsinformation.svg"
anchors.verticalCenter: parent.verticalCenter
}
onClicked: contextMenu.visible ? contextMenu.close() : contextMenu.open()
Popup {
id: contextMenu
x: -(width - contextMenuButton.width)
y: Constants.titlebar_height + Constants.titlebar_padding
closePolicy: Popup.CloseOnPressOutsideParent | Popup.CloseOnEscape
height: contentColumn.height + Constants.titlebar_padding
Column {
id: contentColumn
width: childrenRect.width
spacing: Constants.titlebar_padding
ContextMenuEntry {
text: (settingsModel.historyEnabled ? qsTr("Disable history") : qsTr("Enable history")) + settingsModel.translationTrigger
onClicked: {
settingsModel.historyEnabled = !settingsModel.historyEnabled
qmlExtension.showFeedback((settingsModel.historyEnabled ? qsTr("History enabled") : qsTr("History disabled")) + settingsModel.translationTrigger)
contextMenu.close()
}
}
Rectangle {
width: parent.width
color: Constants.grey
height: Utils.dp(1)
}
ContextMenuEntry {
text: qsTr("Delete all") + settingsModel.translationTrigger
onClicked: {
historyReminderPopup.setValues("ALL_HISTORY", qsTr("Please confirm that you want to delete your complete history."))
historyReminderPopup.open()
contextMenu.close()
}
}
ContextMenuEntry {
text: qsTr("Delete last 4 weeks") + settingsModel.translationTrigger
onClicked: {
historyReminderPopup.setValues("LAST_FOUR_WEEKS", qsTr("Please confirm that you want to delete your history from the last four weeks."))
historyReminderPopup.open()
contextMenu.close()
}
}
ContextMenuEntry {
text: qsTr("Delete last week") + settingsModel.translationTrigger
onClicked: {
historyReminderPopup.setValues("PAST_WEEK", qsTr("Please confirm that you want to delete your history from the last week."))
historyReminderPopup.open()
contextMenu.close()
}
}
ContextMenuEntry {
text: qsTr("Delete last day") + settingsModel.translationTrigger
onClicked: {
historyReminderPopup.setValues("PAST_DAY", qsTr("Please confirm that you want to delete your history from the last day."))
historyReminderPopup.open()
contextMenu.close()
}
}
ContextMenuEntry {
text: qsTr("Delete last hour") + settingsModel.translationTrigger
onClicked: {
historyReminderPopup.setValues("PAST_HOUR", qsTr("Please confirm that you want to delete your history from the last hour."))
historyReminderPopup.open()
contextMenu.close()
}
}
}
}
}

View File

@ -28,12 +28,16 @@ Item {
Rectangle {
id: purposeObject
height: purposeColumn.height
property alias truncated: purposeText.truncated
anchors.verticalCenter: parent.verticalCenter
anchors.left: showDetail ? parent.left : categoryImage.right
anchors.leftMargin: showDetail ? 0 : Utils.dp(15)
anchors.right: deleteButton.left
Column {
id: purposeColumn
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.right: parent.right
@ -56,6 +60,7 @@ Item {
}
Text {
id: subjectText
color: Constants.secondary_text
anchors.left: parent.left
anchors.right: parent.right
@ -73,11 +78,21 @@ Item {
font.pixelSize: Constants.small_font_size
color: Constants.history_delegate_address_color
wrapMode: Text.WordWrap
maximumLineCount: 2
text: historyModelItem ? !!historyModelItem.purpose ? historyModelItem.purpose : qsTr("Tap for more details") + settingsModel.translationTrigger : ""
}
}
}
Text {
visible: purposeText.truncated
anchors.left: purposeObject.right
anchors.bottom: purposeObject.bottom
font.pixelSize: Constants.small_font_size
color: Constants.history_delegate_address_color
text: "..."
}
Image {
height: Utils.dp(35)
source: "qrc:///images/android/arrowRight.svg"

View File

@ -0,0 +1,92 @@
import QtQuick 2.7
import QtQuick.Controls 2.2
import Governikus.Global 1.0
Popup {
id: popupObject
property string timePeriod: "UNKNOWN"
property string popupDescriptionString: ""
property var baseItem: Item { }
x: (baseItem.width - width) / 2
y: (baseItem.height - height) / 2
function setValues(pPeriodToRemove, pNewDescriptionString) {
timePeriod = pPeriodToRemove
popupDescriptionString = pNewDescriptionString
}
modal: true
focus: true
closePolicy: Popup.CloseOnPressOutside | Popup.CloseOnEscape
width: Utils.dp(250)
height: popupColumn.height
Column {
id: popupColumn
width: parent.width
spacing: Constants.pane_spacing
padding: Constants.pane_padding
Text {
id: header
color: Constants.secondary_text
text: qsTr("Delete history") + settingsModel.translationTrigger
font.pixelSize: Constants.header_font_size
font.bold: true
}
Text {
id: info
color: Constants.secondary_text
width: parent.width - 2 * Constants.pane_padding
wrapMode: Text.WordWrap
font.pixelSize: Constants.normal_font_size
text: popupObject.popupDescriptionString
}
Row {
id: buttonBox
anchors.right: parent.right
anchors.rightMargin: Constants.pane_padding
spacing: Constants.pane_spacing
MouseArea {
height: textItemCancel.height + 2 * Utils.dp(10)
width: textItemCancel.width + 2 * Utils.dp(10)
Text {
id: textItemCancel
anchors.centerIn: parent
text: qsTr("Cancel") + settingsModel.translationTrigger
color: Constants.blue
font.pixelSize: Constants.titlebar_font_size
}
onClicked: {
popupObject.close()
}
}
MouseArea {
height: textItemDelete.height + 2 * Utils.dp(10)
width: textItemDelete.width + 2 * Utils.dp(10)
Text {
id: textItemDelete
anchors.centerIn: parent
text: qsTr("Delete") + settingsModel.translationTrigger
color: Constants.blue
font.pixelSize: Constants.titlebar_font_size
}
onClicked: {
var removedItems = settingsModel.removeHistory(deleteHistoryConfirmationDialog.timePeriod);
qmlExtension.showFeedback(qsTr("Removed %1 entries from the history.").arg(removedItems))
popupObject.close()
}
}
}
}
}

View File

@ -1,88 +1,88 @@
import QtQuick 2.5
import QtQuick 2.7
import Governikus.Global 1.0
import Governikus.Provider 1.0
import Governikus.TitleBar 1.0
Item {
SectionPage {
id: root
height: infoPane.height + 2 * Constants.component_spacing
Column {
id: infoPane
anchors.top: parent.top
anchors.left: parent.left
anchors.right: parent.right
anchors.margins: Constants.component_spacing
spacing: Constants.pane_spacing
Text {
font.pixelSize: Constants.normal_font_size
width: parent.width
wrapMode: Text.WordWrap
text: qsTr("You are about to identify yourself towards the following service provider:") + settingsModel.translationTrigger
leftTitleBarAction: TitleBarAction {
state: "cancel"
onClicked: authModel.cancelWorkflow()
}
headerTitleBarAction: TitleBarAction { text: qsTr("Identify") + settingsModel.translationTrigger; font.bold: true }
Pane {
content: Column {
width: baseItem.width
padding: Constants.pane_padding
Row {
height: providerEntries.height
Column {
width: parent.width - 2 * Constants.pane_padding
spacing: Constants.pane_spacing
Text {
color: Constants.secondary_text
font.pixelSize: Constants.normal_font_size
width: parent.width
spacing: Constants.pane_spacing
wrapMode: Text.WordWrap
text: qsTr("You are about to identify yourself towards the following service provider:") + settingsModel.translationTrigger
}
Item {
Pane {
Row {
height: providerEntries.height
width: (parent.width - Constants.pane_spacing) / 2
width: parent.width
spacing: Constants.pane_spacing
Column {
id: providerEntries
anchors.top: parent.top
anchors.left: parent.left
anchors.right: parent.right
spacing: Constants.pane_spacing
Item {
height: providerEntries.height
width: (parent.width - Constants.pane_spacing) / 2
ProviderInfoSection {
imageSource: "qrc:///images/provider/information.svg"
title: qsTr("Service provider") + settingsModel.translationTrigger
name: certificateDescriptionModel.subjectName
}
ProviderInfoSection {
imageSource: "qrc:///images/provider/purpose.svg"
title: qsTr("Purpose for reading out requested data") + settingsModel.translationTrigger
name: certificateDescriptionModel.purpose
}
}
Column {
id: providerEntries
anchors.top: parent.top
anchors.left: parent.left
anchors.right: parent.right
spacing: Constants.pane_spacing
MouseArea {
anchors.fill: parent
onClicked: firePush(certificateDescriptionPage, {})
}
CertificateDescriptionPage {
id: certificateDescriptionPage
name: certificateDescriptionModel.subjectName
visible: false
}
}
Item {
height: parent.height
width: (parent.width - Constants.pane_spacing) / 2
GButton {
id: button
iconSource: "qrc:///images/npa.svg"
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
buttonColor: applicationModel.currentWorkflow === "" && settingsModel.useSelfauthenticationTestUri ? Constants.red : Constants.blue
text: qsTr("Identify now") + settingsModel.translationTrigger
onClicked: {
if (applicationModel.currentWorkflow === "") {
selfAuthenticationModel.startWorkflow();
ProviderInfoSection {
imageSource: "qrc:///images/provider/information.svg"
title: qsTr("Service provider") + settingsModel.translationTrigger
name: certificateDescriptionModel.subjectName
}
else if (applicationModel.currentWorkflow === "authentication") {
ProviderInfoSection {
imageSource: "qrc:///images/provider/purpose.svg"
title: qsTr("Purpose for reading out requested data") + settingsModel.translationTrigger
name: certificateDescriptionModel.purpose
}
}
MouseArea {
anchors.fill: parent
onClicked: firePush(certificateDescriptionPage, {})
}
CertificateDescriptionPage {
id: certificateDescriptionPage
name: certificateDescriptionModel.subjectName
visible: false
}
}
Item {
height: parent.height
width: (parent.width - Constants.pane_spacing) / 2
GButton {
id: button
iconSource: "qrc:///images/npa.svg"
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
text: qsTr("Identify now") + settingsModel.translationTrigger
onClicked: {
chatModel.transferAccessRights()
numberModel.continueWorkflow()
}
@ -90,65 +90,67 @@ Item {
}
}
}
}
Text {
font.pixelSize: Constants.normal_font_size
width: parent.width
wrapMode: Text.WordWrap
text: qsTr("The following data will be transferred to the service provider when you enter the PIN:") + settingsModel.translationTrigger
}
Pane {
Column {
height: childrenRect.height
Text {
color: Constants.secondary_text
font.pixelSize: Constants.normal_font_size
width: parent.width
spacing: Utils.dp(30)
wrapMode: Text.WordWrap
text: qsTr("The following data will be transferred to the service provider when you enter the PIN:") + settingsModel.translationTrigger
}
Pane {
Column {
id: transactionInfo
height: childrenRect.height
width: parent.width
visible: !!transactionInfoText.text
spacing: Utils.dp(30)
Text {
height: implicitHeight * 1.5
verticalAlignment: Text.AlignTop
text: qsTr("Transactional information") + settingsModel.translationTrigger
color: Constants.blue
font.pixelSize: Constants.header_font_size
elide: Text.ElideRight
}
Text {
id: transactionInfoText
Column {
id: transactionInfo
width: parent.width
font.pixelSize: Constants.normal_font_size
text: authModel.transactionInfo
wrapMode: Text.WordWrap
}
}
visible: !!transactionInfoText.text
Row {
width: parent.width
spacing: Constants.pane_spacing
Text {
height: implicitHeight * 1.5
verticalAlignment: Text.AlignTop
text: qsTr("Transactional information") + settingsModel.translationTrigger
color: Constants.blue
font.pixelSize: Constants.header_font_size
elide: Text.ElideRight
}
DataGroup {
id: requiredData
width: optionalData.visible ? parent.width * 0.63 : parent.width
Text {
id: transactionInfoText
color: Constants.secondary_text
title: qsTr("Required Data") + settingsModel.translationTrigger
columns: optionalData.visible ? 2 : 3
chat: chatModel.required
width: parent.width
font.pixelSize: Constants.normal_font_size
text: authModel.transactionInfo
wrapMode: Text.WordWrap
}
}
DataGroup {
id: optionalData
width: parent.width * 0.37 - Constants.pane_spacing
Row {
width: parent.width
spacing: Constants.pane_spacing
title: qsTr("Optional Data") + settingsModel.translationTrigger
chat: chatModel.optional
DataGroup {
id: requiredData
width: optionalData.visible ? parent.width * 0.63 : parent.width
title: qsTr("Required Data") + settingsModel.translationTrigger
columns: optionalData.visible ? 2 : 3
chat: chatModel.required
}
DataGroup {
id: optionalData
width: parent.width * 0.37 - Constants.pane_spacing
title: qsTr("Optional Data") + settingsModel.translationTrigger
chat: chatModel.optional
}
}
}
}

View File

@ -37,6 +37,7 @@ Rectangle {
visible: repeater.count < 1
Text {
id: emptyText
color: Constants.secondary_text
anchors.verticalCenter: parent.verticalCenter
width: parent.width
font.pixelSize: Constants.normal_font_size
@ -70,6 +71,7 @@ Rectangle {
Text {
id: text
color: Constants.secondary_text
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.right: checkBox.left

View File

@ -1,134 +1,138 @@
import QtQuick 2.5
import QtQuick 2.7
import Governikus.Global 1.0
import Governikus.Provider 1.0
import Governikus.TitleBar 1.0
Item {
height: identifycolumn.height + Utils.dp(30)
SectionPage {
id: baseItem
Column {
id: identifycolumn
anchors.top: parent.top
anchors.left: parent.left
anchors.right: parent.right
anchors.margins: Constants.component_spacing
leftTitleBarAction: TitleBarAction {
state: "cancel"
onClicked: authModel.cancelWorkflow()
}
headerTitleBarAction: TitleBarAction { text: qsTr("Identify") + settingsModel.translationTrigger; font.bold: true }
spacing: Constants.component_spacing
content: Column {
width: baseItem.width
padding: Constants.pane_padding
Text {
font.pixelSize: Constants.normal_font_size
width: parent.width
wrapMode: Text.WordWrap
text: qsTr("You are about to identify yourself towards the following service provider:") + settingsModel.translationTrigger
}
Column {
width: parent.width - 2 * Constants.pane_padding
spacing: Constants.component_spacing
Pane {
Item {
Text {
color: Constants.secondary_text
font.pixelSize: Constants.normal_font_size
width: parent.width
height: providerEntries.height
wrapMode: Text.WordWrap
text: qsTr("You are about to identify yourself towards the following service provider:") + settingsModel.translationTrigger
}
Column {
id: providerEntries
anchors.top: parent.top
anchors.left: parent.left
anchors.right: forwardAction.left
spacing: Constants.pane_spacing
Pane {
ProviderInfoSection {
imageSource: "qrc:///images/provider/information.svg"
title: qsTr("Service provider") + settingsModel.translationTrigger
Item {
width: parent.width
height: providerEntries.height
Column {
id: providerEntries
anchors.top: parent.top
anchors.left: parent.left
anchors.right: forwardAction.left
spacing: Constants.pane_spacing
ProviderInfoSection {
imageSource: "qrc:///images/provider/information.svg"
title: qsTr("Service provider") + settingsModel.translationTrigger
name: certificateDescriptionModel.subjectName
}
ProviderInfoSection {
imageSource: "qrc:///images/provider/purpose.svg"
title: qsTr("Purpose for reading out requested data") + settingsModel.translationTrigger
name: certificateDescriptionModel.purpose
}
}
Text {
id: forwardAction
anchors.right: parent.right
anchors.verticalCenter: providerEntries.verticalCenter
text: ">"
font.pixelSize: Utils.sp(22)
color: Constants.grey
}
MouseArea {
anchors.fill: parent
onClicked: firePush(certificateDescriptionPage, {})
}
CertificateDescriptionPage {
id: certificateDescriptionPage
name: certificateDescriptionModel.subjectName
visible: false
}
ProviderInfoSection {
imageSource: "qrc:///images/provider/purpose.svg"
title: qsTr("Purpose for reading out requested data") + settingsModel.translationTrigger
name: certificateDescriptionModel.purpose
}
}
Text {
id: forwardAction
anchors.right: parent.right
anchors.verticalCenter: providerEntries.verticalCenter
text: ">"
font.pixelSize: Utils.sp(22)
color: Constants.grey
}
MouseArea {
anchors.fill: parent
onClicked: firePush(certificateDescriptionPage, {})
}
CertificateDescriptionPage {
id: certificateDescriptionPage
name: certificateDescriptionModel.subjectName
visible: false
}
}
}
GButton {
iconSource: "qrc:///images/npa.svg"
anchors.horizontalCenter: parent.horizontalCenter
buttonColor: applicationModel.currentWorkflow === "" && settingsModel.useSelfauthenticationTestUri ? Constants.red : Constants.blue
text: qsTr("Identify now") + settingsModel.translationTrigger;
onClicked: {
if (applicationModel.currentWorkflow === "") {
selfAuthenticationModel.startWorkflow();
}
else if (applicationModel.currentWorkflow === "authentication") {
GButton {
iconSource: "qrc:///images/npa.svg"
anchors.horizontalCenter: parent.horizontalCenter
text: qsTr("Identify now") + settingsModel.translationTrigger;
onClicked: {
chatModel.transferAccessRights()
numberModel.continueWorkflow()
}
}
}
Text {
font.pixelSize: Constants.normal_font_size
width: parent.width
wrapMode: Text.WordWrap
text: qsTr("The following data will be transferred to the service provider when you enter the PIN:") + settingsModel.translationTrigger
}
Pane {
width: parent.width
Column {
id: transactionInfo
Text {
color: Constants.secondary_text
font.pixelSize: Constants.normal_font_size
width: parent.width
visible: !!transactionInfoText.text
wrapMode: Text.WordWrap
text: qsTr("The following data will be transferred to the service provider when you enter the PIN:") + settingsModel.translationTrigger
}
Text {
height: implicitHeight * 1.5
verticalAlignment: Text.AlignTop
text: qsTr("Transactional information") + settingsModel.translationTrigger
color: Constants.blue
font.pixelSize: Constants.header_font_size
elide: Text.ElideRight
}
Pane {
width: parent.width
Text {
id: transactionInfoText
Column {
id: transactionInfo
width: parent.width
font.pixelSize: Constants.normal_font_size
text: authModel.transactionInfo
wrapMode: Text.WordWrap
visible: !!transactionInfoText.text
Text {
height: implicitHeight * 1.5
verticalAlignment: Text.AlignTop
text: qsTr("Transactional information") + settingsModel.translationTrigger
color: Constants.blue
font.pixelSize: Constants.header_font_size
elide: Text.ElideRight
}
Text {
id: transactionInfoText
color: Constants.secondary_text
width: parent.width
font.pixelSize: Constants.normal_font_size
text: authModel.transactionInfo
wrapMode: Text.WordWrap
}
}
}
DataGroup {
title: qsTr("Required Data") + settingsModel.translationTrigger
chat: chatModel.required
}
DataGroup {
title: qsTr("Required Data") + settingsModel.translationTrigger
chat: chatModel.required
}
DataGroup {
title: qsTr("Optional Data") + settingsModel.translationTrigger
chat: chatModel.optional
DataGroup {
title: qsTr("Optional Data") + settingsModel.translationTrigger
chat: chatModel.optional
}
}
}
}

View File

@ -36,6 +36,7 @@ Rectangle {
height: Utils.dp(40)
visible: repeater.count < 1
Text {
color: Constants.secondary_text
id: emptyText
anchors.verticalCenter: parent.verticalCenter
width: parent.width
@ -70,6 +71,7 @@ Rectangle {
Text {
id: text
color: Constants.secondary_text
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.right: checkBox.left

View File

@ -1,147 +1,152 @@
import QtQuick 2.5
import QtQuick 2.7
import Governikus.Global 1.0
import Governikus.Provider 1.0
import Governikus.TitleBar 1.0
Item {
height: identifycolumn.height + Utils.dp(30)
SectionPage {
id: baseItem
Column {
id: identifycolumn
anchors.top: parent.top
anchors.left: parent.left
anchors.right: parent.right
anchors.margins: Constants.component_spacing
spacing: Constants.component_spacing
Text {
font.pixelSize: Constants.normal_font_size
width: parent.width
wrapMode: Text.WordWrap
text: qsTr("You are about to identify yourself towards the following service provider:") + settingsModel.translationTrigger
leftTitleBarAction: TitleBarAction {
state: "cancel"
onClicked: authModel.cancelWorkflow()
}
headerTitleBarAction: TitleBarAction { text: qsTr("Identify") + settingsModel.translationTrigger; font.bold: true }
Pane {
content: Column {
width: baseItem.width
padding: Constants.pane_padding
Item {
Column {
width: parent.width - 2 * Constants.pane_padding
spacing: Constants.component_spacing
Text {
color: Constants.secondary_text
font.pixelSize: Constants.normal_font_size
width: parent.width
height: providerEntries.height
wrapMode: Text.WordWrap
text: qsTr("You are about to identify yourself towards the following service provider:") + settingsModel.translationTrigger
}
Column {
id: providerEntries
anchors.top: parent.top
anchors.left: parent.left
anchors.right: forwardAction.left
spacing: Constants.pane_spacing
Pane {
ProviderInfoSection {
imageSource: "qrc:///images/provider/information.svg"
title: qsTr("Service provider") + settingsModel.translationTrigger
Item {
width: parent.width
height: providerEntries.height
Column {
id: providerEntries
anchors.top: parent.top
anchors.left: parent.left
anchors.right: forwardAction.left
spacing: Constants.pane_spacing
ProviderInfoSection {
imageSource: "qrc:///images/provider/information.svg"
title: qsTr("Service provider") + settingsModel.translationTrigger
name: certificateDescriptionModel.subjectName
}
ProviderInfoSection {
imageSource: "qrc:///images/provider/purpose.svg"
title: qsTr("Purpose for reading out requested data") + settingsModel.translationTrigger
name: certificateDescriptionModel.purpose
}
}
Text {
id: forwardAction
anchors.right: parent.right
anchors.verticalCenter: providerEntries.verticalCenter
text: ">"
font.pixelSize: Utils.sp(22)
color: Constants.grey
}
MouseArea {
anchors.fill: parent
onClicked: firePush(certificateDescriptionPage, {})
}
CertificateDescriptionPage {
id: certificateDescriptionPage
name: certificateDescriptionModel.subjectName
visible: false
}
ProviderInfoSection {
imageSource: "qrc:///images/provider/purpose.svg"
title: qsTr("Purpose for reading out requested data") + settingsModel.translationTrigger
name: certificateDescriptionModel.purpose
}
}
Text {
id: forwardAction
anchors.right: parent.right
anchors.verticalCenter: providerEntries.verticalCenter
text: ">"
font.pixelSize: Utils.sp(22)
color: Constants.grey
}
MouseArea {
anchors.fill: parent
onClicked: firePush(certificateDescriptionPage, {})
}
CertificateDescriptionPage {
id: certificateDescriptionPage
name: certificateDescriptionModel.subjectName
visible: false
}
}
}
GButton {
anchors.horizontalCenter: parent.horizontalCenter
buttonColor: applicationModel.currentWorkflow === "" && settingsModel.useSelfauthenticationTestUri ? Constants.red : Constants.blue
text: qsTr("Identify now") + settingsModel.translationTrigger;
onClicked: {
if (applicationModel.currentWorkflow === "") {
selfAuthenticationModel.startWorkflow();
}
else if (applicationModel.currentWorkflow === "authentication") {
GButton {
iconSource: "qrc:///images/npa.svg"
anchors.horizontalCenter: parent.horizontalCenter
text: qsTr("Identify now") + settingsModel.translationTrigger;
onClicked: {
chatModel.transferAccessRights()
numberModel.continueWorkflow()
}
}
}
Text {
font.pixelSize: Constants.normal_font_size
width: parent.width
wrapMode: Text.WordWrap
text: qsTr("The following data will be transferred to the service provider when you enter the PIN:") + settingsModel.translationTrigger
}
Pane {
Column {
height: childrenRect.height
Text {
color: Constants.secondary_text
font.pixelSize: Constants.normal_font_size
width: parent.width
spacing: Utils.dp(30)
wrapMode: Text.WordWrap
text: qsTr("The following data will be transferred to the service provider when you enter the PIN:") + settingsModel.translationTrigger
}
Pane {
Column {
id: transactionInfo
height: childrenRect.height
width: parent.width
visible: !!transactionInfoText.text
spacing: Utils.dp(30)
Text {
height: implicitHeight * 1.5
verticalAlignment: Text.AlignTop
text: qsTr("Transactional information") + settingsModel.translationTrigger
color: Constants.blue
font.pixelSize: Constants.header_font_size
elide: Text.ElideRight
}
Text {
id: transactionInfoText
Column {
id: transactionInfo
width: parent.width
font.pixelSize: Constants.normal_font_size
text: authModel.transactionInfo
wrapMode: Text.WordWrap
}
}
visible: !!transactionInfoText.text
Row {
width: parent.width
spacing: Constants.pane_spacing
Text {
height: implicitHeight * 1.5
verticalAlignment: Text.AlignTop
text: qsTr("Transactional information") + settingsModel.translationTrigger
color: Constants.blue
font.pixelSize: Constants.header_font_size
elide: Text.ElideRight
}
DataGroup {
id: requiredData
width: optionalData.visible ? parent.width * 0.63 : parent.width
Text {
id: transactionInfoText
color: Constants.secondary_text
title: qsTr("Required Data") + settingsModel.translationTrigger
columns: optionalData.visible ? 2 : 3
chat: chatModel.required
width: parent.width
font.pixelSize: Constants.normal_font_size
text: authModel.transactionInfo
wrapMode: Text.WordWrap
}
}
DataGroup {
id: optionalData
width: parent.width * 0.37 - Constants.pane_spacing
Row {
width: parent.width
spacing: Constants.pane_spacing
title: qsTr("Optional Data") + settingsModel.translationTrigger
chat: chatModel.optional
DataGroup {
id: requiredData
width: optionalData.visible ? parent.width * 0.63 : parent.width
title: qsTr("Required Data") + settingsModel.translationTrigger
columns: optionalData.visible ? 2 : 3
chat: chatModel.required
}
DataGroup {
id: optionalData
width: parent.width * 0.37 - Constants.pane_spacing
title: qsTr("Optional Data") + settingsModel.translationTrigger
chat: chatModel.optional
}
}
}
}

View File

@ -12,8 +12,6 @@ Pane {
id: pane
spacing: 0
visible: repeater.count > 0
anchors.topMargin: Constants.component_spacing
anchors.top: header.bottom
Repeater {
id: repeater
@ -25,6 +23,7 @@ Pane {
color: "white"
Text {
id: dataGroup
color: Constants.secondary_text
anchors.left: parent.left
anchors.verticalCenter: parent.verticalCenter
anchors.right: checkBox.left

View File

@ -1,120 +1,126 @@
import QtQuick 2.5
import QtQuick 2.7
import Governikus.Global 1.0
import Governikus.Provider 1.0
import Governikus.TitleBar 1.0
Item {
height: identifycolumn.height + Utils.dp(30)
SectionPage {
id: baseItem
Column {
id: identifycolumn
anchors.top: parent.top
anchors.left: parent.left
anchors.right: parent.right
anchors.margins: Constants.component_spacing
leftTitleBarAction: TitleBarAction {
state: "cancel"
onClicked: authModel.cancelWorkflow()
}
headerTitleBarAction: TitleBarAction { text: qsTr("Identify") + settingsModel.translationTrigger; font.bold: true }
spacing: Constants.component_spacing
content: Column {
width: baseItem.width
padding: Constants.pane_padding
Text {
font.pixelSize: Constants.normal_font_size
width: parent.width
wrapMode: Text.WordWrap
text: qsTr("You are about to identify yourself towards the following service provider:") + settingsModel.translationTrigger
}
Column {
width: parent.width - 2 * Constants.pane_padding
Pane {
spacing: Constants.component_spacing
Item {
Text {
color: Constants.secondary_text
font.pixelSize: Constants.normal_font_size
width: parent.width
height: providerEntries.height
wrapMode: Text.WordWrap
text: qsTr("You are about to identify yourself towards the following service provider:") + settingsModel.translationTrigger
}
Column {
id: providerEntries
anchors.top: parent.top
anchors.left: parent.left
anchors.right: forwardAction.left
spacing: Constants.pane_spacing
Pane {
ProviderInfoSection {
imageSource: "qrc:///images/provider/information.svg"
title: qsTr("Service provider") + settingsModel.translationTrigger
Item {
width: parent.width
height: providerEntries.height
Column {
id: providerEntries
anchors.top: parent.top
anchors.left: parent.left
anchors.right: forwardAction.left
spacing: Constants.pane_spacing
ProviderInfoSection {
imageSource: "qrc:///images/provider/information.svg"
title: qsTr("Service provider") + settingsModel.translationTrigger
name: certificateDescriptionModel.subjectName
}
ProviderInfoSection {
imageSource: "qrc:///images/provider/purpose.svg"
title: qsTr("Purpose for reading out requested data") + settingsModel.translationTrigger
name: certificateDescriptionModel.purpose
}
}
Text {
id: forwardAction
anchors.right: parent.right
anchors.verticalCenter: providerEntries.verticalCenter
text: ">"
font.pixelSize: Utils.sp(22)
color: Constants.grey
}
MouseArea {
anchors.fill: parent
onClicked: firePush(certificateDescriptionPage, {})
}
CertificateDescriptionPage {
id: certificateDescriptionPage
name: certificateDescriptionModel.subjectName
visible: false
}
ProviderInfoSection {
imageSource: "qrc:///images/provider/purpose.svg"
title: qsTr("Purpose for reading out requested data") + settingsModel.translationTrigger
name: certificateDescriptionModel.purpose
}
}
Text {
id: forwardAction
anchors.right: parent.right
anchors.verticalCenter: providerEntries.verticalCenter
text: ">"
font.pixelSize: Utils.sp(22)
color: Constants.grey
}
MouseArea {
anchors.fill: parent
onClicked: firePush(certificateDescriptionPage, {})
}
CertificateDescriptionPage {
id: certificateDescriptionPage
name: certificateDescriptionModel.subjectName
visible: false
}
}
}
GButton {
anchors.horizontalCenter: parent.horizontalCenter
buttonColor: applicationModel.currentWorkflow === "" && settingsModel.useSelfauthenticationTestUri ? Constants.red : Constants.blue
text: qsTr("Identify now") + settingsModel.translationTrigger;
onClicked: {
if (applicationModel.currentWorkflow === "") {
selfAuthenticationModel.startWorkflow();
}
else if (applicationModel.currentWorkflow === "authentication") {
GButton {
iconSource: "qrc:///images/npa.svg"
anchors.horizontalCenter: parent.horizontalCenter
text: qsTr("Identify now") + settingsModel.translationTrigger;
onClicked: {
chatModel.transferAccessRights()
numberModel.continueWorkflow()
}
}
}
Text {
font.pixelSize: Constants.normal_font_size
width: parent.width
wrapMode: Text.WordWrap
text: qsTr("The following data will be transferred to the service provider when you enter the PIN:") + settingsModel.translationTrigger
}
Pane {
id: transactionInfo
title: qsTr("Transactional information") + settingsModel.translationTrigger
visible: !!transactionInfoText.text
Text {
id: transactionInfoText
width: parent.width
color: Constants.secondary_text
font.pixelSize: Constants.normal_font_size
text: authModel.transactionInfo
width: parent.width
wrapMode: Text.WordWrap
text: qsTr("The following data will be transferred to the service provider when you enter the PIN:") + settingsModel.translationTrigger
}
}
DataGroup {
title: qsTr("Required Data") + settingsModel.translationTrigger
chat: chatModel.required
}
Pane {
id: transactionInfo
title: qsTr("Transactional information") + settingsModel.translationTrigger
visible: !!transactionInfoText.text
DataGroup {
title: qsTr("Optional Data") + settingsModel.translationTrigger
chat: chatModel.optional
Text {
id: transactionInfoText
color: Constants.secondary_text
width: parent.width
font.pixelSize: Constants.normal_font_size
text: authModel.transactionInfo
wrapMode: Text.WordWrap
}
}
DataGroup {
title: qsTr("Required Data") + settingsModel.translationTrigger
chat: chatModel.required
}
DataGroup {
title: qsTr("Optional Data") + settingsModel.translationTrigger
chat: chatModel.optional
}
}
}
}

View File

@ -1,97 +0,0 @@
import QtQuick 2.5
import QtQuick.Controls 1.4
import QtQuick.Controls.Styles 1.4
import QtGraphicalEffects 1.0
import QtQuick.Layouts 1.2
import Governikus.Global 1.0
Item {
id: header
/* this is interpreted by the SectionPage component */
readonly property real titleBarOpacity: shadow.opacity === 1 ? 1 : 0
Image {
id: dna
width: parent.width
source: "qrc:///images/iOS/Header-Ausweisapp@3x.png"
anchors.top: parent.top
anchors.bottom: parent.bottom
anchors.bottomMargin: (parent.height - 2 * Constants.titlebar_height) * transition()
function transition() {
return Math.min(1, contentY / Constants.titlebar_height)
}
Rectangle {
id: shadow
anchors.fill: parent
color: Constants.blue
opacity: Math.min(1, 0.5 + parent.transition() * 0.5)
}
}
Item {
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: information.top
LocationButton {
id: lang_de
language: "de"
name: "DE"
image: "qrc:///images/location_flag_de.svg"
anchors.margins: Constants.component_spacing
anchors.bottom: parent.bottom
anchors.right: lang_en.left
}
LocationButton {
id: lang_en
language: "en"
name: "EN"
image: "qrc:///images/location_flag_en.svg"
anchors.margins: Constants.component_spacing
anchors.bottom: parent.bottom
anchors.right: parent.right
}
}
Item {
id: information
height: Math.max(npa.height, text.height)
anchors.margins: Constants.component_spacing
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: parent.bottom
Image {
id: npa
anchors.left: parent.left
anchors.verticalCenter: information.verticalCenter
height: Utils.dp(60)
width: height
source: "qrc:///images/npa.svg"
}
Text {
id: text
anchors.verticalCenter: npa.verticalCenter
anchors.left: npa.right
anchors.leftMargin: Constants.component_spacing
anchors.right: parent.right
text: ((applicationModel.currentWorkflow !== "authentication") ?
qsTr("Hello, here you have the opportunity to view the stored data on your identity card.") :
qsTr("Hello, \"%1\" wants to read your data.").arg(certificateDescriptionModel.subjectName)
) + settingsModel.translationTrigger
wrapMode: Text.WordWrap
font.pixelSize: Constants.normal_font_size
}
}
}

View File

@ -53,21 +53,9 @@ Item {
navBar.currentIndex = 0
break
case "StateEditAccessRights":
if (applicationModel.currentWorkflow === "selfauthentication") {
chatModel.transferAccessRights()
numberModel.continueWorkflow()
}
if (applicationModel.currentWorkflow === "authentication") {
firePopAll()
}
firePush(identifyViewContent, {})
if (Qt.platform.os === "android") {
authModel.readerPlugInType = "NFC";
} else if (Qt.platform.os === "ios") {
authModel.readerPlugInType = "BLUETOOTH";
} else {
authModel.readerPlugInType = "PCSC";
}
authModel.setInitialPluginType()
break
case "StateSelectReader":
firePush(identifyWorkflow, {})
@ -96,15 +84,33 @@ Item {
setIdentifyWorkflowStateAndRequestInput("identify_enterpin", "PIN")
break
case "StateDidAuthenticateEac1":
identifyProgressView.progressBarVisible = true
setIdentifyProgressViewValue(1)
setIdentifyWorkflowStateAndContinue("identify_processing")
break
case "StateEstablishPacePuk":
authModel.cancelWorkflowOnPinBlocked()
break
case "StateDidAuthenticateEac2":
setIdentifyProgressViewValue(2)
numberModel.continueWorkflow()
break
case "StateTransmit":
setIdentifyProgressViewValue(3)
numberModel.continueWorkflow()
break
case "StateCleanUpReaderManager":
controller.showRemoveCardFeedback = numberModel.cardConnected && !authModel.isError;
numberModel.continueWorkflow()
break;
case "StateCheckRefreshAddress":
setIdentifyProgressViewValue(4)
numberModel.continueWorkflow()
break
case "StateWriteHistory":
setIdentifyProgressViewValue(5)
numberModel.continueWorkflow()
break
case "FinalState":
navBar.lockedAndHidden = true
if (controller.showRemoveCardFeedback) {
@ -123,12 +129,18 @@ Item {
navBar.lockedAndHidden = false
}
}
identifyProgressView.progressBarVisible = false
setIdentifyProgressViewValue(0)
break
default:
numberModel.continueWorkflow()
}
}
function setIdentifyProgressViewValue(value){
identifyProgressView.progressValue = value
}
function setIdentifyWorkflowState(pState) {
identifyWorkflow.state = pState
}

View File

@ -18,14 +18,21 @@ SectionPage
}
headerTitleBarAction: TitleBarAction { text: qsTr("Identify") + settingsModel.translationTrigger; font.bold: true }
content: IdentifyViewContent {
content: IdentifyViewInfo {
id: identifyViewInfo
width: identifyEditChatView.width
height: identifyEditChatView.height
}
IdentifyController {
id: identifyController
}
IdentifyViewContent {
id: identifyViewContent
visible: false
}
SelfAuthenticationData {
id: selfAuthenticationData
visible: false
@ -54,7 +61,7 @@ SectionPage
leftTitleBarAction: TitleBarAction { state: authModel.isBasicReader ? "cancel" : "hidden"; onClicked: authModel.cancelWorkflow() }
headerTitleBarAction: TitleBarAction { text: qsTr("Identify") + settingsModel.translationTrigger; font.bold: true }
visible: false
text: qsTr("Authenticate") + settingsModel.translationTrigger
text: qsTr("Authentication in progress") + settingsModel.translationTrigger
subText: (!visible ? "" :
authModel.isBasicReader ?
qsTr("Please wait a moment...") :
@ -70,7 +77,16 @@ SectionPage
qsTr("You have entered a wrong PIN three times. Your PIN is now blocked. You have to enter the PUK now for unblocking.") :
qsTr("Please wait a moment...")
) + settingsModel.translationTrigger
subTextColor: !authModel.isBasicReader && (numberModel.inputError || numberModel.pinDeactivated || state === "identify_entercan" || state === "enterpuk") ? "red" : "black"
subTextColor: !authModel.isBasicReader && (numberModel.inputError || numberModel.pinDeactivated || state === "identify_entercan" || state === "enterpuk") ? "red" : Constants.secondary_text
progressValue: 0
progressText: (progressValue == 0 ? "" :
progressValue == 1 ? qsTr("Service provider is being verified") :
progressValue == 2 ? qsTr("Card is being verified") :
progressValue == 3 ? qsTr("Reading data") :
progressValue == 4 ? qsTr("Sending data to service provider") :
progressValue == 5 ? qsTr("Preparing results") :
"") + settingsModel.translationTrigger
progressBarVisible: false
}
ProgressView {

View File

@ -0,0 +1,71 @@
import QtQuick 2.7
import Governikus.Global 1.0
import Governikus.TitleBar 1.0
Item {
id: baseItem
Column {
readonly property int maxWidth: width - 2 * Constants.pane_padding
width: baseItem.width
id: root
spacing: Constants.component_spacing
padding: Constants.pane_padding
Item {
height: childrenRect.height
width: root.maxWidth
Image {
id: useNpa
anchors.left: parent.left
width: parent.width * 0.4
fillMode: Image.PreserveAspectFit
source: "qrc:///images/siteWithLogo.png"
}
Text {
color: Constants.secondary_text
font.pixelSize: Constants.normal_font_size
anchors.verticalCenter: useNpa.verticalCenter
anchors.leftMargin: Constants.component_spacing
wrapMode: Text.WordWrap
anchors.left: useNpa.right
anchors.right: parent.right
text: qsTr("You can use your ID card anywhere you see this logo.") + settingsModel.translationTrigger
}
}
Pane {
anchors.leftMargin: Constants.pane_padding
anchors.rightMargin: Constants.pane_padding
Text {
id: info
color: Constants.secondary_text
font.pixelSize: Constants.normal_font_size
wrapMode: Text.WordWrap
anchors.left: parent.left
anchors.right: parent.right
text: qsTr("Use the button 'See my personal data' to display the data stored on your ID card."
+ " An Internet connection is required to display the data."
+ " Your personal data is neither saved nor processed in any way.")
+ settingsModel.translationTrigger
}
}
}
GButton {
iconSource: "qrc:///images/npa.svg"
anchors.bottom: baseItem.bottom
anchors.bottomMargin: Constants.pane_padding
anchors.horizontalCenter: parent.horizontalCenter
buttonColor: settingsModel.useSelfauthenticationTestUri ? Constants.red : Constants.blue
text: qsTr("See my personal data") + settingsModel.translationTrigger
enabled: applicationModel.currentWorkflow !== "authentication"
onClicked: {
selfAuthenticationModel.startWorkflow()
}
}
}

View File

@ -81,7 +81,7 @@ SectionPage {
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottom: parent.bottom
anchors.bottomMargin: Constants.component_spacing
text: qsTr("Ok") + settingsModel.translationTrigger
text: qsTr("OK") + settingsModel.translationTrigger
onClicked: root.close()
}
}

View File

@ -35,6 +35,7 @@ SectionPage {
text: titleText
}
Text {
color: Constants.secondary_text
width: parent.width
font.pixelSize: Constants.normal_font_size
wrapMode: Text.WordWrap
@ -74,6 +75,7 @@ SectionPage {
}
Text {
id: subtitle
color: Constants.secondary_text
anchors.left: parent.left
anchors.right: parent.right
text: qsTr("Here you are in the right place.") + settingsModel.translationTrigger

View File

@ -16,6 +16,13 @@ SectionPage {
color: "white"
}
onVisibleChanged: {
if (visible) {
remoteServiceModel.detectRemoteDevices = false
}
}
Column {
id: menu
width: parent.width
@ -65,7 +72,10 @@ SectionPage {
imageSource: "qrc:///images/android/navigation/remotesettings.svg"
text: qsTr("Configure remote service") + settingsModel.translationTrigger
showRightArrow: true
onClicked: firePush(remoteServiceSettings, {})
onClicked: {
remoteServiceModel.detectRemoteDevices = true
firePush(remoteServiceSettings, {})
}
}
MoreViewMenuItem {

View File

@ -25,6 +25,7 @@ Item {
Text {
id: textItem
color: Constants.secondary_text
height: parent.height
verticalAlignment: Text.AlignVCenter
anchors.left: imageItem.right

View File

@ -7,6 +7,7 @@ Item {
id: navigation
state: "identify"
width: !PlatformConstants.is_tablet || lockedAndHidden ? 0 : Constants.menubar_width
enabled: !lockedAndHidden
property bool lockedAndHidden: true
property bool isOpen: drawer.position > 0

View File

@ -29,7 +29,7 @@ Item {
anchors.verticalCenter: parent.verticalCenter
font.pixelSize: Constants.small_font_size
renderType: Text.NativeRendering
color: "black"
color: Constants.secondary_text
}
MouseArea {

View File

@ -6,6 +6,8 @@ import Governikus.Global 1.0
Item {
property bool lockedAndHidden: false
property bool isOpen: true
property int currentIndex: 0
enabled: !lockedAndHidden
id: baseItem
state: "identify"

View File

@ -19,6 +19,7 @@ Item {
Text {
id: tabText
color: Constants.secondary_text
anchors.horizontalCenter: parent.horizontalCenter
anchors.bottom: parent.bottom
anchors.bottomMargin: font.pixelSize / 10

View File

@ -36,6 +36,7 @@ Item {
Text {
id: pinDesc
color: Constants.secondary_text
anchors.margins: Utils.dp(10)
anchors.top: pinHeader.bottom

View File

@ -21,6 +21,7 @@ Item {
Text {
id: pinDesc
color: Constants.secondary_text
width: parent.width * 0.9

View File

@ -22,13 +22,7 @@ Item {
baseItem.firePopAll()
baseItem.firePush(pinWorkflow, {})
if (Qt.platform.os === "android") {
changePinModel.readerPlugInType = "NFC"
} else if (Qt.platform.os === "ios") {
changePinModel.readerPlugInType = "BLUETOOTH"
} else {
changePinModel.readerPlugInType = "PCSC"
}
changePinModel.setInitialPluginType()
}
navBar.lockedAndHidden = true

View File

@ -78,6 +78,6 @@ SectionPage {
qsTr("You have entered a wrong PIN three times. Your PIN is now blocked. You have to enter the PUK now for unblocking.") :
qsTr("Please wait a moment...")
) + settingsModel.translationTrigger
subTextColor: !changePinModel.isBasicReader && (numberModel.inputError || numberModel.pinDeactivated || state === "changepin_entercan" || state === "enterpuk") ? "red" : "black"
subTextColor: !changePinModel.isBasicReader && (numberModel.inputError || numberModel.pinDeactivated || state === "changepin_entercan" || state === "enterpuk") ? "red" : Constants.secondary_text
}
}

View File

@ -19,7 +19,6 @@ SectionPage
NfcWorkflow
{
allowRemote: false
anchors.fill: parent
state: parent.state
visible: changePinModel.readerPlugInType === "NFC"
@ -36,7 +35,6 @@ SectionPage
BluetoothWorkflow
{
allowRemote: false
anchors.fill: parent
state: parent.state
visible: changePinModel.readerPlugInType === "BLUETOOTH"

View File

@ -1,5 +1,6 @@
import QtQuick 2.5
import QtQuick.Controls 1.4
import QtQuick.Controls.Styles 1.4
import QtQuick.Layouts 1.2
import Governikus.Global 1.0
@ -11,6 +12,9 @@ SectionPage
property alias text: text.text
property alias subText: subText.text
property alias subTextColor: subText.color
property alias progressText: progressText.text
property int progressValue
property alias progressBarVisible: progressBar.visible
BusyIndicator {
id: busyIndicator
@ -39,6 +43,7 @@ SectionPage
}
Text {
id: subText
color: Constants.secondary_text
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter
font.pixelSize: Constants.normal_font_size
@ -48,4 +53,39 @@ SectionPage
width: baseItem.width * 0.8
wrapMode: Text.WordWrap
}
Text {
id: progressText
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter
font.pixelSize: Constants.normal_font_size
anchors.top: subText.bottom
anchors.topMargin: Utils.dp(20)
anchors.horizontalCenter: parent.horizontalCenter
width: baseItem.width * 0.8
wrapMode: Text.WordWrap
color: Constants.grey
}
ProgressBar {
id: progressBar
anchors.top: progressText.bottom
anchors.horizontalCenter: parent.horizontalCenter
anchors.topMargin: Utils.dp(10)
width: baseItem.width * 0.6
minimumValue: 0
maximumValue: 5
visible: false
value: progressValue
style: ProgressBarStyle {
background: Rectangle {
radius: Utils.dp(2)
color: Constants.lightgrey
implicitWidth: parent.width
implicitHeight: parent.width/12.0
}
progress: Rectangle {
radius: Utils.dp(2)
color: Constants.green
}
}
}
}

View File

@ -99,6 +99,7 @@ SectionPage {
Text {
id: providerText
color: Constants.secondary_text
text: (!!provider.longDescription ? provider.longDescription : qsTr("Description not available")) + settingsModel.translationTrigger
horizontalAlignment: Text.AlignLeft
wrapMode: Text.WordWrap

View File

@ -102,6 +102,7 @@ SectionPage {
Text {
id: providerText
color: Constants.secondary_text
text: (!!provider.longDescription ? provider.longDescription : qsTr("Description not available")) + settingsModel.translationTrigger
horizontalAlignment: Text.AlignLeft
wrapMode: Text.WordWrap

View File

@ -34,6 +34,7 @@ Rectangle {
Text {
id: subjectText
color: Constants.secondary_text
width: parent.width
verticalAlignment: Text.AlignVCenter
font.pixelSize: Constants.normal_font_size

View File

@ -32,6 +32,7 @@ Item {
Text {
id: textItem
color: Constants.secondary_text
text: !!model.text ? model.text : qsTr("Unknown") + settingsModel.translationTrigger
verticalAlignment: Text.AlignVCenter
anchors.left: imageItem.right

View File

@ -16,6 +16,7 @@ Column {
}
Text {
color: Constants.secondary_text
font.pixelSize: Constants.normal_font_size
horizontalAlignment: Text.AlignLeft
text: baseItem.description

View File

@ -92,6 +92,7 @@ Item {
}
Text {
color: Constants.secondary_text
text: modelData.trim()
anchors.verticalCenter: parent.verticalCenter
@ -129,6 +130,7 @@ Item {
Text {
id: termsOfUsageTextItem
color: Constants.secondary_text
text: baseItem.termsOfUsageText
width: parent.width

View File

@ -151,6 +151,7 @@ Rectangle {
Text {
id: providerText
color: Constants.secondary_text
width: parent.width
text: selectedProvider ? selectedProvider.shortDescription : ""
font.pixelSize: Constants.normal_font_size

View File

@ -110,6 +110,7 @@ SectionPage {
Text {
id: noResultsText
color: Constants.secondary_text
anchors.centerIn: mainPane
text: qsTr("No match found") + settingsModel.translationTrigger

View File

@ -62,6 +62,7 @@ SectionPage {
visible: providerModel.rowCount === 0 && !additionalResults.visible
Text {
color: Constants.secondary_text
anchors.centerIn: parent
text: qsTr("No match found") + settingsModel.translationTrigger
font.pixelSize: Constants.normal_font_size

View File

@ -12,8 +12,10 @@ Row {
readonly property alias searchText: searchField.displayText
anchors.top: parent ? parent.top : undefined
anchors.topMargin: Constants.titlebar_padding
anchors.right: parent ? parent.right : undefined
anchors.bottom: parent ? parent.bottom : undefined
anchors.bottomMargin: Constants.titlebar_padding
spacing: Constants.titlebar_padding
GTextField {

View File

@ -111,6 +111,7 @@ SectionPage {
Text {
id: noResultsText
color: Constants.secondary_text
anchors.centerIn: mainPane
text: qsTr("No match found") + settingsModel.translationTrigger

View File

@ -56,6 +56,7 @@ SectionPage {
visible: providerModel.rowCount === 0 && !additionalResults.visible
Text {
color: Constants.secondary_text
anchors.centerIn: parent
text: qsTr("No match found") + settingsModel.translationTrigger
font.pixelSize: Constants.normal_font_size

View File

@ -29,6 +29,7 @@ Item {
Text {
id: label
color: Constants.secondary_text
font.pixelSize: Constants.normal_font_size
anchors.verticalCenter: parent.verticalCenter
}

View File

@ -10,16 +10,24 @@ MouseArea {
signal requestPairing(string pDeviceId)
onClicked: {
requestPairing(deviceId)
if (isSupported) requestPairing(deviceId)
}
Text {
id: nameText
color: Constants.secondary_text
width: parent.width
font.pixelSize: Utils.sp(16)
anchors.verticalCenter: parent.verticalCenter
opacity: 0.87
text: remoteDeviceName
text: {
settingsModel.translationTrigger
if (isSupported) {
return remoteDeviceName;
}
return remoteDeviceName + " (" + qsTr("Unsupported") + ")"
}
}
Rectangle {

View File

@ -15,18 +15,30 @@ Item {
Text {
id: nameText
color: Constants.secondary_text
font.pixelSize: Utils.sp(16)
opacity: 0.87
text: remoteDeviceName + (isNetworkVisible ? qsTr(" (Available)"): "")
text: {
settingsModel.translationTrigger
if (!isNetworkVisible) {
return remoteDeviceName;
}
if (isSupported) {
return remoteDeviceName + " (" + qsTr("Available") + ")"
}
return remoteDeviceName + " (" + qsTr("Available, but unsupported") + ")"
}
}
Text {
id: dateText
color: Constants.secondary_text
anchors.top: nameText.bottom
anchors.topMargin: Utils.dp(2)
font.pixelSize: Utils.sp(14)
opacity: 0.38
text: qsTr("Last connection: ") + lastConnected
text: qsTr("Last connection:") + " " + lastConnected + settingsModel.translationTrigger
}
}

View File

@ -23,7 +23,11 @@ Item {
break
case "StateEstablishPaceChannel":
enterPinView.state = "INITIAL"
setWorkflowStateAndRequestInput("establishPaceChannel")
setWorkflowStateAndRequestInput("establishPaceChannel", remoteServiceModel.getPacePasswordId())
break
case "StateChangePinRemote":
enterPinView.state = "INITIAL"
setWorkflowStateAndRequestInput("changePinRemote", "PIN_NEW")
break
case "FinalState":
numberModel.continueWorkflow()
@ -44,10 +48,10 @@ Item {
numberModel.continueWorkflow()
}
function setWorkflowStateAndRequestInput(pState) {
function setWorkflowStateAndRequestInput(pState, pEnterPinState) {
setWorkflowState(pState)
if (remoteServiceModel.pinPadModeOn()) {
firePush(enterPinView, {state: remoteServiceModel.getPacePasswordId()})
firePush(enterPinView, {state: pEnterPinState})
}
}
}

View File

@ -29,6 +29,7 @@ Popup {
Text {
id: header
color: Constants.secondary_text
text: qsTr("Pairing code") + settingsModel.translationTrigger
font.pixelSize: Constants.header_font_size
font.bold: true
@ -36,6 +37,7 @@ Popup {
Text {
id: info
color: Constants.secondary_text
width: parent.width
wrapMode: Text.WordWrap
font.pixelSize: Constants.normal_font_size
@ -47,6 +49,7 @@ Popup {
TextField {
id: name
focus: true
width: parent.width
horizontalAlignment: Text.AlignHCenter
font.letterSpacing: Utils.dp(5)

Some files were not shown because too many files have changed in this diff Show More