File indexing completed on 2024-06-02 05:44:06
0001 /* 0002 Copyright 2020 Devin Lin <espidev@gmail.com> 0003 0004 This library is free software; you can redistribute it and/or 0005 modify it under the terms of the GNU Lesser General Public 0006 License as published by the Free Software Foundation; either 0007 version 2.1 of the License, or (at your option) version 3, or any 0008 later version accepted by the membership of KDE e.V. (or its 0009 successor approved by the membership of KDE e.V.), which shall 0010 act as a proxy defined in Section 6 of version 3 of the license. 0011 0012 This library is distributed in the hope that it will be useful, 0013 but WITHOUT ANY WARRANTY; without even the implied warranty of 0014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 0015 Lesser General Public License for more details. 0016 0017 You should have received a copy of the GNU Lesser General Public 0018 License along with this library. If not, see <http://www.gnu.org/licenses/>. 0019 */ 0020 0021 #pragma once 0022 0023 #include "fprintdevice.h" 0024 #include <qobjectdefs.h> 0025 0026 #include <KLocalizedString> 0027 0028 #include "fprint_device_interface.h" 0029 #include "fprint_manager_interface.h" 0030 0031 class Finger : public QObject 0032 { 0033 Q_OBJECT 0034 Q_PROPERTY(QString internalName READ internalName CONSTANT) 0035 Q_PROPERTY(QString friendlyName READ friendlyName CONSTANT) 0036 0037 public: 0038 explicit Finger(const Finger &finger, QObject *parent = nullptr) 0039 : QObject(parent) 0040 , m_internalName(finger.internalName()) 0041 , m_friendlyName(finger.friendlyName()) 0042 { 0043 } 0044 0045 explicit Finger(QString internalName = "", QString friendlyName = "", QObject *parent = nullptr) 0046 : QObject(parent) 0047 , m_internalName(internalName) 0048 , m_friendlyName(friendlyName) 0049 { 0050 } 0051 0052 QString internalName() const 0053 { 0054 return m_internalName; 0055 } 0056 QString friendlyName() const 0057 { 0058 return m_friendlyName; 0059 } 0060 0061 private: 0062 QString m_internalName = "", m_friendlyName = ""; 0063 }; 0064 0065 class FingerprintModel : public QObject 0066 { 0067 Q_OBJECT 0068 Q_PROPERTY(FprintDevice::ScanType scanType READ scanType CONSTANT) 0069 Q_PROPERTY(QString currentError READ currentError WRITE setCurrentError NOTIFY currentErrorChanged) // error for ui to display 0070 Q_PROPERTY(QString enrollFeedback READ enrollFeedback WRITE setEnrollFeedback NOTIFY enrollFeedbackChanged) 0071 Q_PROPERTY(QVariantList enrolledFingerprints READ enrolledFingerprints NOTIFY enrolledFingerprintsChanged) 0072 Q_PROPERTY(QVariantList availableFingersToEnroll READ availableFingersToEnroll NOTIFY enrolledFingerprintsChanged) 0073 Q_PROPERTY(QVariantList unavailableFingersToEnroll READ unavailableFingersToEnroll NOTIFY enrolledFingerprintsChanged) 0074 Q_PROPERTY(bool deviceFound READ deviceFound NOTIFY devicesFoundChanged) 0075 Q_PROPERTY(bool currentlyEnrolling READ currentlyEnrolling NOTIFY currentlyEnrollingChanged) 0076 Q_PROPERTY(double enrollProgress READ enrollProgress NOTIFY enrollProgressChanged) 0077 Q_PROPERTY(DialogState dialogState READ dialogState WRITE setDialogState NOTIFY dialogStateChanged) 0078 0079 public: 0080 explicit FingerprintModel(QObject *parent = nullptr); 0081 ~FingerprintModel(); 0082 0083 enum DialogState { 0084 FingerprintList, 0085 PickFinger, 0086 Enrolling, 0087 EnrollComplete, 0088 }; 0089 Q_ENUM(DialogState) 0090 0091 const QList<Finger *> FINGERS = {new Finger("right-index-finger", i18n("Right index finger"), this), 0092 new Finger("right-middle-finger", i18n("Right middle finger"), this), 0093 new Finger("right-ring-finger", i18n("Right ring finger"), this), 0094 new Finger("right-little-finger", i18n("Right little finger"), this), 0095 new Finger("right-thumb", i18n("Right thumb"), this), 0096 new Finger("left-index-finger", i18n("Left index finger"), this), 0097 new Finger("left-middle-finger", i18n("Left middle finger"), this), 0098 new Finger("left-ring-finger", i18n("Left ring finger"), this), 0099 new Finger("left-little-finger", i18n("Left little finger"), this), 0100 new Finger("left-thumb", i18n("Left thumb"), this)}; 0101 0102 Q_INVOKABLE void switchUser(QString username); 0103 bool claimDevice(); 0104 0105 Q_INVOKABLE void startEnrolling(QString finger); 0106 Q_INVOKABLE void stopEnrolling(); 0107 Q_INVOKABLE void deleteFingerprint(QString finger); 0108 Q_INVOKABLE void clearFingerprints(); 0109 0110 QStringList enrolledFingerprintsRaw(); 0111 QVariantList enrolledFingerprints(); 0112 QVariantList availableFingersToEnroll(); 0113 QVariantList unavailableFingersToEnroll(); 0114 0115 FprintDevice::ScanType scanType(); 0116 QString currentError(); 0117 void setCurrentError(QString error); 0118 QString enrollFeedback(); 0119 void setEnrollFeedback(QString feedback); 0120 bool currentlyEnrolling(); 0121 bool deviceFound(); 0122 double enrollProgress(); 0123 void setEnrollStage(int stage); 0124 DialogState dialogState(); 0125 void setDialogState(DialogState dialogState); 0126 0127 public Q_SLOTS: 0128 void handleEnrollCompleted(); 0129 void handleEnrollStagePassed(); 0130 void handleEnrollRetryStage(QString feedback); 0131 void handleEnrollFailed(QString error); 0132 0133 Q_SIGNALS: 0134 void currentErrorChanged(); 0135 void enrollFeedbackChanged(); 0136 void enrolledFingerprintsChanged(); 0137 void devicesFoundChanged(); 0138 void currentlyEnrollingChanged(); 0139 void enrollProgressChanged(); 0140 void dialogStateChanged(); 0141 0142 void scanComplete(); 0143 void scanSuccess(); 0144 void scanFailure(); 0145 0146 private: 0147 QString m_username; // set to "" if it is the currently logged in user 0148 QString m_currentError, m_enrollFeedback; 0149 0150 DialogState m_dialogState = DialogState::FingerprintList; 0151 0152 bool m_currentlyEnrolling = false; 0153 int m_enrollStage = 0; 0154 0155 FprintDevice *m_device = nullptr; 0156 0157 NetReactivatedFprintManagerInterface *m_managerDbusInterface; 0158 };