This commit is contained in:
Ansraer 2024-07-07 12:06:26 -07:00 committed by GitHub
commit fbf460775e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
189 changed files with 11783 additions and 11898 deletions

199
.clang-format Normal file
View file

@ -0,0 +1,199 @@
# Commented out parameters are those with the same value as base LLVM style.
# We can uncomment them if we want to change their value, or enforce the
# chosen value in case the base style changes (last sync: Clang 14.0).
---
### General config, applies to all languages ###
BasedOnStyle: LLVM
AccessModifierOffset: -4
AlignAfterOpenBracket: DontAlign
# AlignArrayOfStructures: None
# AlignConsecutiveMacros: None
# AlignConsecutiveAssignments: None
# AlignConsecutiveBitFields: None
# AlignConsecutiveDeclarations: None
# AlignEscapedNewlines: Right
AlignOperands: DontAlign
AlignTrailingComments: false
# AllowAllArgumentsOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: false
# AllowShortEnumsOnASingleLine: true
# AllowShortBlocksOnASingleLine: Never
# AllowShortCaseLabelsOnASingleLine: false
# AllowShortFunctionsOnASingleLine: All
# AllowShortLambdasOnASingleLine: All
# AllowShortIfStatementsOnASingleLine: Never
# AllowShortLoopsOnASingleLine: false
# AlwaysBreakAfterDefinitionReturnType: None
# AlwaysBreakAfterReturnType: None
# AlwaysBreakBeforeMultilineStrings: false
# AlwaysBreakTemplateDeclarations: MultiLine
# AttributeMacros:
# - __capability
# BinPackArguments: true
# BinPackParameters: true
# BraceWrapping:
# AfterCaseLabel: false
# AfterClass: false
# AfterControlStatement: Never
# AfterEnum: false
# AfterFunction: false
# AfterNamespace: false
# AfterObjCDeclaration: false
# AfterStruct: false
# AfterUnion: false
# AfterExternBlock: false
# BeforeCatch: false
# BeforeElse: false
# BeforeLambdaBody: false
# BeforeWhile: false
# IndentBraces: false
# SplitEmptyFunction: true
# SplitEmptyRecord: true
# SplitEmptyNamespace: true
# BreakBeforeBinaryOperators: None
# BreakBeforeConceptDeclarations: true
# BreakBeforeBraces: Attach
# BreakBeforeInheritanceComma: false
# BreakInheritanceList: BeforeColon
# BreakBeforeTernaryOperators: true
# BreakConstructorInitializersBeforeComma: false
BreakConstructorInitializers: AfterColon
# BreakStringLiterals: true
ColumnLimit: 0
# CommentPragmas: '^ IWYU pragma:'
# QualifierAlignment: Leave
# CompactNamespaces: false
ConstructorInitializerIndentWidth: 8
ContinuationIndentWidth: 8
Cpp11BracedListStyle: false
# DeriveLineEnding: true
# DerivePointerAlignment: false
# DisableFormat: false
# EmptyLineAfterAccessModifier: Never
# EmptyLineBeforeAccessModifier: LogicalBlock
# ExperimentalAutoDetectBinPacking: false
# PackConstructorInitializers: BinPack
ConstructorInitializerAllOnOneLineOrOnePerLine: true
# AllowAllConstructorInitializersOnNextLine: true
# FixNamespaceComments: true
# ForEachMacros:
# - foreach
# - Q_FOREACH
# - BOOST_FOREACH
# IfMacros:
# - KJ_IF_MAYBE
# IncludeBlocks: Preserve
IncludeCategories:
- Regex: '".*"'
Priority: 1
- Regex: '^<.*\.h>'
Priority: 2
- Regex: '^<.*'
Priority: 3
# IncludeIsMainRegex: '(Test)?$'
# IncludeIsMainSourceRegex: ''
# IndentAccessModifiers: false
IndentCaseLabels: true
# IndentCaseBlocks: false
# IndentGotoLabels: true
# IndentPPDirectives: None
# IndentExternBlock: AfterExternBlock
# IndentRequires: false
IndentWidth: 4
# IndentWrappedFunctionNames: false
# InsertTrailingCommas: None
# JavaScriptQuotes: Leave
# JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: false
# LambdaBodyIndentation: Signature
# MacroBlockBegin: ''
# MacroBlockEnd: ''
# MaxEmptyLinesToKeep: 1
# NamespaceIndentation: None
# PenaltyBreakAssignment: 2
# PenaltyBreakBeforeFirstCallParameter: 19
# PenaltyBreakComment: 300
# PenaltyBreakFirstLessLess: 120
# PenaltyBreakOpenParenthesis: 0
# PenaltyBreakString: 1000
# PenaltyBreakTemplateDeclaration: 10
# PenaltyExcessCharacter: 1000000
# PenaltyReturnTypeOnItsOwnLine: 60
# PenaltyIndentedWhitespace: 0
# PointerAlignment: Right
# PPIndentWidth: -1
# ReferenceAlignment: Pointer
# ReflowComments: true
# RemoveBracesLLVM: false
# SeparateDefinitionBlocks: Leave
# ShortNamespaceLines: 1
# SortIncludes: CaseSensitive
# SortJavaStaticImport: Before
# SortUsingDeclarations: true
# SpaceAfterCStyleCast: false
# SpaceAfterLogicalNot: false
# SpaceAfterTemplateKeyword: true
# SpaceBeforeAssignmentOperators: true
# SpaceBeforeCaseColon: false
# SpaceBeforeCpp11BracedList: false
# SpaceBeforeCtorInitializerColon: true
# SpaceBeforeInheritanceColon: true
# SpaceBeforeParens: ControlStatements
# SpaceBeforeParensOptions:
# AfterControlStatements: true
# AfterForeachMacros: true
# AfterFunctionDefinitionName: false
# AfterFunctionDeclarationName: false
# AfterIfMacros: true
# AfterOverloadedOperator: false
# BeforeNonEmptyParentheses: false
# SpaceAroundPointerQualifiers: Default
# SpaceBeforeRangeBasedForLoopColon: true
# SpaceInEmptyBlock: false
# SpaceInEmptyParentheses: false
# SpacesBeforeTrailingComments: 1
# SpacesInAngles: Never
# SpacesInConditionalStatement: false
# SpacesInContainerLiterals: true
# SpacesInCStyleCastParentheses: false
## Godot TODO: We'll want to use a min of 1, but we need to see how to fix
## our comment capitalization at the same time.
SpacesInLineCommentPrefix:
Minimum: 0
Maximum: -1
# SpacesInParentheses: false
# SpacesInSquareBrackets: false
# SpaceBeforeSquareBrackets: false
# BitFieldColonSpacing: Both
# StatementAttributeLikeMacros:
# - Q_EMIT
# StatementMacros:
# - Q_UNUSED
# - QT_REQUIRE_VERSION
TabWidth: 4
# UseCRLF: false
UseTab: Always
# WhitespaceSensitiveMacros:
# - STRINGIZE
# - PP_STRINGIZE
# - BOOST_PP_STRINGIZE
# - NS_SWIFT_NAME
# - CF_SWIFT_NAME
---
### C++ specific config ###
Language: Cpp
Standard: c++17
---
### ObjC specific config ###
Language: ObjC
# ObjCBinPackProtocolList: Auto
ObjCBlockIndentWidth: 4
# ObjCBreakBeforeNestedBlockParam: true
# ObjCSpaceAfterProperty: false
# ObjCSpaceBeforeProtocolList: true
---
### Java specific config ###
Language: Java
# BreakAfterJavaFieldAnnotations: false
JavaImportGroups: ['org.godotengine', 'android', 'androidx', 'com.android', 'com.google', 'java', 'javax']
...

View file

@ -47,3 +47,12 @@ I suggest you visit the [wiki](https://github.com/Quill-OS/quill/wiki). Feel fre
If you like this project and want to improve it in some way, feel free to fork this repository or [one of the subprojects this organization hosts](https://github.com/Quill-OS), then make a [pull request](https://github.com/Quill-OS/quill/pulls). I'll be happy to review it when I have time. You can also join the official [Matrix space](https://matrix.to/#/#inkbox-os-project:matrix.org), [Discord server](https://discord.com/invite/uSWtWbY23m) or [Linen](https://www.linen.dev/s/quill-os) if you'd like to chat a bit. If you like this project and want to improve it in some way, feel free to fork this repository or [one of the subprojects this organization hosts](https://github.com/Quill-OS), then make a [pull request](https://github.com/Quill-OS/quill/pulls). I'll be happy to review it when I have time. You can also join the official [Matrix space](https://matrix.to/#/#inkbox-os-project:matrix.org), [Discord server](https://discord.com/invite/uSWtWbY23m) or [Linen](https://www.linen.dev/s/quill-os) if you'd like to chat a bit.
<br><br> <br><br>
On the other hand, if you don't have the appropriate coding skills or just want to help in some way, feel free to make a donation at my [PayPal account](https://paypal.me/inkboxos/), [LiberaPay](https://liberapay.com/tux-linux/), or via Bitcoin: 3MmXq5o78b4C7ub5sb7F5WVC86jzc6PzSN . I'm a student and motivation has been the only thing that has helped me maintain this project for the last few years. Developing an entire operating system on my own was not an easy task. I have time, but I like to spend it wisely. On the other hand, if you don't have the appropriate coding skills or just want to help in some way, feel free to make a donation at my [PayPal account](https://paypal.me/inkboxos/), [LiberaPay](https://liberapay.com/tux-linux/), or via Bitcoin: 3MmXq5o78b4C7ub5sb7F5WVC86jzc6PzSN . I'm a student and motivation has been the only thing that has helped me maintain this project for the last few years. Developing an entire operating system on my own was not an easy task. I have time, but I like to spend it wisely.
## Building
Make sure you have the following requirements installed on your system:
* a c/cpp profiler
* `libsndfile-dev`
Next open the `inkbox.pro` file qith QTCreator

View file

@ -24,148 +24,172 @@ DEFINES += GIT_COMMIT=\\\"$$GIT_COMMIT\\\"
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \ SOURCES += \
src/apps/todo.cpp \ src/platform/device.cpp \
src/platform/device_desktop.cpp \
src/platform/device_kindle_touch.cpp \
src/platform/device_kobo_aura_edition2.cpp \
src/platform/device_kobo_clarahd.cpp \
src/platform/device_kobo_glo.cpp \
src/platform/device_kobo_glohd.cpp \
src/platform/device_kobo_libra.cpp \
src/platform/device_kobo_mini.cpp \
src/platform/device_kobo_nia.cpp \
src/platform/device_kobo_touch.cpp \
src/ui/apps/todo.cpp \
src/audio/audiothread.cpp \ src/audio/audiothread.cpp \
src/splash/alert.cpp \ src/ui/apps/apps.cpp \
src/apps/apps.cpp \
src/telemetry/telemetry.cpp \ src/telemetry/telemetry.cpp \
src/widgets/dialogs/audio/audiodialog.cpp \ src/ui/splash/splashAlert.cpp \
src/widgets/dialogs/audio/audiofile.cpp \ src/ui/ui.cpp \
src/widgets/dialogs/audio/audiofilequeue.cpp \ src/ui/widgets/dialogs/audio/audiodialog.cpp \
src/widgets/dialogs/library/bookinfodialog.cpp \ src/ui/widgets/dialogs/audio/audiofile.cpp \
src/widgets/dialogs/library/bookoptionsdialog.cpp \ src/ui/widgets/dialogs/audio/audiofilequeue.cpp \
src/widgets/dialogs/brightnessdialog.cpp \ src/ui/widgets/dialogs/library/bookinfodialog.cpp \
src/apps/calendarapp.cpp \ src/ui/widgets/dialogs/library/bookoptionsdialog.cpp \
src/widgets/dialogs/reader/highlightslistdialog.cpp \ src/ui/widgets/dialogs/brightnessdialog.cpp \
src/widgets/dialogs/reader/textdialog.cpp \ src/ui/apps/calendarapp.cpp \
src/widgets/dialogs/wifi/connectiondialog.cpp \ src/ui/widgets/dialogs/reader/highlightslistdialog.cpp \
src/widgets/dialogs/wifi/network.cpp \ src/ui/widgets/dialogs/reader/textdialog.cpp \
src/widgets/dialogs/wifi/wifilogger.cpp \ src/ui/widgets/dialogs/wifi/connectiondialog.cpp \
src/widgets/misc/egg.cpp \ src/ui/widgets/dialogs/wifi/network.cpp \
src/widgets/reader/dictionarywidget.cpp \ src/ui/widgets/dialogs/wifi/wifilogger.cpp \
src/encfs/encryptionmanager.cpp \ src/ui/widgets/misc/egg.cpp \
src/widgets/dialogs/generaldialog.cpp \ src/ui/widgets/reader/dictionarywidget.cpp \
src/homeWidget/homepagewidget.cpp \ src/ui/crypto/encryptionmanager.cpp \
src/widgets/misc/hourglassanimationwidget.cpp \ src/ui/widgets/dialogs/generaldialog.cpp \
src/widgets/dialogs/kobox/koboxappsdialog.cpp \ src/ui/home/homepagewidget.cpp \
src/settings/koboxsettings.cpp \ src/ui/widgets/misc/hourglassanimationwidget.cpp \
src/onlineLibrary/librarywidget.cpp \ src/ui/widgets/dialogs/kobox/koboxappsdialog.cpp \
src/localLibrary/locallibrarywidget.cpp \ src/ui/settings/koboxsettings.cpp \
src/ui/onlineLibrary/librarywidget.cpp \
src/ui/localLibrary/locallibrarywidget.cpp \
src/main.cpp \ src/main.cpp \
src/homeWidget/mainwindow.cpp \ src/ui/home/mainwindow.cpp \
src/otaUpdate/otamanager.cpp \ src/ui/otaUpdate/otamanager.cpp \
src/widgets/interfaceWidgets/qclickablelabel.cpp \ src/ui/widgets/interfaceWidgets/qclickablelabel.cpp \
src/widgets/interfaceWidgets/qtooltiplabel.cpp \ src/ui/widgets/interfaceWidgets/qtooltiplabel.cpp \
src/quit/quit.cpp \ src/ui/quit/quit.cpp \
src/reader/reader.cpp \ src/ui/reader/reader.cpp \
src/apps/savedwords.cpp \ src/ui/apps/savedwords.cpp \
src/widgets/text/searchresultswidget.cpp \ src/ui/widgets/text/searchresultswidget.cpp \
src/settings/settings.cpp \ src/ui/settings/settings.cpp \
src/settings/settingschooser.cpp \ src/ui/settings/settingschooser.cpp \
src/widgets/text/textwidget.cpp \ src/ui/widgets/text/textwidget.cpp \
src/widgets/interfaceWidgets/toast.cpp \ src/ui/widgets/interfaceWidgets/toast.cpp \
src/splash/usbmsSplash.cpp \ src/ui/splash/usbmsSplash.cpp \
src/apps/userapps.cpp \ src/ui/apps/userapps.cpp \
src/widgets/virtualKeyboard/virtualkeyboard.cpp \ src/ui/widgets/virtualKeyboard/virtualkeyboard.cpp \
src/widgets/virtualKeyboard/virtualkeypad.cpp \ src/ui/widgets/virtualKeyboard/virtualkeypad.cpp \
src/widgets/dialogs/wifi/wifidialog.cpp \ src/ui/widgets/dialogs/wifi/wifidialog.cpp \
src/widgets/dialogs/powerDaemon/sleepdialog.cpp \ src/ui/widgets/dialogs/powerDaemon/sleepdialog.cpp \
src/powerDaemon/sleepthread.cpp \ src/powerDaemon/sleepthread.cpp \
src/settings/powerdaemonsettings.cpp src/ui/settings/powerdaemonsettings.cpp
HEADERS += \ HEADERS += \
src/audio/audiothread.h \ src/audio/audiothread.h \
src/apps/todo.h \ src/platform/device.h \
src/splash/alert.h \ src/platform/device_desktop.h \
src/apps/apps.h \ src/platform/device_kindle_touch.h \
src/platform/device_kobo_aura_edition2.h \
src/platform/device_kobo_clarahd.h \
src/platform/device_kobo_glo.h \
src/platform/device_kobo_glohd.h \
src/platform/device_kobo_libra.h \
src/platform/device_kobo_mini.h \
src/platform/device_kobo_nia.h \
src/platform/device_kobo_touch.h \
src/ui/apps/todo.h \
src/ui/apps/apps.h \
src/telemetry/telemetry.h \ src/telemetry/telemetry.h \
src/widgets/dialogs/audio/audiodialog.h \ src/ui/splash/splashAlert.h \
src/widgets/dialogs/audio/audiofile.h \ src/ui/ui.h \
src/widgets/dialogs/audio/audiofilequeue.h \ src/ui/widgets/dialogs/audio/audiodialog.h \
src/widgets/dialogs/library/bookinfodialog.h \ src/ui/widgets/dialogs/audio/audiofile.h \
src/widgets/dialogs/library/bookoptionsdialog.h \ src/ui/widgets/dialogs/audio/audiofilequeue.h \
src/widgets/dialogs/brightnessdialog.h \ src/ui/widgets/dialogs/library/bookinfodialog.h \
src/apps/calendarapp.h \ src/ui/widgets/dialogs/library/bookoptionsdialog.h \
src/widgets/dialogs/reader/highlightslistdialog.h \ src/ui/widgets/dialogs/brightnessdialog.h \
src/widgets/dialogs/reader/textdialog.h \ src/ui/apps/calendarapp.h \
src/widgets/dialogs/wifi/connectiondialog.h \ src/ui/widgets/dialogs/reader/highlightslistdialog.h \
src/widgets/dialogs/wifi/network.h \ src/ui/widgets/dialogs/reader/textdialog.h \
src/widgets/dialogs/wifi/wifilogger.h \ src/ui/widgets/dialogs/wifi/connectiondialog.h \
src/widgets/misc/egg.h \ src/ui/widgets/dialogs/wifi/network.h \
src/widgets/reader/dictionarywidget.h \ src/ui/widgets/dialogs/wifi/wifilogger.h \
src/encfs/encryptionmanager.h \ src/ui/widgets/misc/egg.h \
src/ui/widgets/reader/dictionarywidget.h \
src/ui/crypto/encryptionmanager.h \
src/functions.h \ src/functions.h \
src/widgets/dialogs/generaldialog.h \ src/ui/widgets/dialogs/generaldialog.h \
src/homeWidget/homepagewidget.h \ src/ui/home/homepagewidget.h \
src/widgets/misc/hourglassanimationwidget.h \ src/ui/widgets/misc/hourglassanimationwidget.h \
src/widgets/dialogs/kobox/koboxappsdialog.h \ src/ui/widgets/dialogs/kobox/koboxappsdialog.h \
src/settings/koboxsettings.h \ src/ui/settings/koboxsettings.h \
src/onlineLibrary/librarywidget.h \ src/ui/onlineLibrary/librarywidget.h \
src/localLibrary/locallibrarywidget.h \ src/ui/localLibrary/locallibrarywidget.h \
src/homeWidget/mainwindow.h \ src/ui/home/mainwindow.h \
src/otaUpdate/otamanager.h \ src/ui/otaUpdate/otamanager.h \
src/widgets/interfaceWidgets/qclickablelabel.h \ src/ui/widgets/interfaceWidgets/qclickablelabel.h \
src/widgets/interfaceWidgets/qtooltiplabel.h \ src/ui/widgets/interfaceWidgets/qtooltiplabel.h \
src/quit/quit.h \ src/ui/quit/quit.h \
src/reader/reader.h \ src/ui/reader/reader.h \
src/apps/savedwords.h \ src/ui/apps/savedwords.h \
src/widgets/text/searchresultswidget.h \ src/ui/widgets/text/searchresultswidget.h \
src/settings/settings.h \ src/ui/settings/settings.h \
src/settings/settingschooser.h \ src/ui/settings/settingschooser.h \
src/widgets/text/textwidget.h \ src/ui/widgets/text/textwidget.h \
src/widgets/interfaceWidgets/toast.h \ src/ui/widgets/interfaceWidgets/toast.h \
src/splash/usbmsSplash.h \ src/ui/splash/usbmsSplash.h \
src/apps/userapps.h \ src/ui/apps/userapps.h \
src/widgets/virtualKeyboard/virtualkeyboard.h \ src/ui/widgets/virtualKeyboard/virtualkeyboard.h \
src/widgets/virtualKeyboard/virtualkeypad.h \ src/ui/widgets/virtualKeyboard/virtualkeypad.h \
src/widgets/dialogs/wifi/wifidialog.h \ src/ui/widgets/dialogs/wifi/wifidialog.h \
src/widgets/dialogs/powerDaemon/sleepdialog.h \ src/ui/widgets/dialogs/powerDaemon/sleepdialog.h \
src/powerDaemon/sleepthread.h \ src/powerDaemon/sleepthread.h \
src/settings/powerdaemonsettings.h src/ui/settings/powerdaemonsettings.h
FORMS += \ FORMS += \
src/apps/todo.ui \ src/ui/apps/todo.ui \
src/splash/alert.ui \ src/ui/apps/apps.ui \
src/apps/apps.ui \ src/ui/splash/splashAlert.ui \
src/widgets/dialogs/audio/audiodialog.ui \ src/ui/widgets/dialogs/audio/audiodialog.ui \
src/widgets/dialogs/audio/audiofile.ui \ src/ui/widgets/dialogs/audio/audiofile.ui \
src/widgets/dialogs/audio/audiofilequeue.ui \ src/ui/widgets/dialogs/audio/audiofilequeue.ui \
src/widgets/dialogs/library/bookinfodialog.ui \ src/ui/widgets/dialogs/library/bookinfodialog.ui \
src/widgets/dialogs/library/bookoptionsdialog.ui \ src/ui/widgets/dialogs/library/bookoptionsdialog.ui \
src/widgets/dialogs/brightnessdialog.ui \ src/ui/widgets/dialogs/brightnessdialog.ui \
src/apps/calendarapp.ui \ src/ui/apps/calendarapp.ui \
src/widgets/dialogs/reader/highlightslistdialog.ui \ src/ui/widgets/dialogs/reader/highlightslistdialog.ui \
src/widgets/dialogs/reader/textdialog.ui \ src/ui/widgets/dialogs/reader/textdialog.ui \
src/widgets/dialogs/wifi/connectiondialog.ui \ src/ui/widgets/dialogs/wifi/connectiondialog.ui \
src/widgets/dialogs/wifi/network.ui \ src/ui/widgets/dialogs/wifi/network.ui \
src/widgets/dialogs/wifi/wifilogger.ui \ src/ui/widgets/dialogs/wifi/wifilogger.ui \
src/widgets/misc/egg.ui \ src/ui/widgets/misc/egg.ui \
src/widgets/reader/dictionarywidget.ui \ src/ui/widgets/reader/dictionarywidget.ui \
src/encfs/encryptionmanager.ui \ src/ui/crypto/encryptionmanager.ui \
src/widgets/dialogs/generaldialog.ui \ src/ui/widgets/dialogs/generaldialog.ui \
src/homeWidget/homepagewidget.ui \ src/ui/home/homepagewidget.ui \
src/widgets/misc/hourglassanimationwidget.ui \ src/ui/widgets/misc/hourglassanimationwidget.ui \
src/widgets/dialogs/kobox/koboxappsdialog.ui \ src/ui/widgets/dialogs/kobox/koboxappsdialog.ui \
src/settings/koboxsettings.ui \ src/ui/settings/koboxsettings.ui \
src/onlineLibrary/librarywidget.ui \ src/ui/onlineLibrary/librarywidget.ui \
src/localLibrary/locallibrarywidget.ui \ src/ui/localLibrary/locallibrarywidget.ui \
src/homeWidget/mainwindow.ui \ src/ui/home/mainwindow.ui \
src/otaUpdate/otamanager.ui \ src/ui/otaUpdate/otamanager.ui \
src/quit/quit.ui \ src/ui/quit/quit.ui \
src/reader/reader.ui \ src/ui/reader/reader.ui \
src/apps/savedwords.ui \ src/ui/apps/savedwords.ui \
src/widgets/text/searchresultswidget.ui \ src/ui/widgets/text/searchresultswidget.ui \
src/settings/settings.ui \ src/ui/settings/settings.ui \
src/settings/settingschooser.ui \ src/ui/settings/settingschooser.ui \
src/widgets/text/textwidget.ui \ src/ui/widgets/text/textwidget.ui \
src/widgets/interfaceWidgets/toast.ui \ src/ui/widgets/interfaceWidgets/toast.ui \
src/splash/usbmsSplash.ui \ src/ui/splash/usbmsSplash.ui \
src/apps/userapps.ui \ src/ui/apps/userapps.ui \
src/widgets/virtualKeyboard/virtualkeyboard.ui \ src/ui/widgets/virtualKeyboard/virtualkeyboard.ui \
src/widgets/virtualKeyboard/virtualkeypad.ui \ src/ui/widgets/virtualKeyboard/virtualkeypad.ui \
src/widgets/dialogs/wifi/wifidialog.ui \ src/ui/widgets/dialogs/wifi/wifidialog.ui \
src/widgets/dialogs/powerDaemon/sleepdialog.ui \ src/ui/widgets/dialogs/powerDaemon/sleepdialog.ui \
src/settings/powerdaemonsettings.ui src/ui/settings/powerdaemonsettings.ui
# Default rules for deployment. # Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin qnx: target.path = /tmp/$${TARGET}/bin
@ -173,7 +197,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target !isEmpty(target.path): INSTALLS += target
RESOURCES += \ RESOURCES += \
src/eink.qrc src/ui/eink.qrc
INCLUDEPATH += $$system(find ./ -type d -print -path ./.git -prune | grep -v "./.git") INCLUDEPATH += $$system(find ./ -type d -print -path ./.git -prune | grep -v "./.git")
INCLUDEPATH += $$PWD/libs/libsndfile/include/ INCLUDEPATH += $$PWD/libs/libsndfile/include/

View file

@ -1,32 +0,0 @@
#include "calendarapp.h"
#include "ui_calendarapp.h"
#include <QFile>
calendarApp::calendarApp(QWidget *parent) :
QWidget(parent),
ui(new Ui::calendarApp)
{
ui->setupUi(this);
calendarApp::setFont(QFont("u001"));
ui->backBtn->setFont(QFont("Inter"));
ui->backBtn->setStyleSheet("font-weight: bold");
// Stylesheet
QFile stylesheetFile("/mnt/onboard/.adds/inkbox/eink.qss");
stylesheetFile.open(QFile::ReadOnly);
this->setStyleSheet(stylesheetFile.readAll());
stylesheetFile.close();
ui->backBtn->setProperty("type", "borderless");
}
calendarApp::~calendarApp()
{
delete ui;
}
void calendarApp::on_backBtn_clicked()
{
calendarApp::close();
}

View file

@ -1,86 +0,0 @@
#include "savedwords.h"
#include "ui_savedwords.h"
#include "functions.h"
#include <QStringListModel>
#include <QFile>
#include <QProcess>
savedwords::savedwords(QWidget *parent) :
QWidget(parent),
ui(new Ui::savedwords)
{
ui->setupUi(this);
savedwords::setFont(QFont("u001"));
ui->savedWordsLabel->setFont(QFont("Inter"));
ui->backBtn->setFont(QFont("Inter"));
ui->clearBtn->setFont(QFont("Inter"));
QFile stylesheetFile("/mnt/onboard/.adds/inkbox/eink.qss");
stylesheetFile.open(QFile::ReadOnly);
this->setStyleSheet(stylesheetFile.readAll());
stylesheetFile.close();
ui->backBtn->setProperty("type", "borderless");
ui->clearBtn->setProperty("type", "borderless");
ui->savedWordsLabel->setStyleSheet("font-weight: bold");
ui->wordsList->setStyleSheet("font-size: 10pt");
ui->backBtn->setStyleSheet("font-weight: bold");
ui->clearBtn->setStyleSheet("font-weight: bold");
checkwords();
QStringListModel * model = new QStringListModel(this);
QStringList list = words.split("\n", QString::SkipEmptyParts);
model->setStringList(list);
ui->wordsList->setModel(model);
ui->wordsList->setEditTriggers(QAbstractItemView::NoEditTriggers);
}
savedwords::~savedwords()
{
delete ui;
}
void savedwords::on_backBtn_clicked()
{
// Workaround for the random strange memory corruption error
QProcess process;
process.startDetached("inkbox", QStringList());
qApp->quit();
}
void savedwords::on_clearBtn_clicked()
{
// Warning: possible memory leak here. Though, usually, when you press the "Clear" button and all clears up, you don't have to press it again ;)
log("Wiping Saved Words list", className);
save_word_init();
checkwords();
QStringListModel* model = new QStringListModel(this);
QStringList list = words.split("\n", QString::SkipEmptyParts);
model->setStringList(list);
ui->wordsList->setModel(model);
ui->wordsList->setEditTriggers(QAbstractItemView::NoEditTriggers);
}
void savedwords::checkwords() {
QFile words_list(".config/06-words/config");
words_list.open(QIODevice::ReadWrite);
QTextStream in (&words_list);
words = in.readAll();
words_list.close();
}
void savedwords::save_word_init() {
QFile words(".config/06-words/config");
words.open(QIODevice::ReadWrite);
QTextStream in (&words);
QString words_list = in.readAll();
string words_list_str = words_list.toStdString();
words.close();
ofstream fhandler;
fhandler.open(".config/06-words/config");
fhandler << "";
fhandler.close();
}

View file

@ -10,9 +10,9 @@
#include <QTimer> #include <QTimer>
audiothread::audiothread() {} AudioThread::AudioThread() {}
void audiothread::start() { void AudioThread::start() {
log("Audio thread monitor available", className); log("Audio thread monitor available", className);
// QTimer doesn't work in such loops // QTimer doesn't work in such loops
@ -86,7 +86,7 @@ void audiothread::start() {
// I have no explanation as to why this needs to connect/disconnect every time. // I have no explanation as to why this needs to connect/disconnect every time.
// while (recv(client_sockfd, buffer_tmp, 1, 0) > 0) { // while (recv(client_sockfd, buffer_tmp, 1, 0) > 0) {
// ^ This line makes InkBox freeze // ^ This line makes InkBox freeze
void audiothread::sendInfo(QString message) { void AudioThread::sendInfo(QString message) {
log("Sending message: *" + message + "*", className); log("Sending message: *" + message + "*", className);
// Send // Send
sockfd = socket(AF_UNIX, SOCK_STREAM, 0); sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
@ -113,7 +113,7 @@ void audiothread::sendInfo(QString message) {
} }
// Mutex managed outside of the function // Mutex managed outside of the function
void audiothread::audioProgress() { void AudioThread::audioProgress() {
global::audio::progressSeconds = global::audio::progressSeconds + 1; global::audio::progressSeconds = global::audio::progressSeconds + 1;
// log("Progress, +1 sec: " + QString::number(global::audio::progressSeconds), className); // log("Progress, +1 sec: " + QString::number(global::audio::progressSeconds), className);
if(global::audio::progressSeconds >= global::audio::queue[global::audio::itemCurrentlyPlaying].lengths) { if(global::audio::progressSeconds >= global::audio::queue[global::audio::itemCurrentlyPlaying].lengths) {

View file

@ -5,13 +5,13 @@
#include <sys/un.h> #include <sys/un.h>
#include <QTimer> #include <QTimer>
class audiothread : public QObject class AudioThread : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
QString className = this->metaObject()->className(); QString className = this->metaObject()->className();
audiothread(); AudioThread();
void sendInfo(QString message); void sendInfo(QString message);
int sockfd; int sockfd;
struct sockaddr_un addr; struct sockaddr_un addr;

View file

@ -1,124 +0,0 @@
<RCC>
<qresource prefix="/">
<file>resources/checkbox-checked.png</file>
<file>resources/checkbox-unchecked.png</file>
<file>resources/align-center.png</file>
<file>resources/align-justify.png</file>
<file>resources/align-left.png</file>
<file>resources/align-right.png</file>
<file>resources/chesterton.jpg</file>
<file>resources/alcott.jpg</file>
<file>resources/davies.jpg</file>
<file>resources/king.jpg</file>
<file>resources/star.png</file>
<file>resources/starred_star.png</file>
<file>resources/close.png</file>
<file>resources/chevron-left.png</file>
<file>resources/chevron-right.png</file>
<file>resources/chevron-down.png</file>
<file>resources/chevron-up.png</file>
<file>resources/christie.png</file>
<file>resources/exit.png</file>
<file>resources/usbms.png</file>
<file>resources/settings.png</file>
<file>resources/search.png</file>
<file>resources/power.png</file>
<file>resources/book.png</file>
<file>resources/apps.png</file>
<file>resources/battery_half.png</file>
<file>resources/battery_full.png</file>
<file>resources/battery_empty.png</file>
<file>resources/battery_charging.png</file>
<file>resources/alert.png</file>
<file>resources/eink-dark.qss</file>
<file>resources/frontlight.png</file>
<file>resources/fonts/CrimsonPro-Bold.ttf</file>
<file>resources/fonts/CrimsonPro-Italic.ttf</file>
<file>resources/fonts/CrimsonPro-Regular.ttf</file>
<file>resources/check.png</file>
<file>resources/minus.png</file>
<file>resources/plus.png</file>
<file>resources/battery_alert.png</file>
<file>resources/apps-inverted.png</file>
<file>resources/home.png</file>
<file>resources/settings-inverted.png</file>
<file>resources/kobox-icon.png</file>
<file>resources/X11.png</file>
<file>resources/info.png</file>
<file>resources/nightmode-empty.png</file>
<file>resources/nightmode-full.png</file>
<file>resources/backspace.png</file>
<file>resources/x-circle.png</file>
<file>resources/fonts/Bitter-MediumItalic.ttf</file>
<file>resources/fonts/Bitter-Medium.ttf</file>
<file>resources/fonts/Bitter-Bold.ttf</file>
<file>resources/fonts/Bitter-BoldItalic.ttf</file>
<file>resources/fonts/CrimsonPro-BoldItalic.ttf</file>
<file>resources/fonts/IbarraRealNova-MediumItalic.ttf</file>
<file>resources/fonts/IbarraRealNova-Medium.ttf</file>
<file>resources/fonts/IbarraRealNova-BoldItalic.ttf</file>
<file>resources/fonts/IbarraRealNova-Bold.ttf</file>
<file>resources/wifi-connected.png</file>
<file>resources/wifi-off.png</file>
<file>resources/wifi-standby.png</file>
<file>resources/zoom-in.png</file>
<file>resources/zoom-out.png</file>
<file>resources/encryption.png</file>
<file>resources/check-display.png</file>
<file>resources/hourglass-bottom.png</file>
<file>resources/hourglass-top.png</file>
<file>resources/error.png</file>
<file>resources/alert-triangle.png</file>
<file>resources/online-library.png</file>
<file>resources/online-library-inverted.png</file>
<file>resources/cover_unavailable.png</file>
<file>resources/clock-inverted.png</file>
<file>resources/clock.png</file>
<file>resources/eink-square-encfs.qss</file>
<file>resources/tzlist</file>
<file>resources/edit.png</file>
<file>resources/save.png</file>
<file>resources/book_inverted.png</file>
<file>resources/arrow-left.png</file>
<file>resources/arrow-right.png</file>
<file>resources/file-text.png</file>
<file>resources/pin.png</file>
<file>resources/highlight.png</file>
<file>resources/unhighlight.png</file>
<file>resources/view-highlights.png</file>
<file>resources/stop.png</file>
<file>resources/refresh.png</file>
<file>resources/hide.png</file>
<file>resources/show.png</file>
<file>resources/christie.jpg</file>
<file>resources/encryption-small.png</file>
<file>resources/lock.png</file>
<file>resources/public.png</file>
<file>resources/wifi-0.png</file>
<file>resources/wifi-25.png</file>
<file>resources/wifi-50.png</file>
<file>resources/wifi-75.png</file>
<file>resources/wifi-100.png</file>
<file>resources/log.png</file>
<file>resources/new.png</file>
<file>resources/checkbox-unchecked-small.png</file>
<file>resources/checkbox-checked-small.png</file>
<file>resources/checkbox-x-small.png</file>
<file>resources/checkbox-x.png</file>
<file>resources/folder.png</file>
<file>resources/question-mark.png</file>
<file>resources/refresh-small.png</file>
<file>resources/checkbox-indeterminate.png</file>
<file>resources/egg/0.jpg</file>
<file>resources/egg/1.jpg</file>
<file>resources/music-note.png</file>
<file>resources/music-library.png</file>
<file>resources/next.png</file>
<file>resources/music-queue.png</file>
<file>resources/play.png</file>
<file>resources/previous.png</file>
<file>resources/pause.png</file>
<file>resources/clean.png</file>
<file>resources/usbms-inverted.png</file>
</qresource>
</RCC>

View file

@ -1,384 +0,0 @@
#include "encryptionmanager.h"
#include "ui_encryptionmanager.h"
#include <QFile>
#include <QScreen>
#include <QDebug>
#include <QDir>
#include <QTimer>
#include <QMessageBox>
#include <QDateTime>
#include "usbmsSplash.h"
#include "functions.h"
encryptionManager::encryptionManager(QWidget *parent) :
QWidget(parent),
ui(new Ui::encryptionManager)
{
ui->setupUi(this);
ui->descriptionLabel->setFont(QFont("u001"));
ui->successDescriptionLabel->setFont(QFont("u001"));
ui->failureDescriptionLabel->setFont(QFont("u001"));
ui->warningDescriptionLabel->setFont(QFont("u001"));
// Stylesheet
QFile stylesheetFile("/mnt/onboard/.adds/inkbox/eink.qss");
stylesheetFile.open(QFile::ReadOnly);
this->setStyleSheet(stylesheetFile.readAll());
stylesheetFile.close();
ui->encryptionSetupLabel->setStyleSheet("font-size: 15pt; font-weight: bold");
ui->descriptionLabel->setStyleSheet("font-size: 10pt");
ui->successLabel->setStyleSheet("font-size: 15pt; font-weight: bold");
ui->successDescriptionLabel->setStyleSheet("font-size: 10pt");
ui->failureLabel->setStyleSheet("font-size: 15pt; font-weight: bold");
ui->failureDescriptionLabel->setStyleSheet("font-size: 10pt");
ui->setupContinueBtn->setStyleSheet("background: lightGrey; border: 3px solid black; color: black; padding: 10px; outline: none; font-size: 10pt; font-weight: bold; border-radius: 10px");
ui->setupAbortBtn->setStyleSheet("background: lightGrey; border: 3px solid black; color: black; padding: 10px; outline: none; font-size: 10pt; font-weight: bold; border-radius: 10px");
ui->exitSuccessBtn->setStyleSheet("background: lightGrey; border: 3px solid black; color: black; padding: 10px; outline: none; font-size: 10pt; font-weight: bold; border-radius: 10px");
ui->failureContinueBtn->setStyleSheet("background: lightGrey; border: 3px solid black; color: black; padding: 10px; outline: none; font-size: 10pt; font-weight: bold; border-radius: 10px");
ui->acceptBtn->setStyleSheet("background: lightGrey; border: 3px solid black; color: black; padding: 10px; outline: none; font-size: 10pt; font-weight: bold; border-radius: 10px");
ui->usbmsBtn->setStyleSheet("background: lightGrey; border: 3px solid black; color: black; padding: 10px; outline: none; font-size: 10pt; font-weight: bold; border-radius: 10px");
ui->warningLabel->setStyleSheet("font-size: 15pt; font-weight: bold");
ui->warningDescriptionLabel->setStyleSheet("font-size: 10pt");
// Getting the screen's size
float sW = QGuiApplication::screens()[0]->size().width();
float sH = QGuiApplication::screens()[0]->size().height();
float stdIconWidth;
float stdIconHeight;
{
stdIconWidth = sW / 1.50;
stdIconHeight = sH / 1.50;
QPixmap pixmap(":/resources/encryption.png");
QPixmap scaledPixmap = pixmap.scaled(stdIconWidth, stdIconHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui->encryptionImageLabel->setPixmap(scaledPixmap);
}
{
stdIconWidth = sW / 1.65;
stdIconHeight = sH / 1.65;
QPixmap pixmap(":/resources/check-display.png");
QPixmap scaledPixmap = pixmap.scaled(stdIconWidth, stdIconHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui->checkImageLabel->setPixmap(scaledPixmap);
}
{
stdIconWidth = sW / 1.65;
stdIconHeight = sH / 1.65;
QPixmap pixmap(":/resources/error.png");
QPixmap scaledPixmap = pixmap.scaled(stdIconWidth, stdIconHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui->failureImageLabel->setPixmap(scaledPixmap);
}
{
stdIconWidth = sW / 1.50;
stdIconHeight = sH / 1.50;
QPixmap pixmap(":/resources/alert-triangle.png");
QPixmap scaledPixmap = pixmap.scaled(stdIconWidth, stdIconHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui->warningImageLabel->setPixmap(scaledPixmap);
}
hourglassAnimationWidgetWindow = new hourglassAnimationWidget();
ui->hourglassWidget->insertWidget(0, hourglassAnimationWidgetWindow);
ui->hourglassWidget->setCurrentIndex(0);
setDefaultWorkDir();
if(checkconfig(".config/18-encrypted_storage/initial_setup_done") == true or checkconfig("/external_root/run/encfs_repack") == true) {
ui->activityWidget->hide();
if(checkconfig("/external_root/run/encfs_repack") == false) {
setupPassphraseDialogMode = 1;
}
else {
setupPassphraseDialogMode = 2;
}
QTimer::singleShot(500, this, SLOT(setupPassphraseDialog()));
}
else {
QDir dir("/mnt/onboard/onboard/encfs-dropbox");
if(dir.isEmpty()) {
ui->activityWidget->setCurrentIndex(4);
mkEncfsDirs();
}
}
}
encryptionManager::~encryptionManager()
{
delete ui;
}
void encryptionManager::on_setupContinueBtn_clicked()
{
setupPassphraseDialogMode = 0;
setupPassphraseDialog();
}
void encryptionManager::setupPassphraseDialog() {
/*
* setupPassphraseDialogMode can be:
* 0: Initial setup
* 1: Normal behavior
* 2: Repack
*/
log("Showing passphrase dialog for mode " + QString::number(setupPassphraseDialogMode), className);
ui->activityWidget->hide();
this->setStyleSheet("background-color: black");
global::keyboard::keyboardDialog = true;
global::keyboard::encfsDialog = true;
global::keyboard::keyboardText = "";
generalDialogWindow = new generalDialog();
generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
connect(generalDialogWindow, SIGNAL(refreshScreen()), SLOT(refreshScreen()));
if(setupPassphraseDialogMode == 0) {
connect(generalDialogWindow, SIGNAL(destroyed(QObject*)), SLOT(setupEncryptedStorage()));
}
else if(setupPassphraseDialogMode == 1) {
connect(generalDialogWindow, SIGNAL(destroyed(QObject*)), SLOT(unlockEncryptedStorage()));
}
else {
connect(generalDialogWindow, SIGNAL(destroyed(QObject*)), SLOT(repackEncryptedStorage()));
}
connect(generalDialogWindow, SIGNAL(showToast(QString)), SLOT(showToast(QString)));
generalDialogWindow->show();
}
void encryptionManager::on_setupAbortBtn_clicked()
{
log("Aborting setup", className);
setDefaultWorkDir();
writeFile(".config/18-encrypted_storage/status", "false");
quit_restart();
}
void encryptionManager::quit_restart() {
log("Restarting InkBox", className);
QProcess process;
process.startDetached("inkbox", QStringList());
qApp->quit();
}
void encryptionManager::refreshScreen() {
this->repaint();
}
void encryptionManager::showToast(QString messageToDisplay) {
global::toast::message = messageToDisplay;
toastWindow = new toast(this);
toastWindow->setAttribute(Qt::WA_DeleteOnClose);
connect(toastWindow, SIGNAL(refreshScreen()), SLOT(refreshScreen()));
toastWindow->show();
}
void encryptionManager::setupEncryptedStorage() {
log("Setting up encrypted storage", className);
this->setStyleSheet("background-color: white");
ui->activityWidget->show();
if(global::encfs::cancelSetup == true) {
global::encfs::cancelSetup = false;
ui->activityWidget->setCurrentIndex(0);
}
else {
mkEncfsDirs();
QString bootstrapPassphrase = global::encfs::passphrase;
global::encfs::passphrase = "";
writeFile("/external_root/run/encfs/encrypted_storage_create", "true");
writeFile("/external_root/run/encfs/encrypted_storage_bootstrap_files_location", "/data/onboard/encfs-dropbox");
writeFile("/external_root/run/encfs/encrypted_storage_bootstrap_archive_location", "/data/onboard/data.encfs");
writeFile("/external_root/run/encfs/encrypted_storage_bootstrap_passphrase", bootstrapPassphrase);
setDefaultWorkDir();
writeFile(".config/18-encrypted_storage/storage_list", "/data/onboard/encfs-decrypted");
writeFile("/opt/ibxd", "encfs_restart\n");
bool exitStatus;
ui->activityWidget->setCurrentIndex(3);
QTimer * t = new QTimer(this);
t->setInterval(1000);
connect(t, &QTimer::timeout, [&]() {
if(QFile::exists("/external_root/run/encrypted_storage_bootstrap_setup")) {
exitStatus = checkconfig("/external_root/run/encrypted_storage_bootstrap_setup");
QFile::remove("/external_root/run/encrypted_storage_bootstrap_setup");
setupExitWidget(exitStatus);
}
} );
t->start();
}
}
void encryptionManager::unlockEncryptedStorage() {
log("Trying to unlock encrypted storage", className);
if(global::encfs::cancelSetup == true) {
global::encfs::cancelSetup = false;
poweroff(true);
qApp->quit();
}
else {
this->setStyleSheet("background-color: white");
ui->activityWidget->show();
mkEncfsDirs();
QString passphrase = global::encfs::passphrase;
global::encfs::passphrase = "";
writeFile("/external_root/run/encfs/encrypted_storage_archive", "/data/onboard/data.encfs");
writeFile("/external_root/run/encfs/encrypted_storage_mountpoint", "/data/onboard/encfs-decrypted");
writeFile("/external_root/run/encfs/encrypted_storage_bindmount", "/kobo/mnt/onboard/onboard/encfs-decrypted");
writeFile("/external_root/run/encfs/encrypted_storage_passphrase", passphrase);
writeFile("/opt/ibxd", "encfs_restart\n");
bool exitStatus;
QString passphraseTriesStr = readFile("/inkbox/encryptedStoragePassphraseTries");
if(passphraseTriesStr.isEmpty()) {
passphraseTries = 0;
}
else {
passphraseTries = passphraseTriesStr.toInt();
passphraseTries++;
}
ui->activityWidget->setCurrentIndex(3);
QTimer * t = new QTimer(this);
t->setInterval(1000);
connect(t, &QTimer::timeout, [&]() {
if(QFile::exists("/external_root/run/encfs_mounted")) {
exitStatus = true;
if(readFile("/external_root/run/encfs_mounted") != "true\n") {
exitStatus = false;
QFile::remove("/external_root/run/encfs_mounted");
QString function = __func__; log(function + ": Invalid passphrase", className);
if(setupMessageBoxRan == false) {
int delay = 0;
if(passphraseTries <= 3) {
if(passphraseTries == 0) {
writeFile("/inkbox/encryptedStoragePassphraseTries", "0");
delay = 5000;
}
else if(passphraseTries == 1) {
writeFile("/inkbox/encryptedStoragePassphraseTries", "1");
delay = 10000;
}
else if(passphraseTries == 2) {
writeFile("/inkbox/encryptedStoragePassphraseTries", "2");
delay = 20000;
}
else if(passphraseTries >= 3) {
writeFile("/inkbox/encryptedStoragePassphraseTries", "3");
unsigned long currentEpoch = QDateTime::currentSecsSinceEpoch();
currentEpoch += 86400;
QString unlockTime_str = QString::number(currentEpoch);
global::encfs::unlockTime = QDateTime::fromTime_t(currentEpoch).toString();
global::encfs::lockdownMessage = "FATAL: 4 invalid passphrase tries, locking down device until " + global::encfs::unlockTime;
writeFile("/external_root/boot/flags/ENCRYPT_LOCK", unlockTime_str + "\n");
global::encfs::lockdown = true;
setupMessageBoxRan = true;
alertWindow = new alert();
alertWindow->setAttribute(Qt::WA_DeleteOnClose);
alertWindow->showFullScreen();
}
if(passphraseTries <= 2) {
QTimer::singleShot(delay, this, SLOT(setupFailedAuthenticationMessageBox()));
setupMessageBoxRan = true;
}
}
}
}
else {
log("Unlocking successful", className);
quit_restart();
}
}
} );
t->start();
}
}
void encryptionManager::mkEncfsDirs() {
log("Creating encrypted storage directories", className);
QDir encfsDir;
QString encfsPath("/external_root/run/encfs");
encfsDir.mkpath(encfsPath);
QDir dumpDir;
QString dumpPath("/mnt/onboard/onboard/encfs-dropbox");
dumpDir.mkpath(dumpPath);
QDir decDir;
QString decPath("/mnt/onboard/onboard/encfs-decrypted");
decDir.mkpath(decPath);
}
void encryptionManager::on_exitSuccessBtn_clicked()
{
setDefaultWorkDir();
writeFile(".config/18-encrypted_storage/initial_setup_done", "true");
quit_restart();
}
void encryptionManager::setupExitWidget(bool exitStatus) {
if(setupExitWidgetRan == false) {
if(exitStatus == true) {
ui->activityWidget->setCurrentIndex(1);
}
else {
writeFile(".config/18-encrypted_storage/status", "false");
ui->activityWidget->setCurrentIndex(2);
}
setupExitWidgetRan = true;
}
}
void encryptionManager::on_failureContinueBtn_clicked()
{
setDefaultWorkDir();
writeFile(".config/18-encrypted_storage/initial_setup_done", "true");
quit_restart();
}
void encryptionManager::setupFailedAuthenticationMessageBox() {
log("Showing 'Authentication failed' message box", className);
ui->activityWidget->hide();
QMessageBox::critical(this, tr("Invalid argument"), tr("<font face='u001'>Invalid passphrase. Please try again.</font>"));
quit_restart();
}
void encryptionManager::on_acceptBtn_clicked()
{
writeFile(".config/18-encrypted_storage/status", "false");
quit_restart();
}
void encryptionManager::on_usbmsBtn_clicked()
{
log("Showing USBMS splash", className);
global::usbms::launchUsbms = true;
usbmsWindow = new usbmsSplash();
usbmsWindow->setAttribute(Qt::WA_DeleteOnClose);
usbmsWindow->setGeometry(QRect(QPoint(0,0), screen()->geometry ().size()));
usbmsWindow->show();
}
void encryptionManager::repackEncryptedStorage() {
log("Repacking encrypted storage", className);
if(global::encfs::cancelSetup == true) {
global::encfs::cancelSetup = false;
quit_restart();
}
else {
this->setStyleSheet("background-color: white");
ui->activityWidget->show();
mkEncfsDirs();
QString passphrase = global::encfs::passphrase;
global::encfs::passphrase = "";
writeFile("/external_root/run/encfs/encrypted_storage_repack_passphrase", passphrase);
QFile::remove("/external_root/run/openrc/started/encfs");
writeFile("/opt/ibxd", "encfs_restart\n");
bool exitStatus;
ui->activityWidget->setCurrentIndex(3);
QTimer * t = new QTimer(this);
t->setInterval(1000);
connect(t, &QTimer::timeout, [&]() {
if(QFile::exists("/external_root/run/encfs_repack_status")) {
exitStatus = checkconfig("/external_root/run/encfs_repack_status");
QFile::remove("/external_root/run/encfs_repack_status");
setupExitWidget(exitStatus);
}
} );
t->start();
}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,263 +1,196 @@
/* /*
InkBox: Open-source Qt-based eBook reader InkBox: Open-source Qt-based eBook reader
Copyright (C) 2021-2024 Nicolas Mailloux <nicolecrivain@gmail.com> Copyright (C) 2021-2024 Nicolas Mailloux <nicolecrivain@gmail.com>
SPDX-License-Identifier: GPL-3.0-only SPDX-License-Identifier: GPL-3.0-only
This program is free software: you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
the Free Software Foundation. the Free Software Foundation.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
#include "mainwindow.h"
#include "alert.h"
#include "generaldialog.h"
#include "functions.h"
#include "reader.h"
#include "encryptionmanager.h"
#include "sleepthread.h"
#include "sleepdialog.h"
#include "audiothread.h" #include "audiothread.h"
#include "encryptionmanager.h"
#include "functions.h"
#include "generaldialog.h"
#include "mainwindow.h"
#include "reader.h"
#include "sleepdialog.h"
#include "sleepthread.h"
#include "splashAlert.h"
#include "ui.h"
#include "device.h"
#include <QApplication> #include <QApplication>
#include <QFile> #include <QFile>
#include <QTextStream>
#include <QRect> #include <QRect>
#include <QScreen> #include <QScreen>
#include <QTextCodec> #include <QTextCodec>
#include <QTextStream>
int main(int argc, char *argv[]) int main(int argc, char *argv[]) {
{ QApplication a(argc, argv);
QApplication a(argc, argv); QTextCodec::setCodecForLocale(QTextCodec::codecForName("utf8"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("utf8"));
if(char * debug = std::getenv("DEBUG")) { if (char *debug = std::getenv("DEBUG")) {
if(std::atoi(debug) == 1) { if (std::atoi(debug) == 1) {
global::logger::status = true; global::logger::status = true;
} }
} }
global::deviceID = readFile("/opt/inkbox_device"); QString deviceID = readFile("/opt/inkbox_device");
log("Running on device " + global::deviceID, "main", true); if (deviceID.isEmpty()) {
// we don't have a device id, assume that this is running in an emu
deviceID = "emu";
}
log("Running on device " + deviceID, "main", true);
// initialize the platform singleton
Device::setup(deviceID);
// Tell the OS that we're currently running // Tell the OS that we're currently running
writeFile("/tmp/inkbox_running", "true"); writeFile("/tmp/inkbox_running", "true");
setDefaultWorkDir(); setDefaultWorkDir();
if(checkconfig("/run/wifi_able") == true) { if (Device::getSingleton()->supportsWifi()) {
log("Device has Wi-Fi capabilities", "main"); log("Device has Wi-Fi capabilities", "main");
global::device::isWifiAble = true; } else {
} log("Device does not have Wi-Fi capabilities", "main");
else { }
log("Device does not have Wi-Fi capabilities", "main");
global::device::isWifiAble = false;
}
if(QFile::exists("/tmp/currentlyRunningUserApplication")) { if (QFile::exists("/tmp/currentlyRunningUserApplication")) {
QFile::remove("/tmp/currentlyRunningUserApplication"); QFile::remove("/tmp/currentlyRunningUserApplication");
} }
if(QFile::exists("/tmp/rescan_userapps")) { if (QFile::exists("/tmp/rescan_userapps")) {
QFile::remove("/tmp/rescan_userapps"); QFile::remove("/tmp/rescan_userapps");
log("Re-scanning user applications from explicit request", "main"); log("Re-scanning user applications from explicit request", "main");
writeFile("/opt/ibxd", "gui_apps_stop\n"); writeFile("/opt/ibxd", "gui_apps_stop\n");
while(true) { while (true) {
if(QFile::exists("/tmp/gui_apps_stopped")) { if (QFile::exists("/tmp/gui_apps_stopped")) {
QFile::remove("/tmp/gui_apps_stopped"); QFile::remove("/tmp/gui_apps_stopped");
break; break;
} }
QThread::msleep(500); QThread::msleep(500);
} }
writeFile("/opt/ibxd", "gui_apps_start\n"); writeFile("/opt/ibxd", "gui_apps_start\n");
while(true) { while (true) {
if(QFile::exists("/tmp/gui_apps_started")) { if (QFile::exists("/tmp/gui_apps_started")) {
if(checkconfig("/tmp/gui_apps_started") == true) { if (checkconfig("/tmp/gui_apps_started") == true) {
log("GUI apps service started successfully", "main"); log("GUI apps service started successfully", "main");
QFile::remove("/tmp/gui_apps_started"); QFile::remove("/tmp/gui_apps_started");
updateUserAppsMainJsonFile(); updateUserAppsMainJsonFile();
break; break;
} } else {
else { log("GUI apps service failed to start", "main");
log("GUI apps service failed to start", "main"); QFile::remove("/tmp/gui_apps_started");
QFile::remove("/tmp/gui_apps_started"); break;
break; }
} }
} QThread::msleep(500);
QThread::msleep(500); }
} updateUserAppsMainJsonFile();
updateUserAppsMainJsonFile(); }
}
// Power daemon-related stuff // Power daemon-related stuff
sleepDialog * sleepDialogWindow = new sleepDialog; SleepDialog *sleepDialogWindow = new SleepDialog;
// https://wiki.qt.io/QThreads_general_usage // https://wiki.qt.io/QThreads_general_usage
QThread * IPDThread = new QThread(); QThread *IPDThread = new QThread();
sleepThread * sleepThreadWindow = new sleepThread(); SleepThread *sleepThreadWindow = new SleepThread();
sleepThreadWindow->moveToThread(IPDThread); sleepThreadWindow->moveToThread(IPDThread);
QObject::connect(IPDThread, &QThread::started, sleepThreadWindow, &sleepThread::start); QObject::connect(IPDThread, &QThread::started, sleepThreadWindow, &SleepThread::start);
QObject::connect(sleepThreadWindow, &sleepThread::startDialog, sleepDialogWindow, &sleepDialog::launchSleepDialog); QObject::connect(sleepThreadWindow, &SleepThread::startDialog, sleepDialogWindow, &SleepDialog::launchSleepDialog);
QObject::connect(sleepThreadWindow, &sleepThread::stopDialog, sleepDialogWindow, &sleepDialog::hideSleepDialog); QObject::connect(sleepThreadWindow, &SleepThread::stopDialog, sleepDialogWindow, &SleepDialog::hideSleepDialog);
IPDThread->start(); IPDThread->start();
// Audio stuff // Audio stuff
if(checkconfig(".config/e-2-audio/enabled") == true) { if (checkconfig(".config/e-2-audio/enabled") == true) {
log("Audio is enabled", "main"); log("Audio is enabled", "main");
global::audio::enabled = true; global::audio::enabled = true;
QThread * audioThread = new QThread(); QThread *audioThread = new QThread();
audiothread * audioObject = new audiothread(); AudioThread *audioObject = new AudioThread();
audioObject->moveToThread(audioThread); audioObject->moveToThread(audioThread);
QObject::connect(audioThread, &QThread::started, audioObject, &audiothread::start); QObject::connect(audioThread, &QThread::started, audioObject, &AudioThread::start);
audioThread->start(); audioThread->start();
} } else {
else { log("Audio is disabled", "main");
log("Audio is disabled", "main"); }
}
if(checkconfig(".config/18-encrypted_storage/status") == true and checkconfig("/external_root/run/encfs_mounted") == false) { if (checkconfig(".config/18-encrypted_storage/status") == true and checkconfig("/external_root/run/encfs_mounted") == false) {
// Open Encryption Manager to unlock encrypted storage // Open Encryption Manager to unlock encrypted storage
encryptionManager w; CryptoManagerWidget w;
const QScreen * screen = qApp->primaryScreen(); const QScreen *screen = qApp->primaryScreen();
w.setGeometry(QRect(QPoint(0,0), screen->geometry().size())); w.setGeometry(QRect(QPoint(0, 0), screen->geometry().size()));
w.show(); w.show();
return a.exec(); return a.exec();
} } else if (checkconfig("/external_root/run/encfs_mounted") == true and checkconfig("/external_root/run/encfs_repack") == true) {
else if(checkconfig("/external_root/run/encfs_mounted") == true and checkconfig("/external_root/run/encfs_repack") == true) { log("Launching encryptionManager", "main");
log("Launching encryptionManager", "main"); CryptoManagerWidget w;
encryptionManager w; const QScreen *screen = qApp->primaryScreen();
const QScreen * screen = qApp->primaryScreen(); w.setGeometry(QRect(QPoint(0, 0), screen->geometry().size()));
w.setGeometry(QRect(QPoint(0,0), screen->geometry().size())); w.show();
w.show(); return a.exec();
return a.exec(); } else {
} // Variables
else { global::reader::startBatteryWatchdog = false;
// Variables global::reader::startUsbmsPrompt = false;
global::reader::startBatteryWatchdog = false;
global::reader::startUsbmsPrompt = false;
// Checking if battery level is critical; if true (and if it is not charging), then display a "Please charge your eReader" splash and power off. // Checking if battery level is critical; if true (and if it is not charging), then display a "Please charge your eReader" splash and power off.
if(global::deviceID != "emu\n") { if (Device::getSingleton()->getBatteryLevel() <= 5) {
if(isBatteryCritical() == true) { if (!Device::getSingleton()->isUSBPluggedIn()) {
if(!isUsbPluggedIn()) { global::battery::showCriticalBatteryAlert = true;
global::battery::showCriticalBatteryAlert = true; SplashAlertWidget w;
alert w;
const QScreen * screen = qApp->primaryScreen(); const QScreen *screen = qApp->primaryScreen();
w.setGeometry(QRect(QPoint(0,0), screen->geometry().size())); w.setGeometry(QRect(QPoint(0, 0), screen->geometry().size()));
w.show(); w.show();
return a.exec(); return a.exec();
} }
} }
}
// Checking if there has been an ALERT flag set up, and if there is, show a big warning // Checking if there has been an ALERT flag set up, and if there is, show a big warning
if(checkconfig("/external_root/boot/flags/ALERT") == true) { if (checkconfig("/external_root/boot/flags/ALERT") == true) {
alert w; SplashAlertWidget w;
const QScreen * screen = qApp->primaryScreen(); const QScreen *screen = qApp->primaryScreen();
w.setGeometry(QRect(QPoint(0,0), screen->geometry().size())); w.setGeometry(QRect(QPoint(0, 0), screen->geometry().size()));
w.show(); w.show();
return a.exec(); return a.exec();
} }
// If we're waking from sleep and we have the lockscreen enabled, we'll "resume" the book from scratch // If we're waking from sleep and we have the lockscreen enabled, we'll "resume" the book from scratch
else if(checkconfig("/tmp/suspendBook") == true && checkconfig("/inkbox/bookIsEpub") == false) { else if (checkconfig("/tmp/suspendBook") == true && checkconfig("/inkbox/bookIsEpub") == false) {
// Start the low/critical battery alert timer from the Reader framework since MainWindow is not going to be shown // Start the low/critical battery alert timer from the Reader framework since MainWindow is not going to be shown
global::runningInstanceIsReaderOnly = true; global::runningInstanceIsReaderOnly = true;
global::reader::startBatteryWatchdog = true; global::reader::startBatteryWatchdog = true;
global::reader::startUsbmsPrompt = true; global::reader::startUsbmsPrompt = true;
global::reader::skipOpenDialog = true; global::reader::skipOpenDialog = true;
writeFile("/inkbox/skip_opendialog", "true"); writeFile("/inkbox/skip_opendialog", "true");
if(global::deviceID == "n705\n") {
global::isN705 = true;
}
else if(global::deviceID == "n905\n") {
global::isN905C = true;
}
else if(global::deviceID == "n613\n") {
global::isN613 = true;
}
else if(global::deviceID == "n873\n") {
global::isN873 = true;
}
else if(global::deviceID == "n236\n") {
global::isN236 = true;
}
else if(global::deviceID == "n437\n") {
global::isN437 = true;
}
else if(global::deviceID == "n306\n") {
global::isN306 = true;
}
else if(global::deviceID == "n249\n") {
global::isN249 = true;
}
else if(global::deviceID == "kt\n") {
global::isKT = true;
}
else {
;
}
reader w; ReaderWidget w;
const QScreen* screen = qApp->primaryScreen(); const QScreen *screen = qApp->primaryScreen();
w.setGeometry(QRect(QPoint(0,0), screen->geometry().size())); w.setGeometry(QRect(QPoint(0, 0), screen->geometry().size()));
w.show(); w.show();
return a.exec(); return a.exec();
} } else {
else { QProcess::execute("remount_tmpfs_launch.sh", QStringList());
QProcess::execute("remount_tmpfs_launch.sh", QStringList());
MainWindow w; MainWindow w;
QApplication::setStyle("windows"); QApplication::setStyle("windows");
QFile stylesheetFile("/mnt/onboard/.adds/inkbox/eink.qss"); UI::applyStyle(w, "eink");
stylesheetFile.open(QFile::ReadOnly);
w.setStyleSheet(stylesheetFile.readAll());
stylesheetFile.close();
if(global::deviceID == "n705\n") { const QScreen *screen = qApp->primaryScreen();
global::isN705 = true; w.setGeometry(QRect(QPoint(0, 0), screen->geometry().size()));
} w.show();
else if(global::deviceID == "n905\n") { return a.exec();
global::isN905C = true; }
} }
else if(global::deviceID == "n613\n") {
global::isN613 = true;
}
else if(global::deviceID == "n873\n") {
global::isN873 = true;
}
else if(global::deviceID == "n236\n") {
global::isN236 = true;
}
else if(global::deviceID == "n437\n") {
global::isN437 = true;
}
else if(global::deviceID == "n306\n") {
global::isN306 = true;
}
else if(global::deviceID == "n249\n") {
global::isN249 = true;
}
else if(global::deviceID == "kt\n") {
global::isKT = true;
}
else {
;
}
const QScreen * screen = qApp->primaryScreen();
w.setGeometry(QRect(QPoint(0,0), screen->geometry().size()));
w.show();
return a.exec();
}
}
} }

239
src/platform/device.cpp Normal file
View file

@ -0,0 +1,239 @@
#include "device.h"
#include "functions.h"
#include <QDirIterator>
#include "device_desktop.h"
#include "device_kindle_touch.h"
#include "device_kobo_aura_edition2.h"
#include "device_kobo_clarahd.h"
#include "device_kobo_glo.h"
#include "device_kobo_glohd.h"
#include "device_kobo_libra.h"
#include "device_kobo_mini.h"
#include "device_kobo_nia.h"
#include "device_kobo_touch.h"
Device* Device::instance = nullptr;
Device::Device()
{
powerSupplyPath = getPowerSupplyPath();
}
Device* Device::getSingleton() {
return instance;
}
void Device::setup(QString &platformName){
QString name = platformName.trimmed();
Device* temp;
#define SETUP_DEVICE(x) { \
temp = new x(); \
if(temp->getID() == name) { \
Device::instance = temp;\
log("Setting up Device "+Device::instance->getID()+".", "Device::setup"); \
return; \
} else { \
delete temp; \
} \
}
SETUP_DEVICE(DeviceKindleTouch)
SETUP_DEVICE(DeviceKoboAuraEdition2)
SETUP_DEVICE(DeviceKoboClaraHD)
SETUP_DEVICE(DeviceKoboGlo)
SETUP_DEVICE(DeviceKoboGloHD)
SETUP_DEVICE(DeviceKoboLibra)
SETUP_DEVICE(DeviceKoboMini)
SETUP_DEVICE(DeviceKoboNia)
SETUP_DEVICE(DeviceKoboTouch)
// Fallback if none of the devices above worked
Device::instance = new DeviceDesktop();
log("Setting up Device "+Device::instance->getID()+".", "Device::setup");
fprintf(stderr, "Device has fallen back to desktop.\n");
}
void Device::writeFile(QString path, QString content) {
QFile file(path);
if(file.open(QIODevice::ReadWrite | QIODevice::Truncate | QIODevice::Text)) {
QTextStream stream(&file);
stream << content;
} else {
fprintf(stderr, ("Failed to write to file: "));
}
}
QString Device::readFile(QString path) {
QFile file(path);
file.open(QIODevice::ReadOnly);
QTextStream in (&file);
QString content = in.readAll();
file.close();
return content.trimmed();
}
QString Device::getPowerSupplyPath() {
// get the path to the battery so we can check the charge latter
QString result;
QDirIterator supplies("/sys/class/power_supply", QDirIterator::NoIteratorFlags);
while(supplies.hasNext()) {
QString supply = supplies.filePath();
// Badly-classified device by some ntx kernels, ignore
if (supplies.fileName() == "mc13892_charger") {
continue;
}
if(QFile::exists(supply + "/type")) {
QString content = readFile(supply + "/type");
if(content == "Battery"){
result = supply;
break;
}
}
supplies.next();
}
return result;
}
const QString Device::getStyleSheetPath() {
return "/mnt/onboard/.adds/inkbox/";
}
Device::SysInfo Device::getSystemInfo() {
// get UID
QString prog ("dd");
QStringList args;
args << "if=/dev/mmcblk0" << "bs=512" << "skip=1" << "count=1" << "status=none";
QProcess *proc = new QProcess();
proc->start(prog, args);
proc->waitForFinished();
QString deviceUID = proc->readAllStandardOutput();
deviceUID = deviceUID.left(256);
proc->deleteLater();
// get Kernel Version
prog = "uname";
args = QStringList();
args << "-r";
proc = new QProcess();
proc->start(prog, args);
proc->waitForFinished();
QString kernelVersion = proc->readAllStandardOutput();
kernelVersion = kernelVersion.trimmed();
proc->deleteLater();
setDefaultWorkDir();
writeFile("/external_root/run/initrd-fifo", "get_kernel_build_id\n");
QThread::msleep(100);
writeFile("/external_root/run/initrd-fifo", "get_kernel_commit\n");
QThread::msleep(100);
QString kernelBuildID = readFile("/external_root/run/kernel_build_id").trimmed();
QString kernelCommit = readFile("/external_root/run/kernel_commit").trimmed();
SysInfo info = {
.uid= deviceUID,
.kernelVersion= kernelVersion,
.kernelBuild= kernelBuildID,
.kernelCommit= kernelCommit,
.inkOSVersion= readFile("/external_root/opt/isa/version"),
.inkGitVersion = GIT_VERSION,
.ipAddress = getConnectionInformation()
};
return info;
}
bool Device::supportsWifi() {
return checkconfig("/run/wifi_able");
}
int Device::getBatteryLevel() {
int value = 100;
if(QFile::exists("/sys/devices/platform/pmic_battery.1/power_supply/mc13892_bat/capacity")) {
value = readFile("/sys/devices/platform/pmic_battery.1/power_supply/mc13892_bat/capacity").toInt();
} else if(QFile::exists(powerSupplyPath + "/capacity")) {
value = readFile(powerSupplyPath + "/capacity").toInt();
}
return value;
}
int Device::getBrightness() {
if(QFile::exists("/var/run/brightness")) {
return readFile("/var/run/brightness").toInt();
}
else {
return 0;
}
}
void Device::setBrightness(int value) {
if(QFile::exists("/var/run/brightness")) {
std::ofstream fhandler;
fhandler.open("/var/run/brightness");
fhandler << value;
fhandler.close();
} else if(QFile::exists("/var/run/brightness_write")) {
// this is for N249 devices. Overwrite this virtual method for that platform instead
std::ofstream fhandler;
fhandler.open("/var/run/brightness_write");
fhandler << value;
fhandler.close();
}
}
bool Device::supportsNightmode() {
return true;
}
int Device::getBaseDPI() {
return 125;
}
bool Device::isUSBPluggedIn() {
// Thanks to https://github.com/koreader/KoboUSBMS/blob/2efdf9d920c68752b2933f21c664dc1afb28fc2e/usbms.c#L148-L158
int ntxfd;
if((ntxfd = open("/dev/ntx_io", O_RDWR)) == -1) {
fprintf(stderr, "Error opening ntx_io device\n");
return false;
}
unsigned long ptr = 0U;
ioctl(ntxfd, 108, &ptr);
close(ntxfd);
return !!ptr;
}
void Device::loadUSBMassStorageModule() {
}
QString Device::getUSBMassStorageModule() {
return "/external_root/lib/modules/g_mass_storage.ko";
}
QString Device::getNetworkInterfaceName() {
return "wlan0";
}

130
src/platform/device.h Normal file
View file

@ -0,0 +1,130 @@
#ifndef PLATFORM_H
#define PLATFORM_H
#include <QString>
class Device
{
private:
static Device* instance;
QString powerSupplyPath;
QString getPowerSupplyPath();
protected:
Device();
void writeFile(QString path, QString content);
QString readFile(QString path);
public:
virtual ~Device() = default;
static void setup(QString& platformName);
/*
if(global::deviceID == "n705\n") {
global::isN705 = true;
}
else if(global::deviceID == "n905\n") {
global::isN905C = true;
}
else if(global::deviceID == "n613\n") {
global::isN613 = true;
}
else if(global::deviceID == "n873\n") {
global::isN873 = true;
}
else if(global::deviceID == "n236\n") {
global::isN236 = true;
}
else if(global::deviceID == "n437\n") {
global::isN437 = true;
}
else if(global::deviceID == "n306\n") {
global::isN306 = true;
}
^else if(global::deviceID == "n249\n") {
global::isN249 = true;
}
else if(global::deviceID == "kt\n") {
global::isKT = true;
}
else {
;
}
*/
static Device* getSingleton();
virtual QString getID() = 0;
struct SysInfo {
QString uid;
QString kernelVersion;
QString kernelBuild;
QString kernelCommit;
QString inkOSVersion;
QString inkGitVersion;
QString ipAddress;
};
virtual SysInfo getSystemInfo();
virtual bool hasNavButtons() = 0;
virtual bool supportsWifi() = 0;
// BATTERY stuff
virtual bool hasBattery() = 0;
virtual int getBatteryLevel();
// Generic Battery Utility functions
bool isBatteryCritical() {
return getBatteryLevel() < 5;
}
bool isBatteryLow() {
return getBatteryLevel() < 15;
}
// only true for isN249 and isN873
virtual bool supportsWarmLight() = 0;
// 100 for N249 and 10 for N873
virtual int getMaxWarmLightValue() = 0;
virtual int getWarmth() = 0;
virtual void setWarmth(int value) = 0;
virtual bool supportsBrightness()=0;
virtual int getBrightness();
virtual void setBrightness(int value);
virtual bool supportsNightmode();
virtual int getBaseDPI();
enum ScreenSize {
SMALL, // Kobo Mini (705)
MEDIUM,
LARGE, // Kobo Glo HD (437), 249
VERY_LARGE // Kobo Libra (873)
};
virtual ScreenSize getScreenSize() = 0;
// USB Mass Storage Stuff
virtual bool isUSBPluggedIn();
virtual void loadUSBMassStorageModule();
virtual QString getUSBMassStorageModule();
// NETWORK
virtual QString getNetworkInterfaceName();
// PATHS
virtual const QString getStyleSheetPath();
};
#endif // PLATFORM_H

View file

@ -0,0 +1,6 @@
#include "device_desktop.h"
DeviceDesktop::DeviceDesktop()
{
}

View file

@ -0,0 +1,53 @@
#ifndef DEVICEDESKTOP_H
#define DEVICEDESKTOP_H
#include "device.h"
class DeviceDesktop : public Device
{
public:
DeviceDesktop();
virtual QString getID() override {
return "desktop";
}
virtual bool hasNavButtons() override {
return false;
}
virtual bool supportsWifi() override {
return true;
}
// BATTERY
virtual bool hasBattery() override {
return true;
}
// SCREEN
// WARM LIGHT
virtual bool supportsWarmLight() override {
return false;
};
virtual int getMaxWarmLightValue() override {
return 0;
};
virtual int getWarmth() override {return 0;};
virtual void setWarmth(int value) override {};
// BRIGHTNESS
virtual bool supportsBrightness() override {
return true;
};
// SIZE
virtual int getBaseDPI() override {
return 125;
}
virtual ScreenSize getScreenSize() override {
return ScreenSize::VERY_LARGE;
}
};
#endif // DEVICEDESKTOP_H

View file

@ -0,0 +1,29 @@
#include "device_kindle_touch.h"
#include <QFile>
#include <QProcess>
DeviceKindleTouch::DeviceKindleTouch()
{
}
int DeviceKindleTouch::getBatteryLevel() {
if(QFile::exists("/sys/devices/system/yoshi_battery/yoshi_battery0/battery_capacity")) {
return readFile("/sys/devices/system/yoshi_battery/yoshi_battery0/battery_capacity").toInt();
}
return 100;
}
bool DeviceKindleTouch::isUSBPluggedIn() {
return readFile("/sys/devices/system/yoshi_battery/yoshi_battery0/battery_status").toInt() == 1;
}
void DeviceKindleTouch::loadUSBMassStorageModule() {
QProcess::execute("insmod", QStringList() << "/external_root/lib/modules/2.6.35-inkbox/kernel/drivers/usb/gadget/arcotg_udc.ko");
}
QString DeviceKindleTouch::getUSBMassStorageModule() {
return "/external_root/lib/modules/2.6.35-inkbox/kernel/drivers/usb/gadget/g_file_storage.ko";
}

View file

@ -0,0 +1,61 @@
#ifndef DEVICEKINDLETOUCH_H
#define DEVICEKINDLETOUCH_H
#include "device.h"
class DeviceKindleTouch : public Device
{
public:
DeviceKindleTouch();
virtual QString getID() override {
return "kt";
}
virtual bool hasNavButtons() override {
return false;
}
virtual bool supportsWifi() override {
return true;
}
// BATTERY
virtual bool hasBattery() override {
return true;
}
virtual int getBatteryLevel() override;
// SCREEN
// WARM LIGHT
virtual bool supportsWarmLight() override {
return false;
};
virtual int getMaxWarmLightValue() override {
return 0;
};
virtual int getWarmth() override {return 0;};
virtual void setWarmth(int value) override {};
// BRIGHTNESS
virtual bool supportsBrightness() override {
return true;
};
// SIZE
virtual int getBaseDPI() override {
return 125;
}
virtual ScreenSize getScreenSize() override {
return ScreenSize::MEDIUM;
}
// USB
virtual bool isUSBPluggedIn() override;
virtual void loadUSBMassStorageModule() override;
virtual QString getUSBMassStorageModule() override;
};
#endif // DEVICEKINDLETOUCH_H

View file

@ -0,0 +1,6 @@
#include "device_kobo_aura_edition2.h"
DeviceKoboAuraEdition2::DeviceKoboAuraEdition2()
{
}

View file

@ -0,0 +1,53 @@
#ifndef KOBOAURAEDITION2_H
#define KOBOAURAEDITION2_H
#include "device.h"
class DeviceKoboAuraEdition2 : public Device
{
public:
DeviceKoboAuraEdition2();
virtual QString getID() override {
return "n236";
}
virtual bool hasNavButtons() override {
return false;
}
virtual bool supportsWifi() override {
return true;
}
// BATTERY
virtual bool hasBattery() override {
return true;
}
// SCREEN
// WARM LIGHT
virtual bool supportsWarmLight() override {
return false;
};
virtual int getMaxWarmLightValue() override {
return 0;
};
virtual int getWarmth() override {return 0;};
virtual void setWarmth(int value) override {};
// BRIGHTNESS
virtual bool supportsBrightness() override {
return true;
};
// SIZE
virtual int getBaseDPI() override {
return 175;
}
virtual ScreenSize getScreenSize() override {
return ScreenSize::MEDIUM;
}
};
#endif // KOBOAURAEDITION2_H

View file

@ -0,0 +1,43 @@
#include "device_kobo_clarahd.h"
#include <QFile>
#include <QProcess>
DeviceKoboClaraHD::DeviceKoboClaraHD()
{
}
int DeviceKoboClaraHD::getWarmth() {
QString sysfsWarmthPath = "/sys/class/backlight/backlight_warm/actual_brightness";
int warmthValue;
QString warmthConfig = readFile(sysfsWarmthPath);
warmthValue = warmthConfig.toInt();
return warmthValue;
}
void DeviceKoboClaraHD::setWarmth(int value) {
QString sysfsWarmthPath = "/sys/class/backlight/backlight_warm/brightness";
QString warmthValueStr =QString::number(value);
writeFile(sysfsWarmthPath, warmthValueStr);
}
void DeviceKoboClaraHD::setBrightness(int value) {
if(QFile::exists("/var/run/brightness_write")) {
writeFile("/var/run/brightness_write", QString::number(value));
}
}
//USB
bool DeviceKoboClaraHD::isUSBPluggedIn() {
return (readFile("/sys/class/power_supply/rn5t618-battery/status") != "Discharging\n");
}
void DeviceKoboClaraHD::loadUSBMassStorageModule() {
QProcess::execute("insmod", QStringList() << "/external_root/lib/modules/fs/configfs/configfs.ko");
QProcess::execute("insmod", QStringList() << "/external_root/lib/modules/drivers/usb/gadget/libcomposite.ko");
QProcess::execute("insmod", QStringList() << "/external_root/lib/modules/drivers/usb/gadget/function/usb_f_mass_storage.ko");
}

View file

@ -0,0 +1,63 @@
#ifndef DEVICEKOBOCLARAHD_H
#define DEVICEKOBOCLARAHD_H
#include "device.h"
class DeviceKoboClaraHD : public Device
{
public:
DeviceKoboClaraHD();
virtual QString getID() override {
return "n249";
}
virtual bool hasNavButtons() override {
return false;
}
virtual bool supportsWifi() override {
return true;
}
// BATTERY
virtual bool hasBattery() override {
return true;
}
// SCREEN
// WARM LIGHT
virtual bool supportsWarmLight() override {
return true;
};
virtual int getMaxWarmLightValue() override {
return 100;
};
virtual int getWarmth() override;
virtual void setWarmth(int value) override;
// BRIGHTNESS
virtual bool supportsBrightness() override {
return true;
};
virtual void setBrightness(int value) override;
// SIZE
virtual int getBaseDPI() override {
return 225;
}
virtual ScreenSize getScreenSize() override {
return ScreenSize::LARGE;
}
//USB
virtual bool isUSBPluggedIn() override;
virtual void loadUSBMassStorageModule() override;
// NETWORK
virtual QString getNetworkInterfaceName() override {
return "etho0";
}
};
#endif // DEVICEKOBOCLARAHD_H

View file

@ -0,0 +1,34 @@
#include "device_kobo_glo.h"
#include <sys/ioctl.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <fstream>
#include <QFile>
#include <QTextStream>
DeviceKoboGlo::DeviceKoboGlo()
{
}
int DeviceKoboGlo::getBrightness() {
return readFile(".config/03-brightness/config").toInt();
}
void DeviceKoboGlo::setBrightness(int value) {
int fd;
if((fd = open("/dev/ntx_io", O_RDWR)) == -1) {
fprintf(stderr, "Error opening ntx_io device while setting brightness.\n");
return;
}
ioctl(fd, 241, value);
close(fd);
// also store it somewhere so we can load it when we need it for getBrightness
std::ofstream fhandler;
fhandler.open(".config/03-brightness/config");
fhandler << value;
fhandler.close();
}

View file

@ -0,0 +1,56 @@
#ifndef DEVICEKOBOGLO_H
#define DEVICEKOBOGLO_H
#include "device.h"
class DeviceKoboGlo : public Device
{
public:
DeviceKoboGlo();
virtual QString getID() override {
return "n613";
}
virtual bool hasNavButtons() override {
return false;
}
virtual bool supportsWifi() override {
return true;
}
// BATTERY
virtual bool hasBattery() override {
return true;
}
// SCREEN
// WARM LIGHT
virtual bool supportsWarmLight() override {
return false;
};
virtual int getMaxWarmLightValue() override {
return 0;
};
virtual int getWarmth() override {return 0;};
virtual void setWarmth(int value) override {};
// BRIGHTNESS
virtual bool supportsBrightness() override {
return true;
};
virtual int getBrightness() override;
virtual void setBrightness(int value) override;
// SIZE
virtual int getBaseDPI() override {
return 175;
};
virtual ScreenSize getScreenSize() override {
return ScreenSize::MEDIUM;
}
};
#endif // DEVICEKOBOGLO_H

View file

@ -0,0 +1,6 @@
#include "device_kobo_glohd.h"
DeviceKoboGloHD::DeviceKoboGloHD()
{
}

View file

@ -0,0 +1,58 @@
#ifndef DEVICEKOBOGLOHD_H
#define DEVICEKOBOGLOHD_H
#include "device.h"
class DeviceKoboGloHD : public Device
{
public:
DeviceKoboGloHD();
virtual QString getID() override {
return "n437";
}
virtual bool hasNavButtons() override {
return false;
}
virtual bool supportsWifi() override {
return true;
}
// BATTERY
virtual bool hasBattery() override {
return true;
}
// SCREEN
// WARM LIGHT
virtual bool supportsWarmLight() override {
return false;
};
virtual int getMaxWarmLightValue() override {
return 0;
};
virtual int getWarmth() override {return 0;};
virtual void setWarmth(int value) override {};
// BRIGHTNESS
virtual bool supportsBrightness() override {
return true;
};
// SIZE
virtual int getBaseDPI() override {
return 225;
}
virtual ScreenSize getScreenSize() override {
return ScreenSize::LARGE;
}
//NETWORK
virtual QString getNetworkInterfaceName() override {
return "eth0";
}
};
#endif // DEVICEKOBOGLOHD_H

View file

@ -0,0 +1,35 @@
#include "device_kobo_libra.h"
#include <QProcess>
DeviceKoboLibra::DeviceKoboLibra()
{
}
int DeviceKoboLibra::getWarmth() {
QString sysfsWarmthPath = "/sys/class/backlight/lm3630a_led/color";
int warmthValue;
QString warmthConfig = readFile(sysfsWarmthPath);
warmthValue = warmthConfig.toInt();
warmthValue = 10 - warmthValue;
return warmthValue;
}
void DeviceKoboLibra::setWarmth(int value) {
QString sysfsWarmthPath;
QString warmthValueStr;
// Value 0 gives a warmer lighting than value 10
value = 10 - value;
warmthValueStr = QString::number(value);
sysfsWarmthPath = "/sys/class/backlight/lm3630a_led/color";
writeFile(sysfsWarmthPath, warmthValueStr);
}
void DeviceKoboLibra::loadUSBMassStorageModule() {
QProcess::execute("insmod", QStringList() << "/external_root/lib/modules/fs/configfs/configfs.ko");
QProcess::execute("insmod", QStringList() << "/external_root/lib/modules/drivers/usb/gadget/libcomposite.ko");
QProcess::execute("insmod", QStringList() << "/external_root/lib/modules/drivers/usb/gadget/function/usb_f_mass_storage.ko");
}

View file

@ -0,0 +1,56 @@
#ifndef DEVICEKOBOLIBRA_H
#define DEVICEKOBOLIBRA_H
#include "device.h"
class DeviceKoboLibra : public Device
{
public:
DeviceKoboLibra();
virtual QString getID() override {
return "n873";
}
virtual bool hasNavButtons() override {
return true;
}
virtual bool supportsWifi() override {
return true;
}
// BATTERY
virtual bool hasBattery() override {
return true;
}
// SCREEN
// WARM LIGHT
virtual bool supportsWarmLight() override {
return true;
};
virtual int getMaxWarmLightValue() override {
return 10;
};
virtual int getWarmth() override;
virtual void setWarmth(int value) override;
// BRIGHTNESS
virtual bool supportsBrightness() override {
return true;
};
// SIZE
virtual int getBaseDPI() override {
return 250;
}
virtual ScreenSize getScreenSize() override {
return ScreenSize::VERY_LARGE;
}
//USB
virtual void loadUSBMassStorageModule() override;
};
#endif // DEVICEKOBOLIBRA_H

View file

@ -0,0 +1,13 @@
#include "device_kobo_mini.h"
#include <QFile>
#include <QTextStream>
#include <QDirIterator>
DeviceKoboMini::DeviceKoboMini()
{
}

View file

@ -0,0 +1,50 @@
#ifndef DEVICEKOBOMINI_H
#define DEVICEKOBOMINI_H
#include "device.h"
class DeviceKoboMini : public Device
{
public:
DeviceKoboMini();
virtual QString getID() override {
return "n705";
}
virtual bool hasNavButtons() override {
return false;
}
virtual bool supportsWifi() override {
return true;
}
// BATTERY
virtual bool hasBattery() override {
return true;
}
// SCREEN
// WARM LIGHT
virtual bool supportsWarmLight() override {
return false;
};
virtual int getMaxWarmLightValue() override {
return 0;
};
virtual int getWarmth() override {return 0;};
virtual void setWarmth(int value) override {};
// BRIGHTNESS
virtual bool supportsBrightness() override {
return true;
};
// SIZE
virtual ScreenSize getScreenSize() override {
return ScreenSize::SMALL;
}
};
#endif // DEVICEKOBOMINI_H

View file

@ -0,0 +1,16 @@
#include "device_kobo_nia.h"
#include <QProcess>
DeviceKoboNia::DeviceKoboNia()
{
}
void DeviceKoboNia::loadUSBMassStorageModule() {
QProcess::execute("insmod", QStringList() << "/external_root/lib/modules/fs/configfs/configfs.ko");
QProcess::execute("insmod", QStringList() << "/external_root/lib/modules/drivers/usb/gadget/libcomposite.ko");
QProcess::execute("insmod", QStringList() << "/external_root/lib/modules/drivers/usb/gadget/function/usb_f_mass_storage.ko");
}

View file

@ -0,0 +1,56 @@
#ifndef DEVICEKOBONIA_H
#define DEVICEKOBONIA_H
#include "device.h"
class DeviceKoboNia : public Device
{
public:
DeviceKoboNia();
virtual QString getID() override {
return "n306";
}
virtual bool hasNavButtons() override {
return false;
}
virtual bool supportsWifi() override {
return true;
}
// BATTERY
virtual bool hasBattery() override {
return true;
}
// SCREEN
// WARM LIGHT
virtual bool supportsWarmLight() override {
return false;
};
virtual int getMaxWarmLightValue() override {
return 0;
};
virtual int getWarmth() override {return 0;};
virtual void setWarmth(int value) override {};
// BRIGHTNESS
virtual bool supportsBrightness() override {
return true;
};
// SIZE
virtual int getBaseDPI() override {
return 175;
}
virtual ScreenSize getScreenSize() override {
return ScreenSize::MEDIUM;
}
//USB
virtual void loadUSBMassStorageModule() override;
};
#endif // DEVICEKOBONIA_H

View file

@ -0,0 +1,6 @@
#include "device_kobo_touch.h"
DeviceKoboTouch::DeviceKoboTouch()
{
}

View file

@ -0,0 +1,53 @@
#ifndef DEVICEKOBOTOUCH_H
#define DEVICEKOBOTOUCH_H
#include "device.h"
class DeviceKoboTouch : public Device
{
public:
DeviceKoboTouch();
virtual QString getID() override {
return "n905";
}
virtual bool hasNavButtons() override {
return false;
}
virtual bool supportsWifi() override {
return true;
}
// BATTERY
virtual bool hasBattery() override {
return true;
}
// SCREEN
// WARM LIGHT
virtual bool supportsWarmLight() override {
return false;
};
virtual int getMaxWarmLightValue() override {
return 0;
};
virtual int getWarmth() override {return 0;};
virtual void setWarmth(int value) override {};
// BRIGHTNESS
virtual bool supportsBrightness() override {
return true;
};
// SIZE
virtual ScreenSize getScreenSize() override {
return ScreenSize::MEDIUM;
}
};
#endif // DEVICEKOBOTOUCH_H

View file

@ -3,9 +3,9 @@
#include <stdlib.h> #include <stdlib.h>
sleepThread::sleepThread() {} SleepThread::SleepThread() {}
void sleepThread::start() void SleepThread::start()
{ {
log("Sleep pipe thread active", className); log("Sleep pipe thread active", className);
QDir pipeDirPath = QDir("/dev/ipd"); QDir pipeDirPath = QDir("/dev/ipd");

View file

@ -3,11 +3,11 @@
#include <QObject> #include <QObject>
class sleepThread : public QObject { class SleepThread : public QObject {
Q_OBJECT Q_OBJECT
public: public:
QString className = this->metaObject()->className(); QString className = this->metaObject()->className();
sleepThread(); SleepThread();
public slots: public slots:
void start(); void start();

View file

@ -1,99 +0,0 @@
#include "quit.h"
#include "ui_quit.h"
#include "functions.h"
#include <QProcess>
#include <QIcon>
#include <QPixmap>
#include <QFile>
#include <QDebug>
#include <QScreen>
#include <linux/input.h>
quit::quit(QWidget *parent) :
QWidget(parent),
ui(new Ui::quit)
{
ui->setupUi(this);
ui->backBtn->setFont(QFont("u001"));
ui->pushButton->setProperty("type", "borderless");
ui->pushButton_2->setProperty("type", "borderless");
ui->pushButton_3->setProperty("type", "borderless");
ui->pushButton_4->setProperty("type", "borderless");
ui->backBtn->setProperty("type", "borderless");
// Stylesheet
QFile stylesheetFile("/mnt/onboard/.adds/inkbox/eink.qss");
stylesheetFile.open(QFile::ReadOnly);
this->setStyleSheet(stylesheetFile.readAll());
stylesheetFile.close();
// Getting the screen's size
float sW = QGuiApplication::screens()[0]->size().width();
float sH = QGuiApplication::screens()[0]->size().height();
// Defining what the "Quit" icon size will be
float stdIconWidth = sW / 1.25;
float stdIconHeight = sH / 1.25;
QPixmap pixmap(":/resources/exit.png");
QPixmap scaledPixmap = pixmap.scaled(stdIconWidth, stdIconHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui->label->setPixmap(scaledPixmap);
if(checkconfig("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/9-deepSleep") == true) {
ui->pushButton_3->setText("Deep suspend");
}
}
quit::~quit()
{
delete ui;
}
void quit::on_pushButton_clicked()
{
// Prevent strange "appearing from nowhere" low battery or critical battery alerts due to sysfs unmount
global::battery::showCriticalBatteryAlert = false;
global::battery::showLowBatteryDialog = false;
// GUI apps
updateUserAppsMainJsonFile();
poweroff(true);
qApp->quit();
}
void quit::on_pushButton_2_clicked()
{
global::battery::showCriticalBatteryAlert = false;
global::battery::showLowBatteryDialog = false;
// GUI apps
updateUserAppsMainJsonFile();
reboot(true);
qApp->quit();
}
void quit::on_pushButton_4_clicked()
{
log("Restarting InkBox", className);
QProcess process;
process.startDetached("inkbox", QStringList());
qApp->quit();
}
void quit::on_backBtn_clicked()
{
quit::close();
}
void quit::on_pushButton_3_clicked()
{
log("Suspending", className);
if(checkconfig("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/9-deepSleep") == true) {
writeFile("/dev/ipd/sleepCall", "deepSleep");
}
else {
writeFile("/dev/ipd/sleepCall", "sleep");
}
}

File diff suppressed because it is too large Load diff

View file

@ -1,136 +0,0 @@
#include "koboxsettings.h"
#include "ui_koboxsettings.h"
#include "functions.h"
#include <QFile>
#include <QScreen>
koboxSettings::koboxSettings(QWidget *parent) :
QWidget(parent),
ui(new Ui::koboxSettings)
{
ui->setupUi(this);
koboxSettings::setFont(QFont("u001"));
ui->okBtn->setFont(QFont("Inter"));
// UI tweaks
ui->okBtn->setProperty("type", "borderless");
ui->pushButton->setProperty("type", "borderless");
ui->resetKoboxBtn->setProperty("type", "borderless");
ui->pushButton->setStyleSheet("font-weight: bold");
ui->resetKoboxBtn->setStyleSheet("font-weight: bold");
ui->okBtn->setStyleSheet("font-weight: bold");
// Stylesheet
QFile stylesheetFile("/mnt/onboard/.adds/inkbox/eink.qss");
stylesheetFile.open(QFile::ReadOnly);
this->setStyleSheet(stylesheetFile.readAll());
stylesheetFile.close();
if(checkconfig("/external_root/boot/flags/X11_START") == true) {
ui->koboxStatusLabel->setText("KoBox is <b>enabled</b>");
not_user_change = true;
ui->checkBox->click();
ui->runtimeSettingsWidget->setVisible(true);
}
else {
ui->koboxStatusLabel->setText("KoBox is <b>disabled</b>");
ui->runtimeSettingsWidget->setVisible(false);
}
// DPI setting
QString dpiSetting;
QString dpiSettingStr = readFile(".config/00-kobox/dpiSetting");
if(dpiSettingStr.isEmpty()) {
if(global::deviceID == "n705\n" or global::deviceID == "n905\n" or global::deviceID == "kt\n") {
dpiSetting = "125";
}
else if(global::deviceID == "n613\n" or global::deviceID == "n236\n" or global::deviceID == "n306\n" or global::deviceID == "emu\n") {
dpiSetting = "175";
}
else if(global::deviceID == "n437\n" or global::deviceID == "n249\n") {
dpiSetting = "225";
}
else if(global::deviceID == "n873\n") {
dpiSetting = "250";
}
else {
dpiSetting = "125";
}
writeFile(".config/00-kobox/dpiSetting", dpiSetting);
}
readFile(".config/00-kobox/dpiSetting");
int dpi_setting = dpiSettingStr.toInt();
ui->spinBox->setValue(dpi_setting);
}
koboxSettings::~koboxSettings()
{
delete ui;
}
void koboxSettings::on_okBtn_clicked()
{
koboxSettings::close();
}
void koboxSettings::on_checkBox_toggled(bool checked)
{
if(checked == true) {
if(not_user_change != true) {
log("Enabling KoBox subsystem", className);
writeFile("/external_root/boot/flags/X11_START", "true\n");
openSettingsRebootDialog();
}
else {
not_user_change = false;
}
}
else {
log("Disabling KoBox subsystem", className);
writeFile("/external_root/boot/flags/X11_START", "false\n");
openSettingsRebootDialog();
}
}
void koboxSettings::openSettingsRebootDialog() {
log("Showing reboot dialog", className);
global::settings::settingsRebootDialog = true;
global::kobox::koboxSettingsRebootDialog = true;
generalDialogWindow = new generalDialog(this);
generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
}
void koboxSettings::openResetKoboxDialog() {
log("Showing KoBox reset dialog", className);
global::kobox::resetKoboxDialog = true;
generalDialogWindow = new generalDialog(this);
generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
}
void koboxSettings::on_spinBox_valueChanged(int arg1)
{
QString number = QString::number(arg1);
writeFile(".config/00-kobox/dpiSetting", number);
log("X11 DPI set to " + number, className);
}
void koboxSettings::on_pushButton_clicked()
{
// Export Extensions disk image over USB with g_mass_storage/g_file_storage
global::usbms::usbmsDialog = false;
global::usbms::launchUsbms = true;
global::usbms::koboxExportExtensions = true;
log("Exporting KoBox extensions onboard storage via USB", className);
log("Showing USBMS splash", className);
usbmsWindow = new usbmsSplash();
usbmsWindow->setAttribute(Qt::WA_DeleteOnClose);
usbmsWindow->setGeometry(QRect(QPoint(0,0), screen()->geometry ().size()));
usbmsWindow->show();
}
void koboxSettings::on_resetKoboxBtn_clicked()
{
openResetKoboxDialog();
}

View file

@ -1,434 +0,0 @@
#include "powerdaemonsettings.h"
#include "ui_powerdaemonsettings.h"
#include "functions.h"
#include <QFile>
powerDaemonSettings::powerDaemonSettings(QWidget *parent) :
QWidget(parent),
ui(new Ui::powerDaemonSettings)
{
ui->setupUi(this);
powerDaemonSettings::setFont(QFont("u001"));
ui->mainLabel->setFont(QFont("Inter"));
// Avoid some display issues (label moving because width of text would change with a proportional font)
ui->CBSLabel->setFont(QFont("Roboto Mono"));
ui->idleSleepLabel->setFont(QFont("Roboto Mono"));
// Font tweaks
ui->label_2->setFont(QFont("Inter"));
ui->exitBtn->setFont(QFont("Inter"));
// UI tweaks
ui->exitBtn->setProperty("type", "borderless");
ui->expBtn->setProperty("type", "borderless");
ui->hWhenChargerSleepBtn->setProperty("type", "borderless");
ui->hChargerWakeUpBtn->setProperty("type", "borderless");
ui->wifiReconnectBtn->setProperty("type", "borderless");
ui->ledUsageBtn->setProperty("type", "borderless");
ui->hCustomCaseBtn->setProperty("type", "borderless");
ui->deepSleepBtn->setProperty("type", "borderless");
ui->mainLabel->setStyleSheet("font-weight: bold");
ui->CBSLabel->setStyleSheet("font-weight: bold");
ui->idleSleepLabel->setStyleSheet("font-weight: bold");
ui->exitBtn->setStyleSheet("font-weight: bold");
// Experimental features label
ui->label_2->setStyleSheet("font-weight: bold");
// Icons
int controlBtnFixedWidth;
if(global::deviceID == "n705\n") {
controlBtnFixedWidth = 50;
}
else {
controlBtnFixedWidth = 80;
}
ui->CBSDecreaseBtn->setIcon(QIcon(":/resources/minus.png"));
ui->CBSDecreaseBtn->setFixedWidth(controlBtnFixedWidth);
ui->CBSIncreaseBtn->setIcon(QIcon(":/resources/plus.png"));
ui->CBSIncreaseBtn->setFixedWidth(controlBtnFixedWidth);
int idleBtnsFixedWidth;
if(global::deviceID == "n705\n") {
idleBtnsFixedWidth = 80;
}
else {
idleBtnsFixedWidth = 100;
}
ui->idleSleepDecreaseBtn->setFixedWidth(idleBtnsFixedWidth);
ui->idleSleepIncreaseBtn->setFixedWidth(idleBtnsFixedWidth);
ui->idleSleepDecreaseMBtn->setFixedWidth(idleBtnsFixedWidth);
ui->idleSleepIncreaseMBtn->setFixedWidth(idleBtnsFixedWidth);
// Padding
ui->CBSDecreaseBtn->setStyleSheet("padding: 10px; font-size: 10pt");
ui->CBSIncreaseBtn->setStyleSheet("padding: 10px; font-size: 10pt");
ui->idleSleepDecreaseBtn->setStyleSheet("font-family: 'Roboto Mono'; font-weight: bold; padding: 10px; font-size: 10pt");
ui->idleSleepIncreaseBtn->setStyleSheet("font-family: 'Roboto Mono'; font-weight: bold; padding: 10px; font-size: 10pt");
ui->idleSleepDecreaseMBtn->setStyleSheet("font-family: 'Roboto Mono'; font-weight: bold; padding: 10px; font-size: 10pt");
ui->idleSleepIncreaseMBtn->setStyleSheet("font-family: 'Roboto Mono'; font-weight: bold; padding: 10px; font-size: 10pt");
// Stylesheet
QFile stylesheetFile("/mnt/onboard/.adds/inkbox/eink.qss");
stylesheetFile.open(QFile::ReadOnly);
this->setStyleSheet(stylesheetFile.readAll());
stylesheetFile.close();
// Button tweaks
int autoRepeatDelay = 1250;
int autoRepeatInterval = 20;
ui->CBSDecreaseBtn->setAutoRepeat(true);
ui->CBSDecreaseBtn->setAutoRepeatDelay(autoRepeatDelay);
ui->CBSDecreaseBtn->setAutoRepeatInterval(autoRepeatInterval);
ui->CBSIncreaseBtn->setAutoRepeat(true);
ui->CBSIncreaseBtn->setAutoRepeatDelay(autoRepeatDelay);
ui->CBSIncreaseBtn->setAutoRepeatInterval(autoRepeatInterval);
ui->idleSleepDecreaseBtn->setAutoRepeat(true);
ui->idleSleepDecreaseBtn->setAutoRepeatDelay(autoRepeatDelay);
ui->idleSleepDecreaseBtn->setAutoRepeatInterval(autoRepeatInterval);
ui->idleSleepIncreaseBtn->setAutoRepeat(true);
ui->idleSleepIncreaseBtn->setAutoRepeatDelay(autoRepeatDelay);
ui->idleSleepIncreaseBtn->setAutoRepeatInterval(autoRepeatInterval);
ui->idleSleepDecreaseMBtn->setAutoRepeat(true);
ui->idleSleepDecreaseMBtn->setAutoRepeatDelay(autoRepeatDelay);
ui->idleSleepDecreaseMBtn->setAutoRepeatInterval(autoRepeatInterval);
ui->idleSleepIncreaseMBtn->setAutoRepeat(true);
ui->idleSleepIncreaseMBtn->setAutoRepeatDelay(autoRepeatDelay);
ui->idleSleepIncreaseMBtn->setAutoRepeatInterval(autoRepeatInterval);
// Hide items
ui->hLabel_3->hide();
ui->hCpuFreqComboBox->hide();
ui->hWhenChargerSleepBtn->hide();
ui->hChargerWakeUpBtn->hide();
ui->hCustomCaseBtn->hide();
// Prepare variables from system configuration (20-sleep_daemon)
log("Reading variables from power daemon configuration", className);
// 1 - cinematicBrightnessDelayMs
QString cinematicBrightnessMs = readFile("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/1-cinematicBrightnessDelayMs");
cinematicBrightnessInt = cinematicBrightnessMs.toInt();
convertCinematicInt();
// 2 - cpuGovernor
QString cpuGovernor = readFile("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/2-cpuGovernor");
QStringList cpuGovernorList = QStringList{cpuGovernor};
if(cpuGovernorList.contains("interactive") == false) {
cpuGovernorList.append("interactive");
}
if(cpuGovernorList.contains("conservative") == false) {
cpuGovernorList.append("conservative");
}
if(cpuGovernorList.contains("userspace") == false) {
cpuGovernorList.append("userspace");
}
if(cpuGovernorList.contains("powersave") == false) {
cpuGovernorList.append("powersave");
}
if(cpuGovernorList.contains("ondemand") == false) {
cpuGovernorList.append("ondemand");
}
if(cpuGovernorList.contains("performance") == false) {
cpuGovernorList.append("performance");
}
ui->hCpuFreqComboBox->addItems(cpuGovernorList);
ui->hCpuFreqComboBox->setCurrentIndex(0);
// 3 - whenChargerSleep
if(checkconfig("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/3-whenChargerSleep") == true) {
whenChargerSleepBool = true;
ui->hWhenChargerSleepBtn->click();
}
else {
whenChargerSleepBool = false;
}
// 4 - chargerWakeUp
if(checkconfig("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/4-chargerWakeUp") == true) {
chargerWakeUpBool = true;
ui->hChargerWakeUpBtn->click();
}
else {
chargerWakeUpBool = false;
}
// 5 - wifiReconnect
if(checkconfig("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/5-wifiReconnect") == true) {
ui->wifiReconnectBtn->click();
wifiReconnectBool = true;
}
else {
wifiReconnectBool = false;
}
// 6 - ledUsage
if(checkconfig("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/6-ledUsage") == true) {
ui->ledUsageBtn->click();
ledUsageBool = true;
}
else {
ledUsageBool = false;
}
// 7 - idleSleep
QString idleSleepString = readFile("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/7-idleSleep");
idleSleepInt = idleSleepString.replace("\n", "").toInt();
convertIdleSleepInt();
// 8 - customCase
if(checkconfig("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/8-customCase") == true) {
ui->hCustomCaseBtn->click();
customCaseBool = true;
}
else {
customCaseBool = false;
}
// 9 - deepSleep
if(checkconfig("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/9-deepSleep") == true) {
ui->deepSleepBtn->click();
deepSleepBool = true;
}
else {
deepSleepBool = false;
}
}
powerDaemonSettings::~powerDaemonSettings()
{
delete ui;
}
void powerDaemonSettings::on_CBSIncreaseBtn_clicked()
{
if(cinematicBrightnessInt < 500) {
cinematicBrightnessInt = cinematicBrightnessInt + 1;
convertCinematicInt();
}
}
void powerDaemonSettings::on_CBSDecreaseBtn_clicked()
{
if(cinematicBrightnessInt != 0) {
cinematicBrightnessInt = cinematicBrightnessInt - 1;
convertCinematicInt();
}
}
void powerDaemonSettings::on_exitBtn_clicked()
{
// Save all to files
// 1 - cinematicBrightnessdelayMs
writeFile("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/1-cinematicBrightnessDelayMs", QString::number(cinematicBrightnessInt));
// 2 - cpuGovernor
writeFile("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/2-cpuGovernor", ui->hCpuFreqComboBox->currentText());
// 3 - whenChargerSleep
writeFile("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/3-whenChargerSleep", QVariant(whenChargerSleepBool).toString());
// 4 - chargerWakeUp
writeFile("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/4-chargerWakeUp", QVariant(chargerWakeUpBool).toString());
// 5 - wifiReconnect
writeFile("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/5-wifiReconnect", QVariant(wifiReconnectBool).toString());
// 6 - ledUsage
writeFile("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/6-ledUsage", QVariant(ledUsageBool).toString());
// 7 - idleSleep
writeFile("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/7-idleSleep", QString::number(idleSleepInt));
// 8 - customCase
writeFile("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/8-customCase", QVariant(customCaseBool).toString());
// 9 - deepSleep
writeFile("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/9-deepSleep", QVariant(deepSleepBool).toString());
// Notify power daemon of configuration update
writeFile("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/updateConfig", "true");
powerDaemonSettings::close();
}
void powerDaemonSettings::on_expBtn_clicked()
{
// TODO: Implement additional warning
ui->hLabel_3->show();
ui->hCpuFreqComboBox->show();
ui->hWhenChargerSleepBtn->show();
ui->hChargerWakeUpBtn->show();
ui->hCustomCaseBtn->show();
ui->expBtn->hide();
}
void powerDaemonSettings::on_hWhenChargerSleepBtn_clicked(bool checked)
{
QString settingString = "suspend when charging";
if(checked == true) {
logEnabled(settingString, className);
whenChargerSleepBool = true;
}
else {
logDisabled(settingString, className);
whenChargerSleepBool = false;
}
}
void powerDaemonSettings::on_hChargerWakeUpBtn_clicked(bool checked)
{
QString settingString = "ignore charger wake-up events";
if(checked == true) {
logEnabled(settingString, className);
chargerWakeUpBool = true;
}
else {
logDisabled(settingString, className);
chargerWakeUpBool = false;
}
}
void powerDaemonSettings::on_wifiReconnectBtn_clicked(bool checked)
{
QString settingString = "Wi-Fi reconnection on wake-up";
if(checked == true) {
logEnabled(settingString, className);
wifiReconnectBool = true;
}
else {
logDisabled(settingString, className);
wifiReconnectBool = false;
}
}
void powerDaemonSettings::on_ledUsageBtn_clicked(bool checked)
{
QString settingString = "use LED";
if(checked == true) {
logEnabled(settingString, className);
ledUsageBool = true;
}
else {
logDisabled(settingString, className);
ledUsageBool = false;
}
}
void powerDaemonSettings::on_idleSleepIncreaseBtn_clicked()
{
if(idleSleepInt >= 15) {
idleSleepInt = idleSleepInt + 1;
}
else {
idleSleepInt = 15;
}
convertIdleSleepInt();
}
void powerDaemonSettings::on_idleSleepDecreaseBtn_clicked() {
if(idleSleepInt >= 15) {
idleSleepInt = idleSleepInt - 1;
if(idleSleepInt == 14) {
idleSleepInt = 0;
}
}
else {
idleSleepInt = 0;
}
convertIdleSleepInt();
}
void powerDaemonSettings::convertIdleSleepInt()
{
int copiedIdleSleepInt = idleSleepInt;
int minutes = 0;
int seconds = 0;
if(copiedIdleSleepInt == 0) {
ui->idleSleepLabel->setText("Never");
return;
}
while(copiedIdleSleepInt >= 60) {
minutes = minutes + 1;
copiedIdleSleepInt = copiedIdleSleepInt - 60;
}
seconds = copiedIdleSleepInt;
QString text;
if(minutes != 0) {
text.append(QString::number(minutes) + "m");
}
if(seconds != 0) {
text.append(" ");
text.append(QString::number(seconds) + "s");
}
ui->idleSleepLabel->setText(text);
}
void powerDaemonSettings::on_hCustomCaseBtn_clicked(bool checked)
{
QString settingString = "custom case";
if(checked == true) {
logEnabled(settingString, className);
customCaseBool = true;
}
else {
logDisabled(settingString, className);
customCaseBool = false;
}
}
void powerDaemonSettings::on_deepSleepBtn_clicked(bool checked)
{
QString settingString = "deep sleep";
if(checked == true) {
logEnabled(settingString, className);
deepSleepBool = true;
}
else {
logDisabled(settingString, className);
deepSleepBool = false;
}
}
void powerDaemonSettings::convertCinematicInt() {
QString text = QString::number(cinematicBrightnessInt);
// To avoid moving other widgets when the value changes
text.append(" ms");
ui->CBSLabel->setText(text);
}
void powerDaemonSettings::on_idleSleepIncreaseMBtn_clicked()
{
if(idleSleepInt >= 15) {
idleSleepInt = idleSleepInt + 60;
}
else {
idleSleepInt = 60;
}
convertIdleSleepInt();
}
void powerDaemonSettings::on_idleSleepDecreaseMBtn_clicked()
{
if(idleSleepInt >= 60) {
idleSleepInt = idleSleepInt - 60;
if(idleSleepInt < 14) {
idleSleepInt = 0;
}
}
else {
idleSleepInt = 0;
}
convertIdleSleepInt();
}

File diff suppressed because it is too large Load diff

View file

@ -1,110 +0,0 @@
#include "settingschooser.h"
#include "ui_settingschooser.h"
#include "functions.h"
#include "powerdaemonsettings.h"
#include <QFile>
#include <QScreen>
settingsChooser::settingsChooser(QWidget *parent) :
QWidget(parent),
ui(new Ui::settingsChooser)
{
ui->setupUi(this);
// Stylesheet
QFile stylesheetFile("/mnt/onboard/.adds/inkbox/eink.qss");
stylesheetFile.open(QFile::ReadOnly);
this->setStyleSheet(stylesheetFile.readAll());
stylesheetFile.close();
// UI tweaks
if(checkconfig("/opt/inkbox_kobox_support") == false) {
ui->koboxSettingsBtn->hide();
ui->line_3->hide();
}
// Getting the screen's size
sW = QGuiApplication::screens()[0]->size().width();
sH = QGuiApplication::screens()[0]->size().height();
// Defining what the default icon size will be
if(global::deviceID == "n705\n") {
homeIconWidth = sW / 18;
homeIconHeight = sW / 18;
}
else {
homeIconWidth = sW / 20;
homeIconHeight = sW / 20;
}
ui->inkboxSettingsBtn->setProperty("type", "borderless");
ui->koboxSettingsBtn->setProperty("type", "borderless");
ui->powerSettingsBtn->setProperty("type", "borderless");
if(global::deviceID == "n705\n" or global::deviceID == "n905\n" or global::deviceID == "kt\n") {
ui->inkboxSettingsBtn->setStyleSheet("padding: 20px; Text-align: left");
ui->koboxSettingsBtn->setStyleSheet("padding: 20px; Text-align: left");
ui->powerSettingsBtn->setStyleSheet("padding: 20px; Text-align: left");
}
else if(global::deviceID == "n613\n" or global::deviceID == "n236\n" or global::deviceID == "n306\n" or global::deviceID == "emu\n") {
ui->inkboxSettingsBtn->setStyleSheet("padding: 25px; Text-align: left");
ui->koboxSettingsBtn->setStyleSheet("padding:25px; Text-align: left");
ui->powerSettingsBtn->setStyleSheet("padding:25px; Text-align: left");
}
else {
ui->inkboxSettingsBtn->setStyleSheet("padding: 40px; Text-align: left");
ui->koboxSettingsBtn->setStyleSheet("padding: 40px; Text-align: left");
ui->powerSettingsBtn->setStyleSheet("padding: 40px; Text-align: left");
}
ui->inkboxSettingsBtn->setText("\t\t\tInkBox settings");
ui->koboxSettingsBtn->setText("\t\t\tKoBox settings");
ui->powerSettingsBtn->setText("\t\t\tPower settings");
ui->inkboxSettingsBtn->setIcon(QIcon(":/resources/settings.png"));
ui->inkboxSettingsBtn->setIconSize(QSize(homeIconWidth, homeIconHeight));
ui->koboxSettingsBtn->setIcon(QIcon(":/resources/X11.png"));
ui->koboxSettingsBtn->setIconSize(QSize(homeIconWidth, homeIconHeight));
ui->powerSettingsBtn->setIcon(QIcon(":/resources/power.png"));
ui->powerSettingsBtn->setIconSize(QSize(homeIconWidth, homeIconHeight));
}
settingsChooser::~settingsChooser()
{
delete ui;
}
void settingsChooser::on_inkboxSettingsBtn_clicked()
{
log("Launching InkBox Settings", className);
settingsWindow = new settings();
settingsWindow->setAttribute(Qt::WA_DeleteOnClose);
connect(settingsWindow, SIGNAL(showToast(QString)), SLOT(showToastNative(QString)));
connect(settingsWindow, SIGNAL(closeIndefiniteToast()), SLOT(closeIndefiniteToastNative()));
settingsWindow->showFullScreen();
}
void settingsChooser::on_koboxSettingsBtn_clicked()
{
log("Launching KoBox Settings", className);
koboxSettingsWindow = new koboxSettings();
koboxSettingsWindow->setAttribute(Qt::WA_DeleteOnClose);
koboxSettingsWindow->showFullScreen();
}
void settingsChooser::on_powerSettingsBtn_clicked()
{
log("Launching Power Daemon Settings", className);
powerDaemonSettings * powerSettingsWindow = new powerDaemonSettings();
powerSettingsWindow->setAttribute(Qt::WA_DeleteOnClose);
powerSettingsWindow->showFullScreen();
}
void settingsChooser::showToastNative(QString messageToDisplay) {
emit showToast(messageToDisplay);
}
void settingsChooser::closeIndefiniteToastNative() {
emit closeIndefiniteToast();
}

View file

@ -1,167 +0,0 @@
#include "alert.h"
#include "ui_alert.h"
#include "functions.h"
#include <QPixmap>
#include <QScreen>
#include <QFile>
#include <QProcess>
alert::alert(QWidget *parent) :
QWidget(parent),
ui(new Ui::alert)
{
ui->setupUi(this);
ui->messageLabel->setFont(QFont("u001"));
// Getting the screen's size
float sW = QGuiApplication::screens()[0]->size().width();
float sH = QGuiApplication::screens()[0]->size().height();
// Defining what the "Alert" icon size will be
float stdIconWidth = sW / 1.7;
float stdIconHeight = sH / 1.7;
// General stylesheet
QFile stylesheetFile(":/resources/eink-dark.qss");
stylesheetFile.open(QFile::ReadOnly);
this->setStyleSheet(stylesheetFile.readAll());
stylesheetFile.close();
// Default icon in case none of the conditions below are met
QPixmap pixmap(":/resources/alert.png");
QPixmap scaledPixmap = pixmap.scaled(stdIconWidth, stdIconHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui->alertIconLabel->setPixmap(scaledPixmap);
// Checking if the update's signature is untrusted. The signature error will always take precedence over the downgrade one (c.f. update.sh script)
if(checkconfig("/external_root/boot/flags/ALERT_SIGN") == true) {
QPixmap pixmap(":/resources/alert.png");
QPixmap scaledPixmap = pixmap.scaled(stdIconWidth, stdIconHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui->alertIconLabel->setPixmap(scaledPixmap);
signatureError = true;
log("Displaying signature error alert splash", className);
ui->securityLabel->setText("Failed to update InkBox.");
ui->messageLabel->setText("The digital signature of the update is untrusted.\nFor security reasons, it cannot be installed.");
ui->stackedWidget->setCurrentIndex(1);
}
if(checkconfig("/external_root/boot/flags/ALERT_DOWNGRADE") == true) {
QPixmap pixmap(":/resources/alert.png");
QPixmap scaledPixmap = pixmap.scaled(stdIconWidth, stdIconHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui->alertIconLabel->setPixmap(scaledPixmap);
log("Displaying downgrade error alert splash", className);
downgradeError = true;
ui->securityLabel->setText("Failed to update InkBox.");
ui->messageLabel->setText("An error occured during the update process.\nThe update package's version is lower than the actual installed version.");
ui->stackedWidget->setCurrentIndex(1);
}
if(global::encfs::lockdown == true) {
ui->stackedWidget->setVisible(false);
ui->stackedWidget->deleteLater();
QPixmap pixmap(":/resources/alert.png");
QPixmap scaledPixmap = pixmap.scaled(stdIconWidth, stdIconHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui->alertIconLabel->setPixmap(scaledPixmap);
ui->warningLabel->setText("Fatal error");
ui->securityLabel->setText("Device lockdown");
log(global::encfs::lockdownMessage, className);
QString message = "Due to multiple incorrect passphrase attempts, this device is locked down until\n" + global::encfs::unlockTime + "\nand won't boot.";
ui->messageLabel->setText(message);
poweroff(false);
QTimer::singleShot(1000, this, SLOT(quit()));
}
if(global::battery::showCriticalBatteryAlert == true) {
global::battery::showCriticalBatteryAlert = false;
ui->stackedWidget->setVisible(false);
ui->stackedWidget->deleteLater();
QPixmap pixmap(":/resources/battery_alert.png");
QPixmap scaledPixmap = pixmap.scaled(stdIconWidth, stdIconHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui->alertIconLabel->setPixmap(scaledPixmap);
log("Displaying critical battery alert splash", className);
criticalBattery = true;
ui->warningLabel->setText("Please charge your eReader.");
ui->securityLabel->setText("The battery's charge level is critical.");
ui->messageLabel->setText("To prevent damage, your device has been turned off.\nPlease consider charging it.");
// The Mini (N705) has a higher DPI and otherwise the text doesn't fit
if(global::deviceID == "n705\n") {
ui->warningLabel->setStyleSheet("QLabel { background-color : black; color : white; font-size: 14pt }");
}
else {
ui->warningLabel->setStyleSheet("QLabel { background-color : black; color : white; font-size: 16pt }");
}
poweroff(false);
QTimer::singleShot(1000, this, SLOT(quit()));
}
ui->messageLabel->setStyleSheet("QLabel { background-color : black; color : white; font-size: 10pt }");
ui->securityLabel->setStyleSheet("QLabel { background-color : black; color : white; font-size: 11pt }");
ui->continueBtn->setProperty("type", "borderless");
ui->resetBtn->setProperty("type", "borderless");
ui->continueBtn->setStyleSheet("padding: 20px");
ui->resetBtn->setStyleSheet("padding: 20px");
ui->continue2Btn->setProperty("type", "borderless");
ui->continue2Btn->setStyleSheet("padding: 20px");
}
alert::~alert()
{
delete ui;
}
void alert::on_continueBtn_clicked()
{
// We continue anyway and re-set the ALERT flag
writeFile("/external_root/boot/flags/ALERT", "false\n");
writeFile("/external_root/boot/flags/ALERT_SIGN", "false\n");
updateReset();
QProcess process;
process.startDetached("inkbox", QStringList());
qApp->quit();
}
void alert::on_resetBtn_clicked()
{
// We set the DO_FACTORY_RESET flag and we restart the device
log("Factory reset requested; setting required flags", className);
writeFile("/external_root/boot/flags/DO_FACTORY_RESET", "true\n");
writeFile("/external_root/boot/flags/DIAGS_BOOT", "true\n");
QString reboot_prog ("/sbin/reboot");
QStringList reboot_args;
reboot_args << "no_splash";
QProcess *reboot_proc = new QProcess();
reboot_proc->start(reboot_prog, reboot_args);
reboot_proc->waitForFinished();
reboot_proc->deleteLater();
}
void alert::on_continue2Btn_clicked()
{
// We continue anyway and re-set the ALERT flag
writeFile("/external_root/boot/flags/ALERT", "false\n");
updateReset();
log("Restarting InkBox", className);
if(signatureError == true) {
writeFile("/external_root/boot/flags/ALERT_SIGN", "false\n");
QProcess process;
process.startDetached("inkbox", QStringList());
qApp->quit();
}
if(downgradeError == true) {
writeFile("/external_root/boot/flags/ALERT_DOWNGRADE", "false\n");
QProcess process;
process.startDetached("inkbox", QStringList());
qApp->quit();
}
}
void alert::updateReset() {
writeFile("/mnt/onboard/onboard/.inkbox/can_really_update", "false\n");
writeFile("/mnt/onboard/onboard/.inkbox/can_update", "false\n");
}
void alert::quit() {
qApp->quit();
}

View file

@ -1,287 +0,0 @@
#include "usbmsSplash.h"
#include "ui_usbmsSplash.h"
#include <QPixmap>
#include <QScreen>
#include <QTimer>
#include "functions.h"
usbmsSplash::usbmsSplash(QWidget *parent) :
QWidget(parent),
ui(new Ui::usbmsSplash)
{
ui->setupUi(this);
usbmsSplash::setFont(QFont("u001"));
ui->label->setFont(QFont("Inter"));
// Getting the screen's size
sW = QGuiApplication::screens()[0]->size().width();
sH = QGuiApplication::screens()[0]->size().height();
// Defining what the default icon size will be
if(global::kobox::showKoboxSplash == true) {
float stdIconWidth = sW / 1.30;
float stdIconHeight = sH / 1.30;
// Stylesheet
QFile stylesheetFile("/mnt/onboard/.adds/inkbox/eink.qss");
stylesheetFile.open(QFile::ReadOnly);
this->setStyleSheet(stylesheetFile.readAll());
stylesheetFile.close();
ui->label->setFont(QFont("Inter"));
ui->label->setText("Launching KoBox subsystem");
ui->label->setStyleSheet("font-size: 14pt; font-weight: bold");
ui->label_3->setText("Please wait, this could take a while.");
if(global::deviceID == "n905\n" or global::deviceID == "kt\n") {
ui->label_3->setStyleSheet("font-size: 11pt");
}
else {
ui->label_3->setStyleSheet("font-size: 10pt");
}
QPixmap pixmap(":/resources/kobox-icon.png");
QPixmap scaledPixmap = pixmap.scaled(stdIconWidth, stdIconHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui->label_2->setPixmap(scaledPixmap);
}
else {
float stdIconWidth = sW / 1.15;
float stdIconHeight = sH / 1.15;
this->setStyleSheet("background-color:black;");
ui->label->setStyleSheet("QLabel { background-color : black; color : white; font-size: 15pt; font-weight: bold }");
ui->label_3->setStyleSheet("QLabel { background-color : black; color : white; font-size: 10pt }");
QPixmap pixmap(":/resources/usbms.png");
QPixmap scaledPixmap = pixmap.scaled(stdIconWidth, stdIconHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui->label_2->setPixmap(scaledPixmap);
}
if(global::usbms::launchUsbms == true) {
global::usbms::launchUsbms = false;
usbmsLaunch();
}
}
void usbmsSplash::usbmsLaunch()
{
log("Entering USBMS session", className);
writeFile("/tmp/in_usbms", "true");
QTimer::singleShot(1500, this, SLOT(brightnessDown()));
QTimer::singleShot(1500, this, SLOT(warmthDown()));
if(global::usbms::koboxExportExtensions == true) {
writeFile("/opt/ibxd", "kobox_extensions_storage_unmount\n");
}
if(checkconfig("/external_root/run/encfs_mounted") == true) {
writeFile("/external_root/run/encfs_stop_cleanup", "true");
writeFile("/opt/ibxd", "encfs_stop\n");
while(true) {
if(QFile::exists("/tmp/encfs_stopped")) {
QFile::remove("/tmp/encfs_stopped");
break;
}
QThread::msleep(500);
}
}
writeFile("/opt/ibxd", "gui_apps_stop\n");
while(true) {
if(QFile::exists("/tmp/gui_apps_stopped")) {
QFile::remove("/tmp/gui_apps_stopped");
break;
}
QThread::msleep(500);
}
writeFile("/opt/ibxd", "onboard_unmount\n");
while(true) {
if(QFile::exists("/tmp/onboard_unmounted")) {
QFile::remove("/tmp/onboard_unmounted");
break;
}
QThread::msleep(500);
}
writeFile("/opt/ibxd", "usbnet_stop\n");
while(true) {
if(QFile::exists("/tmp/usbnet_stopped")) {
QFile::remove("/tmp/usbnet_stopped");
break;
}
QThread::msleep(500);
}
if(global::deviceID == "n306\n" or global::deviceID == "n249\n" or global::deviceID == "n873\n") {
QProcess::execute("insmod", QStringList() << "/external_root/lib/modules/fs/configfs/configfs.ko");
QProcess::execute("insmod", QStringList() << "/external_root/lib/modules/drivers/usb/gadget/libcomposite.ko");
QProcess::execute("insmod", QStringList() << "/external_root/lib/modules/drivers/usb/gadget/function/usb_f_mass_storage.ko");
}
else if(global::deviceID == "kt\n") {
QProcess::execute("insmod", QStringList() << "/external_root/lib/modules/2.6.35-inkbox/kernel/drivers/usb/gadget/arcotg_udc.ko");
}
QString prog_1 ("insmod");
QStringList args_1;
if(global::deviceID == "kt\n") {
massStorageModule = "/external_root/lib/modules/2.6.35-inkbox/kernel/drivers/usb/gadget/g_file_storage.ko";
}
else {
massStorageModule = "/external_root/lib/modules/g_mass_storage.ko";
}
if(global::usbms::koboxExportExtensions == true) {
args_1 << massStorageModule << "file=/external_root/opt/storage/X11/extensions-user.img" << "removable=y" << "stall=0";
}
else {
args_1 << massStorageModule << "file=/external_root/opt/storage/onboard" << "removable=y" << "stall=0";
}
QProcess *proc_1 = new QProcess();
proc_1->start(prog_1, args_1);
proc_1->waitForFinished();
proc_1->deleteLater();
bool exitUsbMsDone = false;
QTimer *usbms_t = new QTimer(this);
usbms_t->setInterval(1000);
connect(usbms_t, &QTimer::timeout, [&]() {
if(exitUsbMsDone == false) {
if(isUsbPluggedIn() == 0) {
if(global::usbms::koboxExportExtensions == true) {
reboot(false);
qApp->quit();
}
else {
log("Exiting USBMS session", className);
// '<font/>' bit: because nothing else works ...
ui->label->setText("<font face='Inter'>Processing content</font>");
ui->label->setFont(QFont("Inter"));
ui->label_3->setText("Please wait");
ui->label_3->setFont(QFont("u001"));
ui->label->setStyleSheet("QLabel { background-color : black; color : white; font-size: 15pt; font-weight: bold }");
ui->label_3->setStyleSheet("QLabel { background-color : black; color : white; font-size: 11pt }");
ui->label->setFont(QFont("u001"));
float stdIconWidth = sW / 2;
float stdIconHeight = sH / 2;
QPixmap pixmap(":/resources/clock-inverted.png");
QPixmap scaledPixmap = pixmap.scaled(stdIconWidth, stdIconHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui->label_2->setPixmap(scaledPixmap);
this->repaint();
QString prog("rmmod");
QStringList args;
args << massStorageModule;
QProcess * proc = new QProcess();
proc->start(prog, args);
proc->waitForFinished();
proc->deleteLater();
QTimer::singleShot(500, this, SLOT(restartServices()));
}
exitUsbMsDone = true;
}
else {
;
}
}
} );
usbms_t->start();
}
usbmsSplash::~usbmsSplash()
{
delete ui;
}
void usbmsSplash::brightnessDown() {
cinematicBrightness(0, 1);
writeFile("/tmp/inkbox-cinematicBrightness_ran", "false");
}
void usbmsSplash::warmthDown() {
if(global::deviceID == "n249\n" or global::deviceID == "n873\n") {
cinematicWarmth(0);
}
}
void usbmsSplash::quit_restart() {
// If existing, cleaning bookconfig_mount mountpoint
writeFile("/opt/ibxd", "bookconfig_unmount\n");
// Restarting InkBox
QProcess process;
process.startDetached("inkbox", QStringList());
qApp->quit();
}
void usbmsSplash::restartServices() {
// Restarting USBNet
// NOTE: USBNet is only started if required conditions are met (see https://github.com/Kobo-InkBox/rootfs/blob/master/etc/init.d/usbnet)
writeFile("/opt/ibxd", "usbnet_start\n");
while(true) {
if(QFile::exists("/tmp/usbnet_started")) {
QFile::remove("/tmp/usbnet_started");
break;
}
QThread::msleep(500);
}
// Mounting onboard storage
writeFile("/opt/ibxd", "onboard_mount\n");
while(true) {
if(QFile::exists("/tmp/onboard_mounted")) {
QFile::remove("/tmp/onboard_mounted");
break;
}
QThread::msleep(500);
}
// Checking for updates
writeFile("/opt/ibxd", "update_inkbox_restart\n");
while(true) {
if(QFile::exists("/tmp/update_inkbox_restarted")) {
QFile::remove("/tmp/update_inkbox_restarted");
break;
}
QThread::msleep(500);
}
QFile::remove("/tmp/in_usbms");
// GUI apps: update main JSON file
writeFile("/opt/ibxd", "gui_apps_start\n");
while(true) {
if(QFile::exists("/tmp/gui_apps_started")) {
if(checkconfig("/tmp/gui_apps_started") == true) {
QFile::remove("/tmp/gui_apps_started");
updateUserAppsMainJsonFile();
break;
}
else {
log("GUI apps service failed to start", className);
QFile::remove("/tmp/gui_apps_started");
break;
}
}
QThread::msleep(500);
}
// Remove macOS dotfiles
{
QString prog("busybox-initrd");
QStringList args;
args << "find" << "/mnt/onboard/onboard" << "-type" << "f" << "-name" << "._*" << "-delete";
QProcess * proc = new QProcess();
proc->start(prog, args);
proc->waitForFinished();
proc->deleteLater();
}
// Re-generate local library on next launch
QFile::remove(global::localLibrary::databasePath);
quit_restart();
}

View file

@ -1,16 +1,19 @@
#include "telemetry.h" #include "telemetry.h"
#include "device.h"
telemetry::telemetry(QObject *parent) Telemetry::Telemetry(QObject *parent)
: QObject{parent} : QObject{parent}
{ {
QTimer::singleShot(100, this, SLOT(telemetrySlot())); QTimer::singleShot(100, this, SLOT(telemetrySlot()));
} }
QJsonObject telemetry::collectDeviceInformation() { QJsonObject Telemetry::collectDeviceInformation() {
Device::SysInfo info = Device::getSingleton()->getSystemInfo();
QJsonObject data; QJsonObject data;
data.insert("DeviceUID", getUID()); data.insert("DeviceUID", info.uid);
data.insert("SystemVersion", readFile("/opt/version").trimmed()); data.insert("SystemVersion", readFile("/opt/version").trimmed());
data.insert("Device", global::deviceID.trimmed()); data.insert("Device", Device::getSingleton()->getID());
if(checkconfig("/external_root/opt/root/rooted")) { if(checkconfig("/external_root/opt/root/rooted")) {
data.insert("DeviceRooted", "true"); data.insert("DeviceRooted", "true");
} }
@ -27,7 +30,7 @@ QJsonObject telemetry::collectDeviceInformation() {
return data; return data;
} }
bool telemetry::sendDeviceInformation(QJsonObject data) { bool Telemetry::sendDeviceInformation(QJsonObject data) {
log("Telemetry data to be sent to server: " + QJsonDocument(data).toJson(QJsonDocument::Compact), className); log("Telemetry data to be sent to server: " + QJsonDocument(data).toJson(QJsonDocument::Compact), className);
// NOTE: This URL *will* change in the future // NOTE: This URL *will* change in the future
@ -46,7 +49,7 @@ bool telemetry::sendDeviceInformation(QJsonObject data) {
return true; return true;
} }
void telemetry::telemetrySlot() { void Telemetry::telemetrySlot() {
QJsonObject data = collectDeviceInformation(); QJsonObject data = collectDeviceInformation();
if(sendDeviceInformation(data)) { if(sendDeviceInformation(data)) {
writeFile("/mnt/onboard/.adds/inkbox/.config/24-telemetry/asked", "true"); writeFile("/mnt/onboard/.adds/inkbox/.config/24-telemetry/asked", "true");

View file

@ -7,11 +7,11 @@
#include <QApplication> #include <QApplication>
#include "functions.h" #include "functions.h"
class telemetry : public QObject class Telemetry : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit telemetry(QObject *parent = nullptr); explicit Telemetry(QObject *parent = nullptr);
QString className = this->metaObject()->className(); QString className = this->metaObject()->className();
QString message; QString message;
QString deviceUID; QString deviceUID;

View file

@ -1,20 +1,22 @@
#include "apps.h" #include "apps.h"
#include "ui_apps.h"
#include "mainwindow.h" #include "mainwindow.h"
#include "ui_apps.h"
#include "userapps.h" #include "userapps.h"
#include "ui.h"
#include <QFile> #include <QFile>
#include <QProcess>
#include <QJsonParseError>
#include <QJsonObject>
#include <QJsonValue>
#include <QJsonArray> #include <QJsonArray>
#include <QJsonObject>
#include <QJsonParseError>
#include <QJsonValue>
#include <QProcess>
#include <QScreen> #include <QScreen>
apps::apps(QWidget *parent) : AppsWidget::AppsWidget(QWidget *parent) :
QWidget(parent), QWidget(parent),
ui(new Ui::apps) ui(new Ui::AppsWidget) {
{ Device *device = Device::getSingleton();
ui->setupUi(this); ui->setupUi(this);
ui->koboxAppsOpenButton->setProperty("type", "borderless"); ui->koboxAppsOpenButton->setProperty("type", "borderless");
ui->calendarLaunchBtn->setProperty("type", "borderless"); ui->calendarLaunchBtn->setProperty("type", "borderless");
@ -38,23 +40,22 @@ apps::apps(QWidget *parent) :
ui->noUserAppsAvailableLabel->hide(); ui->noUserAppsAvailableLabel->hide();
// Hiding KoBox apps button and label if X11 isn't enabled/wasn't started // Hiding KoBox apps button and label if X11 isn't enabled/wasn't started
if(checkconfig("/external_root/boot/flags/X11_START") == false or checkconfig("/external_root/boot/flags/X11_STARTED") == false) { if (checkconfig("/external_root/boot/flags/X11_START") == false or checkconfig("/external_root/boot/flags/X11_STARTED") == false) {
ui->label_5->hide(); ui->label_5->hide();
ui->koboxAppsOpenButton->hide(); ui->koboxAppsOpenButton->hide();
ui->label_5->deleteLater(); ui->label_5->deleteLater();
ui->koboxAppsOpenButton->deleteLater(); ui->koboxAppsOpenButton->deleteLater();
} }
// Hiding VNC viewer button and label if device is not rooted and doesn't have a working Wi-Fi adapter, or if X11 is not running // Hiding VNC viewer button and label if device is not rooted and doesn't have a working Wi-Fi adapter, or if X11 is not running
if(checkconfig("/external_root/opt/root/rooted") == false) { if (checkconfig("/external_root/opt/root/rooted") == false) {
if(global::device::isWifiAble == false or checkconfig("/external_root/boot/flags/X11_START") == false or checkconfig("/external_root/boot/flags/X11_STARTED") == false) { if (device->supportsWifi() == false or checkconfig("/external_root/boot/flags/X11_START") == false or checkconfig("/external_root/boot/flags/X11_STARTED") == false) {
ui->vncViewerLabel->hide(); ui->vncViewerLabel->hide();
ui->vncLaunchBtn->hide(); ui->vncLaunchBtn->hide();
ui->vncViewerLabel->deleteLater(); ui->vncViewerLabel->deleteLater();
ui->vncLaunchBtn->deleteLater(); ui->vncLaunchBtn->deleteLater();
} }
} } else {
else { if (checkconfig("/external_root/boot/flags/X11_START") == false or checkconfig("/external_root/boot/flags/X11_STARTED") == false) {
if(checkconfig("/external_root/boot/flags/X11_START") == false or checkconfig("/external_root/boot/flags/X11_STARTED") == false) {
ui->vncViewerLabel->hide(); ui->vncViewerLabel->hide();
ui->vncLaunchBtn->hide(); ui->vncLaunchBtn->hide();
ui->vncViewerLabel->deleteLater(); ui->vncViewerLabel->deleteLater();
@ -71,202 +72,191 @@ apps::apps(QWidget *parent) :
jsonParseSuccess = parseJson(); jsonParseSuccess = parseJson();
showUserApps(false); showUserApps(false);
QFile stylesheetFile("/mnt/onboard/.adds/inkbox/eink.qss"); UI::applyStyle(*this, "eink");
stylesheetFile.open(QFile::ReadOnly);
this->setStyleSheet(stylesheetFile.readAll());
stylesheetFile.close();
} }
apps::~apps() AppsWidget::~AppsWidget() {
{
delete ui; delete ui;
} }
void apps::exitSlot() { void AppsWidget::exitSlot() {
apps::close(); AppsWidget::close();
} }
void apps::on_savedWordsLaunchBtn_clicked() void AppsWidget::on_savedWordsLaunchBtn_clicked() {
{
log("Launching Saved Words app", className); log("Launching Saved Words app", className);
savedWordsWindow = new savedwords(); savedWordsWindow = new SavedWordsAppWidget();
savedWordsWindow->setAttribute(Qt::WA_DeleteOnClose); savedWordsWindow->setAttribute(Qt::WA_DeleteOnClose);
savedWordsWindow->showFullScreen(); savedWordsWindow->showFullScreen();
} }
void apps::on_calendarLaunchBtn_clicked() void AppsWidget::on_calendarLaunchBtn_clicked() {
{
log("Launching Calendar app", className); log("Launching Calendar app", className);
calendarWindow = new calendarApp(); calendarWindow = new CalendarAppWidget();
calendarWindow->setAttribute(Qt::WA_DeleteOnClose); calendarWindow->setAttribute(Qt::WA_DeleteOnClose);
calendarWindow->showFullScreen(); calendarWindow->showFullScreen();
} }
void apps::on_calculatorLaunchBtn_clicked() void AppsWidget::on_calculatorLaunchBtn_clicked() {
{
log("Launching external Qalculate! app", className); log("Launching external Qalculate! app", className);
QProcess process; QProcess process;
process.startDetached("qalculate", QStringList()); process.startDetached("qalculate", QStringList());
qApp->quit(); qApp->quit();
} }
void apps::on_koboxAppsOpenButton_clicked() void AppsWidget::on_koboxAppsOpenButton_clicked() {
{
log("Showing KoBox Apps Dialog", className); log("Showing KoBox Apps Dialog", className);
koboxAppsDialogWindow = new koboxAppsDialog(); koboxAppsDialogWindow = new KoboxAppsDialog();
connect(koboxAppsDialogWindow, SIGNAL(showToast(QString)), SLOT(showToastNative(QString))); connect(koboxAppsDialogWindow, SIGNAL(showToast(QString)), SLOT(showToastNative(QString)));
koboxAppsDialogWindow->setAttribute(Qt::WA_DeleteOnClose); koboxAppsDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
koboxAppsDialogWindow->show(); koboxAppsDialogWindow->show();
} }
void apps::on_vncLaunchBtn_clicked() void AppsWidget::on_vncLaunchBtn_clicked() {
{
log("Showing VNC dialog", className); log("Showing VNC dialog", className);
global::keyboard::keyboardDialog = true; global::keyboard::keyboardDialog = true;
global::keyboard::vncDialog = true; global::keyboard::vncDialog = true;
global::keyboard::keyboardText = ""; global::keyboard::keyboardText = "";
generalDialogWindow = new generalDialog(); generalDialogWindow = new GeneralDialog();
generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose); generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
connect(generalDialogWindow, SIGNAL(refreshScreen()), SLOT(refreshScreenNative())); connect(generalDialogWindow, SIGNAL(refreshScreen()), SLOT(refreshScreenNative()));
generalDialogWindow->show(); generalDialogWindow->show();
} }
void apps::refreshScreenNative() { void AppsWidget::refreshScreenNative() {
emit refreshScreen(); emit refreshScreen();
} }
void apps::on_reversiLaunchBtn_clicked() void AppsWidget::on_reversiLaunchBtn_clicked() {
{
log("Launching external Reversi app", className); log("Launching external Reversi app", className);
QProcess process; QProcess process;
process.startDetached("qreversi", QStringList()); process.startDetached("qreversi", QStringList());
qApp->quit(); qApp->quit();
} }
void apps::on_g2048LaunchBtn_clicked() void AppsWidget::on_g2048LaunchBtn_clicked() {
{
log("Launching external 2048 app", className); log("Launching external 2048 app", className);
QProcess process; QProcess process;
process.startDetached("2048", QStringList()); process.startDetached("2048", QStringList());
qApp->quit(); qApp->quit();
} }
void apps::showToastNative(QString messageToDisplay) { void AppsWidget::showToastNative(QString messageToDisplay) {
emit showToast(messageToDisplay); emit showToast(messageToDisplay);
} }
/* /*
* This function opens and reads the main GUI user applications' JSON file, parses and verifies its contents to avoid issues in the future. * This function opens and reads the main GUI user applications' JSON file, parses and verifies its contents to avoid issues in the future.
*/ */
bool apps::parseJson() { bool AppsWidget::parseJson() {
// If the path changes, it is also used statically in showUserApps() // If the path changes, it is also used statically in showUserApps()
jsonFile.setFileName("/mnt/onboard/onboard/.apps/apps.json"); jsonFile.setFileName("/mnt/onboard/onboard/.apps/apps.json");
bool jsonCheckSuccess = true; bool jsonCheckSuccess = true;
if(jsonFile.exists() == false) { if (jsonFile.exists() == false) {
log("GUI user applications' main JSON file is missing", className); log("GUI user applications' main JSON file is missing", className);
jsonCheckSuccess = false; jsonCheckSuccess = false;
} } else {
else {
jsonFile.open(QIODevice::ReadOnly | QIODevice::Text); jsonFile.open(QIODevice::ReadOnly | QIODevice::Text);
QString fileRead = jsonFile.readAll(); QString fileRead = jsonFile.readAll();
jsonFile.close(); jsonFile.close();
jsonDocument = QJsonDocument::fromJson(fileRead.toUtf8()); jsonDocument = QJsonDocument::fromJson(fileRead.toUtf8());
if(jsonDocument.isNull() == true) { if (jsonDocument.isNull() == true) {
log("GUI user applications' main JSON file is invalid", className); log("GUI user applications' main JSON file is invalid", className);
jsonCheckSuccess = false; jsonCheckSuccess = false;
} } else {
else {
QJsonObject jsonObject = jsonDocument.object(); QJsonObject jsonObject = jsonDocument.object();
if(jsonObject["list"].isArray() == true) { if (jsonObject["list"].isArray() == true) {
QJsonArray jsonArray = jsonObject["list"].toArray(); QJsonArray jsonArray = jsonObject["list"].toArray();
for(QJsonValueRef refJsonObject: jsonArray) { for (QJsonValueRef refJsonObject : jsonArray) {
if(refJsonObject.isObject()) { if (refJsonObject.isObject()) {
QJsonObject jsonMainObject = refJsonObject.toObject(); QJsonObject jsonMainObject = refJsonObject.toObject();
if(jsonMainObject.size() == 9) { if (jsonMainObject.size() == 9) {
if(!jsonMainObject["Name"].isString()) { if (!jsonMainObject["Name"].isString()) {
QString function = __func__; log(function + ": Invalid 'Name' type inside object", className); QString function = __func__;
log(function + ": Invalid 'Name' type inside object", className);
jsonCheckSuccess = false; jsonCheckSuccess = false;
} }
if(!jsonMainObject["Author"].isString()) { if (!jsonMainObject["Author"].isString()) {
QString function = __func__; log(function + ": Invalid 'Author' type inside object", className); QString function = __func__;
log(function + ": Invalid 'Author' type inside object", className);
jsonCheckSuccess = false; jsonCheckSuccess = false;
} }
if(!jsonMainObject["AuthorContact"].isString()) { if (!jsonMainObject["AuthorContact"].isString()) {
QString function = __func__; log(function + ": Invalid 'AuthorContact' type inside object", className); QString function = __func__;
log(function + ": Invalid 'AuthorContact' type inside object", className);
jsonCheckSuccess = false; jsonCheckSuccess = false;
} }
if(!jsonMainObject["Version"].isString()) { if (!jsonMainObject["Version"].isString()) {
QString function = __func__; log(function + ": Invalid 'Version' type inside object", className); QString function = __func__;
log(function + ": Invalid 'Version' type inside object", className);
jsonCheckSuccess = false; jsonCheckSuccess = false;
} }
if(!jsonMainObject["IconPath"].isString()) { if (!jsonMainObject["IconPath"].isString()) {
log("JSON: Invalid IconPath type inside object", className); log("JSON: Invalid IconPath type inside object", className);
jsonCheckSuccess = false; jsonCheckSuccess = false;
} }
if(!jsonMainObject["ExecPath"].isString()) { if (!jsonMainObject["ExecPath"].isString()) {
QString function = __func__; log(function + ": Invalid 'ExecPath' type inside object", className); QString function = __func__;
log(function + ": Invalid 'ExecPath' type inside object", className);
jsonCheckSuccess = false; jsonCheckSuccess = false;
} } else {
else { if (jsonMainObject["ExecPath"].toString().contains("..")) {
if(jsonMainObject["ExecPath"].toString().contains("..")) {
// Possible security risk // Possible security risk
showToastNative("ERROR: 'ExecPath' has invalid path"); showToastNative("ERROR: 'ExecPath' has invalid path");
QString function = __func__; log(function + ": 'ExecPath' contains \"..\"", className); QString function = __func__;
log(function + ": 'ExecPath' contains \"..\"", className);
jsonCheckSuccess = false; jsonCheckSuccess = false;
} }
} }
if(!jsonMainObject["Enabled"].isBool()) { if (!jsonMainObject["Enabled"].isBool()) {
QString function = __func__; log(function + ": Invalid 'Enabled' type inside object", className); QString function = __func__;
log(function + ": Invalid 'Enabled' type inside object", className);
jsonCheckSuccess = false;
}
if (!jsonMainObject["SupportedDevices"].isArray()) {
QString function = __func__;
log(function + ": Invalid 'SupportedDevices' type inside object", className);
jsonCheckSuccess = false; jsonCheckSuccess = false;
} } else {
if(!jsonMainObject["SupportedDevices"].isArray()) {
QString function = __func__; log(function + ": Invalid 'SupportedDevices' type inside object", className);
jsonCheckSuccess = false;
}
else {
QJsonArray jsonArray = jsonMainObject["SupportedDevices"].toArray(); QJsonArray jsonArray = jsonMainObject["SupportedDevices"].toArray();
for(QJsonValueRef refJsonObject: jsonArray) { for (QJsonValueRef refJsonObject : jsonArray) {
// https://doc.qt.io/qt-5/qjsonvalue.html#toInt // https://doc.qt.io/qt-5/qjsonvalue.html#toInt
if(!refJsonObject.isString()) { if (!refJsonObject.isString()) {
QString function = __func__; log(function + ": Array from 'RequiredFeatures' contains a wrong type", className); QString function = __func__;
log(function + ": Array from 'RequiredFeatures' contains a wrong type", className);
jsonCheckSuccess = false; jsonCheckSuccess = false;
} }
} }
} }
if(!jsonMainObject["RequiredFeatures"].isArray()) { if (!jsonMainObject["RequiredFeatures"].isArray()) {
QString function = __func__; log(function + ": Invalid 'RequiredFeatures' type inside object", className); QString function = __func__;
log(function + ": Invalid 'RequiredFeatures' type inside object", className);
jsonCheckSuccess = false; jsonCheckSuccess = false;
} } else {
else {
QJsonArray jsonArray = jsonMainObject["RequiredFeatures"].toArray(); QJsonArray jsonArray = jsonMainObject["RequiredFeatures"].toArray();
for(QJsonValueRef refJsonObject: jsonArray) { for (QJsonValueRef refJsonObject : jsonArray) {
// https://doc.qt.io/qt-5/qjsonvalue.html#toInt // https://doc.qt.io/qt-5/qjsonvalue.html#toInt
if(!refJsonObject.isDouble()) { if (!refJsonObject.isDouble()) {
QString function = __func__; log(function + ": Array from 'RequiredFeatures' contains a wrong type", className); QString function = __func__;
log(function + ": Array from 'RequiredFeatures' contains a wrong type", className);
jsonCheckSuccess = false; jsonCheckSuccess = false;
} }
} }
} }
} } else {
else { QString function = __func__;
QString function = __func__; QString message = function + ": An object inside list array has too many items (or not enough): "; QString message = function + ": An object inside list array has too many items (or not enough): ";
message.append(QString::number(jsonMainObject.size())); message.append(QString::number(jsonMainObject.size()));
log(message, className); log(message, className);
jsonCheckSuccess = false; jsonCheckSuccess = false;
} }
} } else {
else { QString function = __func__;
QString function = __func__; log(function + ": List array has an item of other type than object", className); log(function + ": List array has an item of other type than object", className);
jsonCheckSuccess = false; jsonCheckSuccess = false;
} }
} }
@ -276,9 +266,8 @@ bool apps::parseJson() {
return jsonCheckSuccess; return jsonCheckSuccess;
} }
void apps::on_editUserAppsBtn_clicked() void AppsWidget::on_editUserAppsBtn_clicked() {
{ if (userAppsSecondPage == false) {
if(userAppsSecondPage == false) {
userAppsSecondPage = true; userAppsSecondPage = true;
// Settings page // Settings page
@ -287,8 +276,7 @@ void apps::on_editUserAppsBtn_clicked()
emit showUserAppsEdit(userAppsSecondPage); emit showUserAppsEdit(userAppsSecondPage);
QTimer::singleShot(500, this, SLOT(refreshScreenNative())); QTimer::singleShot(500, this, SLOT(refreshScreenNative()));
} } else {
else {
userAppsSecondPage = false; userAppsSecondPage = false;
userAppsAvailable = false; userAppsAvailable = false;
@ -307,18 +295,18 @@ void apps::on_editUserAppsBtn_clicked()
} }
} }
void apps::showUserApps(bool showDisabledJson) void AppsWidget::showUserApps(bool showDisabledJson) {
{
emit clearAppsLayout(); emit clearAppsLayout();
if(jsonParseSuccess == true) { if (jsonParseSuccess == true) {
QString function = __func__; log(function + ": Main user applications' JSON is valid", className); QString function = __func__;
log(function + ": Main user applications' JSON is valid", className);
QJsonArray jsonListArray = jsonDocument.object()["list"].toArray(); QJsonArray jsonListArray = jsonDocument.object()["list"].toArray();
for(QJsonValueRef refJsonObject: jsonListArray) { for (QJsonValueRef refJsonObject : jsonListArray) {
QJsonObject appInfo = refJsonObject.toObject(); QJsonObject appInfo = refJsonObject.toObject();
if(appInfo["Enabled"].toBool() == true or showDisabledJson == true) { if (appInfo["Enabled"].toBool() == true or showDisabledJson == true) {
userAppsAvailable = true; userAppsAvailable = true;
userapps * newUserApp = new userapps; UserAppsWidget *newUserApp = new UserAppsWidget;
newUserApp->provideInfo(appInfo); newUserApp->provideInfo(appInfo);
connect(this, SIGNAL(clearAppsLayout()), newUserApp, SLOT(deleteLater())); connect(this, SIGNAL(clearAppsLayout()), newUserApp, SLOT(deleteLater()));
connect(this, SIGNAL(showUserAppsEdit(bool)), newUserApp, SLOT(changePageEnabling(bool))); connect(this, SIGNAL(showUserAppsEdit(bool)), newUserApp, SLOT(changePageEnabling(bool)));
@ -330,20 +318,19 @@ void apps::showUserApps(bool showDisabledJson)
} }
} }
if(userAppsAvailable == false) { if (userAppsAvailable == false) {
ui->noUserAppsAvailableLabel->show(); ui->noUserAppsAvailableLabel->show();
} } else {
else {
ui->noUserAppsAvailableLabel->hide(); ui->noUserAppsAvailableLabel->hide();
} }
} } else {
else { if (QFile::exists("/mnt/onboard/onboard/.apps/apps.json")) {
if(QFile::exists("/mnt/onboard/onboard/.apps/apps.json")) { QString function = __func__;
QString function = __func__; log(function + ": Main user applications' JSON file is invalid", className); log(function + ": Main user applications' JSON file is invalid", className);
QTimer::singleShot(500, this, SLOT(showFailedToParseMainUserAppsJsonFile())); QTimer::singleShot(500, this, SLOT(showFailedToParseMainUserAppsJsonFile()));
} } else {
else { QString function = __func__;
QString function = __func__; log(function + ": Main user applications' JSON file doesn't exist; assuming that no user applications are currently installed", className); log(function + ": Main user applications' JSON file doesn't exist; assuming that no user applications are currently installed", className);
} }
ui->editUserAppsBtn->hide(); ui->editUserAppsBtn->hide();
@ -358,21 +345,19 @@ void apps::showUserApps(bool showDisabledJson)
} }
} }
void apps::updateJsonFileSlot(QJsonDocument jsonDocumentFunc) void AppsWidget::updateJsonFileSlot(QJsonDocument jsonDocumentFunc) {
{
jsonDocument = jsonDocumentFunc; jsonDocument = jsonDocumentFunc;
emit updateJsonFileSignal(jsonDocument); emit updateJsonFileSignal(jsonDocument);
} }
void apps::showFailedToParseMainUserAppsJsonFile() { void AppsWidget::showFailedToParseMainUserAppsJsonFile() {
emit showToast("Failed to parse 'apps.json'"); emit showToast("Failed to parse 'apps.json'");
} }
void apps::on_todoLaunchBtn_clicked() void AppsWidget::on_todoLaunchBtn_clicked() {
{ TodoAppWidget *todoWindow = new TodoAppWidget();
todo * todoWindow = new todo(); QObject::connect(todoWindow, &TodoAppWidget::showToast, this, &AppsWidget::showToast);
QObject::connect(todoWindow, &todo::showToast, this, &apps::showToast);
todoWindow->setAttribute(Qt::WA_DeleteOnClose); todoWindow->setAttribute(Qt::WA_DeleteOnClose);
todoWindow->setGeometry(QRect(QPoint(0,0), qApp->primaryScreen()->geometry().size())); todoWindow->setGeometry(QRect(QPoint(0, 0), qApp->primaryScreen()->geometry().size()));
todoWindow->show(); todoWindow->show();
} }

View file

@ -11,17 +11,17 @@
#include <QJsonDocument> #include <QJsonDocument>
namespace Ui { namespace Ui {
class apps; class AppsWidget;
} }
class apps : public QWidget class AppsWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
QString className = this->metaObject()->className(); QString className = this->metaObject()->className();
explicit apps(QWidget *parent = nullptr); explicit AppsWidget(QWidget *parent = nullptr);
~apps(); ~AppsWidget();
private slots: private slots:
void exitSlot(); void exitSlot();
@ -42,12 +42,12 @@ private slots:
void on_todoLaunchBtn_clicked(); void on_todoLaunchBtn_clicked();
private: private:
Ui::apps * ui; Ui::AppsWidget * ui;
savedwords * savedWordsWindow; SavedWordsAppWidget * savedWordsWindow;
calendarApp * calendarWindow; CalendarAppWidget * calendarWindow;
koboxAppsDialog * koboxAppsDialogWindow; KoboxAppsDialog * koboxAppsDialogWindow;
generalDialog * generalDialogWindow; GeneralDialog * generalDialogWindow;
todo * todoWindow; TodoAppWidget * todoWindow;
QFile jsonFile; QFile jsonFile;
QJsonDocument jsonDocument; QJsonDocument jsonDocument;

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>apps</class> <class>AppsWidget</class>
<widget class="QWidget" name="apps"> <widget class="QWidget" name="AppsWidget">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>

View file

@ -0,0 +1,27 @@
#include "calendarapp.h"
#include "ui.h"
#include "ui_calendarapp.h"
#include <QFile>
CalendarAppWidget::CalendarAppWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::CalendarAppWidget) {
ui->setupUi(this);
CalendarAppWidget::setFont(QFont("u001"));
ui->backBtn->setFont(QFont("Inter"));
ui->backBtn->setStyleSheet("font-weight: bold");
// Stylesheet
UI::applyStyle(*this, "eink");
ui->backBtn->setProperty("type", "borderless");
}
CalendarAppWidget::~CalendarAppWidget() {
delete ui;
}
void CalendarAppWidget::on_backBtn_clicked() {
CalendarAppWidget::close();
}

View file

@ -4,23 +4,23 @@
#include <QWidget> #include <QWidget>
namespace Ui { namespace Ui {
class calendarApp; class CalendarAppWidget;
} }
class calendarApp : public QWidget class CalendarAppWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
QString className = this->metaObject()->className(); QString className = this->metaObject()->className();
explicit calendarApp(QWidget *parent = nullptr); explicit CalendarAppWidget(QWidget *parent = nullptr);
~calendarApp(); ~CalendarAppWidget();
private slots: private slots:
void on_backBtn_clicked(); void on_backBtn_clicked();
private: private:
Ui::calendarApp *ui; Ui::CalendarAppWidget *ui;
}; };
#endif // CALENDARAPP_H #endif // CALENDARAPP_H

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>calendarApp</class> <class>CalendarAppWidget</class>
<widget class="QWidget" name="calendarApp"> <widget class="QWidget" name="CalendarAppWidget">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>

View file

@ -0,0 +1,81 @@
#include "savedwords.h"
#include "functions.h"
#include "ui.h"
#include "ui_savedwords.h"
#include <QFile>
#include <QProcess>
#include <QStringListModel>
SavedWordsAppWidget::SavedWordsAppWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::SavedWordsAppWidget) {
ui->setupUi(this);
SavedWordsAppWidget::setFont(QFont("u001"));
ui->savedWordsLabel->setFont(QFont("Inter"));
ui->backBtn->setFont(QFont("Inter"));
ui->clearBtn->setFont(QFont("Inter"));
UI::applyStyle(*this, "eink");
ui->backBtn->setProperty("type", "borderless");
ui->clearBtn->setProperty("type", "borderless");
ui->savedWordsLabel->setStyleSheet("font-weight: bold");
ui->wordsList->setStyleSheet("font-size: 10pt");
ui->backBtn->setStyleSheet("font-weight: bold");
ui->clearBtn->setStyleSheet("font-weight: bold");
checkwords();
QStringListModel *model = new QStringListModel(this);
QStringList list = words.split("\n", QString::SkipEmptyParts);
model->setStringList(list);
ui->wordsList->setModel(model);
ui->wordsList->setEditTriggers(QAbstractItemView::NoEditTriggers);
}
SavedWordsAppWidget::~SavedWordsAppWidget() {
delete ui;
}
void SavedWordsAppWidget::on_backBtn_clicked() {
// Workaround for the random strange memory corruption error
QProcess process;
process.startDetached("inkbox", QStringList());
qApp->quit();
}
void SavedWordsAppWidget::on_clearBtn_clicked() {
// Warning: possible memory leak here. Though, usually, when you press the "Clear" button and all clears up, you don't have to press it again ;)
log("Wiping Saved Words list", className);
save_word_init();
checkwords();
QStringListModel *model = new QStringListModel(this);
QStringList list = words.split("\n", QString::SkipEmptyParts);
model->setStringList(list);
ui->wordsList->setModel(model);
ui->wordsList->setEditTriggers(QAbstractItemView::NoEditTriggers);
}
void SavedWordsAppWidget::checkwords() {
QFile words_list(".config/06-words/config");
words_list.open(QIODevice::ReadWrite);
QTextStream in(&words_list);
words = in.readAll();
words_list.close();
}
void SavedWordsAppWidget::save_word_init() {
QFile words(".config/06-words/config");
words.open(QIODevice::ReadWrite);
QTextStream in(&words);
QString words_list = in.readAll();
string words_list_str = words_list.toStdString();
words.close();
ofstream fhandler;
fhandler.open(".config/06-words/config");
fhandler << "";
fhandler.close();
}

View file

@ -11,17 +11,17 @@
using namespace std; using namespace std;
namespace Ui { namespace Ui {
class savedwords; class SavedWordsAppWidget;
} }
class savedwords : public QWidget class SavedWordsAppWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
QString className = this->metaObject()->className(); QString className = this->metaObject()->className();
explicit savedwords(QWidget *parent = nullptr); explicit SavedWordsAppWidget(QWidget *parent = nullptr);
~savedwords(); ~SavedWordsAppWidget();
QString words; QString words;
void checkwords(); void checkwords();
void save_word_init(); void save_word_init();
@ -31,7 +31,7 @@ private slots:
void on_clearBtn_clicked(); void on_clearBtn_clicked();
private: private:
Ui::savedwords *ui; Ui::SavedWordsAppWidget *ui;
}; };
#endif // SAVEDWORDS_H #endif // SAVEDWORDS_H

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>savedwords</class> <class>SavedWordsAppWidget</class>
<widget class="QWidget" name="savedwords"> <widget class="QWidget" name="SavedWordsAppWidget">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>

View file

@ -1,12 +1,14 @@
#include "todo.h" #include "todo.h"
#include "ui_todo.h" #include "ui_todo.h"
#include "device.h"
#include "functions.h" #include "functions.h"
todo::todo(QWidget *parent) : TodoAppWidget::TodoAppWidget(QWidget *parent) :
QWidget(parent), QWidget(parent),
ui(new Ui::todo) ui(new Ui::TodoAppWidget)
{ {
Device* device = Device::getSingleton();
ui->setupUi(this); ui->setupUi(this);
this->setStyleSheet(readFile("/mnt/onboard/.adds/inkbox/eink.qss")); this->setStyleSheet(readFile("/mnt/onboard/.adds/inkbox/eink.qss"));
this->setFont(QFont("u001")); this->setFont(QFont("u001"));
@ -17,7 +19,7 @@ todo::todo(QWidget *parent) :
ui->setupBtn->setEnabled(false); ui->setupBtn->setEnabled(false);
buttonPadding; buttonPadding;
if(global::deviceID == "n705\n" or global::deviceID == "n905\n" or global::deviceID == "kt\n") { if(device->getScreenSize() <= Device::ScreenSize::MEDIUM) {
buttonPadding = 5; buttonPadding = 5;
} }
else { else {
@ -66,12 +68,12 @@ todo::todo(QWidget *parent) :
refreshList(); refreshList();
} }
todo::~todo() TodoAppWidget::~TodoAppWidget()
{ {
delete ui; delete ui;
} }
void todo::on_closeBtn_clicked() void TodoAppWidget::on_closeBtn_clicked()
{ {
if(currentView == currentView::home) { if(currentView == currentView::home) {
this->close(); this->close();
@ -82,19 +84,19 @@ void todo::on_closeBtn_clicked()
} }
} }
void todo::on_newBtn_clicked() void TodoAppWidget::on_newBtn_clicked()
{ {
global::keyboard::embed = false; global::keyboard::embed = false;
global::keyboard::keyboardText = ""; global::keyboard::keyboardText = "";
virtualkeyboard * virtualKeyboardWidget = new virtualkeyboard(this); virtualkeyboard * virtualKeyboardWidget = new virtualkeyboard(this);
virtualKeyboardWidget->setAttribute(Qt::WA_DeleteOnClose); virtualKeyboardWidget->setAttribute(Qt::WA_DeleteOnClose);
QObject::connect(virtualKeyboardWidget, &virtualkeyboard::enterBtnPressed, this, &todo::createNewList); QObject::connect(virtualKeyboardWidget, &virtualkeyboard::enterBtnPressed, this, &TodoAppWidget::createNewList);
QObject::connect(virtualKeyboardWidget, &virtualkeyboard::closeBtnPressed, this, &todo::setDefaultHomePageStatusText); QObject::connect(virtualKeyboardWidget, &virtualkeyboard::closeBtnPressed, this, &TodoAppWidget::setDefaultHomePageStatusText);
ui->statusLabel->setText("Enter the list's name"); ui->statusLabel->setText("Enter the list's name");
virtualKeyboardWidget->show(); virtualKeyboardWidget->show();
} }
void todo::createNewList(QString listName) { void TodoAppWidget::createNewList(QString listName) {
log("Initializing new To-Do list with name '" + listName + "'", className); log("Initializing new To-Do list with name '" + listName + "'", className);
QJsonDocument document; QJsonDocument document;
QJsonArray mainArray; QJsonArray mainArray;
@ -117,7 +119,7 @@ void todo::createNewList(QString listName) {
refreshList(); refreshList();
} }
void todo::addItem(QString itemName) { void TodoAppWidget::addItem(QString itemName) {
log("Adding item with name '" + itemName + "' to current list", className); log("Adding item with name '" + itemName + "' to current list", className);
// Accessing the current list's items array // Accessing the current list's items array
QJsonDocument document = readTodoDatabase(); QJsonDocument document = readTodoDatabase();
@ -142,7 +144,7 @@ void todo::addItem(QString itemName) {
setupList(listArray.at(0).toString()); setupList(listArray.at(0).toString());
} }
void todo::refreshList() { void TodoAppWidget::refreshList() {
if(QFile::exists(global::localLibrary::todoDatabasePath)) { if(QFile::exists(global::localLibrary::todoDatabasePath)) {
ui->listWidget->clear(); ui->listWidget->clear();
QJsonArray array = readTodoDatabase().object()["List"].toArray(); QJsonArray array = readTodoDatabase().object()["List"].toArray();
@ -155,7 +157,7 @@ void todo::refreshList() {
} }
} }
void todo::setupList(QString listName) { void TodoAppWidget::setupList(QString listName) {
log("Setting up list with name '" + listName + "'", className); log("Setting up list with name '" + listName + "'", className);
QJsonArray array = readTodoDatabase().object()["List"].toArray(); QJsonArray array = readTodoDatabase().object()["List"].toArray();
// Iterate through the To-Do lists array to find the list's array index // Iterate through the To-Do lists array to find the list's array index
@ -197,7 +199,7 @@ void todo::setupList(QString listName) {
ui->statusLabel->setText("Select or create a new item"); ui->statusLabel->setText("Select or create a new item");
} }
void todo::on_setupBtn_clicked() void TodoAppWidget::on_setupBtn_clicked()
{ {
ui->deleteBtn->setEnabled(false); ui->deleteBtn->setEnabled(false);
ui->setupBtn->setEnabled(false); ui->setupBtn->setEnabled(false);
@ -205,13 +207,13 @@ void todo::on_setupBtn_clicked()
} }
void todo::on_listWidget_itemClicked(QListWidgetItem *item) void TodoAppWidget::on_listWidget_itemClicked(QListWidgetItem *item)
{ {
ui->deleteBtn->setEnabled(true); ui->deleteBtn->setEnabled(true);
ui->setupBtn->setEnabled(true); ui->setupBtn->setEnabled(true);
} }
void todo::saveCurrentList() { void TodoAppWidget::saveCurrentList() {
QJsonDocument document = readTodoDatabase(); QJsonDocument document = readTodoDatabase();
QJsonObject object = document.object(); QJsonObject object = document.object();
QJsonArray mainArray = object["List"].toArray(); QJsonArray mainArray = object["List"].toArray();
@ -235,7 +237,7 @@ void todo::saveCurrentList() {
writeTodoDatabase(document); writeTodoDatabase(document);
} }
void todo::on_deleteBtn_clicked() void TodoAppWidget::on_deleteBtn_clicked()
{ {
QJsonDocument document = readTodoDatabase(); QJsonDocument document = readTodoDatabase();
QJsonObject object = document.object(); QJsonObject object = document.object();
@ -251,19 +253,19 @@ void todo::on_deleteBtn_clicked()
refreshList(); refreshList();
} }
void todo::on_newItemBtn_clicked() void TodoAppWidget::on_newItemBtn_clicked()
{ {
global::keyboard::embed = false; global::keyboard::embed = false;
global::keyboard::keyboardText = ""; global::keyboard::keyboardText = "";
virtualkeyboard * virtualKeyboardWidget = new virtualkeyboard(this); virtualkeyboard * virtualKeyboardWidget = new virtualkeyboard(this);
virtualKeyboardWidget->setAttribute(Qt::WA_DeleteOnClose); virtualKeyboardWidget->setAttribute(Qt::WA_DeleteOnClose);
QObject::connect(virtualKeyboardWidget, &virtualkeyboard::enterBtnPressed, this, &todo::addItem); QObject::connect(virtualKeyboardWidget, &virtualkeyboard::enterBtnPressed, this, &TodoAppWidget::addItem);
QObject::connect(virtualKeyboardWidget, &virtualkeyboard::closeBtnPressed, this, &todo::setDefaultListPageStatusText); QObject::connect(virtualKeyboardWidget, &virtualkeyboard::closeBtnPressed, this, &TodoAppWidget::setDefaultListPageStatusText);
ui->statusLabel->setText("Enter the item's name"); ui->statusLabel->setText("Enter the item's name");
virtualKeyboardWidget->show(); virtualKeyboardWidget->show();
} }
void todo::switchViewHome() { void TodoAppWidget::switchViewHome() {
ui->itemsListWidget->clear(); ui->itemsListWidget->clear();
switchItemsSelectionMode(false); switchItemsSelectionMode(false);
ui->stackedWidget->setCurrentIndex(0); ui->stackedWidget->setCurrentIndex(0);
@ -276,7 +278,7 @@ void todo::switchViewHome() {
currentView = currentView::home; currentView = currentView::home;
} }
void todo::on_selectItemsModeBtn_clicked() void TodoAppWidget::on_selectItemsModeBtn_clicked()
{ {
if(selectItemsMode == false) { if(selectItemsMode == false) {
switchItemsSelectionMode(true); switchItemsSelectionMode(true);
@ -286,7 +288,7 @@ void todo::on_selectItemsModeBtn_clicked()
} }
} }
void todo::switchItemsSelectionMode(bool selectionMode) { void TodoAppWidget::switchItemsSelectionMode(bool selectionMode) {
if(selectionMode == true) { if(selectionMode == true) {
log("Entering selection mode", className); log("Entering selection mode", className);
saveCurrentList(); saveCurrentList();
@ -308,7 +310,7 @@ void todo::switchItemsSelectionMode(bool selectionMode) {
QTimer::singleShot(500, this, SLOT(resize())); QTimer::singleShot(500, this, SLOT(resize()));
} }
void todo::on_deleteItemBtn_clicked() void TodoAppWidget::on_deleteItemBtn_clicked()
{ {
QList<int> itemsToDelete; QList<int> itemsToDelete;
for(int i = 1; i < ui->itemsListWidget->count() + 1; i++) { for(int i = 1; i < ui->itemsListWidget->count() + 1; i++) {
@ -350,7 +352,7 @@ void todo::on_deleteItemBtn_clicked()
} }
} }
void todo::on_selectAllItemsBtn_clicked() void TodoAppWidget::on_selectAllItemsBtn_clicked()
{ {
int range = ui->itemsListWidget->count(); int range = ui->itemsListWidget->count();
for(int i = 0; i < range; i++) { for(int i = 0; i < range; i++) {
@ -358,15 +360,15 @@ void todo::on_selectAllItemsBtn_clicked()
} }
} }
void todo::setDefaultHomePageStatusText() { void TodoAppWidget::setDefaultHomePageStatusText() {
ui->statusLabel->setText("Select or create a new list"); ui->statusLabel->setText("Select or create a new list");
} }
void todo::setDefaultListPageStatusText() { void TodoAppWidget::setDefaultListPageStatusText() {
ui->statusLabel->setText("Select or create a new item"); ui->statusLabel->setText("Select or create a new item");
} }
void todo::on_deselectAllItemsBtn_clicked() void TodoAppWidget::on_deselectAllItemsBtn_clicked()
{ {
int range = ui->itemsListWidget->count(); int range = ui->itemsListWidget->count();
for(int i = 0; i < range; i++) { for(int i = 0; i < range; i++) {
@ -374,13 +376,13 @@ void todo::on_deselectAllItemsBtn_clicked()
} }
} }
void todo::on_saveCurrentListViewBtn_clicked() void TodoAppWidget::on_saveCurrentListViewBtn_clicked()
{ {
saveCurrentList(); saveCurrentList();
switchItemsSelectionMode(false); switchItemsSelectionMode(false);
} }
void todo::on_editItemBtn_clicked() void TodoAppWidget::on_editItemBtn_clicked()
{ {
QList<int> selectedItems; QList<int> selectedItems;
for(int i = 1; i < ui->itemsListWidget->count() + 1; i++) { for(int i = 1; i < ui->itemsListWidget->count() + 1; i++) {
@ -395,8 +397,8 @@ void todo::on_editItemBtn_clicked()
global::keyboard::keyboardText = ui->itemsListWidget->item(currentEditItemIndex - 1)->text(); global::keyboard::keyboardText = ui->itemsListWidget->item(currentEditItemIndex - 1)->text();
virtualkeyboard * virtualKeyboardWidget = new virtualkeyboard(this); virtualkeyboard * virtualKeyboardWidget = new virtualkeyboard(this);
virtualKeyboardWidget->setAttribute(Qt::WA_DeleteOnClose); virtualKeyboardWidget->setAttribute(Qt::WA_DeleteOnClose);
QObject::connect(virtualKeyboardWidget, &virtualkeyboard::enterBtnPressed, this, &todo::editItemWrapper); QObject::connect(virtualKeyboardWidget, &virtualkeyboard::enterBtnPressed, this, &TodoAppWidget::editItemWrapper);
QObject::connect(virtualKeyboardWidget, &virtualkeyboard::closeBtnPressed, this, &todo::setDefaultListPageStatusText); QObject::connect(virtualKeyboardWidget, &virtualkeyboard::closeBtnPressed, this, &TodoAppWidget::setDefaultListPageStatusText);
ui->statusLabel->setText("Enter the edited item's name"); ui->statusLabel->setText("Enter the edited item's name");
virtualKeyboardWidget->show(); virtualKeyboardWidget->show();
} }
@ -410,7 +412,7 @@ void todo::on_editItemBtn_clicked()
} }
} }
void todo::editItem(int index, QString replacement) { void TodoAppWidget::editItem(int index, QString replacement) {
QJsonDocument document = readTodoDatabase(); QJsonDocument document = readTodoDatabase();
QJsonObject object = document.object(); QJsonObject object = document.object();
QJsonArray mainArray = object["List"].toArray(); QJsonArray mainArray = object["List"].toArray();
@ -430,17 +432,17 @@ void todo::editItem(int index, QString replacement) {
setupList(listArray.at(0).toString()); setupList(listArray.at(0).toString());
} }
void todo::editItemWrapper(QString replacement) { void TodoAppWidget::editItemWrapper(QString replacement) {
editItem(currentEditItemIndex, replacement); editItem(currentEditItemIndex, replacement);
currentEditItemIndex = NULL; currentEditItemIndex = NULL;
} }
void todo::resize() { void TodoAppWidget::resize() {
this->setGeometry(QRect(QPoint(0,0), qApp->primaryScreen()->geometry().size())); this->setGeometry(QRect(QPoint(0,0), qApp->primaryScreen()->geometry().size()));
this->repaint(); this->repaint();
} }
void todo::on_itemsListWidget_itemClicked(QListWidgetItem *item) void TodoAppWidget::on_itemsListWidget_itemClicked(QListWidgetItem *item)
{ {
if(item->checkState() == Qt::Unchecked) { if(item->checkState() == Qt::Unchecked) {
item->setCheckState(Qt::Checked); item->setCheckState(Qt::Checked);

View file

@ -8,17 +8,17 @@
#include "virtualkeyboard.h" #include "virtualkeyboard.h"
namespace Ui { namespace Ui {
class todo; class TodoAppWidget;
} }
class todo : public QWidget class TodoAppWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
QString className = this->metaObject()->className(); QString className = this->metaObject()->className();
explicit todo(QWidget *parent = nullptr); explicit TodoAppWidget(QWidget *parent = nullptr);
~todo(); ~TodoAppWidget();
enum class currentView { enum class currentView {
home, home,
list list
@ -61,7 +61,7 @@ signals:
void showToast(QString messageToDisplay); void showToast(QString messageToDisplay);
private: private:
Ui::todo *ui; Ui::TodoAppWidget *ui;
virtualkeyboard * virtualKeyboardWidget; virtualkeyboard * virtualKeyboardWidget;
}; };

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>todo</class> <class>TodoAppWidget</class>
<widget class="QWidget" name="todo"> <widget class="QWidget" name="TodoAppWidget">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>

View file

@ -3,9 +3,9 @@
#include "mainwindow.h" #include "mainwindow.h"
#include "generaldialog.h" #include "generaldialog.h"
userapps::userapps(QWidget *parent) : UserAppsWidget::UserAppsWidget(QWidget *parent) :
QWidget(parent), QWidget(parent),
ui(new Ui::userapps) ui(new Ui::UserAppsWidget)
{ {
ui->setupUi(this); ui->setupUi(this);
ui->launchBtn->setProperty("type", "borderless"); ui->launchBtn->setProperty("type", "borderless");
@ -21,12 +21,12 @@ userapps::userapps(QWidget *parent) :
ui->statusBtn->setStyleSheet("background: lightGrey; font-size: 9pt; padding: 8px"); ui->statusBtn->setStyleSheet("background: lightGrey; font-size: 9pt; padding: 8px");
} }
userapps::~userapps() UserAppsWidget::~UserAppsWidget()
{ {
delete ui; delete ui;
} }
void userapps::provideInfo(QJsonObject jsonInfo) void UserAppsWidget::provideInfo(QJsonObject jsonInfo)
{ {
QString name = jsonInfo["Name"].toString(); QString name = jsonInfo["Name"].toString();
appName = name; // It is for searching for json entry while disabling / enabling appName = name; // It is for searching for json entry while disabling / enabling
@ -67,7 +67,7 @@ void userapps::provideInfo(QJsonObject jsonInfo)
} }
// This function is needed when we dont want to repaint all widgets, but only change the the page (when no changes to the main JSON file were applied) // This function is needed when we dont want to repaint all widgets, but only change the the page (when no changes to the main JSON file were applied)
void userapps::changePageEnabling(bool SecondPage) void UserAppsWidget::changePageEnabling(bool SecondPage)
{ {
if(SecondPage == true){ if(SecondPage == true){
ui->stackedWidget->setCurrentIndex(1); ui->stackedWidget->setCurrentIndex(1);
@ -77,7 +77,7 @@ void userapps::changePageEnabling(bool SecondPage)
} }
} }
void userapps::on_infoBtn_clicked() void UserAppsWidget::on_infoBtn_clicked()
{ {
log("Launching user application information dialog", className); log("Launching user application information dialog", className);
// https://stackoverflow.com/questions/28181627/how-to-convert-a-qjsonobject-to-qstring // https://stackoverflow.com/questions/28181627/how-to-convert-a-qjsonobject-to-qstring
@ -85,12 +85,12 @@ void userapps::on_infoBtn_clicked()
global::text::textBrowserContents = jsonStringParsed; global::text::textBrowserContents = jsonStringParsed;
global::userApps::appInfoDialog = true; global::userApps::appInfoDialog = true;
generalDialogWindow = new generalDialog(); generalDialogWindow = new GeneralDialog();
generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose); generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
generalDialogWindow->show(); generalDialogWindow->show();
} }
void userapps::on_statusBtn_clicked() void UserAppsWidget::on_statusBtn_clicked()
{ {
ui->statusBtn->setEnabled(false); ui->statusBtn->setEnabled(false);
@ -129,22 +129,22 @@ void userapps::on_statusBtn_clicked()
ui->statusBtn->setEnabled(true); ui->statusBtn->setEnabled(true);
} }
void userapps::updateJsonFileSlotUA(QJsonDocument jsonDocumentProvided) void UserAppsWidget::updateJsonFileSlotUA(QJsonDocument jsonDocumentProvided)
{ {
jsonDocument = jsonDocumentProvided; jsonDocument = jsonDocumentProvided;
} }
void userapps::on_launchBtn_clicked() void UserAppsWidget::on_launchBtn_clicked()
{ {
// Some command to execute script or binary at "ExecPath" // Some command to execute script or binary at "ExecPath"
QJsonArray supportedDevices = jsonObject["SupportedDevices"].toArray(); QJsonArray supportedDevices = jsonObject["SupportedDevices"].toArray();
// This will work even if we are looking for 'n306' and there is a device named 'n306b' because QJsonArray::contains() works that way // This will work even if we are looking for 'n306' and there is a device named 'n306b' because QJsonArray::contains() works that way
if(supportedDevices.contains("all") == false and supportedDevices.contains(global::deviceID.trimmed()) == false) { if(supportedDevices.contains("all") == false and supportedDevices.contains(Device::getSingleton()->getID()) == false) {
log("Warning: User application '" + appName + "' does not support this device", className); log("Warning: User application '" + appName + "' does not support this device", className);
global::userApps::appCompatibilityDialog = true; global::userApps::appCompatibilityDialog = true;
global::userApps::appCompatibilityText = "<font face='u001'>Your device is not compatible with this app.<br>Continue anyway</font><font face='Inter'>?</font>"; global::userApps::appCompatibilityText = "<font face='u001'>Your device is not compatible with this app.<br>Continue anyway</font><font face='Inter'>?</font>";
generalDialogWindow = new generalDialog(); generalDialogWindow = new GeneralDialog();
generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose); generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
generalDialogWindow->exec(); generalDialogWindow->exec();
@ -173,7 +173,7 @@ void userapps::on_launchBtn_clicked()
} }
} }
bool userapps::manageRequiredFeatures() bool UserAppsWidget::manageRequiredFeatures()
{ {
// This should be already set to 'true', but just in case // This should be already set to 'true', but just in case
global::userApps::appCompatibilityLastContinueStatus = true; global::userApps::appCompatibilityLastContinueStatus = true;
@ -183,13 +183,11 @@ bool userapps::manageRequiredFeatures()
int featureId = refJsonObject.toInt(); int featureId = refJsonObject.toInt();
// Wi-Fi connection required // Wi-Fi connection required
if(featureId == 0) { if(featureId == 0) {
// Double 'if' conditions to avoid launching unnecesery testPing() in emu if(checkWifiState() != global::wifi::wifiState::configured) {
if(global::deviceID != "emu\n") { global::userApps::appCompatibilityText = "<font face='u001'>This app needs a Wi-Fi connection, continue anyway</font><font face='Inter'>?</font>";
if(checkWifiState() != global::wifi::wifiState::configured) { launchDialog = true;
global::userApps::appCompatibilityText = "<font face='u001'>This app needs a Wi-Fi connection, continue anyway</font><font face='Inter'>?</font>";
launchDialog = true;
}
} }
} }
// Rooted kernel required // Rooted kernel required
if(featureId == 1) { if(featureId == 1) {
@ -202,7 +200,7 @@ bool userapps::manageRequiredFeatures()
if(launchDialog == true) { if(launchDialog == true) {
global::userApps::appCompatibilityDialog = true; global::userApps::appCompatibilityDialog = true;
generalDialogWindow = new generalDialog(); generalDialogWindow = new GeneralDialog();
generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose); generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
generalDialogWindow->exec(); generalDialogWindow->exec();
} }
@ -214,7 +212,7 @@ bool userapps::manageRequiredFeatures()
return true; return true;
} }
QString userapps::parseJsonShow(QJsonObject json) QString UserAppsWidget::parseJsonShow(QJsonObject json)
{ {
QString mainString; QString mainString;
foreach(const QString& key, json.keys()) { foreach(const QString& key, json.keys()) {

View file

@ -13,17 +13,17 @@
#include <QFile> #include <QFile>
namespace Ui { namespace Ui {
class userapps; class UserAppsWidget;
} }
class userapps : public QWidget class UserAppsWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
QString className = this->metaObject()->className(); QString className = this->metaObject()->className();
explicit userapps(QWidget * parent = nullptr); explicit UserAppsWidget(QWidget * parent = nullptr);
~userapps(); ~UserAppsWidget();
QJsonDocument jsonDocument; // TODO: Optimize for RAM usage QJsonDocument jsonDocument; // TODO: Optimize for RAM usage
QJsonObject jsonObject; // Needed for 'App info' button QJsonObject jsonObject; // Needed for 'App info' button
QString jsonFilePath; QString jsonFilePath;
@ -46,8 +46,8 @@ private slots:
void on_launchBtn_clicked(); void on_launchBtn_clicked();
private: private:
Ui::userapps * ui; Ui::UserAppsWidget * ui;
generalDialog * generalDialogWindow; GeneralDialog * generalDialogWindow;
QDir appDir; QDir appDir;
QFile execPath; QFile execPath;

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>userapps</class> <class>UserAppsWidget</class>
<widget class="QWidget" name="userapps"> <widget class="QWidget" name="UserAppsWidget">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>

View file

@ -0,0 +1,360 @@
#include "encryptionmanager.h"
#include "ui.h"
#include "ui_encryptionmanager.h"
#include "functions.h"
#include "usbmsSplash.h"
#include <QDateTime>
#include <QDebug>
#include <QDir>
#include <QFile>
#include <QMessageBox>
#include <QScreen>
#include <QTimer>
CryptoManagerWidget::CryptoManagerWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::CryptoManagerWidget) {
ui->setupUi(this);
ui->descriptionLabel->setFont(QFont("u001"));
ui->successDescriptionLabel->setFont(QFont("u001"));
ui->failureDescriptionLabel->setFont(QFont("u001"));
ui->warningDescriptionLabel->setFont(QFont("u001"));
// Stylesheet
UI::applyStyle(*this, "eink");
ui->encryptionSetupLabel->setStyleSheet("font-size: 15pt; font-weight: bold");
ui->descriptionLabel->setStyleSheet("font-size: 10pt");
ui->successLabel->setStyleSheet("font-size: 15pt; font-weight: bold");
ui->successDescriptionLabel->setStyleSheet("font-size: 10pt");
ui->failureLabel->setStyleSheet("font-size: 15pt; font-weight: bold");
ui->failureDescriptionLabel->setStyleSheet("font-size: 10pt");
ui->setupContinueBtn->setStyleSheet("background: lightGrey; border: 3px solid black; color: black; padding: 10px; outline: none; font-size: 10pt; font-weight: bold; border-radius: 10px");
ui->setupAbortBtn->setStyleSheet("background: lightGrey; border: 3px solid black; color: black; padding: 10px; outline: none; font-size: 10pt; font-weight: bold; border-radius: 10px");
ui->exitSuccessBtn->setStyleSheet("background: lightGrey; border: 3px solid black; color: black; padding: 10px; outline: none; font-size: 10pt; font-weight: bold; border-radius: 10px");
ui->failureContinueBtn->setStyleSheet("background: lightGrey; border: 3px solid black; color: black; padding: 10px; outline: none; font-size: 10pt; font-weight: bold; border-radius: 10px");
ui->acceptBtn->setStyleSheet("background: lightGrey; border: 3px solid black; color: black; padding: 10px; outline: none; font-size: 10pt; font-weight: bold; border-radius: 10px");
ui->usbmsBtn->setStyleSheet("background: lightGrey; border: 3px solid black; color: black; padding: 10px; outline: none; font-size: 10pt; font-weight: bold; border-radius: 10px");
ui->warningLabel->setStyleSheet("font-size: 15pt; font-weight: bold");
ui->warningDescriptionLabel->setStyleSheet("font-size: 10pt");
// Getting the screen's size
float sW = QGuiApplication::screens()[0]->size().width();
float sH = QGuiApplication::screens()[0]->size().height();
float stdIconWidth;
float stdIconHeight;
{
stdIconWidth = sW / 1.50;
stdIconHeight = sH / 1.50;
QPixmap pixmap(":/resources/encryption.png");
QPixmap scaledPixmap = pixmap.scaled(stdIconWidth, stdIconHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui->encryptionImageLabel->setPixmap(scaledPixmap);
}
{
stdIconWidth = sW / 1.65;
stdIconHeight = sH / 1.65;
QPixmap pixmap(":/resources/check-display.png");
QPixmap scaledPixmap = pixmap.scaled(stdIconWidth, stdIconHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui->checkImageLabel->setPixmap(scaledPixmap);
}
{
stdIconWidth = sW / 1.65;
stdIconHeight = sH / 1.65;
QPixmap pixmap(":/resources/error.png");
QPixmap scaledPixmap = pixmap.scaled(stdIconWidth, stdIconHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui->failureImageLabel->setPixmap(scaledPixmap);
}
{
stdIconWidth = sW / 1.50;
stdIconHeight = sH / 1.50;
QPixmap pixmap(":/resources/alert-triangle.png");
QPixmap scaledPixmap = pixmap.scaled(stdIconWidth, stdIconHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui->warningImageLabel->setPixmap(scaledPixmap);
}
hourglassAnimationWidgetWindow = new hourglassAnimationWidget();
ui->hourglassWidget->insertWidget(0, hourglassAnimationWidgetWindow);
ui->hourglassWidget->setCurrentIndex(0);
setDefaultWorkDir();
if (checkconfig(".config/18-encrypted_storage/initial_setup_done") == true or checkconfig("/external_root/run/encfs_repack") == true) {
ui->activityWidget->hide();
if (checkconfig("/external_root/run/encfs_repack") == false) {
setupPassphraseDialogMode = 1;
} else {
setupPassphraseDialogMode = 2;
}
QTimer::singleShot(500, this, SLOT(setupPassphraseDialog()));
} else {
QDir dir("/mnt/onboard/onboard/encfs-dropbox");
if (dir.isEmpty()) {
ui->activityWidget->setCurrentIndex(4);
mkEncfsDirs();
}
}
}
CryptoManagerWidget::~CryptoManagerWidget() {
delete ui;
}
void CryptoManagerWidget::on_setupContinueBtn_clicked() {
setupPassphraseDialogMode = 0;
setupPassphraseDialog();
}
void CryptoManagerWidget::setupPassphraseDialog() {
/*
* setupPassphraseDialogMode can be:
* 0: Initial setup
* 1: Normal behavior
* 2: Repack
*/
log("Showing passphrase dialog for mode " + QString::number(setupPassphraseDialogMode), className);
ui->activityWidget->hide();
this->setStyleSheet("background-color: black");
global::keyboard::keyboardDialog = true;
global::keyboard::encfsDialog = true;
global::keyboard::keyboardText = "";
generalDialogWindow = new GeneralDialog();
generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
connect(generalDialogWindow, SIGNAL(refreshScreen()), SLOT(refreshScreen()));
if (setupPassphraseDialogMode == 0) {
connect(generalDialogWindow, SIGNAL(destroyed(QObject *)), SLOT(setupEncryptedStorage()));
} else if (setupPassphraseDialogMode == 1) {
connect(generalDialogWindow, SIGNAL(destroyed(QObject *)), SLOT(unlockEncryptedStorage()));
} else {
connect(generalDialogWindow, SIGNAL(destroyed(QObject *)), SLOT(repackEncryptedStorage()));
}
connect(generalDialogWindow, SIGNAL(showToast(QString)), SLOT(showToast(QString)));
generalDialogWindow->show();
}
void CryptoManagerWidget::on_setupAbortBtn_clicked() {
log("Aborting setup", className);
setDefaultWorkDir();
writeFile(".config/18-encrypted_storage/status", "false");
quit_restart();
}
void CryptoManagerWidget::quit_restart() {
log("Restarting InkBox", className);
QProcess process;
process.startDetached("inkbox", QStringList());
qApp->quit();
}
void CryptoManagerWidget::refreshScreen() {
this->repaint();
}
void CryptoManagerWidget::showToast(QString messageToDisplay) {
global::toast::message = messageToDisplay;
toastWindow = new toast(this);
toastWindow->setAttribute(Qt::WA_DeleteOnClose);
connect(toastWindow, SIGNAL(refreshScreen()), SLOT(refreshScreen()));
toastWindow->show();
}
void CryptoManagerWidget::setupEncryptedStorage() {
log("Setting up encrypted storage", className);
this->setStyleSheet("background-color: white");
ui->activityWidget->show();
if (global::encfs::cancelSetup == true) {
global::encfs::cancelSetup = false;
ui->activityWidget->setCurrentIndex(0);
} else {
mkEncfsDirs();
QString bootstrapPassphrase = global::encfs::passphrase;
global::encfs::passphrase = "";
writeFile("/external_root/run/encfs/encrypted_storage_create", "true");
writeFile("/external_root/run/encfs/encrypted_storage_bootstrap_files_location", "/data/onboard/encfs-dropbox");
writeFile("/external_root/run/encfs/encrypted_storage_bootstrap_archive_location", "/data/onboard/data.encfs");
writeFile("/external_root/run/encfs/encrypted_storage_bootstrap_passphrase", bootstrapPassphrase);
setDefaultWorkDir();
writeFile(".config/18-encrypted_storage/storage_list", "/data/onboard/encfs-decrypted");
writeFile("/opt/ibxd", "encfs_restart\n");
bool exitStatus;
ui->activityWidget->setCurrentIndex(3);
QTimer *t = new QTimer(this);
t->setInterval(1000);
connect(t, &QTimer::timeout, [&]() {
if (QFile::exists("/external_root/run/encrypted_storage_bootstrap_setup")) {
exitStatus = checkconfig("/external_root/run/encrypted_storage_bootstrap_setup");
QFile::remove("/external_root/run/encrypted_storage_bootstrap_setup");
setupExitWidget(exitStatus);
}
});
t->start();
}
}
void CryptoManagerWidget::unlockEncryptedStorage() {
log("Trying to unlock encrypted storage", className);
if (global::encfs::cancelSetup == true) {
global::encfs::cancelSetup = false;
poweroff(true);
qApp->quit();
} else {
this->setStyleSheet("background-color: white");
ui->activityWidget->show();
mkEncfsDirs();
QString passphrase = global::encfs::passphrase;
global::encfs::passphrase = "";
writeFile("/external_root/run/encfs/encrypted_storage_archive", "/data/onboard/data.encfs");
writeFile("/external_root/run/encfs/encrypted_storage_mountpoint", "/data/onboard/encfs-decrypted");
writeFile("/external_root/run/encfs/encrypted_storage_bindmount", "/kobo/mnt/onboard/onboard/encfs-decrypted");
writeFile("/external_root/run/encfs/encrypted_storage_passphrase", passphrase);
writeFile("/opt/ibxd", "encfs_restart\n");
bool exitStatus;
QString passphraseTriesStr = readFile("/inkbox/encryptedStoragePassphraseTries");
if (passphraseTriesStr.isEmpty()) {
passphraseTries = 0;
} else {
passphraseTries = passphraseTriesStr.toInt();
passphraseTries++;
}
ui->activityWidget->setCurrentIndex(3);
QTimer *t = new QTimer(this);
t->setInterval(1000);
connect(t, &QTimer::timeout, [&]() {
if (QFile::exists("/external_root/run/encfs_mounted")) {
exitStatus = true;
if (readFile("/external_root/run/encfs_mounted") != "true\n") {
exitStatus = false;
QFile::remove("/external_root/run/encfs_mounted");
QString function = __func__;
log(function + ": Invalid passphrase", className);
if (setupMessageBoxRan == false) {
int delay = 0;
if (passphraseTries <= 3) {
if (passphraseTries == 0) {
writeFile("/inkbox/encryptedStoragePassphraseTries", "0");
delay = 5000;
} else if (passphraseTries == 1) {
writeFile("/inkbox/encryptedStoragePassphraseTries", "1");
delay = 10000;
} else if (passphraseTries == 2) {
writeFile("/inkbox/encryptedStoragePassphraseTries", "2");
delay = 20000;
} else if (passphraseTries >= 3) {
writeFile("/inkbox/encryptedStoragePassphraseTries", "3");
unsigned long currentEpoch = QDateTime::currentSecsSinceEpoch();
currentEpoch += 86400;
QString unlockTime_str = QString::number(currentEpoch);
global::encfs::unlockTime = QDateTime::fromTime_t(currentEpoch).toString();
global::encfs::lockdownMessage = "FATAL: 4 invalid passphrase tries, locking down device until " + global::encfs::unlockTime;
writeFile("/external_root/boot/flags/ENCRYPT_LOCK", unlockTime_str + "\n");
global::encfs::lockdown = true;
setupMessageBoxRan = true;
alertWindow = new SplashAlertWidget();
alertWindow->setAttribute(Qt::WA_DeleteOnClose);
alertWindow->showFullScreen();
}
if (passphraseTries <= 2) {
QTimer::singleShot(delay, this, SLOT(setupFailedAuthenticationMessageBox()));
setupMessageBoxRan = true;
}
}
}
} else {
log("Unlocking successful", className);
quit_restart();
}
}
});
t->start();
}
}
void CryptoManagerWidget::mkEncfsDirs() {
log("Creating encrypted storage directories", className);
QDir encfsDir;
QString encfsPath("/external_root/run/encfs");
encfsDir.mkpath(encfsPath);
QDir dumpDir;
QString dumpPath("/mnt/onboard/onboard/encfs-dropbox");
dumpDir.mkpath(dumpPath);
QDir decDir;
QString decPath("/mnt/onboard/onboard/encfs-decrypted");
decDir.mkpath(decPath);
}
void CryptoManagerWidget::on_exitSuccessBtn_clicked() {
setDefaultWorkDir();
writeFile(".config/18-encrypted_storage/initial_setup_done", "true");
quit_restart();
}
void CryptoManagerWidget::setupExitWidget(bool exitStatus) {
if (setupExitWidgetRan == false) {
if (exitStatus == true) {
ui->activityWidget->setCurrentIndex(1);
} else {
writeFile(".config/18-encrypted_storage/status", "false");
ui->activityWidget->setCurrentIndex(2);
}
setupExitWidgetRan = true;
}
}
void CryptoManagerWidget::on_failureContinueBtn_clicked() {
setDefaultWorkDir();
writeFile(".config/18-encrypted_storage/initial_setup_done", "true");
quit_restart();
}
void CryptoManagerWidget::setupFailedAuthenticationMessageBox() {
log("Showing 'Authentication failed' message box", className);
ui->activityWidget->hide();
QMessageBox::critical(this, tr("Invalid argument"), tr("<font face='u001'>Invalid passphrase. Please try again.</font>"));
quit_restart();
}
void CryptoManagerWidget::on_acceptBtn_clicked() {
writeFile(".config/18-encrypted_storage/status", "false");
quit_restart();
}
void CryptoManagerWidget::on_usbmsBtn_clicked() {
log("Showing USBMS splash", className);
global::usbms::launchUsbms = true;
usbmsWindow = new USBMSSplashWidget();
usbmsWindow->setAttribute(Qt::WA_DeleteOnClose);
usbmsWindow->setGeometry(QRect(QPoint(0, 0), screen()->geometry().size()));
usbmsWindow->show();
}
void CryptoManagerWidget::repackEncryptedStorage() {
log("Repacking encrypted storage", className);
if (global::encfs::cancelSetup == true) {
global::encfs::cancelSetup = false;
quit_restart();
} else {
this->setStyleSheet("background-color: white");
ui->activityWidget->show();
mkEncfsDirs();
QString passphrase = global::encfs::passphrase;
global::encfs::passphrase = "";
writeFile("/external_root/run/encfs/encrypted_storage_repack_passphrase", passphrase);
QFile::remove("/external_root/run/openrc/started/encfs");
writeFile("/opt/ibxd", "encfs_restart\n");
bool exitStatus;
ui->activityWidget->setCurrentIndex(3);
QTimer *t = new QTimer(this);
t->setInterval(1000);
connect(t, &QTimer::timeout, [&]() {
if (QFile::exists("/external_root/run/encfs_repack_status")) {
exitStatus = checkconfig("/external_root/run/encfs_repack_status");
QFile::remove("/external_root/run/encfs_repack_status");
setupExitWidget(exitStatus);
}
});
t->start();
}
}

View file

@ -5,20 +5,20 @@
#include "generaldialog.h" #include "generaldialog.h"
#include "toast.h" #include "toast.h"
#include "hourglassanimationwidget.h" #include "hourglassanimationwidget.h"
#include "alert.h" #include "splashAlert.h"
namespace Ui { namespace Ui {
class encryptionManager; class CryptoManagerWidget;
} }
class encryptionManager : public QWidget class CryptoManagerWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
QString className = this->metaObject()->className(); QString className = this->metaObject()->className();
explicit encryptionManager(QWidget *parent = nullptr); explicit CryptoManagerWidget(QWidget *parent = nullptr);
~encryptionManager(); ~CryptoManagerWidget();
bool setupExitWidgetRan = false; bool setupExitWidgetRan = false;
int setupPassphraseDialogMode; int setupPassphraseDialogMode;
bool setupMessageBoxRan = false; bool setupMessageBoxRan = false;
@ -43,12 +43,12 @@ private slots:
void repackEncryptedStorage(); void repackEncryptedStorage();
private: private:
Ui::encryptionManager *ui; Ui::CryptoManagerWidget *ui;
generalDialog * generalDialogWindow; GeneralDialog * generalDialogWindow;
toast * toastWindow; toast * toastWindow;
hourglassAnimationWidget * hourglassAnimationWidgetWindow; hourglassAnimationWidget * hourglassAnimationWidgetWindow;
alert * alertWindow; SplashAlertWidget * alertWindow;
usbmsSplash *usbmsWindow; USBMSSplashWidget *usbmsWindow;
}; };
#endif // ENCRYPTIONMANAGER_H #endif // ENCRYPTIONMANAGER_H

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>encryptionManager</class> <class>CryptoManagerWidget</class>
<widget class="QWidget" name="encryptionManager"> <widget class="QWidget" name="CryptoManagerWidget">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>

124
src/ui/eink.qrc Normal file
View file

@ -0,0 +1,124 @@
<RCC>
<qresource prefix="/">
<file>../resources/checkbox-checked.png</file>
<file>../resources/checkbox-unchecked.png</file>
<file>../resources/align-center.png</file>
<file>../resources/align-justify.png</file>
<file>../resources/align-left.png</file>
<file>../resources/align-right.png</file>
<file>../resources/chesterton.jpg</file>
<file>../resources/alcott.jpg</file>
<file>../resources/davies.jpg</file>
<file>../resources/king.jpg</file>
<file>../resources/star.png</file>
<file>../resources/starred_star.png</file>
<file>../resources/close.png</file>
<file>../resources/chevron-left.png</file>
<file>../resources/chevron-right.png</file>
<file>../resources/chevron-down.png</file>
<file>../resources/chevron-up.png</file>
<file>../resources/christie.png</file>
<file>../resources/exit.png</file>
<file>../resources/usbms.png</file>
<file>../resources/settings.png</file>
<file>../resources/search.png</file>
<file>../resources/power.png</file>
<file>../resources/book.png</file>
<file>../resources/apps.png</file>
<file>../resources/battery_half.png</file>
<file>../resources/battery_full.png</file>
<file>../resources/battery_empty.png</file>
<file>../resources/battery_charging.png</file>
<file>../resources/alert.png</file>
<file>../resources/eink-dark.qss</file>
<file>../resources/frontlight.png</file>
<file>../resources/fonts/CrimsonPro-Bold.ttf</file>
<file>../resources/fonts/CrimsonPro-Italic.ttf</file>
<file>../resources/fonts/CrimsonPro-Regular.ttf</file>
<file>../resources/check.png</file>
<file>../resources/minus.png</file>
<file>../resources/plus.png</file>
<file>../resources/battery_alert.png</file>
<file>../resources/apps-inverted.png</file>
<file>../resources/home.png</file>
<file>../resources/settings-inverted.png</file>
<file>../resources/kobox-icon.png</file>
<file>../resources/X11.png</file>
<file>../resources/info.png</file>
<file>../resources/nightmode-empty.png</file>
<file>../resources/nightmode-full.png</file>
<file>../resources/backspace.png</file>
<file>../resources/x-circle.png</file>
<file>../resources/fonts/Bitter-MediumItalic.ttf</file>
<file>../resources/fonts/Bitter-Medium.ttf</file>
<file>../resources/fonts/Bitter-Bold.ttf</file>
<file>../resources/fonts/Bitter-BoldItalic.ttf</file>
<file>../resources/fonts/CrimsonPro-BoldItalic.ttf</file>
<file>../resources/fonts/IbarraRealNova-MediumItalic.ttf</file>
<file>../resources/fonts/IbarraRealNova-Medium.ttf</file>
<file>../resources/fonts/IbarraRealNova-BoldItalic.ttf</file>
<file>../resources/fonts/IbarraRealNova-Bold.ttf</file>
<file>../resources/wifi-connected.png</file>
<file>../resources/wifi-off.png</file>
<file>../resources/wifi-standby.png</file>
<file>../resources/zoom-in.png</file>
<file>../resources/zoom-out.png</file>
<file>../resources/encryption.png</file>
<file>../resources/check-display.png</file>
<file>../resources/hourglass-bottom.png</file>
<file>../resources/hourglass-top.png</file>
<file>../resources/error.png</file>
<file>../resources/alert-triangle.png</file>
<file>../resources/online-library.png</file>
<file>../resources/online-library-inverted.png</file>
<file>../resources/cover_unavailable.png</file>
<file>../resources/clock-inverted.png</file>
<file>../resources/clock.png</file>
<file>../resources/eink-square-encfs.qss</file>
<file>../resources/tzlist</file>
<file>../resources/edit.png</file>
<file>../resources/save.png</file>
<file>../resources/book_inverted.png</file>
<file>../resources/arrow-left.png</file>
<file>../resources/arrow-right.png</file>
<file>../resources/file-text.png</file>
<file>../resources/pin.png</file>
<file>../resources/highlight.png</file>
<file>../resources/unhighlight.png</file>
<file>../resources/view-highlights.png</file>
<file>../resources/stop.png</file>
<file>../resources/refresh.png</file>
<file>../resources/hide.png</file>
<file>../resources/show.png</file>
<file>../resources/christie.jpg</file>
<file>../resources/encryption-small.png</file>
<file>../resources/lock.png</file>
<file>../resources/public.png</file>
<file>../resources/wifi-0.png</file>
<file>../resources/wifi-25.png</file>
<file>../resources/wifi-50.png</file>
<file>../resources/wifi-75.png</file>
<file>../resources/wifi-100.png</file>
<file>../resources/log.png</file>
<file>../resources/new.png</file>
<file>../resources/checkbox-unchecked-small.png</file>
<file>../resources/checkbox-checked-small.png</file>
<file>../resources/checkbox-x-small.png</file>
<file>../resources/checkbox-x.png</file>
<file>../resources/folder.png</file>
<file>../resources/question-mark.png</file>
<file>../resources/refresh-small.png</file>
<file>../resources/checkbox-indeterminate.png</file>
<file>../resources/egg/0.jpg</file>
<file>../resources/egg/1.jpg</file>
<file>../resources/music-note.png</file>
<file>../resources/music-library.png</file>
<file>../resources/next.png</file>
<file>../resources/music-queue.png</file>
<file>../resources/play.png</file>
<file>../resources/previous.png</file>
<file>../resources/pause.png</file>
<file>../resources/clean.png</file>
<file>../resources/usbms-inverted.png</file>
</qresource>
</RCC>

View file

@ -1,36 +1,52 @@
#include "homepagewidget.h" #include "homepagewidget.h"
#include "ui_homepagewidget.h" #include "ui_homepagewidget.h"
#include "device.h"
#include <QScreen> #include <QScreen>
#include "functions.h" #include "functions.h"
homePageWidget::homePageWidget(QWidget *parent) : HomePageWidget::HomePageWidget(QWidget *parent) :
QWidget(parent), QWidget(parent),
ui(new Ui::homePageWidget) ui(new Ui::HomePageWidget)
{ {
Device * device = Device::getSingleton();
Device::ScreenSize screenSize = device->getScreenSize();
ui->setupUi(this); ui->setupUi(this);
// Getting the screen's size // Getting the screen's size
sW = QGuiApplication::screens()[0]->size().width(); sW = QGuiApplication::screens()[0]->size().width();
sH = QGuiApplication::screens()[0]->size().height(); sH = QGuiApplication::screens()[0]->size().height();
if(global::deviceID == "n705\n") {
if(screenSize == Device::ScreenSize::SMALL) {
stdIconWidth = sW / 23; stdIconWidth = sW / 23;
stdIconHeight = sH / 23; stdIconHeight = sH / 23;
} bookTitleTruncateThreshold = 20;
else if(global::deviceID == "n905\n" or global::deviceID == "kt\n") { stdIconWidthDivider = 8;
stdIconWidth = sW / 25; stdIconHeightDivider = 8;
stdIconHeight = sH / 25; } else if(screenSize == Device::ScreenSize::MEDIUM) {
}
else if(global::deviceID == "n613\n" or global::deviceID == "n236\n" or global::deviceID == "n437\n" or global::deviceID == "n306\n" or global::deviceID == "n249\n" or global::deviceID == "emu\n") {
stdIconWidth = sW / 23.5; stdIconWidth = sW / 23.5;
stdIconHeight = sH / 23.5; stdIconHeight = sH / 23.5;
} bookTitleTruncateThreshold = 25;
else { stdIconWidthDivider = 7;
stdIconHeightDivider = 7;
} else if(screenSize == Device::ScreenSize::LARGE) {
stdIconWidth = sW / 24;
stdIconHeight = sH / 24;
bookTitleTruncateThreshold = 25;
stdIconWidthDivider = 6.5;
stdIconHeightDivider = 6.5;
} else if(screenSize == Device::ScreenSize::VERY_LARGE) {
stdIconWidth = sW / 25; stdIconWidth = sW / 25;
stdIconHeight = sH / 25; stdIconHeight = sH / 25;
bookTitleTruncateThreshold = 35;
stdIconWidthDivider = 6;
stdIconHeightDivider = 6;
} }
ui->recentBooksIconLabel->setPixmap(QPixmap(":/resources/file-text.png").scaled(stdIconWidth, stdIconHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation)); ui->recentBooksIconLabel->setPixmap(QPixmap(":/resources/file-text.png").scaled(stdIconWidth, stdIconHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation));
ui->pinnedBooksIconLabel->setPixmap(QPixmap(":/resources/pin.png").scaled(stdIconWidth, stdIconHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation)); ui->pinnedBooksIconLabel->setPixmap(QPixmap(":/resources/pin.png").scaled(stdIconWidth, stdIconHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation));
@ -43,46 +59,8 @@ homePageWidget::homePageWidget(QWidget *parent) :
pinnedBooksBtnArray.resize(global::homePageWidget::pinnedBooksNumber); pinnedBooksBtnArray.resize(global::homePageWidget::pinnedBooksNumber);
pinnedBooksTitleArray.resize(global::homePageWidget::pinnedBooksNumber); pinnedBooksTitleArray.resize(global::homePageWidget::pinnedBooksNumber);
if(global::deviceID == "n705\n") { stdIconWidth = sW / stdIconWidthDivider;
bookTitleTruncateThreshold = 20; stdIconHeight = sH / stdIconHeightDivider;
}
else if(global::deviceID == "n873\n") {
bookTitleTruncateThreshold = 35;
}
else {
bookTitleTruncateThreshold = 25;
}
if(global::deviceID == "n705\n" or global::deviceID == "n905\n" or global::deviceID == "kt\n") {
stdIconWidthDivider = 8;
stdIconHeightDivider = 8;
stdIconWidth = sW / stdIconWidthDivider;
stdIconHeight = sH / stdIconHeightDivider;
}
else if(global::deviceID == "n613\n" or global::deviceID == "n236\n" or global::deviceID == "n306\n" or global::deviceID == "emu\n") {
stdIconWidthDivider = 7;
stdIconHeightDivider = 7;
stdIconWidth = sW / stdIconWidthDivider;
stdIconHeight = sH / stdIconHeightDivider;
}
else if(global::deviceID == "n437\n" or global::deviceID == "n249\n") {
stdIconWidthDivider = 6.5;
stdIconHeightDivider = 6.5;
stdIconWidth = sW / stdIconWidthDivider;
stdIconHeight = sH / stdIconHeightDivider;
}
else if(global::deviceID == "n873\n") {
stdIconWidthDivider = 6;
stdIconHeightDivider = 6;
stdIconWidth = sW / stdIconWidthDivider;
stdIconHeight = sH / stdIconHeightDivider;
}
else {
stdIconWidthDivider = 8;
stdIconHeightDivider = 8;
stdIconWidth = sW / stdIconWidthDivider;
stdIconHeight = sH / stdIconHeightDivider;
}
if(!QFile::exists(global::localLibrary::databasePath)) { if(!QFile::exists(global::localLibrary::databasePath)) {
global::toast::modalToast = true; global::toast::modalToast = true;
@ -95,12 +73,12 @@ homePageWidget::homePageWidget(QWidget *parent) :
} }
} }
homePageWidget::~homePageWidget() HomePageWidget::~HomePageWidget()
{ {
delete ui; delete ui;
} }
void homePageWidget::openBook(QString bookPath) { void HomePageWidget::openBook(QString bookPath) {
if(!bookPath.isEmpty()) { if(!bookPath.isEmpty()) {
emit openBookSignal(bookPath, false); emit openBookSignal(bookPath, false);
} }
@ -109,11 +87,11 @@ void homePageWidget::openBook(QString bookPath) {
} }
} }
void homePageWidget::refreshScreenNative() { void HomePageWidget::refreshScreenNative() {
emit refreshScreen(); emit refreshScreen();
} }
void homePageWidget::setupDisplay(bool databaseGenerated) { void HomePageWidget::setupDisplay(bool databaseGenerated) {
if(databaseGenerated == true) { if(databaseGenerated == true) {
toastWindow->close(); toastWindow->close();
} }
@ -173,8 +151,8 @@ void homePageWidget::setupDisplay(bool databaseGenerated) {
verticalLayoutArray[i] = new QVBoxLayout(); verticalLayoutArray[i] = new QVBoxLayout();
// Book icon button // Book icon button
QObject::connect(bookBtnArray[i], &QClickableLabel::bookPath, this, &homePageWidget::openBook); QObject::connect(bookBtnArray[i], &QClickableLabel::bookPath, this, &HomePageWidget::openBook);
QObject::connect(bookBtnArray[i], &QClickableLabel::longPressString, this, &homePageWidget::openBookOptionsDialog); QObject::connect(bookBtnArray[i], &QClickableLabel::longPressString, this, &HomePageWidget::openBookOptionsDialog);
bookBtnArray[i]->setAlignment(Qt::AlignCenter); bookBtnArray[i]->setAlignment(Qt::AlignCenter);
bookBtnArray[i]->setFont(QFont("u001")); bookBtnArray[i]->setFont(QFont("u001"));
bookBtnArray[i]->setStyleSheet("color: black; background-color: white; border-radius: 10px; padding: 10px"); bookBtnArray[i]->setStyleSheet("color: black; background-color: white; border-radius: 10px; padding: 10px");
@ -277,8 +255,8 @@ void homePageWidget::setupDisplay(bool databaseGenerated) {
pinnedBooksVerticalLayoutArray[i] = new QVBoxLayout(); pinnedBooksVerticalLayoutArray[i] = new QVBoxLayout();
// Book icon button // Book icon button
QObject::connect(pinnedBooksBtnArray[i], &QClickableLabel::bookPath, this, &homePageWidget::openBook); QObject::connect(pinnedBooksBtnArray[i], &QClickableLabel::bookPath, this, &HomePageWidget::openBook);
QObject::connect(pinnedBooksBtnArray[i], &QClickableLabel::longPressString, this, &homePageWidget::openBookOptionsDialog); QObject::connect(pinnedBooksBtnArray[i], &QClickableLabel::longPressString, this, &HomePageWidget::openBookOptionsDialog);
pinnedBooksBtnArray[i]->setAlignment(Qt::AlignCenter); pinnedBooksBtnArray[i]->setAlignment(Qt::AlignCenter);
pinnedBooksBtnArray[i]->setFont(QFont("u001")); pinnedBooksBtnArray[i]->setFont(QFont("u001"));
pinnedBooksBtnArray[i]->setStyleSheet("color: black; background-color: white; border-radius: 10px; padding: 10px"); pinnedBooksBtnArray[i]->setStyleSheet("color: black; background-color: white; border-radius: 10px; padding: 10px");
@ -355,26 +333,26 @@ void homePageWidget::setupDisplay(bool databaseGenerated) {
QTimer::singleShot(500, this, SLOT(refreshScreenNative())); QTimer::singleShot(500, this, SLOT(refreshScreenNative()));
} }
void homePageWidget::setupDisplaySlot() { void HomePageWidget::setupDisplaySlot() {
setupDisplay(true); setupDisplay(true);
} }
void homePageWidget::setupDisplayWithDatabase() { void HomePageWidget::setupDisplayWithDatabase() {
global::localLibrary::headless = true; global::localLibrary::headless = true;
localLibraryWidget * localLibraryWidgetWindow = new localLibraryWidget(this); LocalLibraryWidget * localLibraryWidgetWindow = new LocalLibraryWidget(this);
localLibraryWidgetWindow->setAttribute(Qt::WA_DeleteOnClose); localLibraryWidgetWindow->setAttribute(Qt::WA_DeleteOnClose);
localLibraryWidgetWindow->hide(); localLibraryWidgetWindow->hide();
QObject::connect(localLibraryWidgetWindow, &localLibraryWidget::destroyed, this, &homePageWidget::setupDisplaySlot); QObject::connect(localLibraryWidgetWindow, &LocalLibraryWidget::destroyed, this, &HomePageWidget::setupDisplaySlot);
} }
void homePageWidget::showToast(QString messageToDisplay) { void HomePageWidget::showToast(QString messageToDisplay) {
global::toast::message = messageToDisplay; global::toast::message = messageToDisplay;
toastWindow = new toast(this); toastWindow = new toast(this);
toastWindow->setAttribute(Qt::WA_DeleteOnClose); toastWindow->setAttribute(Qt::WA_DeleteOnClose);
toastWindow->show(); toastWindow->show();
} }
void homePageWidget::openBookOptionsDialog(QString bookPath) { void HomePageWidget::openBookOptionsDialog(QString bookPath) {
int bookID; int bookID;
// Finding bookID from bookPath // Finding bookID from bookPath
@ -403,23 +381,23 @@ void homePageWidget::openBookOptionsDialog(QString bookPath) {
log("Opening book options dialog for book with path '" + bookPath + "', ID " + QString::number(bookID), className); log("Opening book options dialog for book with path '" + bookPath + "', ID " + QString::number(bookID), className);
global::localLibrary::bookOptionsDialog::bookID = bookID; global::localLibrary::bookOptionsDialog::bookID = bookID;
global::localLibrary::bookOptionsDialog::deleteOption = false; global::localLibrary::bookOptionsDialog::deleteOption = false;
bookOptionsDialog * bookOptionsDialogWindow = new bookOptionsDialog(this); BookOptionsDialog * bookOptionsDialogWindow = new BookOptionsDialog(this);
QObject::connect(bookOptionsDialogWindow, &bookOptionsDialog::openLocalBookInfoDialog, this, &homePageWidget::openLocalBookInfoDialog); QObject::connect(bookOptionsDialogWindow, &BookOptionsDialog::openLocalBookInfoDialog, this, &HomePageWidget::openLocalBookInfoDialog);
QObject::connect(bookOptionsDialogWindow, &bookOptionsDialog::showToast, this, &homePageWidget::showToast); QObject::connect(bookOptionsDialogWindow, &BookOptionsDialog::showToast, this, &HomePageWidget::showToast);
QObject::connect(bookOptionsDialogWindow, &bookOptionsDialog::destroyed, this, &homePageWidget::handlePossibleBookPin); QObject::connect(bookOptionsDialogWindow, &BookOptionsDialog::destroyed, this, &HomePageWidget::handlePossibleBookPin);
bookOptionsDialogWindow->setAttribute(Qt::WA_DeleteOnClose); bookOptionsDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
bookOptionsDialogWindow->setWindowFlags(Qt::FramelessWindowHint | Qt::Popup); bookOptionsDialogWindow->setWindowFlags(Qt::FramelessWindowHint | Qt::Popup);
bookOptionsDialogWindow->show(); bookOptionsDialogWindow->show();
} }
void homePageWidget::openLocalBookInfoDialog() { void HomePageWidget::openLocalBookInfoDialog() {
global::bookInfoDialog::localInfoDialog = true; global::bookInfoDialog::localInfoDialog = true;
bookInfoDialog * bookInfoDialogWindow = new bookInfoDialog(this); BookInfoDialog * bookInfoDialogWindow = new BookInfoDialog(this);
bookInfoDialogWindow->setAttribute(Qt::WA_DeleteOnClose); bookInfoDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
bookInfoDialogWindow->show(); bookInfoDialogWindow->show();
} }
void homePageWidget::handlePossibleBookPin() { void HomePageWidget::handlePossibleBookPin() {
if(global::localLibrary::bookOptionsDialog::bookPinAction == true) { if(global::localLibrary::bookOptionsDialog::bookPinAction == true) {
QTimer::singleShot(3100, this, [&]() { QTimer::singleShot(3100, this, [&]() {
emit relaunchHomePageWidget(); emit relaunchHomePageWidget();

View file

@ -11,17 +11,17 @@
#include "bookinfodialog.h" #include "bookinfodialog.h"
namespace Ui { namespace Ui {
class homePageWidget; class HomePageWidget;
} }
class homePageWidget : public QWidget class HomePageWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
QString className = this->metaObject()->className(); QString className = this->metaObject()->className();
explicit homePageWidget(QWidget *parent = nullptr); explicit HomePageWidget(QWidget *parent = nullptr);
~homePageWidget(); ~HomePageWidget();
int sW; int sW;
int sH; int sH;
int stdIconWidth; int stdIconWidth;
@ -48,11 +48,11 @@ private slots:
void handlePossibleBookPin(); void handlePossibleBookPin();
private: private:
Ui::homePageWidget *ui; Ui::HomePageWidget *ui;
localLibraryWidget * localLibraryWidgetWindow; LocalLibraryWidget * localLibraryWidgetWindow;
toast * toastWindow; toast * toastWindow;
bookOptionsDialog * bookOptionsDialogWindow; BookOptionsDialog * bookOptionsDialogWindow;
bookInfoDialog * bookInfoDialogWindow; BookInfoDialog * bookInfoDialogWindow;
QVector<QToolTipLabel*> bookTitleArray; QVector<QToolTipLabel*> bookTitleArray;
QVector<QHBoxLayout*> horizontalLayoutArray; QVector<QHBoxLayout*> horizontalLayoutArray;
QVector<QVBoxLayout*> verticalLayoutArray; QVector<QVBoxLayout*> verticalLayoutArray;

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>homePageWidget</class> <class>HomePageWidget</class>
<widget class="QWidget" name="homePageWidget"> <widget class="QWidget" name="HomePageWidget">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>

1032
src/ui/home/mainwindow.cpp Normal file

File diff suppressed because it is too large Load diff

View file

@ -7,7 +7,7 @@
#include "apps.h" #include "apps.h"
#include "reader.h" #include "reader.h"
#include "quit.h" #include "quit.h"
#include "alert.h" #include "splashAlert.h"
#include "usbmsSplash.h" #include "usbmsSplash.h"
#include "brightnessdialog.h" #include "brightnessdialog.h"
#include "generaldialog.h" #include "generaldialog.h"
@ -110,24 +110,24 @@ private slots:
private: private:
Ui::MainWindow * ui; Ui::MainWindow * ui;
settingsChooser * settingsChooserWindow; SettingsChooserWidget * settingsChooserWindow;
apps * appsWindow; AppsWidget * appsWindow;
reader * readerWindow; ReaderWidget * readerWindow;
quit * quitWindow; QuitWidget * quitWindow;
alert * alertWindow; SplashAlertWidget * alertWindow;
usbmsSplash * usbmsWindow; USBMSSplashWidget * usbmsWindow;
brightnessDialog * brightnessDialogWindow; BrightnessDialog * brightnessDialogWindow;
generalDialog * generalDialogWindow; GeneralDialog * generalDialogWindow;
koboxSettings * koboxSettingsWindow; KoboxSettingsWidget * koboxSettingsWindow;
koboxAppsDialog * koboxAppsDialogWindow; KoboxAppsDialog * koboxAppsDialogWindow;
textwidget * textwidgetWindow; textwidget * textwidgetWindow;
virtualkeypad * keypadWidget; virtualkeypad * keypadWidget;
toast * toastWindow; toast * toastWindow;
otaManager * otaManagerWindow; OTAUpdateManagerWidget * otaManagerWindow;
libraryWidget * libraryWidgetWindow; LibraryWidget * libraryWidgetWindow;
localLibraryWidget * localLibraryWidgetWindow; LocalLibraryWidget * localLibraryWidgetWindow;
homePageWidget * homePageWidgetWindow; HomePageWidget * homePageWidgetWindow;
telemetry * telemetryInstance; Telemetry * telemetryInstance;
}; };
#endif // MAINWINDOW_H #endif // MAINWINDOW_H

View file

@ -1,17 +1,21 @@
#include "locallibrarywidget.h" #include "locallibrarywidget.h"
#include "ui_locallibrarywidget.h" #include "ui_locallibrarywidget.h"
#include "device.h"
#include <QVBoxLayout> #include <QVBoxLayout>
#include <QSpacerItem> #include <QSpacerItem>
#include <QScreen> #include <QScreen>
localLibraryWidget::localLibraryWidget(QWidget *parent) : LocalLibraryWidget::LocalLibraryWidget(QWidget *parent) :
QWidget(parent), QWidget(parent),
ui(new Ui::localLibraryWidget) ui(new Ui::LocalLibraryWidget)
{ {
Device *device = Device::getSingleton();
Device::ScreenSize screenSize = device->getScreenSize();
ui->setupUi(this); ui->setupUi(this);
this->setFont(QFont("u001")); this->setFont(QFont("u001"));
QObject::connect(ui->pageNumberLabel, &QClickableLabel::clicked, this, &localLibraryWidget::openGoToPageDialog); QObject::connect(ui->pageNumberLabel, &QClickableLabel::clicked, this, &LocalLibraryWidget::openGoToPageDialog);
ui->previousPageBtn->setProperty("type", "borderless"); ui->previousPageBtn->setProperty("type", "borderless");
ui->previousPageBtn->setEnabled(false); ui->previousPageBtn->setEnabled(false);
@ -25,23 +29,23 @@ localLibraryWidget::localLibraryWidget(QWidget *parent) :
ui->goUpBtn->setEnabled(false); ui->goUpBtn->setEnabled(false);
if(global::deviceID == "n705\n") { if(screenSize == Device::ScreenSize::SMALL) {
buttonsNumber = 3; buttonsNumber = 3;
} }
else if(global::deviceID == "n873\n") { else if(screenSize >= Device::ScreenSize::VERY_LARGE) {
buttonsNumber = 5; buttonsNumber = 5;
} }
else { else {
buttonsNumber = 4; buttonsNumber = 4;
} }
if(global::deviceID == "n705\n") { if(screenSize == Device::ScreenSize::SMALL) {
bookTitleTruncateThreshold = 27; bookTitleTruncateThreshold = 27;
} }
else if(global::deviceID == "n873\n") { else if(screenSize >= Device::ScreenSize::VERY_LARGE) {
bookTitleTruncateThreshold = 45; bookTitleTruncateThreshold = 45;
} }
else if(global::deviceID == "n306\n") { else if(screenSize == Device::ScreenSize::MEDIUM) {
bookTitleTruncateThreshold = 32; bookTitleTruncateThreshold = 32;
} }
else { else {
@ -57,34 +61,21 @@ localLibraryWidget::localLibraryWidget(QWidget *parent) :
sW = QGuiApplication::screens()[0]->size().width(); sW = QGuiApplication::screens()[0]->size().width();
sH = QGuiApplication::screens()[0]->size().height(); sH = QGuiApplication::screens()[0]->size().height();
if(global::deviceID == "n705\n") {
if(screenSize == Device::ScreenSize::SMALL) {
stdIconWidthDivider = 7.2; stdIconWidthDivider = 7.2;
stdIconHeightDivider = 7.2; stdIconHeightDivider = 7.2;
} } else if(screenSize == Device::ScreenSize::MEDIUM) {
else if(global::deviceID == "n905\n" or global::deviceID == "kt\n") {
stdIconWidthDivider = 9.5;
stdIconHeightDivider = 9.5;
}
else if(global::deviceID == "n613\n" or global::deviceID == "emu\n") {
stdIconWidthDivider = 8.7;
stdIconHeightDivider = 8.7;
}
else if(global::deviceID == "n437\n" or global::deviceID == "n249\n") {
stdIconWidthDivider = 8.1; stdIconWidthDivider = 8.1;
stdIconHeightDivider = 8.1; stdIconHeightDivider = 8.1;
} } else if(screenSize == Device::ScreenSize::LARGE) {
else if(global::deviceID == "n873\n") { stdIconWidthDivider = 8.5;
stdIconHeightDivider = 8.5;
} else if(screenSize >= Device::ScreenSize::VERY_LARGE) {
stdIconWidthDivider = 9.7; stdIconWidthDivider = 9.7;
stdIconHeightDivider = 9.7; stdIconHeightDivider = 9.7;
} }
else if(global::deviceID == "n236\n" or global::deviceID == "n306\n") {
stdIconWidthDivider = 9.1;
stdIconHeightDivider = 9.1;
}
else {
stdIconWidthDivider = 9.5;
stdIconHeightDivider = 9.5;
}
stdIconWidth = sW / stdIconWidthDivider; stdIconWidth = sW / stdIconWidthDivider;
stdIconHeight = sH / stdIconHeightDivider; stdIconHeight = sH / stdIconHeightDivider;
@ -109,12 +100,12 @@ localLibraryWidget::localLibraryWidget(QWidget *parent) :
} }
} }
localLibraryWidget::~localLibraryWidget() LocalLibraryWidget::~LocalLibraryWidget()
{ {
delete ui; delete ui;
} }
void localLibraryWidget::setupDatabase() { void LocalLibraryWidget::setupDatabase() {
setDefaultWorkDir(); setDefaultWorkDir();
if(!QFile::exists(global::localLibrary::databasePath)) { if(!QFile::exists(global::localLibrary::databasePath)) {
log("Generating database", className); log("Generating database", className);
@ -195,11 +186,11 @@ void localLibraryWidget::setupDatabase() {
if(global::localLibrary::headless == true) { if(global::localLibrary::headless == true) {
global::localLibrary::headless = false; global::localLibrary::headless = false;
localLibraryWidget::close(); LocalLibraryWidget::close();
} }
} }
void localLibraryWidget::setupBooksList(int pageNumber) { void LocalLibraryWidget::setupBooksList(int pageNumber) {
idList.clear(); idList.clear();
int in = 1; int in = 1;
for(int i = (1 * pageNumber * buttonsNumber) - (buttonsNumber - 1); i <= (1 * pageNumber * buttonsNumber); i++) { for(int i = (1 * pageNumber * buttonsNumber) - (buttonsNumber - 1); i <= (1 * pageNumber * buttonsNumber); i++) {
@ -279,7 +270,7 @@ void localLibraryWidget::setupBooksList(int pageNumber) {
} }
} }
void localLibraryWidget::on_previousPageBtn_clicked() void LocalLibraryWidget::on_previousPageBtn_clicked()
{ {
log("Previous button clicked", className); log("Previous button clicked", className);
@ -303,7 +294,7 @@ void localLibraryWidget::on_previousPageBtn_clicked()
} }
void localLibraryWidget::on_nextPageBtn_clicked() void LocalLibraryWidget::on_nextPageBtn_clicked()
{ {
currentPageNumber++; currentPageNumber++;
setupBooksListToggle(currentPageNumber); setupBooksListToggle(currentPageNumber);
@ -315,14 +306,14 @@ void localLibraryWidget::on_nextPageBtn_clicked()
} }
} }
void localLibraryWidget::openBook(int bookID) { void LocalLibraryWidget::openBook(int bookID) {
QJsonObject jsonObject = databaseJsonArrayList.at(bookID - 1).toObject(); QJsonObject jsonObject = databaseJsonArrayList.at(bookID - 1).toObject();
QString bookPath = jsonObject["BookPath"].toString(); QString bookPath = jsonObject["BookPath"].toString();
log("Opening book with ID " + QString::number(bookID) + ", path '" + bookPath + "'", className); log("Opening book with ID " + QString::number(bookID) + ", path '" + bookPath + "'", className);
emit openBookSignal(bookPath, false); emit openBookSignal(bookPath, false);
} }
void localLibraryWidget::btnOpenBook(int buttonNumber) { void LocalLibraryWidget::btnOpenBook(int buttonNumber) {
log("Book/directory button clicked, buttonNumber is " + QString::number(buttonNumber), className); log("Book/directory button clicked, buttonNumber is " + QString::number(buttonNumber), className);
if(mainPathIsEmpty == true) { if(mainPathIsEmpty == true) {
return void(); return void();
@ -339,23 +330,23 @@ void localLibraryWidget::btnOpenBook(int buttonNumber) {
else { else {
log("A book was selected", className); log("A book was selected", className);
openBook(id); openBook(id);
localLibraryWidget::close(); LocalLibraryWidget::close();
} }
} }
void localLibraryWidget::openGoToPageDialog() { void LocalLibraryWidget::openGoToPageDialog() {
if(mainPathIsEmpty == true) { if(mainPathIsEmpty == true) {
return void(); return void();
} }
log("Showing 'Go to page' dialog", className); log("Showing 'Go to page' dialog", className);
global::keyboard::keypadDialog = true; global::keyboard::keypadDialog = true;
generalDialogWindow = new generalDialog(); generalDialogWindow = new GeneralDialog();
generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose); generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
QObject::connect(generalDialogWindow, &generalDialog::gotoPageSelected, this, &localLibraryWidget::goToPage); QObject::connect(generalDialogWindow, &GeneralDialog::gotoPageSelected, this, &LocalLibraryWidget::goToPage);
} }
void localLibraryWidget::goToPage(int page) { void LocalLibraryWidget::goToPage(int page) {
checkIfMainPathIsEmpty(); checkIfMainPathIsEmpty();
if(mainPathIsEmpty == true) { if(mainPathIsEmpty == true) {
return void(); return void();
@ -375,11 +366,11 @@ void localLibraryWidget::goToPage(int page) {
} }
} }
void localLibraryWidget::refreshScreenNative() { void LocalLibraryWidget::refreshScreenNative() {
emit refreshScreen(); emit refreshScreen();
} }
void localLibraryWidget::setupDisplay() { void LocalLibraryWidget::setupDisplay() {
setupDatabase(); setupDatabase();
if(noBooksInDatabase == false) { if(noBooksInDatabase == false) {
// Prevent segmentation fault if a book was the last of its page // Prevent segmentation fault if a book was the last of its page
@ -403,14 +394,14 @@ void localLibraryWidget::setupDisplay() {
global::localLibrary::bookOptionsDialog::bookDeleted = false; global::localLibrary::bookOptionsDialog::bookDeleted = false;
} }
void localLibraryWidget::showToast(QString messageToDisplay) { void LocalLibraryWidget::showToast(QString messageToDisplay) {
global::toast::message = messageToDisplay; global::toast::message = messageToDisplay;
toastWindow = new toast(this); toastWindow = new toast(this);
toastWindow->setAttribute(Qt::WA_DeleteOnClose); toastWindow->setAttribute(Qt::WA_DeleteOnClose);
toastWindow->show(); toastWindow->show();
} }
void localLibraryWidget::openBookOptionsDialog(int pseudoBookID) { void LocalLibraryWidget::openBookOptionsDialog(int pseudoBookID) {
if(mainPathIsEmpty == true) { if(mainPathIsEmpty == true) {
return void(); return void();
} }
@ -440,17 +431,17 @@ void localLibraryWidget::openBookOptionsDialog(int pseudoBookID) {
log("Opening book options dialog for book with pseudo-ID " + QString::number(pseudoBookID) + ", ID " + QString::number(bookID), className); log("Opening book options dialog for book with pseudo-ID " + QString::number(pseudoBookID) + ", ID " + QString::number(bookID), className);
// Here, ID should go because of idList.at(pseudoBookID - 1); // Here, ID should go because of idList.at(pseudoBookID - 1);
global::localLibrary::bookOptionsDialog::bookID = id; global::localLibrary::bookOptionsDialog::bookID = id;
bookOptionsDialog * bookOptionsDialogWindow = new bookOptionsDialog(this); BookOptionsDialog * bookOptionsDialogWindow = new BookOptionsDialog(this);
QObject::connect(bookOptionsDialogWindow, &bookOptionsDialog::openLocalBookInfoDialog, this, &localLibraryWidget::openLocalBookInfoDialog); QObject::connect(bookOptionsDialogWindow, &BookOptionsDialog::openLocalBookInfoDialog, this, &LocalLibraryWidget::openLocalBookInfoDialog);
QObject::connect(bookOptionsDialogWindow, &bookOptionsDialog::showToast, this, &localLibraryWidget::showToast); QObject::connect(bookOptionsDialogWindow, &BookOptionsDialog::showToast, this, &LocalLibraryWidget::showToast);
QObject::connect(bookOptionsDialogWindow, &bookOptionsDialog::destroyed, this, &localLibraryWidget::handlePossibleBookDeletion); QObject::connect(bookOptionsDialogWindow, &BookOptionsDialog::destroyed, this, &LocalLibraryWidget::handlePossibleBookDeletion);
QObject::connect(bookOptionsDialogWindow, &bookOptionsDialog::removedFolder, this, &localLibraryWidget::refreshFolders); QObject::connect(bookOptionsDialogWindow, &BookOptionsDialog::removedFolder, this, &LocalLibraryWidget::refreshFolders);
bookOptionsDialogWindow->setAttribute(Qt::WA_DeleteOnClose); bookOptionsDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
bookOptionsDialogWindow->setWindowFlags(Qt::FramelessWindowHint | Qt::Popup); bookOptionsDialogWindow->setWindowFlags(Qt::FramelessWindowHint | Qt::Popup);
bookOptionsDialogWindow->show(); bookOptionsDialogWindow->show();
} }
void localLibraryWidget::handlePossibleBookDeletion() { void LocalLibraryWidget::handlePossibleBookDeletion() {
if(global::localLibrary::bookOptionsDialog::bookDeleted == true) { if(global::localLibrary::bookOptionsDialog::bookDeleted == true) {
QTimer::singleShot(3100, this, [&]() { QTimer::singleShot(3100, this, [&]() {
global::toast::modalToast = true; global::toast::modalToast = true;
@ -461,14 +452,14 @@ void localLibraryWidget::handlePossibleBookDeletion() {
} }
} }
void localLibraryWidget::openLocalBookInfoDialog() { void LocalLibraryWidget::openLocalBookInfoDialog() {
global::bookInfoDialog::localInfoDialog = true; global::bookInfoDialog::localInfoDialog = true;
bookInfoDialog * bookInfoDialogWindow = new bookInfoDialog(this); BookInfoDialog * bookInfoDialogWindow = new BookInfoDialog(this);
bookInfoDialogWindow->setAttribute(Qt::WA_DeleteOnClose); bookInfoDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
bookInfoDialogWindow->show(); bookInfoDialogWindow->show();
} }
void localLibraryWidget::setupBooksListToggle(int pageNumber) { void LocalLibraryWidget::setupBooksListToggle(int pageNumber) {
if(folderFeatureEnabled == true) { if(folderFeatureEnabled == true) {
setupBooksListFolders(pageNumber); setupBooksListFolders(pageNumber);
} }
@ -477,7 +468,7 @@ void localLibraryWidget::setupBooksListToggle(int pageNumber) {
} }
} }
void localLibraryWidget::setupBooksListFolders(int pageNumber) { void LocalLibraryWidget::setupBooksListFolders(int pageNumber) {
log("Showing folders for page: " + QString::number(pageNumber), className); log("Showing folders for page: " + QString::number(pageNumber), className);
QStringList directoryList = QDir(pathForFolders).entryList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name); QStringList directoryList = QDir(pathForFolders).entryList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name);
log("Full directory list is '" + directoryList.join(", ") + "'", className); log("Full directory list is '" + directoryList.join(", ") + "'", className);
@ -644,7 +635,7 @@ void localLibraryWidget::setupBooksListFolders(int pageNumber) {
} }
// Sets pagesNumber for folders feature, and everything else // Sets pagesNumber for folders feature, and everything else
void localLibraryWidget::calculateMaximumPagesNumberForFolders() { void LocalLibraryWidget::calculateMaximumPagesNumberForFolders() {
log("Main path is '" + pathForFolders + "'", className); log("Main path is '" + pathForFolders + "'", className);
checkIfMainPathIsEmpty(); checkIfMainPathIsEmpty();
@ -713,7 +704,7 @@ void localLibraryWidget::calculateMaximumPagesNumberForFolders() {
// Sorting the vector if needed should be done here // Sorting the vector if needed should be done here
} }
void localLibraryWidget::calculateIndexForPage(int pageNumber) { void LocalLibraryWidget::calculateIndexForPage(int pageNumber) {
if(pageNumber == firstPageForBooks + 1) { if(pageNumber == firstPageForBooks + 1) {
log("Variable firstPageForBooks is 0", className); log("Variable firstPageForBooks is 0", className);
bookIndexVector = 0; bookIndexVector = 0;
@ -747,7 +738,7 @@ void localLibraryWidget::calculateIndexForPage(int pageNumber) {
} }
} }
void localLibraryWidget::changePathAndRefresh(QString directory) { void LocalLibraryWidget::changePathAndRefresh(QString directory) {
log("Changing path", className); log("Changing path", className);
QString temporaryPathForFolders = pathForFolders + directory + "/"; QString temporaryPathForFolders = pathForFolders + directory + "/";
if(QDir(temporaryPathForFolders).isEmpty() == false) { if(QDir(temporaryPathForFolders).isEmpty() == false) {
@ -762,12 +753,12 @@ void localLibraryWidget::changePathAndRefresh(QString directory) {
} }
} }
void localLibraryWidget::on_goUpBtn_clicked() void LocalLibraryWidget::on_goUpBtn_clicked()
{ {
goUpFunction(); goUpFunction();
} }
void localLibraryWidget::goUpFunction() { void LocalLibraryWidget::goUpFunction() {
if(pathForFolders != "/mnt/onboard/onboard/") { if(pathForFolders != "/mnt/onboard/onboard/") {
log("Changing path; going back", className); log("Changing path; going back", className);
// This can't be a one-liner // This can't be a one-liner
@ -786,7 +777,7 @@ void localLibraryWidget::goUpFunction() {
} }
} }
void localLibraryWidget::on_pathBtn_clicked() void LocalLibraryWidget::on_pathBtn_clicked()
{ {
log("Showing path dialog", className); log("Showing path dialog", className);
QString pathForFoldersSaved = pathForFolders; QString pathForFoldersSaved = pathForFolders;
@ -794,14 +785,14 @@ void localLibraryWidget::on_pathBtn_clicked()
pathForFolders = pathForFoldersSaved; pathForFolders = pathForFoldersSaved;
} }
void localLibraryWidget::refreshFolders() { void LocalLibraryWidget::refreshFolders() {
log("Called refresh folders"); log("Called refresh folders");
calculateMaximumPagesNumberForFolders(); calculateMaximumPagesNumberForFolders();
bookIndexVector = 0; bookIndexVector = 0;
goToPage(1); goToPage(1);
} }
void localLibraryWidget::checkIfMainPathIsEmpty() { void LocalLibraryWidget::checkIfMainPathIsEmpty() {
if(folderFeatureEnabled == true) { if(folderFeatureEnabled == true) {
// If the main path is empty, prevent it from freezing and using the CPU at 100% because of a while loop // If the main path is empty, prevent it from freezing and using the CPU at 100% because of a while loop
if(pathForFolders == "/mnt/onboard/onboard/") { if(pathForFolders == "/mnt/onboard/onboard/") {
@ -827,8 +818,8 @@ void localLibraryWidget::checkIfMainPathIsEmpty() {
} }
} }
void localLibraryWidget::setupButtonsLook() { void LocalLibraryWidget::setupButtonsLook() {
for(int i = 1; i <= buttonsNumber; i++) { for(int i = 0; i < buttonsNumber; i++) {
// Horizontal layout that will contain the book button and its icon // Horizontal layout that will contain the book button and its icon
horizontalLayoutArray[i] = new QHBoxLayout(this); horizontalLayoutArray[i] = new QHBoxLayout(this);
@ -839,8 +830,8 @@ void localLibraryWidget::setupButtonsLook() {
// Book button // Book button
bookBtnArray[i] = new QClickableLabel(this); bookBtnArray[i] = new QClickableLabel(this);
bookBtnArray[i]->setObjectName(QString::number(i)); bookBtnArray[i]->setObjectName(QString::number(i));
QObject::connect(bookBtnArray[i], &QClickableLabel::bookID, this, &localLibraryWidget::btnOpenBook); QObject::connect(bookBtnArray[i], &QClickableLabel::bookID, this, &LocalLibraryWidget::btnOpenBook);
QObject::connect(bookBtnArray[i], &QClickableLabel::longPressInt, this, &localLibraryWidget::openBookOptionsDialog); QObject::connect(bookBtnArray[i], &QClickableLabel::longPressInt, this, &LocalLibraryWidget::openBookOptionsDialog);
bookBtnArray[i]->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); bookBtnArray[i]->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
bookBtnArray[i]->setStyleSheet("color: black; background-color: white; border-radius: 10px; padding: 10px"); bookBtnArray[i]->setStyleSheet("color: black; background-color: white; border-radius: 10px; padding: 10px");
bookBtnArray[i]->setFont(QFont("u001")); bookBtnArray[i]->setFont(QFont("u001"));
@ -860,7 +851,7 @@ void localLibraryWidget::setupButtonsLook() {
} }
} }
void localLibraryWidget::cleanButtons() { void LocalLibraryWidget::cleanButtons() {
log("Hiding items", className); log("Hiding items", className);
for(int i = 1; i <= buttonsNumber; i++) { for(int i = 1; i <= buttonsNumber; i++) {
if(bookIconArray[i]->isHidden() == false) { if(bookIconArray[i]->isHidden() == false) {

View file

@ -13,17 +13,17 @@
#include "bookinfodialog.h" #include "bookinfodialog.h"
namespace Ui { namespace Ui {
class localLibraryWidget; class LocalLibraryWidget;
} }
class localLibraryWidget : public QWidget class LocalLibraryWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
QString className = this->metaObject()->className(); QString className = this->metaObject()->className();
explicit localLibraryWidget(QWidget *parent = nullptr); explicit LocalLibraryWidget(QWidget *parent = nullptr);
~localLibraryWidget(); ~LocalLibraryWidget();
int buttonsNumber; int buttonsNumber;
int sW; int sW;
int sH; int sH;
@ -87,11 +87,11 @@ private slots:
void on_pathBtn_clicked(); void on_pathBtn_clicked();
private: private:
Ui::localLibraryWidget * ui; Ui::LocalLibraryWidget * ui;
generalDialog * generalDialogWindow; GeneralDialog * generalDialogWindow;
bookOptionsDialog * bookOptionsDialogWindow; BookOptionsDialog * bookOptionsDialogWindow;
toast * toastWindow; toast * toastWindow;
bookInfoDialog * bookInfoDialogWindow; BookInfoDialog * bookInfoDialogWindow;
QVector<QHBoxLayout*> horizontalLayoutArray; QVector<QHBoxLayout*> horizontalLayoutArray;
QVector<QLabel*> bookIconArray; QVector<QLabel*> bookIconArray;
QVector<QClickableLabel*> bookBtnArray; QVector<QClickableLabel*> bookBtnArray;

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>localLibraryWidget</class> <class>LocalLibraryWidget</class>
<widget class="QWidget" name="localLibraryWidget"> <widget class="QWidget" name="LocalLibraryWidget">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>

View file

@ -1,6 +1,7 @@
#include "librarywidget.h" #include "librarywidget.h"
#include "ui_librarywidget.h" #include "ui_librarywidget.h"
#include "functions.h" #include "functions.h"
#include "device.h"
#include <QProcess> #include <QProcess>
#include <QDebug> #include <QDebug>
@ -8,10 +9,11 @@
#include <QScreen> #include <QScreen>
#include <QFontDatabase> #include <QFontDatabase>
libraryWidget::libraryWidget(QWidget *parent) : LibraryWidget::LibraryWidget(QWidget *parent) :
QWidget(parent), QWidget(parent),
ui(new Ui::libraryWidget) ui(new Ui::LibraryWidget)
{ {
Device* device = Device::getSingleton();
ui->setupUi(this); ui->setupUi(this);
ui->booksStackedWidget->hide(); ui->booksStackedWidget->hide();
@ -34,7 +36,9 @@ libraryWidget::libraryWidget(QWidget *parent) :
} }
QFont crimson(family); QFont crimson(family);
if(global::deviceID != "n705\n" and global::deviceID != "n905\n" and global::deviceID != "kt\n") {
if(device->getScreenSize() <= Device::ScreenSize::MEDIUM) {
ui->previousBtn->setText(""); ui->previousBtn->setText("");
ui->previousBtn->setProperty("type", "borderless"); ui->previousBtn->setProperty("type", "borderless");
ui->nextBtn->setText(""); ui->nextBtn->setText("");
@ -70,7 +74,7 @@ libraryWidget::libraryWidget(QWidget *parent) :
ui->book6Btn->setProperty("type", "borderless"); ui->book6Btn->setProperty("type", "borderless");
ui->book7Btn->setProperty("type", "borderless"); ui->book7Btn->setProperty("type", "borderless");
ui->book8Btn->setProperty("type", "borderless"); ui->book8Btn->setProperty("type", "borderless");
if(global::deviceID != "n705\n" and global::deviceID != "n905\n" and global::deviceID != "kt\n") { if(device->getScreenSize() > Device::ScreenSize::MEDIUM) {
ui->book9Btn->setText(""); ui->book9Btn->setText("");
ui->book10Btn->setText(""); ui->book10Btn->setText("");
ui->book11Btn->setText(""); ui->book11Btn->setText("");
@ -114,7 +118,7 @@ libraryWidget::libraryWidget(QWidget *parent) :
ui->book6Label->setStyleSheet("font-size: 8.5pt; font-style: italic"); ui->book6Label->setStyleSheet("font-size: 8.5pt; font-style: italic");
ui->book7Label->setStyleSheet("font-size: 8.5pt; font-style: italic"); ui->book7Label->setStyleSheet("font-size: 8.5pt; font-style: italic");
ui->book8Label->setStyleSheet("font-size: 8.5pt; font-style: italic"); ui->book8Label->setStyleSheet("font-size: 8.5pt; font-style: italic");
if(global::deviceID != "n705\n" and global::deviceID != "n905\n" and global::deviceID != "kt\n") { if(device->getScreenSize() > Device::ScreenSize::MEDIUM) {
ui->book9Label->setStyleSheet("font-size: 8.5pt; font-style: italic"); ui->book9Label->setStyleSheet("font-size: 8.5pt; font-style: italic");
ui->book10Label->setStyleSheet("font-size: 8.5pt; font-style: italic"); ui->book10Label->setStyleSheet("font-size: 8.5pt; font-style: italic");
ui->book11Label->setStyleSheet("font-size: 8.5pt; font-style: italic"); ui->book11Label->setStyleSheet("font-size: 8.5pt; font-style: italic");
@ -150,7 +154,7 @@ libraryWidget::libraryWidget(QWidget *parent) :
ui->book6Label->setFont(crimson); ui->book6Label->setFont(crimson);
ui->book7Label->setFont(crimson); ui->book7Label->setFont(crimson);
ui->book8Label->setFont(crimson); ui->book8Label->setFont(crimson);
if(global::deviceID != "n705\n" and global::deviceID != "n905\n" and global::deviceID != "kt\n") { if(device->getScreenSize() > Device::ScreenSize::MEDIUM) {
ui->book9Label->setFont(crimson); ui->book9Label->setFont(crimson);
ui->book10Label->setFont(crimson); ui->book10Label->setFont(crimson);
ui->book11Label->setFont(crimson); ui->book11Label->setFont(crimson);
@ -183,15 +187,16 @@ libraryWidget::libraryWidget(QWidget *parent) :
} }
} }
libraryWidget::~libraryWidget() LibraryWidget::~LibraryWidget()
{ {
delete ui; delete ui;
} }
void libraryWidget::setupView() { void LibraryWidget::setupView() {
Device *device = Device::getSingleton();
ui->booksStackedWidget->show(); ui->booksStackedWidget->show();
if(global::deviceID == "n705\n") { if(device->getScreenSize() == Device::ScreenSize::SMALL) {
stdIconWidth = sW / 7 stdIconWidth = sW / 7
; ;
stdIconHeight = sH / 7; stdIconHeight = sH / 7;
@ -209,7 +214,7 @@ void libraryWidget::setupView() {
ui->book6Label->setText(readFile("/mnt/onboard/onboard/.inkbox/gutenberg-data/latest-books/6/title")); ui->book6Label->setText(readFile("/mnt/onboard/onboard/.inkbox/gutenberg-data/latest-books/6/title"));
ui->book7Label->setText(readFile("/mnt/onboard/onboard/.inkbox/gutenberg-data/latest-books/7/title")); ui->book7Label->setText(readFile("/mnt/onboard/onboard/.inkbox/gutenberg-data/latest-books/7/title"));
ui->book8Label->setText(readFile("/mnt/onboard/onboard/.inkbox/gutenberg-data/latest-books/8/title")); ui->book8Label->setText(readFile("/mnt/onboard/onboard/.inkbox/gutenberg-data/latest-books/8/title"));
if(global::deviceID != "n705\n" and global::deviceID != "n905\n" and global::deviceID != "kt\n") { if(device->getScreenSize() > Device::ScreenSize::MEDIUM) {
ui->book9Label->setText(readFile("/mnt/onboard/onboard/.inkbox/gutenberg-data/latest-books/9/title")); ui->book9Label->setText(readFile("/mnt/onboard/onboard/.inkbox/gutenberg-data/latest-books/9/title"));
ui->book10Label->setText(readFile("/mnt/onboard/onboard/.inkbox/gutenberg-data/latest-books/10/title")); ui->book10Label->setText(readFile("/mnt/onboard/onboard/.inkbox/gutenberg-data/latest-books/10/title"));
ui->book11Label->setText(readFile("/mnt/onboard/onboard/.inkbox/gutenberg-data/latest-books/11/title")); ui->book11Label->setText(readFile("/mnt/onboard/onboard/.inkbox/gutenberg-data/latest-books/11/title"));
@ -236,7 +241,7 @@ void libraryWidget::setupView() {
ui->book7Btn->setIconSize(QSize(stdIconWidth, stdIconHeight)); ui->book7Btn->setIconSize(QSize(stdIconWidth, stdIconHeight));
ui->book8Btn->setIcon(QIcon("/mnt/onboard/onboard/.inkbox/gutenberg-data/latest-books/8/cover.jpg")); ui->book8Btn->setIcon(QIcon("/mnt/onboard/onboard/.inkbox/gutenberg-data/latest-books/8/cover.jpg"));
ui->book8Btn->setIconSize(QSize(stdIconWidth, stdIconHeight)); ui->book8Btn->setIconSize(QSize(stdIconWidth, stdIconHeight));
if(global::deviceID != "n705\n" and global::deviceID != "n905\n" and global::deviceID != "kt\n") { if(device->getScreenSize() > Device::ScreenSize::MEDIUM) {
ui->book9Btn->setIcon(QIcon("/mnt/onboard/onboard/.inkbox/gutenberg-data/latest-books/9/cover.jpg")); ui->book9Btn->setIcon(QIcon("/mnt/onboard/onboard/.inkbox/gutenberg-data/latest-books/9/cover.jpg"));
ui->book9Btn->setIconSize(QSize(stdIconWidth, stdIconHeight)); ui->book9Btn->setIconSize(QSize(stdIconWidth, stdIconHeight));
ui->book10Btn->setIcon(QIcon("/mnt/onboard/onboard/.inkbox/gutenberg-data/latest-books/10/cover.jpg")); ui->book10Btn->setIcon(QIcon("/mnt/onboard/onboard/.inkbox/gutenberg-data/latest-books/10/cover.jpg"));
@ -256,19 +261,19 @@ void libraryWidget::setupView() {
} }
} }
void libraryWidget::showToast(QString messageToDisplay) { void LibraryWidget::showToast(QString messageToDisplay) {
global::toast::message = messageToDisplay; global::toast::message = messageToDisplay;
toastWindow = new toast(this); toastWindow = new toast(this);
toastWindow->setAttribute(Qt::WA_DeleteOnClose); toastWindow->setAttribute(Qt::WA_DeleteOnClose);
toastWindow->show(); toastWindow->show();
} }
void libraryWidget::closeIndefiniteToast() { void LibraryWidget::closeIndefiniteToast() {
// Warning: use with caution // Warning: use with caution
toastWindow->close(); toastWindow->close();
} }
void libraryWidget::syncCatalog() { void LibraryWidget::syncCatalog() {
global::toast::modalToast = true; global::toast::modalToast = true;
global::toast::indefiniteToast = true; global::toast::indefiniteToast = true;
log("Gutenberg sync in progress", className); log("Gutenberg sync in progress", className);
@ -276,7 +281,7 @@ void libraryWidget::syncCatalog() {
QTimer::singleShot(500, this, SLOT(syncCatalogSlot())); QTimer::singleShot(500, this, SLOT(syncCatalogSlot()));
} }
void libraryWidget::syncCatalogSlot() { void LibraryWidget::syncCatalogSlot() {
bool syncDone = false; bool syncDone = false;
writeFile("/opt/ibxd", "gutenberg_sync\n"); writeFile("/opt/ibxd", "gutenberg_sync\n");
while(true) { while(true) {
@ -301,20 +306,20 @@ void libraryWidget::syncCatalogSlot() {
} }
} }
void libraryWidget::on_previousBtn_clicked() void LibraryWidget::on_previousBtn_clicked()
{ {
ui->booksStackedWidget->setCurrentIndex(0); ui->booksStackedWidget->setCurrentIndex(0);
ui->pageLabel->setText("1 <i>of</i> 2"); ui->pageLabel->setText("1 <i>of</i> 2");
} }
void libraryWidget::on_nextBtn_clicked() void LibraryWidget::on_nextBtn_clicked()
{ {
ui->booksStackedWidget->setCurrentIndex(1); ui->booksStackedWidget->setCurrentIndex(1);
ui->pageLabel->setText("2 <i>of</i> 2"); ui->pageLabel->setText("2 <i>of</i> 2");
} }
QString libraryWidget::getTitle(int bookNumber) { QString LibraryWidget::getTitle(int bookNumber) {
QString bookNumberQstr = QString::number(bookNumber); QString bookNumberQstr = QString::number(bookNumber);
QString fullTitlePath = "/mnt/onboard/onboard/.inkbox/gutenberg-data/latest-books/"; QString fullTitlePath = "/mnt/onboard/onboard/.inkbox/gutenberg-data/latest-books/";
fullTitlePath = fullTitlePath.append(bookNumberQstr); fullTitlePath = fullTitlePath.append(bookNumberQstr);
@ -323,7 +328,7 @@ QString libraryWidget::getTitle(int bookNumber) {
return readFile(fullTitlePath); return readFile(fullTitlePath);
} }
void libraryWidget::openLatestBookInfoDialog(int bookNumber, QString title) { void LibraryWidget::openLatestBookInfoDialog(int bookNumber, QString title) {
QString idPath = "/mnt/onboard/onboard/.inkbox/gutenberg-data/latest-books/"; QString idPath = "/mnt/onboard/onboard/.inkbox/gutenberg-data/latest-books/";
idPath = idPath.append(bookNumber); idPath = idPath.append(bookNumber);
idPath = idPath.append("/id"); idPath = idPath.append("/id");
@ -332,7 +337,7 @@ void libraryWidget::openLatestBookInfoDialog(int bookNumber, QString title) {
global::library::latestBookNumber = bookNumber; global::library::latestBookNumber = bookNumber;
global::library::bookTitle = title; global::library::bookTitle = title;
bookInfoDialogWindow = new bookInfoDialog(this); bookInfoDialogWindow = new BookInfoDialog(this);
connect(bookInfoDialogWindow, SIGNAL(showToast(QString)), SLOT(showToast(QString))); connect(bookInfoDialogWindow, SIGNAL(showToast(QString)), SLOT(showToast(QString)));
connect(bookInfoDialogWindow, SIGNAL(closeIndefiniteToast()), SLOT(closeIndefiniteToast())); connect(bookInfoDialogWindow, SIGNAL(closeIndefiniteToast()), SLOT(closeIndefiniteToast()));
bookInfoDialogWindow->setAttribute(Qt::WA_DeleteOnClose); bookInfoDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
@ -341,111 +346,111 @@ void libraryWidget::openLatestBookInfoDialog(int bookNumber, QString title) {
} }
void libraryWidget::on_book1Btn_clicked() void LibraryWidget::on_book1Btn_clicked()
{ {
QString title = getTitle(1); QString title = getTitle(1);
openLatestBookInfoDialog(1, title); openLatestBookInfoDialog(1, title);
} }
void libraryWidget::on_book2Btn_clicked() void LibraryWidget::on_book2Btn_clicked()
{ {
QString title = getTitle(2); QString title = getTitle(2);
openLatestBookInfoDialog(2, title); openLatestBookInfoDialog(2, title);
} }
void libraryWidget::on_book3Btn_clicked() void LibraryWidget::on_book3Btn_clicked()
{ {
QString title = getTitle(3); QString title = getTitle(3);
openLatestBookInfoDialog(3, title); openLatestBookInfoDialog(3, title);
} }
void libraryWidget::on_book4Btn_clicked() void LibraryWidget::on_book4Btn_clicked()
{ {
QString title = getTitle(4); QString title = getTitle(4);
openLatestBookInfoDialog(4, title); openLatestBookInfoDialog(4, title);
} }
void libraryWidget::on_book5Btn_clicked() void LibraryWidget::on_book5Btn_clicked()
{ {
QString title = getTitle(5); QString title = getTitle(5);
openLatestBookInfoDialog(5, title); openLatestBookInfoDialog(5, title);
} }
void libraryWidget::on_book6Btn_clicked() void LibraryWidget::on_book6Btn_clicked()
{ {
QString title = getTitle(6); QString title = getTitle(6);
openLatestBookInfoDialog(6, title); openLatestBookInfoDialog(6, title);
} }
void libraryWidget::on_book7Btn_clicked() void LibraryWidget::on_book7Btn_clicked()
{ {
QString title = getTitle(7); QString title = getTitle(7);
openLatestBookInfoDialog(7, title); openLatestBookInfoDialog(7, title);
} }
void libraryWidget::on_book8Btn_clicked() void LibraryWidget::on_book8Btn_clicked()
{ {
QString title = getTitle(8); QString title = getTitle(8);
openLatestBookInfoDialog(8, title); openLatestBookInfoDialog(8, title);
} }
void libraryWidget::on_book9Btn_clicked() void LibraryWidget::on_book9Btn_clicked()
{ {
QString title = getTitle(9); QString title = getTitle(9);
openLatestBookInfoDialog(9, title); openLatestBookInfoDialog(9, title);
} }
void libraryWidget::on_book10Btn_clicked() void LibraryWidget::on_book10Btn_clicked()
{ {
QString title = getTitle(10); QString title = getTitle(10);
openLatestBookInfoDialog(10, title); openLatestBookInfoDialog(10, title);
} }
void libraryWidget::on_book11Btn_clicked() void LibraryWidget::on_book11Btn_clicked()
{ {
QString title = getTitle(11); QString title = getTitle(11);
openLatestBookInfoDialog(11, title); openLatestBookInfoDialog(11, title);
} }
void libraryWidget::on_book12Btn_clicked() void LibraryWidget::on_book12Btn_clicked()
{ {
QString title = getTitle(12); QString title = getTitle(12);
openLatestBookInfoDialog(12, title); openLatestBookInfoDialog(12, title);
} }
void libraryWidget::on_book13Btn_clicked() void LibraryWidget::on_book13Btn_clicked()
{ {
QString title = getTitle(13); QString title = getTitle(13);
openLatestBookInfoDialog(13, title); openLatestBookInfoDialog(13, title);
} }
void libraryWidget::on_book14Btn_clicked() void LibraryWidget::on_book14Btn_clicked()
{ {
QString title = getTitle(14); QString title = getTitle(14);
openLatestBookInfoDialog(14, title); openLatestBookInfoDialog(14, title);
} }
void libraryWidget::on_book15Btn_clicked() void LibraryWidget::on_book15Btn_clicked()
{ {
QString title = getTitle(15); QString title = getTitle(15);
openLatestBookInfoDialog(15, title); openLatestBookInfoDialog(15, title);
} }
void libraryWidget::on_book16Btn_clicked() void LibraryWidget::on_book16Btn_clicked()
{ {
QString title = getTitle(16); QString title = getTitle(16);
openLatestBookInfoDialog(16, title); openLatestBookInfoDialog(16, title);

View file

@ -6,26 +6,26 @@
#include <bookinfodialog.h> #include <bookinfodialog.h>
namespace Ui { namespace Ui {
class libraryWidget; class LibraryWidget;
} }
class libraryWidget : public QWidget class LibraryWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
QString className = this->metaObject()->className(); QString className = this->metaObject()->className();
explicit libraryWidget(QWidget *parent = nullptr); explicit LibraryWidget(QWidget *parent = nullptr);
~libraryWidget(); ~LibraryWidget();
float sH; float sH;
float sW; float sW;
float stdIconHeight; float stdIconHeight;
float stdIconWidth; float stdIconWidth;
private: private:
Ui::libraryWidget * ui; Ui::LibraryWidget * ui;
toast * toastWindow; toast * toastWindow;
bookInfoDialog * bookInfoDialogWindow; BookInfoDialog * bookInfoDialogWindow;
private slots: private slots:
void syncCatalog(); void syncCatalog();

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>libraryWidget</class> <class>LibraryWidget</class>
<widget class="QWidget" name="libraryWidget"> <widget class="QWidget" name="LibraryWidget">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>

View file

@ -6,9 +6,9 @@
#include <QDebug> #include <QDebug>
#include <QDateTime> #include <QDateTime>
otaManager::otaManager(QWidget *parent) : OTAUpdateManagerWidget::OTAUpdateManagerWidget(QWidget *parent) :
QWidget(parent), QWidget(parent),
ui(new Ui::otaManager) ui(new Ui::OTAUpdateManagerWidget)
{ {
ui->setupUi(this); ui->setupUi(this);
QThread::msleep(500); QThread::msleep(500);
@ -30,7 +30,7 @@ otaManager::otaManager(QWidget *parent) :
unsigned long currentEpoch = QDateTime::currentSecsSinceEpoch(); unsigned long currentEpoch = QDateTime::currentSecsSinceEpoch();
writeFile("/external_root/opt/storage/update/last_sync", QString::number(currentEpoch)); writeFile("/external_root/opt/storage/update/last_sync", QString::number(currentEpoch));
QFile::remove("/run/can_ota_update"); QFile::remove("/run/can_ota_update");
otaManager::close(); OTAUpdateManagerWidget::close();
} }
} ); } );
otaCheckTimer->start(); otaCheckTimer->start();
@ -54,14 +54,14 @@ otaManager::otaManager(QWidget *parent) :
global::otaUpdate::downloadOta = false; global::otaUpdate::downloadOta = false;
} }
QFile::remove("/external_root/opt/storage/update/last_sync"); QFile::remove("/external_root/opt/storage/update/last_sync");
otaManager::close(); OTAUpdateManagerWidget::close();
} }
} ); } );
otaDownloadTimer->start(); otaDownloadTimer->start();
} }
} }
otaManager::~otaManager() OTAUpdateManagerWidget::~OTAUpdateManagerWidget()
{ {
delete ui; delete ui;
} }

View file

@ -4,20 +4,20 @@
#include <QWidget> #include <QWidget>
namespace Ui { namespace Ui {
class otaManager; class OTAUpdateManagerWidget;
} }
class otaManager : public QWidget class OTAUpdateManagerWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
QString className = this->metaObject()->className(); QString className = this->metaObject()->className();
explicit otaManager(QWidget *parent = nullptr); explicit OTAUpdateManagerWidget(QWidget *parent = nullptr);
~otaManager(); ~OTAUpdateManagerWidget();
private: private:
Ui::otaManager *ui; Ui::OTAUpdateManagerWidget *ui;
signals: signals:
void canOtaUpdate(bool yesno); void canOtaUpdate(bool yesno);

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>otaManager</class> <class>OTAUpdateManagerWidget</class>
<widget class="QWidget" name="otaManager"> <widget class="QWidget" name="OTAUpdateManagerWidget">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>

89
src/ui/quit/quit.cpp Normal file
View file

@ -0,0 +1,89 @@
#include "quit.h"
#include "functions.h"
#include "ui.h"
#include "ui_quit.h"
#include <linux/input.h>
#include <QDebug>
#include <QFile>
#include <QIcon>
#include <QPixmap>
#include <QProcess>
#include <QScreen>
QuitWidget::QuitWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::QuitWidget) {
ui->setupUi(this);
ui->backBtn->setFont(QFont("u001"));
ui->pushButton->setProperty("type", "borderless");
ui->pushButton_2->setProperty("type", "borderless");
ui->pushButton_3->setProperty("type", "borderless");
ui->pushButton_4->setProperty("type", "borderless");
ui->backBtn->setProperty("type", "borderless");
// Stylesheet
UI::applyStyle(*this, "eink");
// Getting the screen's size
float sW = QGuiApplication::screens()[0]->size().width();
float sH = QGuiApplication::screens()[0]->size().height();
// Defining what the "Quit" icon size will be
float stdIconWidth = sW / 1.25;
float stdIconHeight = sH / 1.25;
QPixmap pixmap(":/resources/exit.png");
QPixmap scaledPixmap = pixmap.scaled(stdIconWidth, stdIconHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui->label->setPixmap(scaledPixmap);
if (checkconfig("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/9-deepSleep") == true) {
ui->pushButton_3->setText("Deep suspend");
}
}
QuitWidget::~QuitWidget() {
delete ui;
}
void QuitWidget::on_pushButton_clicked() {
// Prevent strange "appearing from nowhere" low battery or critical battery alerts due to sysfs unmount
global::battery::showCriticalBatteryAlert = false;
global::battery::showLowBatteryDialog = false;
// GUI apps
updateUserAppsMainJsonFile();
poweroff(true);
qApp->quit();
}
void QuitWidget::on_pushButton_2_clicked() {
global::battery::showCriticalBatteryAlert = false;
global::battery::showLowBatteryDialog = false;
// GUI apps
updateUserAppsMainJsonFile();
reboot(true);
qApp->quit();
}
void QuitWidget::on_pushButton_4_clicked() {
log("Restarting InkBox", className);
QProcess process;
process.startDetached("inkbox", QStringList());
qApp->quit();
}
void QuitWidget::on_backBtn_clicked() {
QuitWidget::close();
}
void QuitWidget::on_pushButton_3_clicked() {
log("Suspending", className);
if (checkconfig("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/9-deepSleep") == true) {
writeFile("/dev/ipd/sleepCall", "deepSleep");
} else {
writeFile("/dev/ipd/sleepCall", "sleep");
}
}

View file

@ -6,17 +6,17 @@
using namespace std; using namespace std;
namespace Ui { namespace Ui {
class quit; class QuitWidget;
} }
class quit : public QWidget class QuitWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
QString className = this->metaObject()->className(); QString className = this->metaObject()->className();
explicit quit(QWidget *parent = nullptr); explicit QuitWidget(QWidget *parent = nullptr);
~quit(); ~QuitWidget();
private slots: private slots:
void on_pushButton_clicked(); void on_pushButton_clicked();
@ -26,7 +26,7 @@ private slots:
void on_pushButton_3_clicked(); void on_pushButton_3_clicked();
private: private:
Ui::quit *ui; Ui::QuitWidget *ui;
}; };
#endif // QUIT_H #endif // QUIT_H

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>quit</class> <class>QuitWidget</class>
<widget class="QWidget" name="quit"> <widget class="QWidget" name="QuitWidget">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>

2115
src/ui/reader/reader.cpp Normal file

File diff suppressed because it is too large Load diff

View file

@ -2,7 +2,7 @@
#define READER_H #define READER_H
#include "functions.h" #include "functions.h"
#include "alert.h" #include "splashAlert.h"
#include "generaldialog.h" #include "generaldialog.h"
#include "toast.h" #include "toast.h"
#include "quit.h" #include "quit.h"
@ -41,17 +41,17 @@ namespace mupdf {
} }
namespace Ui { namespace Ui {
class reader; class ReaderWidget;
} }
class reader : public QWidget class ReaderWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
QString className = this->metaObject()->className(); QString className = this->metaObject()->className();
explicit reader(QWidget *parent = nullptr); explicit ReaderWidget(QWidget *parent = nullptr);
~reader(); ~ReaderWidget();
int split_total; int split_total;
int split_files_number; int split_files_number;
@ -174,15 +174,15 @@ signals:
void openBookFile(QString book, bool relativePath); void openBookFile(QString book, bool relativePath);
private: private:
Ui::reader * ui; Ui::ReaderWidget * ui;
alert * alertWindow; SplashAlertWidget * alertWindow;
generalDialog * generalDialogWindow; GeneralDialog * generalDialogWindow;
toast * toastWindow; toast * toastWindow;
quit * quitWindow; QuitWidget * quitWindow;
textDialog * textDialogWindow; TextDialog * textDialogWindow;
highlightsListDialog * highlightsListDialogWindow; HighlightsListDialog * highlightsListDialogWindow;
QGraphicsScene * graphicsScene; QGraphicsScene * graphicsScene;
brightnessDialog * brightnessDialogWindow; BrightnessDialog * brightnessDialogWindow;
}; };
#endif // READER_H #endif // READER_H

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>reader</class> <class>ReaderWidget</class>
<widget class="QWidget" name="reader"> <widget class="QWidget" name="ReaderWidget">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>

View file

@ -0,0 +1,110 @@
#include "koboxsettings.h"
#include "device.h"
#include "functions.h"
#include "ui.h"
#include "ui_koboxsettings.h"
#include <QFile>
#include <QScreen>
KoboxSettingsWidget::KoboxSettingsWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::KoboxSettingsWidget) {
ui->setupUi(this);
KoboxSettingsWidget::setFont(QFont("u001"));
ui->okBtn->setFont(QFont("Inter"));
// UI tweaks
ui->okBtn->setProperty("type", "borderless");
ui->pushButton->setProperty("type", "borderless");
ui->resetKoboxBtn->setProperty("type", "borderless");
ui->pushButton->setStyleSheet("font-weight: bold");
ui->resetKoboxBtn->setStyleSheet("font-weight: bold");
ui->okBtn->setStyleSheet("font-weight: bold");
// Stylesheet
UI::applyStyle(*this, "eink");
if (checkconfig("/external_root/boot/flags/X11_START") == true) {
ui->koboxStatusLabel->setText("KoBox is <b>enabled</b>");
not_user_change = true;
ui->checkBox->click();
ui->runtimeSettingsWidget->setVisible(true);
} else {
ui->koboxStatusLabel->setText("KoBox is <b>disabled</b>");
ui->runtimeSettingsWidget->setVisible(false);
}
// DPI setting
QString dpiSetting;
QString dpiSettingStr = readFile(".config/00-kobox/dpiSetting");
int dpi = dpiSettingStr.toInt();
if (dpiSettingStr.isEmpty()) {
dpi = Device::getSingleton()->getSingleton()->getBaseDPI();
writeFile(".config/00-kobox/dpiSetting", QString(dpi));
}
ui->spinBox->setValue(dpi);
}
KoboxSettingsWidget::~KoboxSettingsWidget() {
delete ui;
}
void KoboxSettingsWidget::on_okBtn_clicked() {
KoboxSettingsWidget::close();
}
void KoboxSettingsWidget::on_checkBox_toggled(bool checked) {
if (checked == true) {
if (not_user_change != true) {
log("Enabling KoBox subsystem", className);
writeFile("/external_root/boot/flags/X11_START", "true\n");
openSettingsRebootDialog();
} else {
not_user_change = false;
}
} else {
log("Disabling KoBox subsystem", className);
writeFile("/external_root/boot/flags/X11_START", "false\n");
openSettingsRebootDialog();
}
}
void KoboxSettingsWidget::openSettingsRebootDialog() {
log("Showing reboot dialog", className);
global::settings::settingsRebootDialog = true;
global::kobox::koboxSettingsRebootDialog = true;
generalDialogWindow = new GeneralDialog(this);
generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
}
void KoboxSettingsWidget::openResetKoboxDialog() {
log("Showing KoBox reset dialog", className);
global::kobox::resetKoboxDialog = true;
generalDialogWindow = new GeneralDialog(this);
generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
}
void KoboxSettingsWidget::on_spinBox_valueChanged(int arg1) {
QString number = QString::number(arg1);
writeFile(".config/00-kobox/dpiSetting", number);
log("X11 DPI set to " + number, className);
}
void KoboxSettingsWidget::on_pushButton_clicked() {
// Export Extensions disk image over USB with g_mass_storage/g_file_storage
global::usbms::usbmsDialog = false;
global::usbms::launchUsbms = true;
global::usbms::koboxExportExtensions = true;
log("Exporting KoBox extensions onboard storage via USB", className);
log("Showing USBMS splash", className);
usbmsWindow = new USBMSSplashWidget();
usbmsWindow->setAttribute(Qt::WA_DeleteOnClose);
usbmsWindow->setGeometry(QRect(QPoint(0, 0), screen()->geometry().size()));
usbmsWindow->show();
}
void KoboxSettingsWidget::on_resetKoboxBtn_clicked() {
openResetKoboxDialog();
}

View file

@ -7,17 +7,17 @@
#include "usbmsSplash.h" #include "usbmsSplash.h"
namespace Ui { namespace Ui {
class koboxSettings; class KoboxSettingsWidget;
} }
class koboxSettings : public QWidget class KoboxSettingsWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
QString className = this->metaObject()->className(); QString className = this->metaObject()->className();
explicit koboxSettings(QWidget *parent = nullptr); explicit KoboxSettingsWidget(QWidget *parent = nullptr);
~koboxSettings(); ~KoboxSettingsWidget();
bool not_user_change = false; bool not_user_change = false;
void openSettingsRebootDialog(); void openSettingsRebootDialog();
@ -31,9 +31,9 @@ private slots:
void on_resetKoboxBtn_clicked(); void on_resetKoboxBtn_clicked();
private: private:
Ui::koboxSettings *ui; Ui::KoboxSettingsWidget *ui;
generalDialog *generalDialogWindow; GeneralDialog *generalDialogWindow;
usbmsSplash *usbmsWindow; USBMSSplashWidget *usbmsWindow;
}; };
#endif // KOBOXSETTINGS_H #endif // KOBOXSETTINGS_H

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>koboxSettings</class> <class>KoboxSettingsWidget</class>
<widget class="QWidget" name="koboxSettings"> <widget class="QWidget" name="KoboxSettingsWidget">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>

View file

@ -0,0 +1,399 @@
#include "powerdaemonsettings.h"
#include "device.h"
#include "functions.h"
#include "ui_powerdaemonsettings.h"
#include "ui.h"
#include <QFile>
PowerDaemonSettingsWidget::PowerDaemonSettingsWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::PowerDaemonSettingsWidget) {
ui->setupUi(this);
PowerDaemonSettingsWidget::setFont(QFont("u001"));
ui->mainLabel->setFont(QFont("Inter"));
// Avoid some display issues (label moving because width of text would change with a proportional font)
ui->CBSLabel->setFont(QFont("Roboto Mono"));
ui->idleSleepLabel->setFont(QFont("Roboto Mono"));
// Font tweaks
ui->label_2->setFont(QFont("Inter"));
ui->exitBtn->setFont(QFont("Inter"));
// UI tweaks
ui->exitBtn->setProperty("type", "borderless");
ui->expBtn->setProperty("type", "borderless");
ui->hWhenChargerSleepBtn->setProperty("type", "borderless");
ui->hChargerWakeUpBtn->setProperty("type", "borderless");
ui->wifiReconnectBtn->setProperty("type", "borderless");
ui->ledUsageBtn->setProperty("type", "borderless");
ui->hCustomCaseBtn->setProperty("type", "borderless");
ui->deepSleepBtn->setProperty("type", "borderless");
ui->mainLabel->setStyleSheet("font-weight: bold");
ui->CBSLabel->setStyleSheet("font-weight: bold");
ui->idleSleepLabel->setStyleSheet("font-weight: bold");
ui->exitBtn->setStyleSheet("font-weight: bold");
// Experimental features label
ui->label_2->setStyleSheet("font-weight: bold");
Device::ScreenSize screenSize = Device::getSingleton()->getScreenSize();
// Icons
int controlBtnFixedWidth;
if (screenSize == Device::ScreenSize::SMALL) {
controlBtnFixedWidth = 50;
} else {
controlBtnFixedWidth = 80;
}
ui->CBSDecreaseBtn->setIcon(QIcon(":/resources/minus.png"));
ui->CBSDecreaseBtn->setFixedWidth(controlBtnFixedWidth);
ui->CBSIncreaseBtn->setIcon(QIcon(":/resources/plus.png"));
ui->CBSIncreaseBtn->setFixedWidth(controlBtnFixedWidth);
int idleBtnsFixedWidth;
if (screenSize == Device::ScreenSize::SMALL) {
idleBtnsFixedWidth = 80;
} else {
idleBtnsFixedWidth = 100;
}
ui->idleSleepDecreaseBtn->setFixedWidth(idleBtnsFixedWidth);
ui->idleSleepIncreaseBtn->setFixedWidth(idleBtnsFixedWidth);
ui->idleSleepDecreaseMBtn->setFixedWidth(idleBtnsFixedWidth);
ui->idleSleepIncreaseMBtn->setFixedWidth(idleBtnsFixedWidth);
// Padding
ui->CBSDecreaseBtn->setStyleSheet("padding: 10px; font-size: 10pt");
ui->CBSIncreaseBtn->setStyleSheet("padding: 10px; font-size: 10pt");
ui->idleSleepDecreaseBtn->setStyleSheet("font-family: 'Roboto Mono'; font-weight: bold; padding: 10px; font-size: 10pt");
ui->idleSleepIncreaseBtn->setStyleSheet("font-family: 'Roboto Mono'; font-weight: bold; padding: 10px; font-size: 10pt");
ui->idleSleepDecreaseMBtn->setStyleSheet("font-family: 'Roboto Mono'; font-weight: bold; padding: 10px; font-size: 10pt");
ui->idleSleepIncreaseMBtn->setStyleSheet("font-family: 'Roboto Mono'; font-weight: bold; padding: 10px; font-size: 10pt");
// Stylesheet
UI::applyStyle(*this, "eink");
// Button tweaks
int autoRepeatDelay = 1250;
int autoRepeatInterval = 20;
ui->CBSDecreaseBtn->setAutoRepeat(true);
ui->CBSDecreaseBtn->setAutoRepeatDelay(autoRepeatDelay);
ui->CBSDecreaseBtn->setAutoRepeatInterval(autoRepeatInterval);
ui->CBSIncreaseBtn->setAutoRepeat(true);
ui->CBSIncreaseBtn->setAutoRepeatDelay(autoRepeatDelay);
ui->CBSIncreaseBtn->setAutoRepeatInterval(autoRepeatInterval);
ui->idleSleepDecreaseBtn->setAutoRepeat(true);
ui->idleSleepDecreaseBtn->setAutoRepeatDelay(autoRepeatDelay);
ui->idleSleepDecreaseBtn->setAutoRepeatInterval(autoRepeatInterval);
ui->idleSleepIncreaseBtn->setAutoRepeat(true);
ui->idleSleepIncreaseBtn->setAutoRepeatDelay(autoRepeatDelay);
ui->idleSleepIncreaseBtn->setAutoRepeatInterval(autoRepeatInterval);
ui->idleSleepDecreaseMBtn->setAutoRepeat(true);
ui->idleSleepDecreaseMBtn->setAutoRepeatDelay(autoRepeatDelay);
ui->idleSleepDecreaseMBtn->setAutoRepeatInterval(autoRepeatInterval);
ui->idleSleepIncreaseMBtn->setAutoRepeat(true);
ui->idleSleepIncreaseMBtn->setAutoRepeatDelay(autoRepeatDelay);
ui->idleSleepIncreaseMBtn->setAutoRepeatInterval(autoRepeatInterval);
// Hide items
ui->hLabel_3->hide();
ui->hCpuFreqComboBox->hide();
ui->hWhenChargerSleepBtn->hide();
ui->hChargerWakeUpBtn->hide();
ui->hCustomCaseBtn->hide();
// Prepare variables from system configuration (20-sleep_daemon)
log("Reading variables from power daemon configuration", className);
// 1 - cinematicBrightnessDelayMs
QString cinematicBrightnessMs = readFile("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/1-cinematicBrightnessDelayMs");
cinematicBrightnessInt = cinematicBrightnessMs.toInt();
convertCinematicInt();
// 2 - cpuGovernor
QString cpuGovernor = readFile("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/2-cpuGovernor");
QStringList cpuGovernorList = QStringList{ cpuGovernor };
if (cpuGovernorList.contains("interactive") == false) {
cpuGovernorList.append("interactive");
}
if (cpuGovernorList.contains("conservative") == false) {
cpuGovernorList.append("conservative");
}
if (cpuGovernorList.contains("userspace") == false) {
cpuGovernorList.append("userspace");
}
if (cpuGovernorList.contains("powersave") == false) {
cpuGovernorList.append("powersave");
}
if (cpuGovernorList.contains("ondemand") == false) {
cpuGovernorList.append("ondemand");
}
if (cpuGovernorList.contains("performance") == false) {
cpuGovernorList.append("performance");
}
ui->hCpuFreqComboBox->addItems(cpuGovernorList);
ui->hCpuFreqComboBox->setCurrentIndex(0);
// 3 - whenChargerSleep
if (checkconfig("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/3-whenChargerSleep") == true) {
whenChargerSleepBool = true;
ui->hWhenChargerSleepBtn->click();
} else {
whenChargerSleepBool = false;
}
// 4 - chargerWakeUp
if (checkconfig("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/4-chargerWakeUp") == true) {
chargerWakeUpBool = true;
ui->hChargerWakeUpBtn->click();
} else {
chargerWakeUpBool = false;
}
// 5 - wifiReconnect
if (checkconfig("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/5-wifiReconnect") == true) {
ui->wifiReconnectBtn->click();
wifiReconnectBool = true;
} else {
wifiReconnectBool = false;
}
// 6 - ledUsage
if (checkconfig("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/6-ledUsage") == true) {
ui->ledUsageBtn->click();
ledUsageBool = true;
} else {
ledUsageBool = false;
}
// 7 - idleSleep
QString idleSleepString = readFile("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/7-idleSleep");
idleSleepInt = idleSleepString.replace("\n", "").toInt();
convertIdleSleepInt();
// 8 - customCase
if (checkconfig("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/8-customCase") == true) {
ui->hCustomCaseBtn->click();
customCaseBool = true;
} else {
customCaseBool = false;
}
// 9 - deepSleep
if (checkconfig("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/9-deepSleep") == true) {
ui->deepSleepBtn->click();
deepSleepBool = true;
} else {
deepSleepBool = false;
}
}
PowerDaemonSettingsWidget::~PowerDaemonSettingsWidget() {
delete ui;
}
void PowerDaemonSettingsWidget::on_CBSIncreaseBtn_clicked() {
if (cinematicBrightnessInt < 500) {
cinematicBrightnessInt = cinematicBrightnessInt + 1;
convertCinematicInt();
}
}
void PowerDaemonSettingsWidget::on_CBSDecreaseBtn_clicked() {
if (cinematicBrightnessInt != 0) {
cinematicBrightnessInt = cinematicBrightnessInt - 1;
convertCinematicInt();
}
}
void PowerDaemonSettingsWidget::on_exitBtn_clicked() {
// Save all to files
// 1 - cinematicBrightnessdelayMs
writeFile("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/1-cinematicBrightnessDelayMs", QString::number(cinematicBrightnessInt));
// 2 - cpuGovernor
writeFile("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/2-cpuGovernor", ui->hCpuFreqComboBox->currentText());
// 3 - whenChargerSleep
writeFile("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/3-whenChargerSleep", QVariant(whenChargerSleepBool).toString());
// 4 - chargerWakeUp
writeFile("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/4-chargerWakeUp", QVariant(chargerWakeUpBool).toString());
// 5 - wifiReconnect
writeFile("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/5-wifiReconnect", QVariant(wifiReconnectBool).toString());
// 6 - ledUsage
writeFile("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/6-ledUsage", QVariant(ledUsageBool).toString());
// 7 - idleSleep
writeFile("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/7-idleSleep", QString::number(idleSleepInt));
// 8 - customCase
writeFile("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/8-customCase", QVariant(customCaseBool).toString());
// 9 - deepSleep
writeFile("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/9-deepSleep", QVariant(deepSleepBool).toString());
// Notify power daemon of configuration update
writeFile("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/updateConfig", "true");
PowerDaemonSettingsWidget::close();
}
void PowerDaemonSettingsWidget::on_expBtn_clicked() {
// TODO: Implement additional warning
ui->hLabel_3->show();
ui->hCpuFreqComboBox->show();
ui->hWhenChargerSleepBtn->show();
ui->hChargerWakeUpBtn->show();
ui->hCustomCaseBtn->show();
ui->expBtn->hide();
}
void PowerDaemonSettingsWidget::on_hWhenChargerSleepBtn_clicked(bool checked) {
QString settingString = "suspend when charging";
if (checked == true) {
logEnabled(settingString, className);
whenChargerSleepBool = true;
} else {
logDisabled(settingString, className);
whenChargerSleepBool = false;
}
}
void PowerDaemonSettingsWidget::on_hChargerWakeUpBtn_clicked(bool checked) {
QString settingString = "ignore charger wake-up events";
if (checked == true) {
logEnabled(settingString, className);
chargerWakeUpBool = true;
} else {
logDisabled(settingString, className);
chargerWakeUpBool = false;
}
}
void PowerDaemonSettingsWidget::on_wifiReconnectBtn_clicked(bool checked) {
QString settingString = "Wi-Fi reconnection on wake-up";
if (checked == true) {
logEnabled(settingString, className);
wifiReconnectBool = true;
} else {
logDisabled(settingString, className);
wifiReconnectBool = false;
}
}
void PowerDaemonSettingsWidget::on_ledUsageBtn_clicked(bool checked) {
QString settingString = "use LED";
if (checked == true) {
logEnabled(settingString, className);
ledUsageBool = true;
} else {
logDisabled(settingString, className);
ledUsageBool = false;
}
}
void PowerDaemonSettingsWidget::on_idleSleepIncreaseBtn_clicked() {
if (idleSleepInt >= 15) {
idleSleepInt = idleSleepInt + 1;
} else {
idleSleepInt = 15;
}
convertIdleSleepInt();
}
void PowerDaemonSettingsWidget::on_idleSleepDecreaseBtn_clicked() {
if (idleSleepInt >= 15) {
idleSleepInt = idleSleepInt - 1;
if (idleSleepInt == 14) {
idleSleepInt = 0;
}
} else {
idleSleepInt = 0;
}
convertIdleSleepInt();
}
void PowerDaemonSettingsWidget::convertIdleSleepInt() {
int copiedIdleSleepInt = idleSleepInt;
int minutes = 0;
int seconds = 0;
if (copiedIdleSleepInt == 0) {
ui->idleSleepLabel->setText("Never");
return;
}
while (copiedIdleSleepInt >= 60) {
minutes = minutes + 1;
copiedIdleSleepInt = copiedIdleSleepInt - 60;
}
seconds = copiedIdleSleepInt;
QString text;
if (minutes != 0) {
text.append(QString::number(minutes) + "m");
}
if (seconds != 0) {
text.append(" ");
text.append(QString::number(seconds) + "s");
}
ui->idleSleepLabel->setText(text);
}
void PowerDaemonSettingsWidget::on_hCustomCaseBtn_clicked(bool checked) {
QString settingString = "custom case";
if (checked == true) {
logEnabled(settingString, className);
customCaseBool = true;
} else {
logDisabled(settingString, className);
customCaseBool = false;
}
}
void PowerDaemonSettingsWidget::on_deepSleepBtn_clicked(bool checked) {
QString settingString = "deep sleep";
if (checked == true) {
logEnabled(settingString, className);
deepSleepBool = true;
} else {
logDisabled(settingString, className);
deepSleepBool = false;
}
}
void PowerDaemonSettingsWidget::convertCinematicInt() {
QString text = QString::number(cinematicBrightnessInt);
// To avoid moving other widgets when the value changes
text.append(" ms");
ui->CBSLabel->setText(text);
}
void PowerDaemonSettingsWidget::on_idleSleepIncreaseMBtn_clicked() {
if (idleSleepInt >= 15) {
idleSleepInt = idleSleepInt + 60;
} else {
idleSleepInt = 60;
}
convertIdleSleepInt();
}
void PowerDaemonSettingsWidget::on_idleSleepDecreaseMBtn_clicked() {
if (idleSleepInt >= 60) {
idleSleepInt = idleSleepInt - 60;
if (idleSleepInt < 14) {
idleSleepInt = 0;
}
} else {
idleSleepInt = 0;
}
convertIdleSleepInt();
}

View file

@ -4,17 +4,17 @@
#include <QWidget> #include <QWidget>
namespace Ui { namespace Ui {
class powerDaemonSettings; class PowerDaemonSettingsWidget;
} }
class powerDaemonSettings : public QWidget class PowerDaemonSettingsWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
QString className = this->metaObject()->className(); QString className = this->metaObject()->className();
explicit powerDaemonSettings(QWidget *parent = nullptr); explicit PowerDaemonSettingsWidget(QWidget *parent = nullptr);
~powerDaemonSettings(); ~PowerDaemonSettingsWidget();
int cinematicBrightnessMs; int cinematicBrightnessMs;
private slots: private slots:
@ -39,7 +39,7 @@ private slots:
void on_idleSleepDecreaseMBtn_clicked(); void on_idleSleepDecreaseMBtn_clicked();
private: private:
Ui::powerDaemonSettings * ui; Ui::PowerDaemonSettingsWidget * ui;
bool whenChargerSleepBool; bool whenChargerSleepBool;
bool chargerWakeUpBool; bool chargerWakeUpBool;
bool wifiReconnectBool; bool wifiReconnectBool;

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>powerDaemonSettings</class> <class>PowerDaemonSettingsWidget</class>
<widget class="QWidget" name="powerDaemonSettings"> <widget class="QWidget" name="PowerDaemonSettingsWidget">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>

View file

@ -0,0 +1,944 @@
#include "settings.h"
#include "device.h"
#include "functions.h"
#include "mainwindow.h"
#include "ui.h"
#include "ui_mainwindow.h"
#include "ui_settings.h"
#include <QFile>
#include <QIcon>
#include <QMessageBox>
#include <QProcess>
#include <QScreen>
#include <QSettings>
#include <QTimer>
#include <QWidget>
#include <fstream>
#include <iostream>
#include <streambuf>
#include <string>
using namespace std;
SettingsWidget::SettingsWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::SettingsWidget) {
Device *device = Device::getSingleton();
ui->setupUi(this);
SettingsWidget::setFont(QFont("u001"));
ui->comboBox->setFont(QFont("u001"));
ui->tzComboBox->setFont(QFont("u001"));
ui->aboutBtn->setFont(QFont("u001"));
ui->headerBtn->setFont(QFont("Inter"));
ui->headerLabel->setFont(QFont("Chivo"));
ui->readingSettingsBtn->setFont(QFont("Chivo"));
ui->homeSettingsBtn->setFont(QFont("Chivo"));
ui->librarySettingsBtn->setFont(QFont("Chivo"));
ui->storageSettingsBtn->setFont(QFont("Chivo"));
ui->systemSettingsBtn->setFont(QFont("Chivo"));
ui->securitySettingsBtn->setFont(QFont("Chivo"));
ui->okBtn->setFont(QFont("Inter"));
ui->setPasscodeBtn->setProperty("type", "borderless");
ui->okBtn->setProperty("type", "borderless");
ui->aboutBtn->setProperty("type", "borderless");
ui->requestLeaseBtn->setProperty("type", "borderless");
ui->usbmsBtn->setProperty("type", "borderless");
ui->updateBtn->setProperty("type", "borderless");
ui->resetBtn->setProperty("type", "borderless");
ui->showSystemInfoBtn->setProperty("type", "borderless");
ui->generateSystemReportBtn->setProperty("type", "borderless");
ui->checkOtaUpdateBtn->setProperty("type", "borderless");
ui->repackBtn->setProperty("type", "borderless");
ui->exportHighlightsBtn->setProperty("type", "borderless");
ui->label->setStyleSheet("font-size: 10.5pt; font-weight: bold");
ui->okBtn->setStyleSheet("font-weight: bold");
ui->aboutBtn->setStyleSheet("font-size: 9pt");
ui->requestLeaseBtn->setStyleSheet("font-size: 9pt");
ui->usbmsBtn->setStyleSheet("font-size: 9pt");
ui->updateBtn->setStyleSheet("font-size: 9pt");
ui->resetBtn->setStyleSheet("font-size: 9pt");
ui->showSystemInfoBtn->setStyleSheet("font-size: 9pt");
ui->generateSystemReportBtn->setStyleSheet("font-size: 9pt");
ui->checkOtaUpdateBtn->setStyleSheet("font-size: 9pt");
ui->comboBox->setStyleSheet("font-size: 9pt");
ui->tzComboBox->setStyleSheet("font-size: 9pt");
ui->setPasscodeBtn->setStyleSheet("font-size: 9pt");
ui->repackBtn->setStyleSheet("font-size: 9pt");
ui->exportHighlightsBtn->setStyleSheet("font-size: 9pt");
// Getting the screen's size
sW = QGuiApplication::screens()[0]->size().width();
sH = QGuiApplication::screens()[0]->size().height();
// Defining what the default icon size will be
if (device->getScreenSize() == Device::ScreenSize::SMALL) {
homeIconWidth = sW / 18;
homeIconHeight = sW / 18;
} else {
homeIconWidth = sW / 20;
homeIconHeight = sW / 20;
}
ui->headerStackedWidget->hide();
ui->headerBtn->setIcon(QIcon(":/resources/chevron-left.png"));
ui->headerBtn->setProperty("type", "borderless");
ui->headerBtn->setStyleSheet("font-size: 9pt; font-weight: bold; padding: 15px");
ui->headerLabel->setStyleSheet("padding: 15px");
ui->readingSettingsBtn->setText("\t\t\tReading");
ui->readingSettingsBtn->setProperty("type", "borderless");
ui->readingSettingsBtn->setStyleSheet("padding: 25px; Text-align: left");
ui->readingSettingsBtn->setIcon(QIcon(":/resources/book.png"));
ui->readingSettingsBtn->setIconSize(QSize(homeIconWidth, homeIconHeight));
ui->homeSettingsBtn->setText("\t\t\tHome");
ui->homeSettingsBtn->setProperty("type", "borderless");
ui->homeSettingsBtn->setStyleSheet("padding: 25px; Text-align:left");
ui->homeSettingsBtn->setIcon(QIcon(":/resources/home.png"));
ui->homeSettingsBtn->setIconSize(QSize(homeIconWidth, homeIconHeight));
ui->librarySettingsBtn->setText("\t\t\t Library");
ui->librarySettingsBtn->setProperty("type", "borderless");
ui->librarySettingsBtn->setStyleSheet("padding: 25px; Text-align:left");
ui->librarySettingsBtn->setIcon(QIcon(":/resources/online-library.png"));
ui->storageSettingsBtn->setIconSize(QSize(homeIconWidth, homeIconHeight));
ui->storageSettingsBtn->setText("\t\t\tStorage");
ui->storageSettingsBtn->setProperty("type", "borderless");
ui->storageSettingsBtn->setStyleSheet("padding: 25px; Text-align:left");
ui->storageSettingsBtn->setIcon(QIcon(":/resources/usbms-inverted.png"));
ui->storageSettingsBtn->setIconSize(QSize(homeIconWidth, homeIconHeight));
ui->systemSettingsBtn->setText("\t\t\tSystem");
ui->systemSettingsBtn->setProperty("type", "borderless");
ui->systemSettingsBtn->setStyleSheet("padding: 25px; Text-align:left");
ui->systemSettingsBtn->setIcon(QIcon(":/resources/settings.png"));
ui->systemSettingsBtn->setIconSize(QSize(homeIconWidth, homeIconHeight));
ui->securitySettingsBtn->setText("\t\t\tSecurity");
ui->securitySettingsBtn->setProperty("type", "borderless");
ui->securitySettingsBtn->setStyleSheet("padding: 25px; Text-align:left");
ui->securitySettingsBtn->setIcon(QIcon(":/resources/lock.png"));
ui->securitySettingsBtn->setIconSize(QSize(homeIconWidth, homeIconHeight));
ui->usbNetworkingCheckBox->hide();
ui->requestLeaseBtn->hide();
ui->usbmsBtn->hide();
ui->label_4->hide();
ui->label_6->hide();
ui->updateBtn->hide();
ui->updateLabel->hide();
ui->enableLockscreenCheckBox->hide();
ui->setPasscodeBtn->hide();
ui->setPasscodeLabel->hide();
// Variables
defineDefaultPageSize(0);
defineDefaultPageSize(1);
// Settings tweaking + enabling specific features whether it's running on the provided integrated OS or Kobo firmware
if (checkconfig(".config/01-demo/config") == true) {
ui->demoCheckBox->click();
}
if (checkconfig(".config/02-clock/config") == true) {
ui->clockCheckBox->click();
}
if (checkconfig(".config/05-quote/config") == true) {
ui->quoteCheckBox->click();
}
if (device->supportsNightmode()) {
if (checkconfig(".config/10-dark_mode/config") == true) {
ui->darkModeCheckBox->click();
}
} else {
ui->darkModeCheckBox->hide();
ui->darkModeCheckBox->deleteLater();
}
// Words number
QString wordsNumberConfigStr = readFile(".config/07-words_number/config");
if (wordsNumberConfigStr.isEmpty()) {
Device::ScreenSize size = device->getScreenSize();
if (size == Device::ScreenSize::SMALL) {
wordsNumberSaved = 120;
} else if (size == Device::ScreenSize::VERY_LARGE) {
wordsNumberSaved = 250;
} else {
wordsNumberSaved = 175;
}
} else {
QString words_number = wordsNumberConfigStr;
wordsNumberSaved = wordsNumberConfigStr.toInt();
}
ui->wordsNumberValueLabel->setText(QString::number(wordsNumberSaved));
// ePUB page size
if (checkconfig(".config/13-epub_page_size/set") == true) {
QString epubPageWidthSettingStr = readFile(".config/13-epub_page_size/width");
if (!epubPageWidthSettingStr.isEmpty()) {
QString pageWidth = epubPageWidthSettingStr;
ui->pageSizeWidthLabel->setText(pageWidth);
pageSizeWidthSaved = pageWidth.toInt();
} else {
// Failsafe: setting default
ui->pageSizeWidthLabel->setText(QString::number(defaultEpubPageWidth));
pageSizeWidthSaved = defaultEpubPageWidth;
}
QString epubPageHeightSettingStr = readFile(".config/13-epub_page_size/height");
if (!epubPageHeightSettingStr.isEmpty()) {
QString pageHeight = epubPageHeightSettingStr;
ui->pageSizeHeightLabel->setText(pageHeight);
pageSizeHeightSaved = pageHeight.toInt();
} else {
// Failsafe: setting default
ui->pageSizeHeightLabel->setText(QString::number(defaultEpubPageHeight));
pageSizeHeightSaved = defaultEpubPageHeight;
}
} else {
ui->pageSizeWidthLabel->setText(QString::number(defaultEpubPageWidth));
ui->pageSizeHeightLabel->setText(QString::number(defaultEpubPageHeight));
pageSizeHeightSaved = defaultEpubPageHeight;
pageSizeWidthSaved = defaultEpubPageWidth;
}
// QTextEdit scroll bar in Reader framework
if (checkconfig(".config/14-reader_scrollbar/config") == true) {
ui->readerScrollBarCheckBox->click();
}
// Sticky menubar
if (checkconfig(".config/11-menubar/sticky") == true) {
ui->menuBarCheckBox->click();
}
// Refresh
QString refreshSettingStr = readFile(".config/04-book/refresh");
if (refreshSettingStr.isEmpty()) {
// Set default option, 3
writeFile(".config/04-book/refresh", "3");
ui->comboBox->setCurrentText("3 pages");
} else {
int refreshInt = refreshSettingStr.toInt();
if (refreshInt == -1) {
ui->comboBox->setCurrentText("Never refresh");
}
if (refreshInt == 0) {
ui->comboBox->setCurrentText("Every page");
}
if (refreshInt == 1) {
ui->comboBox->setCurrentText("1 page");
}
if (refreshInt == 2) {
ui->comboBox->setCurrentText("2 pages");
}
if (refreshInt == 3) {
ui->comboBox->setCurrentText("3 pages");
}
if (refreshInt == 4) {
ui->comboBox->setCurrentText("4 pages");
}
if (refreshInt == 5) {
ui->comboBox->setCurrentText("5 pages");
}
if (refreshInt == 6) {
ui->comboBox->setCurrentText("6 pages");
}
}
// Lock screen
if (checkconfig(".config/12-lockscreen/config") == true) {
ui->enableLockscreenCheckBox->click();
}
// Global reading settings
if (checkconfig(".config/16-global_reading_settings/config") == true) {
ui->globalReadingSettingsCheckBox->click();
}
// Encrypted storage
if (checkconfig(".config/18-encrypted_storage/status") == true) {
ui->enableEncryptedStorageCheckBox->click();
} else {
// Next interaction will be by the user
enableEncryptedStorageUserChange = true;
}
if (getEncFSStatus() == false) {
ui->repackLabel->hide();
ui->repackBtn->hide();
}
// Timezone
ui->tzComboBox->addItems(QStringList(readFile(":/resources/tzlist").split("\n", Qt::SkipEmptyParts)));
timezone_not_user_change = true;
if (readFile(".config/19-timezone/config-name").isEmpty()) {
ui->tzComboBox->setCurrentText("UTC");
} else {
ui->tzComboBox->setCurrentText(readFile(".config/19-timezone/config-name"));
}
// Local library folders support
if (checkconfig(".config/21-local_library/folders") == true) {
ui->localLibraryShowFoldersCheckBox->click();
}
// USB show dialog
if (checkconfig(".config/22-usb/show-dialog") == true) {
ui->usbmsDialogBox->click();
}
// Automatic updates
if (checkconfig(".config/23-updates/check-updates") == true) {
ui->autoCheckUpdatesBox->click();
}
// 'Export highlights' button
if (!QFile::exists(global::localLibrary::highlightsDatabasePath) or readFile(global::localLibrary::highlightsDatabasePath).isEmpty()) {
ui->exportHighlightsBtn->setEnabled(false);
}
if (readFile(".config/12-lockscreen/background") == "blank") {
ui->lockscreenBackgroundComboBox->setCurrentIndex(0);
} else if (readFile(".config/12-lockscreen/background") == "screenSaver") {
ui->lockscreenBackgroundComboBox->setCurrentIndex(1);
} else if (readFile(".config/12-lockscreen/background") == "background") {
ui->lockscreenBackgroundComboBox->setCurrentIndex(2);
}
if (checkconfig("/opt/inkbox_genuine") == true) {
// Enforcing security policy if the user has not rooted the device
if (checkconfig("/external_root/opt/root/rooted") == true) {
ui->usbNetworkingCheckBox->show();
if (checkconfig("/external_root/boot/flags/USBNET_ENABLE")) {
ui->usbNetworkingCheckBox->click();
}
ui->requestLeaseBtn->show();
ui->label_4->show();
} else {
ui->usbNetworkingCheckBox->hide();
ui->requestLeaseBtn->hide();
ui->label_4->hide();
}
ui->enableLockscreenCheckBox->show();
ui->setPasscodeBtn->show();
ui->setPasscodeLabel->show();
ui->usbmsBtn->show();
ui->label_6->show();
} else {
ui->label_8->setText("Reset InkBox");
}
if (!device->supportsWifi()) {
ui->checkOtaUpdateLabel->hide();
ui->checkOtaUpdateBtn->hide();
ui->checkOtaUpdateLabel->deleteLater();
ui->checkOtaUpdateBtn->deleteLater();
ui->checkOtaUpdateGridLayout->deleteLater();
}
UI::applyStyle(*this, "eink");
}
SettingsWidget::~SettingsWidget() {
delete ui;
}
void SettingsWidget::on_okBtn_clicked() {
saveDeferredSettings();
// Prevent potential unknown damage launching via shell script this could do
if (launch_sh == true) {
if (ui_enable_changed == true) {
ui_enable_changed = false;
global::settings::settingsRebootDialog = true;
generalDialogWindow = new GeneralDialog();
generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
} else {
QProcess process;
process.startDetached("inkbox.sh", QStringList());
qApp->quit();
}
} else {
QProcess process;
process.startDetached("inkbox", QStringList());
qApp->quit();
}
}
void SettingsWidget::saveDeferredSettings() {
// Save things
writeFile(".config/07-words_number/config", QString::number(wordsNumberSaved));
log("Set text files words number to " + QString::number(wordsNumberSaved), className);
writeFile(".config/13-epub_page_size/width", QString::number(pageSizeWidthSaved));
writeFile(".config/13-epub_page_size/set", "true");
writeFile(".config/13-epub_page_size/height", QString::number(pageSizeHeightSaved));
writeFile(".config/13-epub_page_size/set", "true");
// Notify power daemon of a potential configuration update
writeFile("/mnt/onboard/.adds/inkbox/.config/20-sleep_daemon/updateConfig", "true");
}
void SettingsWidget::on_aboutBtn_clicked() {
log("Showing About message box", className);
if (checkconfig("/opt/inkbox_genuine") == true) {
QString aboutmsg = "InkBox is an open-source, Qt-based eBook reader. It aims to bring you the latest Qt features while being also fast and responsive.";
aboutmsg.prepend("<font face='u001'>");
aboutmsg.append("<br><br>InkBox ");
aboutmsg.append(readFile("/external_root/opt/isa/version"));
aboutmsg.append("</font>");
QMessageBox::information(this, tr("Information"), aboutmsg);
} else {
QMessageBox::information(this, tr("About"), tr("InkBox is an open-source Qt-based eBook reader. It aims to bring you the latest Qt features while being also fast and responsive."));
}
}
void SettingsWidget::on_demoCheckBox_toggled(bool checked) {
QString settingString = "change MainWindow label demo";
// Write to config file
if (checked == true) {
logEnabled(settingString, className);
checked_box = true;
writeconfig(".config/01-demo/config", "InkboxChangeLabel=");
} else {
logDisabled(settingString, className);
checked_box = false;
writeconfig(".config/01-demo/config", "InkboxChangeLabel=");
}
}
void SettingsWidget::on_clockCheckBox_toggled(bool checked) {
QString settingString = "clock with seconds";
// Write to config file
if (checked == true) {
logEnabled(settingString, className);
checked_box = true;
writeconfig(".config/02-clock/config", "ClockShowSeconds=");
} else {
logDisabled(settingString, className);
checked_box = false;
writeconfig(".config/02-clock/config", "ClockShowSeconds=");
}
}
void SettingsWidget::on_quoteCheckBox_toggled(bool checked) {
QString settingString = "disable show quotes";
if (checked == true) {
logEnabled(settingString, className);
checked_box = true;
writeconfig(".config/05-quote/config", "DisableQuote=");
} else {
logDisabled(settingString, className);
checked_box = false;
writeconfig(".config/05-quote/config", "DisableQuote=");
}
}
void SettingsWidget::on_requestLeaseBtn_clicked() {
log("Requesting DHCP lease", className);
QString prog("chroot");
QStringList args;
args << "/external_root"
<< "/usr/sbin/dhclient";
QProcess *proc = new QProcess();
proc->start(prog, args);
proc->waitForFinished();
proc->deleteLater();
}
void SettingsWidget::on_usbmsBtn_clicked() {
usbms_launch();
}
void SettingsWidget::on_updateBtn_clicked() {
log("'Update' button clicked", className);
writeFile("/mnt/onboard/onboard/.inkbox/can_really_update", "true\n");
writeFile("/external_root/opt/update/will_update", "true\n");
writeFile("/external_root/boot/flags/WILL_UPDATE", "true\n");
QString prog("/sbin/reboot");
QStringList args;
QProcess *proc = new QProcess();
proc->start(prog, args);
proc->waitForFinished();
proc->deleteLater();
}
void SettingsWidget::on_darkModeCheckBox_toggled(bool checked) {
QString settingString = "dark mode";
if (checked == true) {
logEnabled(settingString, className);
writeFile(".config/10-dark_mode/config", "true");
writeFile("/tmp/invertScreen", "y");
} else {
logDisabled(settingString, className);
writeFile(".config/10-dark_mode/config", "false");
writeFile("/tmp/invertScreen", "n");
}
}
void SettingsWidget::on_menuBarCheckBox_toggled(bool checked) {
QString settingString = "sticky menu bar";
if (checked == true) {
logEnabled(settingString, className);
checked_box = true;
writeconfig(".config/11-menubar/sticky", "StickyMenuBar=");
} else {
logDisabled(settingString, className);
checked_box = false;
writeconfig(".config/11-menubar/sticky", "StickyMenuBar=");
}
}
void SettingsWidget::on_comboBox_currentIndexChanged(const QString &arg1) {
log("Setting page refresh setting to " + arg1, className);
if (arg1 == "Every page") {
writeFile(".config/04-book/refresh", "0");
}
if (arg1 == "1 page") {
writeFile(".config/04-book/refresh", "1");
}
if (arg1 == "2 pages") {
writeFile(".config/04-book/refresh", "2");
}
if (arg1 == "3 pages") {
writeFile(".config/04-book/refresh", "3");
}
if (arg1 == "4 pages") {
writeFile(".config/04-book/refresh", "4");
}
if (arg1 == "5 pages") {
writeFile(".config/04-book/refresh", "5");
}
if (arg1 == "6 pages") {
writeFile(".config/04-book/refresh", "6");
}
if (arg1 == "Never refresh") {
writeFile(".config/04-book/refresh", "-1");
}
}
void SettingsWidget::on_resetBtn_clicked() {
log("'Reset' button clicked", className);
// We write to a temporary file to show a "Reset" prompt
writeFile("/inkbox/resetDialog", "true");
// We setup the dialog
log("Showing reset dialog", className);
generalDialogWindow = new GeneralDialog();
generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
}
void SettingsWidget::on_setPasscodeBtn_clicked() {
log("'Set passcode' button clicked", className);
log("Launching lockscreen binary", className);
saveDeferredSettings();
writeFile("/tmp/setPasscode", "true");
QProcess process;
process.startDetached("lockscreen", QStringList());
qApp->quit();
}
void SettingsWidget::on_enableLockscreenCheckBox_toggled(bool checked) {
QString settingString = "lockscreen";
if (checked == true) {
logEnabled(settingString, className);
writeFile(".config/12-lockscreen/config", "true");
// Launching passcode setup wizard if none seems to be set at the moment
if (!(QFile::exists(".config/12-lockscreen/passcode") && QFile::exists(".config/12-lockscreen/salt"))) {
ui->setPasscodeBtn->click();
}
} else {
logDisabled(settingString, className);
writeFile(".config/12-lockscreen/config", "false");
}
}
void SettingsWidget::on_showSystemInfoBtn_clicked() {
log("'Show system info' button clicked", className);
global::usbms::usbmsDialog = false;
Device::SysInfo info = Device::getSingleton()->getSystemInfo();
QString text;
text = "<b>InkBox OS version ";
text.append(readFile("/external_root/opt/isa/version"));
text.append("</b><br>Copyright <font face='Inter'>©</font> 2021-2024 Nicolas Mailloux and contributors<br>Special thanks to: Szybet, NiLuJe, akemnade, Rain92, Ansraer (GitHub)");
text.append("<br><b>GUI Git commit:</b> ");
text.append(info.inkGitVersion);
text.append("<br><b>Device UID:</b> ");
text.append(info.uid);
text.append("<br><b>Kernel version:</b> ");
text.append(info.kernelVersion);
text.append("<br><b>Kernel build:</b> ");
text.append(info.kernelBuild);
text.append("<br><b>Kernel commit:</b> ");
text.append(info.kernelCommit);
text.append("<br><b>Device:</b> ");
QString device = Device::getSingleton()->getID();
text.append(device);
text.append("<br><b>IP address: </b>");
text.append(info.ipAddress);
global::text::textBrowserContents = text;
global::text::textBrowserDialog = true;
// Show a system info dialog
log("Showing system info dialog", className);
generalDialogWindow = new GeneralDialog();
generalDialogWindow->yIncrease = determineYIncrease();
generalDialogWindow->increaseSize();
generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
}
void SettingsWidget::on_readerScrollBarCheckBox_toggled(bool checked) {
QString settingString = "scrollbar display if necessary";
if (checked == true) {
logEnabled(settingString, className);
writeFile(".config/14-reader_scrollbar/config", "true");
} else {
logDisabled(settingString, className);
writeFile(".config/14-reader_scrollbar/config", "false");
}
}
void SettingsWidget::brightnessDown() {
UI::transitionBrightness(0);
}
void SettingsWidget::on_globalReadingSettingsCheckBox_toggled(bool checked) {
QString settingString = "global reading settings";
if (checked == true) {
logEnabled(settingString, className);
checked_box = true;
writeconfig(".config/16-global_reading_settings/config", "GlobalReadingSettings=");
} else {
logDisabled(settingString, className);
checked_box = false;
writeconfig(".config/16-global_reading_settings/config", "GlobalReadingSettings=");
}
}
void SettingsWidget::on_checkOtaUpdateBtn_clicked() {
log("'Check for OTA update' button clicked", className);
if (testPing() == 0) {
launchOtaUpdater();
} else {
emit showToast("Wi-Fi connection error");
}
}
void SettingsWidget::openUpdateDialog() {
log("Showing update dialog", className);
global::mainwindow::updateDialog = true;
// Write to a temporary file to show an "Update" prompt
writeFile("/inkbox/updateDialog", "true");
// Show the dialog
generalDialogWindow = new GeneralDialog(this);
generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
connect(generalDialogWindow, SIGNAL(showToast(QString)), SLOT(showToastNative(QString)));
connect(generalDialogWindow, SIGNAL(closeIndefiniteToast()), SLOT(closeIndefiniteToastNative()));
QApplication::processEvents();
}
void SettingsWidget::launchOtaUpdater() {
global::toast::modalToast = true;
global::toast::indefiniteToast = true;
emit showToast("Checking for updates");
otaManagerWindow = new OTAUpdateManagerWidget(this);
connect(otaManagerWindow, SIGNAL(canOtaUpdate(bool)), SLOT(openUpdateDialogOTA(bool)));
otaManagerWindow->setAttribute(Qt::WA_DeleteOnClose);
}
void SettingsWidget::openUpdateDialogOTA(bool open) {
emit closeIndefiniteToast();
if (open == true) {
global::otaUpdate::isUpdateOta = true;
openUpdateDialog();
} else {
emit showToast("No update available");
}
}
void SettingsWidget::showToastNative(QString messageToDisplay) {
emit showToast(messageToDisplay);
}
void SettingsWidget::closeIndefiniteToastNative() {
emit closeIndefiniteToast();
}
void SettingsWidget::usbms_launch() {
log("Showing USBMS splash", className);
global::usbms::launchUsbms = true;
usbmsWindow = new USBMSSplashWidget();
usbmsWindow->setAttribute(Qt::WA_DeleteOnClose);
usbmsWindow->setGeometry(QRect(QPoint(0, 0), screen()->geometry().size()));
usbmsWindow->show();
}
void SettingsWidget::quit_restart() {
// If existing, cleaning bookconfig_mount mountpoint
writeFile("/opt/ibxd", "bookconfig_unmount\n");
// Restarting InkBox
QProcess process;
process.startDetached("inkbox", QStringList());
qApp->quit();
}
void SettingsWidget::on_enableEncryptedStorageCheckBox_toggled(bool checked) {
QString settingString = "encrypted storage";
if (checked == true) {
if (enableEncryptedStorageUserChange == true) {
logEnabled(settingString, className);
setDefaultWorkDir();
writeFile(".config/18-encrypted_storage/initial_setup_done", "false");
writeFile(".config/18-encrypted_storage/status", "true");
if (QFile::exists(".config/18-encrypted_storage/storage_list")) {
QFile::remove(".config/18-encrypted_storage/storage_list");
}
global::settings::settingsRebootDialog = true;
global::encfs::enableStorageEncryptionDialog = true;
generalDialogWindow = new GeneralDialog(this);
generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
} else {
enableEncryptedStorageUserChange = true;
}
} else {
logDisabled(settingString, className);
global::encfs::disableStorageEncryptionDialog = true;
generalDialogWindow = new GeneralDialog(this);
generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
connect(generalDialogWindow, SIGNAL(cancelDisableStorageEncryption()), SLOT(cancelDisableStorageEncryption()));
connect(generalDialogWindow, SIGNAL(disableStorageEncryption()), SLOT(disableStorageEncryption()));
}
}
void SettingsWidget::disableStorageEncryption() {
log("Disabling encrypted storage", className);
setDefaultWorkDir();
writeFile("/external_root/run/encfs_stop_cleanup", "true");
writeFile("/opt/ibxd", "encfs_stop\n");
QThread::msleep(5000);
writeFile(".config/18-encrypted_storage/status", "false");
QFile::remove(".config/18-encrypted_storage/initial_setup_done");
QFile::remove(".config/18-encrypted_storage/storage_list");
QFile::remove("/mnt/onboard/onboard/data.encfs");
QDir dumpDir("/mnt/onboard/onboard/encfs-dropbox");
dumpDir.removeRecursively();
QDir decDir("/mnt/onboard/onboard/encfs-decrypted");
decDir.removeRecursively();
global::settings::settingsRebootDialog = true;
generalDialogWindow = new GeneralDialog(this);
generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
}
void SettingsWidget::cancelDisableStorageEncryption() {
enableEncryptedStorageUserChange = false;
ui->enableEncryptedStorageCheckBox->click();
}
void SettingsWidget::on_repackBtn_clicked() {
log("'Repack encrypted storage' button clicked", className);
QDir dir("/mnt/onboard/onboard/encfs-dropbox");
if (dir.isEmpty()) {
log("Showing encrypted storage repack error dialog ('encfs-dropbox' directory is empty)", className);
global::encfs::errorNoBooksInDropboxDialog = true;
generalDialogWindow = new GeneralDialog(this);
generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
} else {
log("Showing encrypted storage repack dialog", className);
writeFile("/external_root/run/encfs_repack", "true");
quit_restart();
}
}
void SettingsWidget::on_generateSystemReportBtn_clicked() {
log("'Generate system report' button clicked", className);
log("Generating system report", className);
writeFile("/opt/ibxd", "generate_system_report\n");
while (true) {
if (QFile::exists("/inkbox/systemReportDone")) {
if (checkconfig("/inkbox/systemReportDone") == true) {
QFile::remove(global::localLibrary::databasePath);
emit showToast("System report generated successfully");
} else {
emit showToast("Error in generating system report");
}
QFile::remove("/inkbox/systemReportDone");
break;
}
}
}
void SettingsWidget::on_tzComboBox_currentTextChanged(const QString &arg1) {
if (timezone_not_user_change == true) {
timezone_not_user_change = false;
} else {
log("Setting timezone to " + arg1, className);
setDefaultWorkDir();
// Preventing unnecessary (e)MMC writes
if (readFile(".config/19-timezone/config-name") != arg1) {
QProcess::execute("ln", QStringList() << "-sf"
<< "/usr/share/zoneinfo/" + arg1 << ".config/19-timezone/config");
writeFile(".config/19-timezone/config-name", arg1);
writeFile("/opt/ibxd", "gui_remount_localtime\n");
QThread::msleep(500);
}
}
}
void SettingsWidget::on_exportHighlightsBtn_clicked() {
QJsonObject jsonObject = readHighlightsDatabase();
writeFile("/mnt/onboard/onboard/highlights-" + QDateTime::currentDateTime().toString("dd-MM-yy_hh.mm.ss") + ".json", QJsonDocument(jsonObject).toJson());
showToast("Highlights exported successfully");
}
void SettingsWidget::on_wordsNumberIncBtn_clicked() {
wordsNumberSaved = wordsNumberSaved + 5;
ui->wordsNumberValueLabel->setText(QString::number(wordsNumberSaved));
}
void SettingsWidget::on_wordsNumberDecBtn_clicked() {
if (wordsNumberSaved > 10) {
wordsNumberSaved = wordsNumberSaved - 5;
ui->wordsNumberValueLabel->setText(QString::number(wordsNumberSaved));
}
}
void SettingsWidget::on_pageSizeHeightDecBtn_clicked() {
if (pageSizeHeightSaved > 100) {
pageSizeHeightSaved = pageSizeHeightSaved - 5;
ui->pageSizeHeightLabel->setText(QString::number(pageSizeHeightSaved));
}
}
void SettingsWidget::on_pageSizeHeightIncBtn_clicked() {
pageSizeHeightSaved = pageSizeHeightSaved + 5;
ui->pageSizeHeightLabel->setText(QString::number(pageSizeHeightSaved));
}
void SettingsWidget::on_pageSizeWidthDecBtn_clicked() {
if (pageSizeWidthSaved > 100) {
pageSizeWidthSaved = pageSizeWidthSaved - 5;
ui->pageSizeWidthLabel->setText(QString::number(pageSizeWidthSaved));
}
}
void SettingsWidget::on_pageSizeWidthIncBtn_clicked() {
pageSizeWidthSaved = pageSizeWidthSaved + 5;
ui->pageSizeWidthLabel->setText(QString::number(pageSizeWidthSaved));
}
void SettingsWidget::on_localLibraryShowFoldersCheckBox_toggled(bool checked) {
QString settingString = "local library folders support";
if (checked == true) {
logEnabled(settingString, className);
checked_box = true;
writeconfig(".config/21-local_library/folders", "Folders=");
} else {
logDisabled(settingString, className);
checked_box = false;
writeconfig(".config/21-local_library/folders", "Folders=");
}
}
void SettingsWidget::on_usbmsDialogBox_clicked(bool checked) {
QString settingString = "USB Mass Storage dialog display";
if (checked == true) {
logEnabled(settingString, className);
writeFile(".config/22-usb/show-dialog", "true");
} else {
logDisabled(settingString, className);
writeFile(".config/22-usb/show-dialog", "false");
}
}
void SettingsWidget::on_autoCheckUpdatesBox_clicked(bool checked) {
QString settingString = "automatic updates checking";
if (checked == true) {
logEnabled(settingString, className);
writeFile(".config/23-updates/check-updates", "true");
} else {
logDisabled(settingString, className);
writeFile(".config/23-updates/check-updates", "false");
}
}
void SettingsWidget::on_lockscreenBackgroundComboBox_currentTextChanged(const QString &arg1) {
if (arg1 == "Blank") {
writeFile(".config/12-lockscreen/background", "blank");
log("Set lockscreen background to 'blank'", className);
} else if (arg1 == "Screensaver picture") {
writeFile(".config/12-lockscreen/background", "screenSaver");
log("Set lockscreen background to 'screenSaver'", className);
} else if (arg1 == "Device's screen") {
writeFile(".config/12-lockscreen/background", "background");
log("Set lockscreen background to 'background'", className);
}
}
void SettingsWidget::on_settingsStackedWidget_currentChanged(int arg1) {
if (ui->settingsStackedWidget->currentIndex() != 0) {
ui->headerLabel->setText(ui->settingsStackedWidget->currentWidget()->objectName());
ui->headerStackedWidget->show();
} else {
ui->headerStackedWidget->hide();
}
}
void SettingsWidget::on_readingSettingsBtn_clicked() {
log("'Reading settings' button clicked", className);
ui->settingsStackedWidget->setCurrentIndex(1);
}
void SettingsWidget::on_homeSettingsBtn_clicked() {
log("'Home settings' button clicked", className);
ui->settingsStackedWidget->setCurrentIndex(2);
}
void SettingsWidget::on_librarySettingsBtn_clicked() {
log("'Library settings' button clicked", className);
ui->settingsStackedWidget->setCurrentIndex(3);
}
void SettingsWidget::on_storageSettingsBtn_clicked() {
log("'Storage settings' button clicked", className);
ui->settingsStackedWidget->setCurrentIndex(4);
}
void SettingsWidget::on_systemSettingsBtn_clicked() {
log("'System settings' button clicked", className);
ui->settingsStackedWidget->setCurrentIndex(5);
}
void SettingsWidget::on_securitySettingsBtn_clicked() {
log("'Security settings' button clicked", className);
ui->settingsStackedWidget->setCurrentIndex(6);
}
void SettingsWidget::on_headerBtn_clicked() {
// "Home" button
log("'Home' button clicked", className);
ui->settingsStackedWidget->setCurrentIndex(0);
}
void SettingsWidget::on_usbNetworkingCheckBox_toggled(bool checked) {
if (checked) {
writeFile("/external_root/boot/flags/USBNET_ENABLE", "true");
writeFile("/opt/ibxd", "usbnet_start\n");
} else {
writeFile("/external_root/boot/flags/USBNET_ENABLE", "false");
writeFile("/opt/ibxd", "usbnet_stop\n");
}
}

View file

@ -11,10 +11,10 @@
using namespace std; using namespace std;
namespace Ui { namespace Ui {
class settings; class SettingsWidget;
} }
class settings : public QWidget class SettingsWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT
@ -33,8 +33,8 @@ public:
float homeIconWidth; float homeIconWidth;
float homeIconHeight; float homeIconHeight;
explicit settings(QWidget *parent = nullptr); explicit SettingsWidget(QWidget *parent = nullptr);
~settings(); ~SettingsWidget();
private slots: private slots:
void on_demoCheckBox_toggled(bool); void on_demoCheckBox_toggled(bool);
@ -46,7 +46,6 @@ private slots:
void on_usbmsBtn_clicked(); void on_usbmsBtn_clicked();
void on_updateBtn_clicked(); void on_updateBtn_clicked();
void on_darkModeCheckBox_toggled(bool checked); void on_darkModeCheckBox_toggled(bool checked);
void on_uiScalingSlider_valueChanged(int value);
void on_menuBarCheckBox_toggled(bool checked); void on_menuBarCheckBox_toggled(bool checked);
void on_comboBox_currentIndexChanged(const QString &arg1); void on_comboBox_currentIndexChanged(const QString &arg1);
void on_resetBtn_clicked(); void on_resetBtn_clicked();
@ -97,10 +96,10 @@ signals:
void closeIndefiniteToast(); void closeIndefiniteToast();
private: private:
Ui::settings * ui; Ui::SettingsWidget * ui;
usbmsSplash * usbmsWindow; USBMSSplashWidget * usbmsWindow;
generalDialog * generalDialogWindow; GeneralDialog * generalDialogWindow;
otaManager * otaManagerWindow; OTAUpdateManagerWidget * otaManagerWindow;
toast * toastWindow; toast * toastWindow;
int pageSizeHeightSaved; int pageSizeHeightSaved;

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>settings</class> <class>SettingsWidget</class>
<widget class="QWidget" name="settings"> <widget class="QWidget" name="SettingsWidget">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
@ -64,6 +64,7 @@
<widget class="QLabel" name="label"> <widget class="QLabel" name="label">
<property name="font"> <property name="font">
<font> <font>
<weight>75</weight>
<bold>true</bold> <bold>true</bold>
</font> </font>
</property> </property>
@ -169,7 +170,7 @@
<item> <item>
<widget class="QStackedWidget" name="settingsStackedWidget"> <widget class="QStackedWidget" name="settingsStackedWidget">
<property name="currentIndex"> <property name="currentIndex">
<number>0</number> <number>5</number>
</property> </property>
<widget class="QWidget" name="General"> <widget class="QWidget" name="General">
<layout class="QVBoxLayout" name="verticalLayout_7"> <layout class="QVBoxLayout" name="verticalLayout_7">
@ -200,8 +201,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>461</width> <width>457</width>
<height>636</height> <height>622</height>
</rect> </rect>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_2"> <layout class="QVBoxLayout" name="verticalLayout_2">
@ -363,6 +364,7 @@
<widget class="QPushButton" name="okBtn"> <widget class="QPushButton" name="okBtn">
<property name="font"> <property name="font">
<font> <font>
<weight>75</weight>
<bold>true</bold> <bold>true</bold>
</font> </font>
</property> </property>
@ -407,8 +409,8 @@ Save &amp;&amp; Quit
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>423</width> <width>235</width>
<height>738</height> <height>258</height>
</rect> </rect>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_3"> <layout class="QVBoxLayout" name="verticalLayout_3">
@ -690,6 +692,7 @@ Save &amp;&amp; Quit
<widget class="QPushButton" name="exportHighlightsBtn"> <widget class="QPushButton" name="exportHighlightsBtn">
<property name="font"> <property name="font">
<font> <font>
<weight>75</weight>
<bold>true</bold> <bold>true</bold>
</font> </font>
</property> </property>
@ -868,6 +871,7 @@ Save &amp;&amp; Quit
<widget class="QPushButton" name="usbmsBtn"> <widget class="QPushButton" name="usbmsBtn">
<property name="font"> <property name="font">
<font> <font>
<weight>75</weight>
<bold>true</bold> <bold>true</bold>
</font> </font>
</property> </property>
@ -937,7 +941,7 @@ Save &amp;&amp; Quit
<property name="bottomMargin"> <property name="bottomMargin">
<number>0</number> <number>0</number>
</property> </property>
<item row="5" column="0"> <item row="4" column="0">
<layout class="QGridLayout" name="gridLayout_7"> <layout class="QGridLayout" name="gridLayout_7">
<property name="bottomMargin"> <property name="bottomMargin">
<number>0</number> <number>0</number>
@ -969,6 +973,7 @@ Save &amp;&amp; Quit
<widget class="QPushButton" name="showSystemInfoBtn"> <widget class="QPushButton" name="showSystemInfoBtn">
<property name="font"> <property name="font">
<font> <font>
<weight>75</weight>
<bold>true</bold> <bold>true</bold>
</font> </font>
</property> </property>
@ -979,7 +984,54 @@ Save &amp;&amp; Quit
</item> </item>
</layout> </layout>
</item> </item>
<item row="9" column="0"> <item row="5" column="0">
<layout class="QGridLayout" name="gridLayout_19">
<property name="bottomMargin">
<number>0</number>
</property>
<item row="0" column="2">
<widget class="QPushButton" name="generateSystemReportBtn">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Generate</string>
</property>
</widget>
</item>
<item row="0" column="1">
<spacer name="horizontalSpacer_15">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_10">
<property name="text">
<string>Generate system report</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="0" column="0">
<widget class="QCheckBox" name="usbNetworkingCheckBox">
<property name="text">
<string>Enable USB networking</string>
</property>
</widget>
</item>
<item row="8" column="0">
<layout class="QGridLayout" name="checkOtaUpdateGridLayout"> <layout class="QGridLayout" name="checkOtaUpdateGridLayout">
<property name="bottomMargin"> <property name="bottomMargin">
<number>0</number> <number>0</number>
@ -988,6 +1040,7 @@ Save &amp;&amp; Quit
<widget class="QPushButton" name="checkOtaUpdateBtn"> <widget class="QPushButton" name="checkOtaUpdateBtn">
<property name="font"> <property name="font">
<font> <font>
<weight>75</weight>
<bold>true</bold> <bold>true</bold>
</font> </font>
</property> </property>
@ -1018,7 +1071,80 @@ Save &amp;&amp; Quit
</item> </item>
</layout> </layout>
</item> </item>
<item row="11" column="0"> <item row="7" column="0">
<layout class="QGridLayout" name="gridLayout_14">
<property name="bottomMargin">
<number>0</number>
</property>
<item row="0" column="2">
<widget class="QPushButton" name="updateBtn">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Update</string>
</property>
</widget>
</item>
<item row="0" column="1">
<spacer name="horizontalSpacer_10">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0">
<widget class="QLabel" name="updateLabel">
<property name="text">
<string>Update InkBox</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
</widget>
</item>
</layout>
</item>
<item row="6" column="0">
<layout class="QGridLayout" name="gridLayout_18">
<property name="bottomMargin">
<number>0</number>
</property>
<item row="0" column="1">
<spacer name="horizontalSpacer_16">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="2">
<widget class="QComboBox" name="tzComboBox"/>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_11">
<property name="text">
<string>Timezone</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="10" column="0">
<spacer name="verticalSpacer_8"> <spacer name="verticalSpacer_8">
<property name="orientation"> <property name="orientation">
<enum>Qt::Vertical</enum> <enum>Qt::Vertical</enum>
@ -1060,6 +1186,7 @@ Save &amp;&amp; Quit
<widget class="QPushButton" name="requestLeaseBtn"> <widget class="QPushButton" name="requestLeaseBtn">
<property name="font"> <property name="font">
<font> <font>
<weight>75</weight>
<bold>true</bold> <bold>true</bold>
</font> </font>
</property> </property>
@ -1070,56 +1197,27 @@ Save &amp;&amp; Quit
</item> </item>
</layout> </layout>
</item> </item>
<item row="8" column="0"> <item row="9" column="0">
<layout class="QGridLayout" name="gridLayout_14"> <widget class="QCheckBox" name="autoCheckUpdatesBox">
<property name="bottomMargin"> <property name="sizePolicy">
<number>0</number> <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property> </property>
<item row="0" column="2"> <property name="text">
<widget class="QPushButton" name="updateBtn"> <string>Automatically check for updates</string>
<property name="font"> </property>
<font> </widget>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Update</string>
</property>
</widget>
</item>
<item row="0" column="1">
<spacer name="horizontalSpacer_10">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0">
<widget class="QLabel" name="updateLabel">
<property name="text">
<string>Update InkBox</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
</widget>
</item>
</layout>
</item> </item>
<item row="3" column="0"> <item row="2" column="0">
<widget class="QCheckBox" name="darkModeCheckBox"> <widget class="QCheckBox" name="darkModeCheckBox">
<property name="text"> <property name="text">
<string>Enable night mode</string> <string>Enable night mode</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="4" column="0"> <item row="3" column="0">
<layout class="QGridLayout" name="gridLayout_12"> <layout class="QGridLayout" name="gridLayout_12">
<property name="bottomMargin"> <property name="bottomMargin">
<number>0</number> <number>0</number>
@ -1128,6 +1226,7 @@ Save &amp;&amp; Quit
<widget class="QPushButton" name="resetBtn"> <widget class="QPushButton" name="resetBtn">
<property name="font"> <property name="font">
<font> <font>
<weight>75</weight>
<bold>true</bold> <bold>true</bold>
</font> </font>
</property> </property>
@ -1158,146 +1257,6 @@ Save &amp;&amp; Quit
</item> </item>
</layout> </layout>
</item> </item>
<item row="2" column="0">
<layout class="QGridLayout" name="gridLayout_8">
<property name="bottomMargin">
<number>0</number>
</property>
<item row="1" column="2">
<widget class="QLabel" name="uiScaleNumberLabel">
<property name="font">
<font>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>1</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSlider" name="uiScalingSlider">
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>2</number>
</property>
<property name="singleStep">
<number>1</number>
</property>
<property name="pageStep">
<number>1</number>
</property>
<property name="value">
<number>0</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="uiScalingLabel">
<property name="text">
<string>UI scaling factor</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
</widget>
</item>
</layout>
</item>
<item row="6" column="0">
<layout class="QGridLayout" name="gridLayout_19">
<property name="bottomMargin">
<number>0</number>
</property>
<item row="0" column="2">
<widget class="QPushButton" name="generateSystemReportBtn">
<property name="font">
<font>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Generate</string>
</property>
</widget>
</item>
<item row="0" column="1">
<spacer name="horizontalSpacer_15">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_10">
<property name="text">
<string>Generate system report</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="10" column="0">
<widget class="QCheckBox" name="autoCheckUpdatesBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Automatically check for updates</string>
</property>
</widget>
</item>
<item row="7" column="0">
<layout class="QGridLayout" name="gridLayout_18">
<property name="bottomMargin">
<number>0</number>
</property>
<item row="0" column="1">
<spacer name="horizontalSpacer_16">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="2">
<widget class="QComboBox" name="tzComboBox"/>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_11">
<property name="text">
<string>Timezone</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="0" column="0">
<widget class="QCheckBox" name="usbNetworkingCheckBox">
<property name="text">
<string>Enable USB networking</string>
</property>
</widget>
</item>
</layout> </layout>
</item> </item>
</layout> </layout>
@ -1350,6 +1309,7 @@ Save &amp;&amp; Quit
<widget class="QPushButton" name="repackBtn"> <widget class="QPushButton" name="repackBtn">
<property name="font"> <property name="font">
<font> <font>
<weight>75</weight>
<bold>true</bold> <bold>true</bold>
</font> </font>
</property> </property>
@ -1472,6 +1432,7 @@ Save &amp;&amp; Quit
<widget class="QPushButton" name="setPasscodeBtn"> <widget class="QPushButton" name="setPasscodeBtn">
<property name="font"> <property name="font">
<font> <font>
<weight>75</weight>
<bold>true</bold> <bold>true</bold>
</font> </font>
</property> </property>

View file

@ -0,0 +1,101 @@
#include "settingschooser.h"
#include "device.h"
#include "functions.h"
#include "powerdaemonsettings.h"
#include "ui.h"
#include "ui_settingschooser.h"
#include <QFile>
#include <QScreen>
SettingsChooserWidget::SettingsChooserWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::SettingsChooserWidget) {
ui->setupUi(this);
// Stylesheet
UI::applyStyle(*this, "eink");
// UI tweaks
if (checkconfig("/opt/inkbox_kobox_support") == false) {
ui->koboxSettingsBtn->hide();
ui->line_3->hide();
}
// Getting the screen's size
sW = QGuiApplication::screens()[0]->size().width();
sH = QGuiApplication::screens()[0]->size().height();
Device::ScreenSize screenSize = Device::getSingleton()->getScreenSize();
QString padding = "";
if (screenSize == Device::ScreenSize::SMALL) {
homeIconWidth = sW / 18;
homeIconHeight = sW / 18;
padding = "18px";
} else if (screenSize == Device::ScreenSize::MEDIUM) {
homeIconWidth = sW / 20;
homeIconHeight = sW / 20;
padding = "20px";
} else if (screenSize == Device::ScreenSize::LARGE) {
homeIconWidth = sW / 20;
homeIconHeight = sW / 20;
padding = "25px";
} else if (screenSize == Device::ScreenSize::VERY_LARGE) {
homeIconWidth = sW / 20;
homeIconHeight = sW / 20;
padding = "40px";
}
ui->inkboxSettingsBtn->setStyleSheet("padding: " + padding + "; Text-align: left");
ui->koboxSettingsBtn->setStyleSheet("padding: " + padding + "; Text-align: left");
ui->powerSettingsBtn->setStyleSheet("padding: " + padding + "; Text-align: left");
ui->inkboxSettingsBtn->setProperty("type", "borderless");
ui->koboxSettingsBtn->setProperty("type", "borderless");
ui->powerSettingsBtn->setProperty("type", "borderless");
ui->inkboxSettingsBtn->setText("\t\t\tInkBox settings");
ui->koboxSettingsBtn->setText("\t\t\tKoBox settings");
ui->powerSettingsBtn->setText("\t\t\tPower settings");
ui->inkboxSettingsBtn->setIcon(QIcon(":/resources/settings.png"));
ui->inkboxSettingsBtn->setIconSize(QSize(homeIconWidth, homeIconHeight));
ui->koboxSettingsBtn->setIcon(QIcon(":/resources/X11.png"));
ui->koboxSettingsBtn->setIconSize(QSize(homeIconWidth, homeIconHeight));
ui->powerSettingsBtn->setIcon(QIcon(":/resources/power.png"));
ui->powerSettingsBtn->setIconSize(QSize(homeIconWidth, homeIconHeight));
}
SettingsChooserWidget::~SettingsChooserWidget() {
delete ui;
}
void SettingsChooserWidget::on_inkboxSettingsBtn_clicked() {
log("Launching InkBox Settings", className);
settingsWindow = new SettingsWidget();
settingsWindow->setAttribute(Qt::WA_DeleteOnClose);
connect(settingsWindow, SIGNAL(showToast(QString)), SLOT(showToastNative(QString)));
connect(settingsWindow, SIGNAL(closeIndefiniteToast()), SLOT(closeIndefiniteToastNative()));
settingsWindow->showFullScreen();
}
void SettingsChooserWidget::on_koboxSettingsBtn_clicked() {
log("Launching KoBox Settings", className);
koboxSettingsWindow = new KoboxSettingsWidget();
koboxSettingsWindow->setAttribute(Qt::WA_DeleteOnClose);
koboxSettingsWindow->showFullScreen();
}
void SettingsChooserWidget::on_powerSettingsBtn_clicked() {
log("Launching Power Daemon Settings", className);
PowerDaemonSettingsWidget *powerSettingsWindow = new PowerDaemonSettingsWidget();
powerSettingsWindow->setAttribute(Qt::WA_DeleteOnClose);
powerSettingsWindow->showFullScreen();
}
void SettingsChooserWidget::showToastNative(QString messageToDisplay) {
emit showToast(messageToDisplay);
}
void SettingsChooserWidget::closeIndefiniteToastNative() {
emit closeIndefiniteToast();
}

View file

@ -7,17 +7,17 @@
#include "koboxsettings.h" #include "koboxsettings.h"
namespace Ui { namespace Ui {
class settingsChooser; class SettingsChooserWidget;
} }
class settingsChooser : public QWidget class SettingsChooserWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
QString className = this->metaObject()->className(); QString className = this->metaObject()->className();
explicit settingsChooser(QWidget *parent = nullptr); explicit SettingsChooserWidget(QWidget *parent = nullptr);
~settingsChooser(); ~SettingsChooserWidget();
float sW; float sW;
float sH; float sH;
@ -36,9 +36,9 @@ signals:
void closeIndefiniteToast(); void closeIndefiniteToast();
private: private:
Ui::settingsChooser *ui; Ui::SettingsChooserWidget *ui;
settings *settingsWindow; SettingsWidget *settingsWindow;
koboxSettings *koboxSettingsWindow; KoboxSettingsWidget *koboxSettingsWindow;
}; };
#endif // SETTINGSCHOOSER_H #endif // SETTINGSCHOOSER_H

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>settingsChooser</class> <class>SettingsChooserWidget</class>
<widget class="QWidget" name="settingsChooser"> <widget class="QWidget" name="SettingsChooserWidget">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>

View file

@ -0,0 +1,161 @@
#include "splashAlert.h"
#include "device.h"
#include "functions.h"
#include "ui.h"
#include "ui_splashAlert.h"
#include <QFile>
#include <QPixmap>
#include <QProcess>
#include <QScreen>
SplashAlertWidget::SplashAlertWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::SplashAlertWidget) {
ui->setupUi(this);
ui->messageLabel->setFont(QFont("u001"));
// Getting the screen's size
float sW = QGuiApplication::screens()[0]->size().width();
float sH = QGuiApplication::screens()[0]->size().height();
// Defining what the "Alert" icon size will be
float stdIconWidth = sW / 1.7;
float stdIconHeight = sH / 1.7;
// General stylesheet
UI::applyStyle(*this, ":/resources/eink-dark.qss");
// Default icon in case none of the conditions below are met
QPixmap pixmap(":/resources/alert.png");
QPixmap scaledPixmap = pixmap.scaled(stdIconWidth, stdIconHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui->alertIconLabel->setPixmap(scaledPixmap);
// Checking if the update's signature is untrusted. The signature error will always take precedence over the downgrade one (c.f. update.sh script)
if (checkconfig("/external_root/boot/flags/ALERT_SIGN") == true) {
QPixmap pixmap(":/resources/alert.png");
QPixmap scaledPixmap = pixmap.scaled(stdIconWidth, stdIconHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui->alertIconLabel->setPixmap(scaledPixmap);
signatureError = true;
log("Displaying signature error alert splash", className);
ui->securityLabel->setText("Failed to update InkBox.");
ui->messageLabel->setText("The digital signature of the update is untrusted.\nFor security reasons, it cannot be installed.");
ui->stackedWidget->setCurrentIndex(1);
}
if (checkconfig("/external_root/boot/flags/ALERT_DOWNGRADE") == true) {
QPixmap pixmap(":/resources/alert.png");
QPixmap scaledPixmap = pixmap.scaled(stdIconWidth, stdIconHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui->alertIconLabel->setPixmap(scaledPixmap);
log("Displaying downgrade error alert splash", className);
downgradeError = true;
ui->securityLabel->setText("Failed to update InkBox.");
ui->messageLabel->setText("An error occured during the update process.\nThe update package's version is lower than the actual installed version.");
ui->stackedWidget->setCurrentIndex(1);
}
if (global::encfs::lockdown == true) {
ui->stackedWidget->setVisible(false);
ui->stackedWidget->deleteLater();
QPixmap pixmap(":/resources/alert.png");
QPixmap scaledPixmap = pixmap.scaled(stdIconWidth, stdIconHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui->alertIconLabel->setPixmap(scaledPixmap);
ui->warningLabel->setText("Fatal error");
ui->securityLabel->setText("Device lockdown");
log(global::encfs::lockdownMessage, className);
QString message = "Due to multiple incorrect passphrase attempts, this device is locked down until\n" + global::encfs::unlockTime + "\nand won't boot.";
ui->messageLabel->setText(message);
poweroff(false);
QTimer::singleShot(1000, this, SLOT(quit()));
}
if (global::battery::showCriticalBatteryAlert == true) {
global::battery::showCriticalBatteryAlert = false;
ui->stackedWidget->setVisible(false);
ui->stackedWidget->deleteLater();
QPixmap pixmap(":/resources/battery_alert.png");
QPixmap scaledPixmap = pixmap.scaled(stdIconWidth, stdIconHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
ui->alertIconLabel->setPixmap(scaledPixmap);
log("Displaying critical battery alert splash", className);
criticalBattery = true;
ui->warningLabel->setText("Please charge your eReader.");
ui->securityLabel->setText("The battery's charge level is critical.");
ui->messageLabel->setText("To prevent damage, your device has been turned off.\nPlease consider charging it.");
// The Mini (N705) has a higher DPI and otherwise the text doesn't fit
Device::ScreenSize screenSize = Device::getSingleton()->getScreenSize();
if (screenSize == Device::ScreenSize::SMALL) {
ui->warningLabel->setStyleSheet("QLabel { background-color : black; color : white; font-size: 14pt }");
} else {
ui->warningLabel->setStyleSheet("QLabel { background-color : black; color : white; font-size: 16pt }");
}
poweroff(false);
QTimer::singleShot(1000, this, SLOT(quit()));
}
ui->messageLabel->setStyleSheet("QLabel { background-color : black; color : white; font-size: 10pt }");
ui->securityLabel->setStyleSheet("QLabel { background-color : black; color : white; font-size: 11pt }");
ui->continueBtn->setProperty("type", "borderless");
ui->resetBtn->setProperty("type", "borderless");
ui->continueBtn->setStyleSheet("padding: 20px");
ui->resetBtn->setStyleSheet("padding: 20px");
ui->continue2Btn->setProperty("type", "borderless");
ui->continue2Btn->setStyleSheet("padding: 20px");
}
SplashAlertWidget::~SplashAlertWidget() {
delete ui;
}
void SplashAlertWidget::on_continueBtn_clicked() {
// We continue anyway and re-set the ALERT flag
writeFile("/external_root/boot/flags/ALERT", "false\n");
writeFile("/external_root/boot/flags/ALERT_SIGN", "false\n");
updateReset();
QProcess process;
process.startDetached("inkbox", QStringList());
qApp->quit();
}
void SplashAlertWidget::on_resetBtn_clicked() {
// We set the DO_FACTORY_RESET flag and we restart the device
log("Factory reset requested; setting required flags", className);
writeFile("/external_root/boot/flags/DO_FACTORY_RESET", "true\n");
writeFile("/external_root/boot/flags/DIAGS_BOOT", "true\n");
QString reboot_prog("/sbin/reboot");
QStringList reboot_args;
reboot_args << "no_splash";
QProcess *reboot_proc = new QProcess();
reboot_proc->start(reboot_prog, reboot_args);
reboot_proc->waitForFinished();
reboot_proc->deleteLater();
}
void SplashAlertWidget::on_continue2Btn_clicked() {
// We continue anyway and re-set the ALERT flag
writeFile("/external_root/boot/flags/ALERT", "false\n");
updateReset();
log("Restarting InkBox", className);
if (signatureError == true) {
writeFile("/external_root/boot/flags/ALERT_SIGN", "false\n");
QProcess process;
process.startDetached("inkbox", QStringList());
qApp->quit();
}
if (downgradeError == true) {
writeFile("/external_root/boot/flags/ALERT_DOWNGRADE", "false\n");
QProcess process;
process.startDetached("inkbox", QStringList());
qApp->quit();
}
}
void SplashAlertWidget::updateReset() {
writeFile("/mnt/onboard/onboard/.inkbox/can_really_update", "false\n");
writeFile("/mnt/onboard/onboard/.inkbox/can_update", "false\n");
}
void SplashAlertWidget::quit() {
qApp->quit();
}

View file

@ -1,22 +1,22 @@
#ifndef ALERT_H #ifndef SPLASHALERT_H
#define ALERT_H #define SPLASHALERT_H
#include <QWidget> #include <QWidget>
namespace Ui { namespace Ui {
class alert; class SplashAlertWidget;
} }
using namespace std; using namespace std;
class alert : public QWidget class SplashAlertWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
QString className = this->metaObject()->className(); QString className = this->metaObject()->className();
explicit alert(QWidget *parent = nullptr); explicit SplashAlertWidget(QWidget *parent = nullptr);
~alert(); ~SplashAlertWidget();
bool signatureError = false; bool signatureError = false;
bool downgradeError = false; bool downgradeError = false;
bool criticalBattery = false; bool criticalBattery = false;
@ -29,7 +29,7 @@ private slots:
void quit(); void quit();
private: private:
Ui::alert *ui; Ui::SplashAlertWidget *ui;
}; };
#endif // ALERT_H #endif // SPLASHALERT_H

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