Skip to content

Commit

Permalink
Merge branch 'dev'
Browse files Browse the repository at this point in the history
  • Loading branch information
yanghao committed Dec 28, 2018
2 parents 1fa81f4 + 0e2f845 commit c7b4cf4
Show file tree
Hide file tree
Showing 110 changed files with 5,456 additions and 3,415 deletions.
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
[submodule "src/VirtualKeyboard"]
path = src/VirtualKeyboard
url = [email protected]:nackee/VirtualKeyboard.git
[submodule "VirtualKeyboard"]
path = VirtualKeyboard
url = [email protected]:nackee/VirtualKeyboard.git
9 changes: 9 additions & 0 deletions BiometricAuth/BiometricAuth.pri
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
SOURCES += \
$$PWD/biometricproxy.cpp \
$$PWD/biometricauthwidget.cpp \
$$PWD/biometricdeviceswidget.cpp

HEADERS += \
$$PWD/biometricproxy.h \
$$PWD/biometricauthwidget.h \
$$PWD/biometricdeviceswidget.h
Original file line number Diff line number Diff line change
@@ -1,11 +1,18 @@
QT -= gui
QT += core dbus
#-------------------------------------------------
#
# Project created by QtCreator 2018-12-06T09:17:41
#
#-------------------------------------------------

CONFIG += c++11 console
CONFIG -= app_bundle
QT += core gui dbus

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = BiometricAuth
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked deprecated (the exact warnings
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
Expand All @@ -15,17 +22,16 @@ DEFINES += QT_DEPRECATED_WARNINGS
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0

SOURCES += src/backend_main.cpp \
src/interface.cpp \
src/sessionwatcher.cpp \
src/interfaceAdaptor.cpp

HEADERS += \
src/interface.h \
src/sessionwatcher.h \
src/types.h \
src/interfaceAdaptor.h
SOURCES += \
main.cpp \
biometricauthwidget.cpp \
biometricproxy.cpp \
biometricdeviceswidget.cpp

target.path = /usr/bin/
HEADERS += \
biometricauthwidget.h \
biometricproxy.h \
biometricdeviceswidget.h

INSTALLS += target
FORMS +=
24 changes: 24 additions & 0 deletions BiometricAuth/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
qt5_wrap_cpp(BiometricAuth_SRC
biometricdeviceinfo.h
biometricproxy.h
biometricauthwidget.h
biometricdeviceswidget.h
)

set(BiometricAuth_SRC
${BiometricAuth_SRC}
biometricdeviceinfo.cpp
biometricproxy.cpp
biometricauthwidget.cpp
biometricdeviceswidget.cpp
)

include_directories(
${Qt5Core_INCLUDE_DIRS}
${Qt5Widgets_INCLUDE_DIRS}
${Qt5DBus_INCLUDE_DIRS}
)


add_library(BiometricAuth STATIC ${BiometricAuth_SRC})
target_link_libraries(BiometricAuth Qt5::Core Qt5::DBus Qt5::Widgets)
249 changes: 249 additions & 0 deletions BiometricAuth/biometricauthwidget.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,249 @@
/**
* Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301, USA.
**/
#include "biometricauthwidget.h"
#include <QLabel>
#include <QDebug>
#include <pwd.h>

BiometricAuthWidget::BiometricAuthWidget(BiometricProxy *proxy, QWidget *parent) :
QWidget(parent),
proxy(proxy),
isInAuth(false),
movieTimer(nullptr),
failedCount(0),
timeoutCount(0),
beStopped(false)
{
initUI();
resize(400, 300);

if(this->proxy)
{
connect(this->proxy, &BiometricProxy::StatusChanged,
this, &BiometricAuthWidget::onStatusChanged);
}
}

void BiometricAuthWidget::initUI()
{
//显示提示信息
lblNotify = new QLabel(this);
lblNotify->setWordWrap(true);
lblNotify->setAlignment(Qt::AlignHCenter | Qt::AlignBottom);

//显示当前设备
lblDevice = new QLabel(this);
lblDevice->setWordWrap(true);
lblDevice->setAlignment(Qt::AlignCenter);

//显示图片
lblImage = new QLabel(this);
lblImage->setFixedSize(100, 100);
}


void BiometricAuthWidget::resizeEvent(QResizeEvent */*event*/)
{
lblNotify->setGeometry(0, 0, width(), 40);
lblDevice->setGeometry(0, lblNotify->geometry().bottom()+5, width(), 30);
lblImage->setGeometry((width() - lblImage->width()) / 2,
lblDevice->geometry().bottom() + 10,
lblImage->width(), lblImage->height());
}

void BiometricAuthWidget::startAuth(DeviceInfoPtr device, int uid)
{
if(!proxy)
{
qWarning() << "BiometricProxy doesn't exist.";
return;
}

if(isInAuth)
{
qDebug() << "Identification is currently under way, stop it";
stopAuth();
}

this->device = device;
this->uid = uid;
this->userName = getpwuid(uid)->pw_name;
this->failedCount = 0;
this->timeoutCount = 0;
this->beStopped = false;

startAuth_();
}

void BiometricAuthWidget::startAuth_()
{
lblDevice->setText(tr("Current device: ") + device->shortName);

qDebug().noquote() << QString("Identify:[drvid: %1, uid: %2]").arg(1).arg(2);

isInAuth = true;

QDBusPendingCall call = proxy->Identify(device->id, uid);
QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this);
connect(watcher, &QDBusPendingCallWatcher::finished,
this, &BiometricAuthWidget::onIdentifyComplete);

updateImage(1);
}

void BiometricAuthWidget::stopAuth()
{
beStopped = true;
if(!isInAuth)
{
return;
}
proxy->StopOps(device->id);
isInAuth = false;
updateImage(0);
}

void BiometricAuthWidget::onIdentifyComplete(QDBusPendingCallWatcher *watcher)
{
QDBusPendingReply<int, int> reply = *watcher;
if(reply.isError())
{
qWarning() << "Identify error: " << reply.error().message();
Q_EMIT authComplete(false);
updateImage(0);
return;
}
int result = reply.argumentAt(0).toInt();
int authUid = reply.argumentAt(1).toInt();

// 特征识别成功,而且用户id匹配
if(result == DBUS_RESULT_SUCCESS && authUid == uid)
{
qDebug() << "Identify success";
Q_EMIT authComplete(true);
}
// 特征识别不匹配
else if(result == DBUS_RESULT_NOTMATCH)
{
qDebug() << "Identify failed";
failedCount++;
if(failedCount >= GetMaxFailedAutoRetry(userName))
{
Q_EMIT authComplete(false);
}
else
{
lblNotify->setText(tr("Identify failed, Please retry."));
QTimer::singleShot(1000, this, &BiometricAuthWidget::startAuth_);
}
}
//识别发生错误
else if(result == DBUS_RESULT_ERROR)
{
StatusReslut ret = proxy->UpdateStatus(device->id);
//识别操作超时
if(ret.result == 0 && ret.opsStatus == IDENTIFY_TIMEOUT)
{
timeoutCount++;
if(timeoutCount >= GetMaxTimeoutAutoRetry(userName))
{
Q_EMIT authComplete(false);
}
else
{
QTimer::singleShot(1000, [&]{
if(!beStopped)
{
startAuth_();
}
});
}
}
}
updateImage(0);
}

void BiometricAuthWidget::onStatusChanged(int drvid, int status)
{
if(!isInAuth)
{
return;
}
if(drvid != device->id)
{
return;
}

// 显示来自服务的提示信息
if(status == STATUS_NOTIFY)
{
QString notifyMsg = proxy->GetNotifyMesg(drvid);
lblNotify->setText(notifyMsg);
}
}

static int count = 0;
void BiometricAuthWidget::updateImage(int type)
{
if(type == 0)
{
if(movieTimer && movieTimer->isActive())
{
movieTimer->stop();
}

QString imagePath = QString(UKUI_BIOMETRIC_IMAGES_PATH "%1/01.png")
.arg(DeviceType::getDeviceType(device->deviceType));
setImage(imagePath);
}
else
{
if(!movieTimer)
{
movieTimer = new QTimer(this);
movieTimer->setInterval(100);
connect(movieTimer, &QTimer::timeout,
this, &BiometricAuthWidget::onMoviePixmapUpdate);
}
count = 0;
movieTimer->start();
}
}

void BiometricAuthWidget::onMoviePixmapUpdate()
{
if(count >= 18)
{
count = 0;
}
count++;
QString fileName = (count < 10 ? "0" : "") + QString::number(count);
QString imagePath = QString(UKUI_BIOMETRIC_IMAGES_PATH "%1/%2.png")
.arg(DeviceType::getDeviceType(device->deviceType))
.arg(fileName);
setImage(imagePath);
}

void BiometricAuthWidget::setImage(const QString &path)
{
QPixmap image(path);
image = image.scaled(lblImage->width(), lblImage->height(),
Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
lblImage->setPixmap(image);
}
Loading

0 comments on commit c7b4cf4

Please sign in to comment.