Compare commits

...

2 commits

Author SHA1 Message Date
Ansraer
3a31c3ac0b
Merge 91517f65e4 into d416ecdd58 2024-05-28 15:28:20 -07:00
Ansraer
91517f65e4 refactor and clean up codebase, create device abstraction 2024-02-29 17:13:54 +01:00
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.
<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.
## 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
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/splash/alert.cpp \
src/apps/apps.cpp \
src/ui/apps/apps.cpp \
src/telemetry/telemetry.cpp \
src/widgets/dialogs/audio/audiodialog.cpp \
src/widgets/dialogs/audio/audiofile.cpp \
src/widgets/dialogs/audio/audiofilequeue.cpp \
src/widgets/dialogs/library/bookinfodialog.cpp \
src/widgets/dialogs/library/bookoptionsdialog.cpp \
src/widgets/dialogs/brightnessdialog.cpp \
src/apps/calendarapp.cpp \
src/widgets/dialogs/reader/highlightslistdialog.cpp \
src/widgets/dialogs/reader/textdialog.cpp \
src/widgets/dialogs/wifi/connectiondialog.cpp \
src/widgets/dialogs/wifi/network.cpp \
src/widgets/dialogs/wifi/wifilogger.cpp \
src/widgets/misc/egg.cpp \
src/widgets/reader/dictionarywidget.cpp \
src/encfs/encryptionmanager.cpp \
src/widgets/dialogs/generaldialog.cpp \
src/homeWidget/homepagewidget.cpp \
src/widgets/misc/hourglassanimationwidget.cpp \
src/widgets/dialogs/kobox/koboxappsdialog.cpp \
src/settings/koboxsettings.cpp \
src/onlineLibrary/librarywidget.cpp \
src/localLibrary/locallibrarywidget.cpp \
src/ui/splash/splashAlert.cpp \
src/ui/ui.cpp \
src/ui/widgets/dialogs/audio/audiodialog.cpp \
src/ui/widgets/dialogs/audio/audiofile.cpp \
src/ui/widgets/dialogs/audio/audiofilequeue.cpp \
src/ui/widgets/dialogs/library/bookinfodialog.cpp \
src/ui/widgets/dialogs/library/bookoptionsdialog.cpp \
src/ui/widgets/dialogs/brightnessdialog.cpp \
src/ui/apps/calendarapp.cpp \
src/ui/widgets/dialogs/reader/highlightslistdialog.cpp \
src/ui/widgets/dialogs/reader/textdialog.cpp \
src/ui/widgets/dialogs/wifi/connectiondialog.cpp \
src/ui/widgets/dialogs/wifi/network.cpp \
src/ui/widgets/dialogs/wifi/wifilogger.cpp \
src/ui/widgets/misc/egg.cpp \
src/ui/widgets/reader/dictionarywidget.cpp \
src/ui/crypto/encryptionmanager.cpp \
src/ui/widgets/dialogs/generaldialog.cpp \
src/ui/home/homepagewidget.cpp \
src/ui/widgets/misc/hourglassanimationwidget.cpp \
src/ui/widgets/dialogs/kobox/koboxappsdialog.cpp \
src/ui/settings/koboxsettings.cpp \
src/ui/onlineLibrary/librarywidget.cpp \
src/ui/localLibrary/locallibrarywidget.cpp \
src/main.cpp \
src/homeWidget/mainwindow.cpp \
src/otaUpdate/otamanager.cpp \
src/widgets/interfaceWidgets/qclickablelabel.cpp \
src/widgets/interfaceWidgets/qtooltiplabel.cpp \
src/quit/quit.cpp \
src/reader/reader.cpp \
src/apps/savedwords.cpp \
src/widgets/text/searchresultswidget.cpp \
src/settings/settings.cpp \
src/settings/settingschooser.cpp \
src/widgets/text/textwidget.cpp \
src/widgets/interfaceWidgets/toast.cpp \
src/splash/usbmsSplash.cpp \
src/apps/userapps.cpp \
src/widgets/virtualKeyboard/virtualkeyboard.cpp \
src/widgets/virtualKeyboard/virtualkeypad.cpp \
src/widgets/dialogs/wifi/wifidialog.cpp \
src/widgets/dialogs/powerDaemon/sleepdialog.cpp \
src/ui/home/mainwindow.cpp \
src/ui/otaUpdate/otamanager.cpp \
src/ui/widgets/interfaceWidgets/qclickablelabel.cpp \
src/ui/widgets/interfaceWidgets/qtooltiplabel.cpp \
src/ui/quit/quit.cpp \
src/ui/reader/reader.cpp \
src/ui/apps/savedwords.cpp \
src/ui/widgets/text/searchresultswidget.cpp \
src/ui/settings/settings.cpp \
src/ui/settings/settingschooser.cpp \
src/ui/widgets/text/textwidget.cpp \
src/ui/widgets/interfaceWidgets/toast.cpp \
src/ui/splash/usbmsSplash.cpp \
src/ui/apps/userapps.cpp \
src/ui/widgets/virtualKeyboard/virtualkeyboard.cpp \
src/ui/widgets/virtualKeyboard/virtualkeypad.cpp \
src/ui/widgets/dialogs/wifi/wifidialog.cpp \
src/ui/widgets/dialogs/powerDaemon/sleepdialog.cpp \
src/powerDaemon/sleepthread.cpp \
src/settings/powerdaemonsettings.cpp
src/ui/settings/powerdaemonsettings.cpp
HEADERS += \
src/audio/audiothread.h \
src/apps/todo.h \
src/splash/alert.h \
src/apps/apps.h \
src/platform/device.h \
src/platform/device_desktop.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/widgets/dialogs/audio/audiodialog.h \
src/widgets/dialogs/audio/audiofile.h \
src/widgets/dialogs/audio/audiofilequeue.h \
src/widgets/dialogs/library/bookinfodialog.h \
src/widgets/dialogs/library/bookoptionsdialog.h \
src/widgets/dialogs/brightnessdialog.h \
src/apps/calendarapp.h \
src/widgets/dialogs/reader/highlightslistdialog.h \
src/widgets/dialogs/reader/textdialog.h \
src/widgets/dialogs/wifi/connectiondialog.h \
src/widgets/dialogs/wifi/network.h \
src/widgets/dialogs/wifi/wifilogger.h \
src/widgets/misc/egg.h \
src/widgets/reader/dictionarywidget.h \
src/encfs/encryptionmanager.h \
src/ui/splash/splashAlert.h \
src/ui/ui.h \
src/ui/widgets/dialogs/audio/audiodialog.h \
src/ui/widgets/dialogs/audio/audiofile.h \
src/ui/widgets/dialogs/audio/audiofilequeue.h \
src/ui/widgets/dialogs/library/bookinfodialog.h \
src/ui/widgets/dialogs/library/bookoptionsdialog.h \
src/ui/widgets/dialogs/brightnessdialog.h \
src/ui/apps/calendarapp.h \
src/ui/widgets/dialogs/reader/highlightslistdialog.h \
src/ui/widgets/dialogs/reader/textdialog.h \
src/ui/widgets/dialogs/wifi/connectiondialog.h \
src/ui/widgets/dialogs/wifi/network.h \
src/ui/widgets/dialogs/wifi/wifilogger.h \
src/ui/widgets/misc/egg.h \
src/ui/widgets/reader/dictionarywidget.h \
src/ui/crypto/encryptionmanager.h \
src/functions.h \
src/widgets/dialogs/generaldialog.h \
src/homeWidget/homepagewidget.h \
src/widgets/misc/hourglassanimationwidget.h \
src/widgets/dialogs/kobox/koboxappsdialog.h \
src/settings/koboxsettings.h \
src/onlineLibrary/librarywidget.h \
src/localLibrary/locallibrarywidget.h \
src/homeWidget/mainwindow.h \
src/otaUpdate/otamanager.h \
src/widgets/interfaceWidgets/qclickablelabel.h \
src/widgets/interfaceWidgets/qtooltiplabel.h \
src/quit/quit.h \
src/reader/reader.h \
src/apps/savedwords.h \
src/widgets/text/searchresultswidget.h \
src/settings/settings.h \
src/settings/settingschooser.h \
src/widgets/text/textwidget.h \
src/widgets/interfaceWidgets/toast.h \
src/splash/usbmsSplash.h \
src/apps/userapps.h \
src/widgets/virtualKeyboard/virtualkeyboard.h \
src/widgets/virtualKeyboard/virtualkeypad.h \
src/widgets/dialogs/wifi/wifidialog.h \
src/widgets/dialogs/powerDaemon/sleepdialog.h \
src/ui/widgets/dialogs/generaldialog.h \
src/ui/home/homepagewidget.h \
src/ui/widgets/misc/hourglassanimationwidget.h \
src/ui/widgets/dialogs/kobox/koboxappsdialog.h \
src/ui/settings/koboxsettings.h \
src/ui/onlineLibrary/librarywidget.h \
src/ui/localLibrary/locallibrarywidget.h \
src/ui/home/mainwindow.h \
src/ui/otaUpdate/otamanager.h \
src/ui/widgets/interfaceWidgets/qclickablelabel.h \
src/ui/widgets/interfaceWidgets/qtooltiplabel.h \
src/ui/quit/quit.h \
src/ui/reader/reader.h \
src/ui/apps/savedwords.h \
src/ui/widgets/text/searchresultswidget.h \
src/ui/settings/settings.h \
src/ui/settings/settingschooser.h \
src/ui/widgets/text/textwidget.h \
src/ui/widgets/interfaceWidgets/toast.h \
src/ui/splash/usbmsSplash.h \
src/ui/apps/userapps.h \
src/ui/widgets/virtualKeyboard/virtualkeyboard.h \
src/ui/widgets/virtualKeyboard/virtualkeypad.h \
src/ui/widgets/dialogs/wifi/wifidialog.h \
src/ui/widgets/dialogs/powerDaemon/sleepdialog.h \
src/powerDaemon/sleepthread.h \
src/settings/powerdaemonsettings.h
src/ui/settings/powerdaemonsettings.h
FORMS += \
src/apps/todo.ui \
src/splash/alert.ui \
src/apps/apps.ui \
src/widgets/dialogs/audio/audiodialog.ui \
src/widgets/dialogs/audio/audiofile.ui \
src/widgets/dialogs/audio/audiofilequeue.ui \
src/widgets/dialogs/library/bookinfodialog.ui \
src/widgets/dialogs/library/bookoptionsdialog.ui \
src/widgets/dialogs/brightnessdialog.ui \
src/apps/calendarapp.ui \
src/widgets/dialogs/reader/highlightslistdialog.ui \
src/widgets/dialogs/reader/textdialog.ui \
src/widgets/dialogs/wifi/connectiondialog.ui \
src/widgets/dialogs/wifi/network.ui \
src/widgets/dialogs/wifi/wifilogger.ui \
src/widgets/misc/egg.ui \
src/widgets/reader/dictionarywidget.ui \
src/encfs/encryptionmanager.ui \
src/widgets/dialogs/generaldialog.ui \
src/homeWidget/homepagewidget.ui \
src/widgets/misc/hourglassanimationwidget.ui \
src/widgets/dialogs/kobox/koboxappsdialog.ui \
src/settings/koboxsettings.ui \
src/onlineLibrary/librarywidget.ui \
src/localLibrary/locallibrarywidget.ui \
src/homeWidget/mainwindow.ui \
src/otaUpdate/otamanager.ui \
src/quit/quit.ui \
src/reader/reader.ui \
src/apps/savedwords.ui \
src/widgets/text/searchresultswidget.ui \
src/settings/settings.ui \
src/settings/settingschooser.ui \
src/widgets/text/textwidget.ui \
src/widgets/interfaceWidgets/toast.ui \
src/splash/usbmsSplash.ui \
src/apps/userapps.ui \
src/widgets/virtualKeyboard/virtualkeyboard.ui \
src/widgets/virtualKeyboard/virtualkeypad.ui \
src/widgets/dialogs/wifi/wifidialog.ui \
src/widgets/dialogs/powerDaemon/sleepdialog.ui \
src/settings/powerdaemonsettings.ui
src/ui/apps/todo.ui \
src/ui/apps/apps.ui \
src/ui/splash/splashAlert.ui \
src/ui/widgets/dialogs/audio/audiodialog.ui \
src/ui/widgets/dialogs/audio/audiofile.ui \
src/ui/widgets/dialogs/audio/audiofilequeue.ui \
src/ui/widgets/dialogs/library/bookinfodialog.ui \
src/ui/widgets/dialogs/library/bookoptionsdialog.ui \
src/ui/widgets/dialogs/brightnessdialog.ui \
src/ui/apps/calendarapp.ui \
src/ui/widgets/dialogs/reader/highlightslistdialog.ui \
src/ui/widgets/dialogs/reader/textdialog.ui \
src/ui/widgets/dialogs/wifi/connectiondialog.ui \
src/ui/widgets/dialogs/wifi/network.ui \
src/ui/widgets/dialogs/wifi/wifilogger.ui \
src/ui/widgets/misc/egg.ui \
src/ui/widgets/reader/dictionarywidget.ui \
src/ui/crypto/encryptionmanager.ui \
src/ui/widgets/dialogs/generaldialog.ui \
src/ui/home/homepagewidget.ui \
src/ui/widgets/misc/hourglassanimationwidget.ui \
src/ui/widgets/dialogs/kobox/koboxappsdialog.ui \
src/ui/settings/koboxsettings.ui \
src/ui/onlineLibrary/librarywidget.ui \
src/ui/localLibrary/locallibrarywidget.ui \
src/ui/home/mainwindow.ui \
src/ui/otaUpdate/otamanager.ui \
src/ui/quit/quit.ui \
src/ui/reader/reader.ui \
src/ui/apps/savedwords.ui \
src/ui/widgets/text/searchresultswidget.ui \
src/ui/settings/settings.ui \
src/ui/settings/settingschooser.ui \
src/ui/widgets/text/textwidget.ui \
src/ui/widgets/interfaceWidgets/toast.ui \
src/ui/splash/usbmsSplash.ui \
src/ui/apps/userapps.ui \
src/ui/widgets/virtualKeyboard/virtualkeyboard.ui \
src/ui/widgets/virtualKeyboard/virtualkeypad.ui \
src/ui/widgets/dialogs/wifi/wifidialog.ui \
src/ui/widgets/dialogs/powerDaemon/sleepdialog.ui \
src/ui/settings/powerdaemonsettings.ui
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
@ -173,7 +197,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
RESOURCES += \
src/eink.qrc
src/ui/eink.qrc
INCLUDEPATH += $$system(find ./ -type d -print -path ./.git -prune | grep -v "./.git")
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>
audiothread::audiothread() {}
AudioThread::AudioThread() {}
void audiothread::start() {
void AudioThread::start() {
log("Audio thread monitor available", className);
// 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.
// while (recv(client_sockfd, buffer_tmp, 1, 0) > 0) {
// ^ This line makes InkBox freeze
void audiothread::sendInfo(QString message) {
void AudioThread::sendInfo(QString message) {
log("Sending message: *" + message + "*", className);
// Send
sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
@ -113,7 +113,7 @@ void audiothread::sendInfo(QString message) {
}
// Mutex managed outside of the function
void audiothread::audioProgress() {
void AudioThread::audioProgress() {
global::audio::progressSeconds = global::audio::progressSeconds + 1;
// log("Progress, +1 sec: " + QString::number(global::audio::progressSeconds), className);
if(global::audio::progressSeconds >= global::audio::queue[global::audio::itemCurrentlyPlaying].lengths) {

View file

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

View file

@ -1,40 +1,42 @@
#ifndef FUNCTIONS_H
#define FUNCTIONS_H
#include <QCryptographicHash>
#include <QDateTime>
#include <QDebug>
#include <QDir>
#include <QDirIterator>
#include <QFile>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonParseError>
#include <QJsonValue>
#include <QMutex>
#include <QNetworkInterface>
#include <QProcess>
#include <QRandomGenerator>
#include <QString>
#include <QTextStream>
#include <fstream>
#include <QDir>
#include <QProcess>
#include <regex>
#include <QThread>
#include <QTimer>
#include <QDebug>
#include <QRandomGenerator>
#include <QDateTime>
#include <QDirIterator>
#include <QJsonDocument>
#include <QJsonParseError>
#include <QJsonObject>
#include <QJsonValue>
#include <QJsonArray>
#include <QCryptographicHash>
#include <QNetworkInterface>
#include <QMutex>
#include <fstream>
#include <regex>
#include <stdio.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include "device.h"
// WoW, global variables and namespaces are awesome
namespace global {
namespace battery {
inline bool showLowBatteryDialog;
inline bool showCriticalBatteryAlert;
inline bool batteryAlertLock;
}
} //namespace battery
namespace reader {
inline QString bookFile;
inline int pageNumber;
@ -53,13 +55,13 @@ namespace global {
inline int fontSize;
inline int margins;
inline QString currentViewportText;
}
} //namespace reader
namespace kobox {
inline bool showKoboxSplash;
inline bool koboxSettingsRebootDialog;
inline bool resetKoboxUserDataBool;
inline bool resetKoboxDialog;
}
} //namespace kobox
namespace mainwindow {
namespace tabSwitcher {
inline bool repaint;
@ -72,16 +74,16 @@ namespace global {
inline bool libraryWidgetSelected;
inline bool localLibraryWidgetCreated;
inline bool localLibraryWidgetSelected;
}
} //namespace tabSwitcher
inline bool updateDialog;
inline bool lowBatteryDialog;
}
} //namespace mainwindow
namespace usbms {
inline bool usbmsDialog;
inline bool showUsbmsDialog;
inline bool launchUsbms;
inline bool koboxExportExtensions;
}
} //namespace usbms
namespace settings {
inline bool settingsRebootDialog;
}
@ -89,7 +91,7 @@ namespace global {
inline bool textBrowserDialog;
inline QString textBrowserContents;
inline QString textBrowserTitle = ""; // At default: empty; "Information" will be displayed
}
} //namespace text
namespace keyboard {
inline bool keyboardDialog;
inline bool keypadDialog;
@ -101,20 +103,17 @@ namespace global {
inline QString keyboardText;
inline QString keypadText;
inline bool embed = true;
}
} //namespace keyboard
namespace toast {
inline QString message;
inline bool modalToast;
inline bool indefiniteToast;
inline int delay;
}
namespace device {
inline bool isWifiAble;
}
} //namespace toast
namespace otaUpdate {
inline bool isUpdateOta;
inline bool downloadOta;
}
} //namespace otaUpdate
namespace encfs {
inline QString passphrase;
inline QString unlockTime;
@ -126,7 +125,7 @@ namespace global {
inline bool disableStorageEncryptionDialog;
inline bool errorNoBooksInDropboxDialog;
inline bool repackDialog;
}
} //namespace encfs
namespace library {
inline unsigned long bookId;
inline bool isLatestBook;
@ -135,7 +134,7 @@ namespace global {
inline bool librarySearchDialog;
inline bool libraryResults;
inline bool librarySyncDialog;
}
} //namespace library
namespace bookInfoDialog {
inline bool localInfoDialog;
}
@ -157,8 +156,8 @@ namespace global {
inline bool bookPinAction;
inline QString folderPath;
inline bool isFolder = false;
}
}
} //namespace bookOptionsDialog
} //namespace localLibrary
namespace localStorage {
inline QStringList searchResultsPaths;
}
@ -171,7 +170,7 @@ namespace global {
inline bool appCompatibilityLastContinueStatus = true; // This is for RequiredFeatures to show only one dialog if 'Cancel' is clicked.
inline bool appInfoDialog;
inline bool launchApp;
}
} //namespace userApps
namespace homePageWidget {
static inline int recentBooksNumber = 8;
static inline int recentBooksNumberPerRow = 4;
@ -179,7 +178,7 @@ namespace global {
static inline int pinnedBooksNumber = 4;
static inline int pinnedBooksNumberPerRow = 4;
static inline int pinnedBooksRowNumber = global::homePageWidget::pinnedBooksNumber / global::homePageWidget::pinnedBooksNumberPerRow;
}
} //namespace homePageWidget
namespace highlightsListDialog {
inline QString bookPath;
}
@ -198,7 +197,7 @@ namespace global {
bool encryption;
int signal;
};
}
} //namespace wifi
namespace audio {
inline bool enabled = false;
struct musicFile {
@ -229,33 +228,17 @@ namespace global {
inline bool firstScan = true;
inline int volumeLevel = 40; // Default save value
inline bool songChanged = false;
}
} //namespace audio
namespace telemetry {
inline bool enabled = false;
inline bool telemetryDialog = false;
}
inline QString systemInfoText;
} //namespace telemetry
inline bool forbidOpenSearchDialog;
inline bool isN705 = false;
inline bool isN905C = false;
inline bool isN613 = false;
inline bool isN873 = false;
inline bool isN236 = false;
inline bool isN437 = false;
inline bool isN306 = false;
inline bool isN249 = false;
inline bool isKT = false;
inline bool runningInstanceIsReaderOnly;
inline QString deviceID;
}
} //namespace global
// https://stackoverflow.com/questions/6080853/c-multiple-definition-error-for-global-functions-in-the-header-file/20679534#20679534
namespace {
QString deviceUID;
QString device;
QString batteryLevel;
QString kernelVersion;
int batteryLevelInt;
int defaultEpubPageWidth;
int defaultEpubPageHeight;
int defaultPdfPageWidth;
@ -302,13 +285,12 @@ namespace {
config.close();
if (content.contains("true")) {
return true;
}
else {
} else {
return false;
}
}
else {
QString function = __func__; log(function + ": Warning: File '" + file + "' doesn't exist, returning false", "functions");
} else {
QString function = __func__;
log(function + ": Warning: File '" + file + "' doesn't exist, returning false", "functions");
return false;
}
return 0;
@ -316,48 +298,7 @@ namespace {
void setDefaultWorkDir() {
QDir::setCurrent("/mnt/onboard/.adds/inkbox");
}
int brightnessCheckconfig(QString file) {
if(QFile::exists(file)) {
QFile config(file);
config.open(QIODevice::ReadWrite);
QTextStream in (&config);
const QString content = in.readAll();
int contentInt = content.toInt();
return contentInt;
config.close();
}
else {
return EXIT_FAILURE;
}
return 0;
}
void setBrightness(int value) {
if(global::deviceID == "n249\n") {
if(QFile::exists("/var/run/brightness_write")) {
std::ofstream fhandler;
fhandler.open("/var/run/brightness_write");
fhandler << value;
fhandler.close();
}
}
else {
if(QFile::exists("/var/run/brightness")) {
std::ofstream fhandler;
fhandler.open("/var/run/brightness");
fhandler << value;
fhandler.close();
}
}
}
void setBrightness_ntxio(int value) {
// Thanks to Kevin Short for this (GloLight)
int light;
if((light = open("/dev/ntx_io", O_RDWR)) == -1) {
fprintf(stderr, "Error opening ntx_io device\n");
}
ioctl(light, 241, value);
close(light);
}
int displayQuote() {
int quoteNumber = QRandomGenerator::global()->bounded(1, 6);
return quoteNumber;
@ -368,9 +309,9 @@ namespace {
QTextStream stream(&file);
stream << content;
return true;
}
else {
QString function = __func__; log(function + ": Failed to write string '" + content + "' to file '" + filename + "'", "functions");
} else {
QString function = __func__;
log(function + ": Failed to write string '" + content + "' to file '" + filename + "'", "functions");
return false;
}
}
@ -381,103 +322,11 @@ namespace {
QTextStream in(&fileToRead);
QString content = in.readAll();
return content;
}
else {
} else {
return NULL;
}
}
void brightnessWriteconfig(int value) {
std::ofstream fhandler;
fhandler.open(".config/03-brightness/config");
fhandler << value;
fhandler.close();
}
void warmthWriteconfig(int value) {
std::ofstream fhandler;
fhandler.open(".config/03-brightness/config-warmth");
fhandler << value;
fhandler.close();
}
int getBrightness() {
if(global::deviceID == "n613\n") {
QString brightnessConfig = readFile(".config/03-brightness/config");
int brightness;
if(brightnessConfig.isEmpty()) {
brightness = 0;
}
else {
brightness = brightnessConfig.toInt();
}
return brightness;
}
else {
if(QFile::exists("/var/run/brightness")) {
QFile brightness("/var/run/brightness");
brightness.open(QIODevice::ReadOnly);
QString valuestr = brightness.readAll();
int value = valuestr.toInt();
brightness.close();
return value;
}
else {
return 0;
}
}
return 0;
}
QString getPowerSupplyOfType(QString type) {
QDirIterator supplies("/sys/class/power_supply", QDirIterator::NoIteratorFlags);
while(supplies.hasNext()) {
supplies.next();
QString supply = supplies.filePath();
// Badly-classified device by some ntx kernels, ignore
if ((type == "Battery") &&
(supplies.fileName() == "mc13892_charger")) {
continue;
}
if (readFile(supplies.filePath() + "/type").trimmed() == type) {
return supply;
}
}
return NULL;
}
QString getBatteryFile() {
static QString capacity;
if (capacity.isNull()) {
QString battery = getPowerSupplyOfType("Battery");
if (!battery.isNull()) {
capacity = battery + "/capacity";
}
}
return capacity;
}
void getBatteryLevel() {
batteryLevelInt = 100;
batteryLevel = "100%";
if(global::deviceID == "kt\n") {
if(QFile::exists("/sys/devices/system/yoshi_battery/yoshi_battery0/battery_capacity")) {
batteryLevel = readFile("/sys/devices/system/yoshi_battery/yoshi_battery0/battery_capacity").trimmed();
batteryLevelInt = batteryLevel.toInt();
batteryLevel.append("%");
}
}
else {
// probably superfluous, catched by default
if(QFile::exists("/sys/devices/platform/pmic_battery.1/power_supply/mc13892_bat/capacity")) {
batteryLevel = readFile("/sys/devices/platform/pmic_battery.1/power_supply/mc13892_bat/capacity").trimmed();
batteryLevelInt = batteryLevel.toInt();
batteryLevel.append("%");
}
else {
QString path = getBatteryFile();
if(QFile::exists(path)) {
batteryLevel = readFile(path).trimmed();
batteryLevelInt = batteryLevel.toInt();
batteryLevel.append("%");
}
}
}
}
void writeconfig(std::string file, std::string config) {
std::ofstream fhandler;
fhandler.open(file);
@ -498,43 +347,12 @@ namespace {
if (std::regex_search(contentstr, m, r)) {
return true;
}
else {
} else {
return false;
}
return 0;
};
bool isBatteryLow() {
// Checks if battery level is under 15% of total capacity.
getBatteryLevel();
if(batteryLevelInt <= 15) {
return true;
}
else {
return false;
}
return 0;
}
bool isBatteryCritical() {
// Checks if the battery level is critical (i.e. <= 5%)
getBatteryLevel();
if(batteryLevelInt <= 5) {
QString function = __func__; log(function + ": Battery is at a critical charge level!", "functions");
return true;
}
else {
return false;
}
return 0;
}
void zeroBrightness() {
if(global::deviceID != "n613\n") {
setBrightness(0);
}
else {
setBrightness_ntxio(0);
}
}
void poweroff(bool splash) {
log("Powering off", "functions");
if (splash == true) {
@ -544,8 +362,7 @@ namespace {
proc->start(prog, args);
proc->waitForFinished();
proc->deleteLater();
}
else {
} else {
QString prog("/sbin/poweroff");
QStringList args;
args << "no_splash";
@ -561,20 +378,20 @@ namespace {
QString prog("/sbin/reboot");
QStringList args;
if (global::kobox::resetKoboxUserDataBool == true) {
args << "splash" << "reset_kobox";
args << "splash"
<< "reset_kobox";
}
QProcess *proc = new QProcess();
proc->start(prog, args);
proc->waitForFinished();
proc->deleteLater();
}
else {
} else {
QString prog("/sbin/reboot");
QStringList args;
if (global::kobox::resetKoboxUserDataBool == true) {
args << "no_splash" << "reset_kobox";
}
else {
args << "no_splash"
<< "reset_kobox";
} else {
args << "no_splash";
}
QProcess *proc = new QProcess();
@ -583,57 +400,14 @@ namespace {
proc->deleteLater();
}
}
QString getUID() {
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();
deviceUID = proc->readAllStandardOutput();
deviceUID = deviceUID.left(256);
proc->deleteLater();
return deviceUID;
}
void getKernelVersion() {
QString prog ("uname");
QStringList args;
args << "-r";
QProcess *proc = new QProcess();
proc->start(prog, args);
proc->waitForFinished();
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();
kernelVersion.append(", build ");
kernelVersion.append(kernelBuildID);
QString kernelCommit = readFile("/external_root/run/kernel_commit").trimmed();
kernelVersion.append(", commit ");
kernelVersion.append(kernelCommit);
}
QString getConnectionInformation() {
QString getIpProg("sh");
QStringList getIpArgs;
if(global::deviceID != "n437\n" and global::deviceID != "n249\n") {
getIpArgs << "-c" << "/sbin/ifconfig eth0 | grep 'inet addr' | cut -d: -f2 | awk '{print $1}'";
}
else {
getIpArgs << "-c" << "/sbin/ifconfig wlan0 | grep 'inet addr' | cut -d: -f2 | awk '{print $1}'";
}
getIpArgs << "-c"
<< "/sbin/ifconfig " + Device::getSingleton()->getNetworkInterfaceName() + " | grep 'inet addr' | cut -d: -f2 | awk '{print $1}'";
QProcess *getIpProc = new QProcess();
getIpProc->start(getIpProg, getIpArgs);
getIpProc->waitForFinished();
@ -646,26 +420,7 @@ namespace {
getIpProc->deleteLater();
return ipAddress;
}
void getSystemInfo() {
getUID();
getKernelVersion();
global::systemInfoText = "<b>InkBox OS version ";
global::systemInfoText.append(readFile("/external_root/opt/isa/version"));
global::systemInfoText.append("</b><br>Copyright <font face='Inter'>©</font> 2021-2024 Nicolas Mailloux and contributors<br>Special thanks to: Szybet, NiLuJe, akemnade, Rain92 (GitHub)");
global::systemInfoText.append("<br><b>GUI Git commit:</b> ");
global::systemInfoText.append(GIT_VERSION);
global::systemInfoText.append("<br><b>Device UID:</b> ");
global::systemInfoText.append(deviceUID);
global::systemInfoText.append("<br><b>Kernel version:</b> ");
global::systemInfoText.append(kernelVersion);
global::systemInfoText.append("<br><b>Device:</b> ");
QString device = global::deviceID.trimmed();
global::systemInfoText.append(device);
QString ipAddress = getConnectionInformation();
global::systemInfoText.append("<br><b>IP address: </b>");
global::systemInfoText.append(ipAddress);
}
void resetKoboxUserData() {
log("Resetting KoBox user data", "functions");
global::kobox::resetKoboxUserDataBool = true;
@ -682,7 +437,8 @@ namespace {
proc->waitForFinished();
QString returnedMetadata = proc->readAllStandardOutput();
QString function = __func__; log(function + ": ePUB metadata is: " + returnedMetadata, "functions");
QString function = __func__;
log(function + ": ePUB metadata is: " + returnedMetadata, "functions");
return returnedMetadata;
}
void defineDefaultPageSize(int fileType) {
@ -690,64 +446,56 @@ namespace {
* 0: ePUB
* 1: PDF
*/
Device *device = Device::getSingleton();
Device::ScreenSize screenSize = device->getScreenSize();
if (fileType == 0) {
if(global::deviceID == "n705\n") {
if (screenSize == Device::ScreenSize::SMALL) {
defaultEpubPageHeight = 365;
defaultEpubPageWidth = 365;
}
else if(global::deviceID == "n905\n" or global::deviceID == "kt\n") {
} else if (screenSize == Device::ScreenSize::MEDIUM) {
defaultEpubPageHeight = 425;
defaultEpubPageWidth = 425;
}
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") {
} else if (screenSize == Device::ScreenSize::LARGE) {
defaultEpubPageHeight = 450;
defaultEpubPageWidth = 450;
}
else if(global::deviceID == "n873\n") {
} else if (screenSize == Device::ScreenSize::VERY_LARGE) {
defaultEpubPageHeight = 525;
defaultEpubPageWidth = 525;
}
QString function = __func__;
log(function + ": Defined default ePUB page height to " + QString::number(defaultEpubPageHeight), "functions");
log(function + ": Defined default ePUB page width to " + QString::number(defaultEpubPageWidth), "functions");
}
else if(fileType == 1) {
if(global::deviceID == "n705\n" or global::deviceID == "n905\n" or global::deviceID == "kt\n") {
} else if (fileType == 1) {
if (screenSize == Device::ScreenSize::SMALL) {
if (global::reader::pdfOrientation == 0) {
defaultPdfPageHeight = 750;
defaultPdfPageWidth = 550;
}
else {
} else {
defaultPdfPageHeight = 550;
defaultPdfPageWidth = 750;
}
}
else if(global::deviceID == "n613\n" or global::deviceID == "n236\n" or global::deviceID == "n306\n" or global::deviceID == "emu\n") {
} else if (screenSize == Device::ScreenSize::MEDIUM) {
if (global::reader::pdfOrientation == 0) {
defaultPdfPageHeight = 974;
defaultPdfPageWidth = 708;
}
else {
} else {
defaultPdfPageHeight = 708;
defaultPdfPageWidth = 974;
}
}
else if(global::deviceID == "n437\n" or global::deviceID == "n249\n") {
} else if (screenSize == Device::ScreenSize::LARGE) {
if (global::reader::pdfOrientation == 0) {
defaultPdfPageHeight = 1398;
defaultPdfPageWidth = 1022;
}
else {
} else {
defaultPdfPageHeight = 1022;
defaultPdfPageWidth = 1398;
}
}
else if(global::deviceID == "n873\n") {
} else if (screenSize == Device::ScreenSize::VERY_LARGE) {
if (global::reader::pdfOrientation == 0) {
defaultPdfPageHeight = 1630;
defaultPdfPageWidth = 1214;
}
else {
} else {
defaultPdfPageHeight = 1214;
defaultPdfPageWidth = 1630;
}
@ -757,108 +505,7 @@ namespace {
log(function + "Defined default PDF page width to " + QString::number(defaultPdfPageWidth), "functions");
}
}
void preSetBrightness(int brightnessValue) {
if(global::deviceID == "n705\n" or global::deviceID == "n905\n" or global::deviceID == "n873\n" or global::deviceID == "n236\n" or global::deviceID == "n437\n" or global::deviceID == "n306\n" or global::deviceID == "n249\n" or global::deviceID == "kt\n") {
setBrightness(brightnessValue);
}
else if(global::deviceID == "n613\n") {
setBrightness_ntxio(brightnessValue);
}
else {
setBrightness(brightnessValue);
}
}
void cinematicBrightness(int value, int mode) {
/* mode can be 0, 1, or 2, respectively:
* 0: Bring UP brightness
* 1: Bring DOWN brightness
* 2: Auto; smooth brightness transition between two brightness levels
*/
if(global::deviceID != "n705\n" && global::deviceID != "n905\n" && global::deviceID != "kt\n") {
QString function = __func__; log(function + ": Setting brightness to " + QString::number(value), "functions");
}
if(mode == 0) {
int brightness = 0;
while(brightness != value) {
brightness = brightness + 1;
preSetBrightness(brightness);
QThread::msleep(30);
}
}
else if(mode == 1) {
int brightness = getBrightness();
while(brightness != 0) {
brightness = brightness - 1;
preSetBrightness(brightness);
QThread::msleep(30);
}
}
else if(mode == 2) {
int brightness = getBrightness();
if(brightness <= value) {
while(brightness != value) {
brightness = brightness + 1;
preSetBrightness(brightness);
QThread::msleep(30);
}
}
else if(brightness >= value) {
while(brightness != value) {
brightness = brightness - 1;
preSetBrightness(brightness);
QThread::msleep(30);
}
}
}
}
int getWarmth() {
QString sysfsWarmthPath;
int warmthValue;
if(global::deviceID == "n873\n") {
sysfsWarmthPath = "/sys/class/backlight/lm3630a_led/color";
}
else if(global::deviceID == "n249\n") {
sysfsWarmthPath = "/sys/class/backlight/backlight_warm/actual_brightness";
}
QString warmthConfig = readFile(sysfsWarmthPath);
warmthValue = warmthConfig.toInt();
if (global::deviceID == "n873\n") {
warmthValue = 10 - warmthValue;
}
return warmthValue;
}
void setWarmth(int warmthValue) {
QString sysfsWarmthPath;
QString warmthValueStr;
if(global::deviceID == "n873\n") {
// Value 0 gives a warmer lighting than value 10
warmthValue = 10 - warmthValue;
warmthValueStr = QString::number(warmthValue);
sysfsWarmthPath = "/sys/class/backlight/lm3630a_led/color";
}
else if(global::deviceID == "n249\n") {
warmthValueStr = QString::number(warmthValue);
sysfsWarmthPath = "/sys/class/backlight/backlight_warm/brightness";
}
writeFile(sysfsWarmthPath, warmthValueStr);
}
void cinematicWarmth(int warmthValue) {
int currentWarmth = getWarmth();
if(warmthValue < currentWarmth) {
while(warmthValue < currentWarmth) {
currentWarmth--;
setWarmth(currentWarmth);
QThread::msleep(30);
}
}
else if(warmthValue > currentWarmth) {
while(warmthValue > currentWarmth) {
currentWarmth++;
setWarmth(currentWarmth);
QThread::msleep(30);
}
}
}
void installUpdate() {
log("Installing update package", "functions");
writeFile("/mnt/onboard/onboard/.inkbox/can_really_update", "true\n");
@ -869,43 +516,14 @@ namespace {
bool getEncFSStatus() {
return checkconfig("/external_root/run/encfs_mounted");
}
bool isUsbPluggedIn() {
if(global::deviceID == "kt\n") {
if(readFile("/sys/devices/system/yoshi_battery/yoshi_battery0/battery_status") == "1\n") {
return 1;
}
else {
return 0;
}
}
else if(global::deviceID == "n249\n") {
if(readFile("/sys/class/power_supply/rn5t618-battery/status") != "Discharging\n") {
return 1;
}
else {
return 0;
}
}
else {
// 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");
}
unsigned long ptr = 0U;
ioctl(ntxfd, 108, &ptr);
close(ntxfd);
return !!ptr;
}
}
void updateUserAppsMainJsonFile() {
QDirIterator appsDir("/mnt/onboard/onboard/.apps", QDirIterator::NoIteratorFlags);
QFile newJsonFile = QFile{ "/mnt/onboard/onboard/.apps/apps.json" };
QJsonDocument newJsonDocument;
QJsonArray array;
while (appsDir.hasNext())
{
while (appsDir.hasNext()) {
QDir dir(appsDir.next());
if (dir.exists() == true) {
if (dir.path().split("/").last().contains(".") == false) {
@ -920,13 +538,11 @@ namespace {
QJsonObject jsonSmallMainObj = jsonSmallDoc["app"].toObject();
array.append(jsonSmallMainObj);
}
else {
} else {
log("Error: User application '" + appsDir.path() + "''s JSON file descriptor is missing main object 'app'", "main");
}
}
else {
} else {
QString message = "User application '" + appsDir.path() + "' does not contain any 'app.json' file: ";
message.append(jsonSmall.fileName());
log(message, "main");
@ -965,7 +581,8 @@ namespace {
if (dir.exists() == true) {
if (dir.path().split("/").last().toLower().contains(appName.toLower()) == true) {
QJsonObject root;
root["app"] = refJsonObject.toObject();;
root["app"] = refJsonObject.toObject();
;
QJsonDocument newJsonDocument;
newJsonDocument.setObject(root);
@ -998,9 +615,9 @@ namespace {
if (database.open(QIODevice::ReadOnly)) {
data = database.readAll();
database.close();
}
else {
QString function = __func__; log(function + ": Failed to open local library database file for reading at '" + database.fileName() + "'", "functions");
} else {
QString function = __func__;
log(function + ": Failed to open local library database file for reading at '" + database.fileName() + "'", "functions");
}
// Parse JSON data
@ -1015,9 +632,9 @@ namespace {
if (database.open(QIODevice::ReadOnly)) {
data = database.readAll();
database.close();
}
else {
QString function = __func__; log(function + ": Failed to open highlights database file for reading at '" + database.fileName() + "'", "functions");
} else {
QString function = __func__;
log(function + ": Failed to open highlights database file for reading at '" + database.fileName() + "'", "functions");
}
// Parse JSON data
@ -1034,9 +651,9 @@ namespace {
if (database.open(QIODevice::ReadOnly)) {
data = database.readAll();
database.close();
}
else {
QString function = __func__; log(function + ": Failed to open To-Do database file for reading at '" + database.fileName() + "'", "functions");
} else {
QString function = __func__;
log(function + ": Failed to open To-Do database file for reading at '" + database.fileName() + "'", "functions");
}
// Parse JSON data
@ -1055,8 +672,7 @@ namespace {
firstJsonObject.insert("T-" + QUuid::createUuid().toString(QUuid::WithoutBraces), QJsonValue(text));
mainJsonObject["Book1"] = firstJsonObject;
writeHighlightsDatabase(mainJsonObject);
}
else {
} else {
QJsonObject jsonObject = readHighlightsDatabase();
bool highlightWrote = false;
int length = jsonObject.length();
@ -1072,8 +688,7 @@ namespace {
while (true) {
if (highlightJsonObject.contains(uuid)) {
uuid = "T-" + QUuid::createUuid().toString(QUuid::WithoutBraces);
}
else {
} else {
break;
}
}
@ -1097,8 +712,7 @@ namespace {
highlightWrote = true;
}
}
}
else {
} else {
QJsonObject jsonObject = readHighlightsDatabase();
int length = jsonObject.length();
for (int i = 1; i <= length; i++) {
@ -1128,27 +742,19 @@ namespace {
return QJsonObject();
}
float determineYIncrease() {
if(global::deviceID == "n705\n" or global::deviceID == "n905\n") {
Device::ScreenSize screenSize = Device::getSingleton()->getScreenSize();
if (screenSize == Device::ScreenSize::SMALL) {
return 2;
}
else if(global::deviceID == "n613\n" or global::deviceID == "n236\n" or global::deviceID == "n306\n" or global::deviceID == "emu\n") {
} else if (screenSize <= Device::ScreenSize::LARGE) {
return 2.6;
}
else if(global::deviceID == "n437\n" or global::deviceID == "n249\n" or global::deviceID == "n873\n") {
} else if (screenSize == Device::ScreenSize::VERY_LARGE) {
return 3;
}
else {
return 2;
}
}
global::wifi::wifiState checkWifiState() {
QString interfaceName;
if(global::deviceID == "n437\n" or global::deviceID == "n249\n" or global::deviceID == "kt\n") {
interfaceName = "wlan0";
}
else {
interfaceName = "eth0";
}
QString interfaceName = Device::getSingleton()->getNetworkInterfaceName();
// Check if network interface has an IP address
QNetworkInterface iface = QNetworkInterface::interfaceFromName(interfaceName);
@ -1157,14 +763,12 @@ namespace {
// Interface is up and has an IP address
global::wifi::isConnected = true;
return global::wifi::wifiState::configured;
}
else {
} else {
if (QFile::exists("/sys/class/net/" + interfaceName + "/operstate")) {
// Interface is up but doesn't have an IP address
global::wifi::isConnected = false;
return global::wifi::wifiState::enabled;
}
else {
} else {
// Interface is not up
global::wifi::isConnected = false;
return global::wifi::wifiState::disabled;
@ -1173,11 +777,13 @@ namespace {
}
int testPing(QString ipAddress = "1.1.1.1") {
// For some reason, implementing a non-blocking version of this functions triggers a "terminate called without an active exception" error with a platform plugin compiled with a newer GCC 11 toolchain. The problem has been solved by transplanting this function into the related area which uses it.
QString function = __func__; log(function + ": pinging IP address " + ipAddress, "functions");
QString function = __func__;
log(function + ": pinging IP address " + ipAddress, "functions");
QProcess *pingProcess = new QProcess();
QString pingProg = "ping";
QStringList pingArgs;
pingArgs << "-c" << "1" << ipAddress;
pingArgs << "-c"
<< "1" << ipAddress;
pingProcess->start(pingProg, pingArgs);
pingProcess->waitForFinished();
int exitCode = pingProcess->exitCode();
@ -1185,8 +791,7 @@ namespace {
if (exitCode == 0) {
log("Ping successful", "functions");
global::wifi::isConnected = true;
}
else {
} else {
log("Ping unsuccessful", "functions");
if (ipAddress == "1.1.1.1") {
global::wifi::isConnected = false;
@ -1220,8 +825,7 @@ namespace {
QString str;
if (option == true) {
str = "true";
}
else {
} else {
str = "false";
}
std::ofstream fhandler;
@ -1229,6 +833,6 @@ namespace {
fhandler << str.toStdString();
fhandler.close();
}
}
} //namespace
#endif // FUNCTIONS_H

File diff suppressed because it is too large Load diff

View file

@ -15,25 +15,26 @@
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 "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 <QFile>
#include <QTextStream>
#include <QRect>
#include <QScreen>
#include <QTextCodec>
#include <QTextStream>
int main(int argc, char *argv[])
{
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
QTextCodec::setCodecForLocale(QTextCodec::codecForName("utf8"));
@ -43,20 +44,23 @@ int main(int argc, char *argv[])
}
}
global::deviceID = readFile("/opt/inkbox_device");
log("Running on device " + global::deviceID, "main", true);
QString deviceID = readFile("/opt/inkbox_device");
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
writeFile("/tmp/inkbox_running", "true");
setDefaultWorkDir();
if(checkconfig("/run/wifi_able") == true) {
if (Device::getSingleton()->supportsWifi()) {
log("Device has Wi-Fi capabilities", "main");
global::device::isWifiAble = true;
}
else {
} else {
log("Device does not have Wi-Fi capabilities", "main");
global::device::isWifiAble = false;
}
if (QFile::exists("/tmp/currentlyRunningUserApplication")) {
@ -82,8 +86,7 @@ int main(int argc, char *argv[])
QFile::remove("/tmp/gui_apps_started");
updateUserAppsMainJsonFile();
break;
}
else {
} else {
log("GUI apps service failed to start", "main");
QFile::remove("/tmp/gui_apps_started");
break;
@ -95,14 +98,14 @@ int main(int argc, char *argv[])
}
// Power daemon-related stuff
sleepDialog * sleepDialogWindow = new sleepDialog;
SleepDialog *sleepDialogWindow = new SleepDialog;
// https://wiki.qt.io/QThreads_general_usage
QThread *IPDThread = new QThread();
sleepThread * sleepThreadWindow = new sleepThread();
SleepThread *sleepThreadWindow = new SleepThread();
sleepThreadWindow->moveToThread(IPDThread);
QObject::connect(IPDThread, &QThread::started, sleepThreadWindow, &sleepThread::start);
QObject::connect(sleepThreadWindow, &sleepThread::startDialog, sleepDialogWindow, &sleepDialog::launchSleepDialog);
QObject::connect(sleepThreadWindow, &sleepThread::stopDialog, sleepDialogWindow, &sleepDialog::hideSleepDialog);
QObject::connect(IPDThread, &QThread::started, sleepThreadWindow, &SleepThread::start);
QObject::connect(sleepThreadWindow, &SleepThread::startDialog, sleepDialogWindow, &SleepDialog::launchSleepDialog);
QObject::connect(sleepThreadWindow, &SleepThread::stopDialog, sleepDialogWindow, &SleepDialog::hideSleepDialog);
IPDThread->start();
// Audio stuff
@ -110,42 +113,38 @@ int main(int argc, char *argv[])
log("Audio is enabled", "main");
global::audio::enabled = true;
QThread *audioThread = new QThread();
audiothread * audioObject = new audiothread();
AudioThread *audioObject = new AudioThread();
audioObject->moveToThread(audioThread);
QObject::connect(audioThread, &QThread::started, audioObject, &audiothread::start);
QObject::connect(audioThread, &QThread::started, audioObject, &AudioThread::start);
audioThread->start();
}
else {
} else {
log("Audio is disabled", "main");
}
if (checkconfig(".config/18-encrypted_storage/status") == true and checkconfig("/external_root/run/encfs_mounted") == false) {
// Open Encryption Manager to unlock encrypted storage
encryptionManager w;
CryptoManagerWidget w;
const QScreen *screen = qApp->primaryScreen();
w.setGeometry(QRect(QPoint(0, 0), screen->geometry().size()));
w.show();
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");
encryptionManager w;
CryptoManagerWidget w;
const QScreen *screen = qApp->primaryScreen();
w.setGeometry(QRect(QPoint(0, 0), screen->geometry().size()));
w.show();
return a.exec();
}
else {
} else {
// Variables
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.
if(global::deviceID != "emu\n") {
if(isBatteryCritical() == true) {
if(!isUsbPluggedIn()) {
if (Device::getSingleton()->getBatteryLevel() <= 5) {
if (!Device::getSingleton()->isUSBPluggedIn()) {
global::battery::showCriticalBatteryAlert = true;
alert w;
SplashAlertWidget w;
const QScreen *screen = qApp->primaryScreen();
w.setGeometry(QRect(QPoint(0, 0), screen->geometry().size()));
@ -153,11 +152,10 @@ int main(int argc, char *argv[])
return a.exec();
}
}
}
// 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) {
alert w;
SplashAlertWidget w;
const QScreen *screen = qApp->primaryScreen();
w.setGeometry(QRect(QPoint(0, 0), screen->geometry().size()));
@ -173,86 +171,21 @@ int main(int argc, char *argv[])
global::reader::skipOpenDialog = 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();
w.setGeometry(QRect(QPoint(0, 0), screen->geometry().size()));
w.show();
return a.exec();
}
else {
} else {
QProcess::execute("remount_tmpfs_launch.sh", QStringList());
MainWindow w;
QApplication::setStyle("windows");
QFile stylesheetFile("/mnt/onboard/.adds/inkbox/eink.qss");
stylesheetFile.open(QFile::ReadOnly);
w.setStyleSheet(stylesheetFile.readAll());
stylesheetFile.close();
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 {
;
}
UI::applyStyle(w, "eink");
const QScreen *screen = qApp->primaryScreen();
w.setGeometry(QRect(QPoint(0, 0), screen->geometry().size()));

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>
sleepThread::sleepThread() {}
SleepThread::SleepThread() {}
void sleepThread::start()
void SleepThread::start()
{
log("Sleep pipe thread active", className);
QDir pipeDirPath = QDir("/dev/ipd");

View file

@ -3,11 +3,11 @@
#include <QObject>
class sleepThread : public QObject {
class SleepThread : public QObject {
Q_OBJECT
public:
QString className = this->metaObject()->className();
sleepThread();
SleepThread();
public slots:
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 "device.h"
telemetry::telemetry(QObject *parent)
Telemetry::Telemetry(QObject *parent)
: QObject{parent}
{
QTimer::singleShot(100, this, SLOT(telemetrySlot()));
}
QJsonObject telemetry::collectDeviceInformation() {
QJsonObject Telemetry::collectDeviceInformation() {
Device::SysInfo info = Device::getSingleton()->getSystemInfo();
QJsonObject data;
data.insert("DeviceUID", getUID());
data.insert("DeviceUID", info.uid);
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")) {
data.insert("DeviceRooted", "true");
}
@ -27,7 +30,7 @@ QJsonObject telemetry::collectDeviceInformation() {
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);
// NOTE: This URL *will* change in the future
@ -46,7 +49,7 @@ bool telemetry::sendDeviceInformation(QJsonObject data) {
return true;
}
void telemetry::telemetrySlot() {
void Telemetry::telemetrySlot() {
QJsonObject data = collectDeviceInformation();
if(sendDeviceInformation(data)) {
writeFile("/mnt/onboard/.adds/inkbox/.config/24-telemetry/asked", "true");

View file

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

View file

@ -1,20 +1,22 @@
#include "apps.h"
#include "ui_apps.h"
#include "mainwindow.h"
#include "ui_apps.h"
#include "userapps.h"
#include "ui.h"
#include <QFile>
#include <QProcess>
#include <QJsonParseError>
#include <QJsonObject>
#include <QJsonValue>
#include <QJsonArray>
#include <QJsonObject>
#include <QJsonParseError>
#include <QJsonValue>
#include <QProcess>
#include <QScreen>
apps::apps(QWidget *parent) :
AppsWidget::AppsWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::apps)
{
ui(new Ui::AppsWidget) {
Device *device = Device::getSingleton();
ui->setupUi(this);
ui->koboxAppsOpenButton->setProperty("type", "borderless");
ui->calendarLaunchBtn->setProperty("type", "borderless");
@ -46,14 +48,13 @@ apps::apps(QWidget *parent) :
}
// 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(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->vncLaunchBtn->hide();
ui->vncViewerLabel->deleteLater();
ui->vncLaunchBtn->deleteLater();
}
}
else {
} else {
if (checkconfig("/external_root/boot/flags/X11_START") == false or checkconfig("/external_root/boot/flags/X11_STARTED") == false) {
ui->vncViewerLabel->hide();
ui->vncLaunchBtn->hide();
@ -71,94 +72,83 @@ apps::apps(QWidget *parent) :
jsonParseSuccess = parseJson();
showUserApps(false);
QFile stylesheetFile("/mnt/onboard/.adds/inkbox/eink.qss");
stylesheetFile.open(QFile::ReadOnly);
this->setStyleSheet(stylesheetFile.readAll());
stylesheetFile.close();
UI::applyStyle(*this, "eink");
}
apps::~apps()
{
AppsWidget::~AppsWidget() {
delete ui;
}
void apps::exitSlot() {
apps::close();
void AppsWidget::exitSlot() {
AppsWidget::close();
}
void apps::on_savedWordsLaunchBtn_clicked()
{
void AppsWidget::on_savedWordsLaunchBtn_clicked() {
log("Launching Saved Words app", className);
savedWordsWindow = new savedwords();
savedWordsWindow = new SavedWordsAppWidget();
savedWordsWindow->setAttribute(Qt::WA_DeleteOnClose);
savedWordsWindow->showFullScreen();
}
void apps::on_calendarLaunchBtn_clicked()
{
void AppsWidget::on_calendarLaunchBtn_clicked() {
log("Launching Calendar app", className);
calendarWindow = new calendarApp();
calendarWindow = new CalendarAppWidget();
calendarWindow->setAttribute(Qt::WA_DeleteOnClose);
calendarWindow->showFullScreen();
}
void apps::on_calculatorLaunchBtn_clicked()
{
void AppsWidget::on_calculatorLaunchBtn_clicked() {
log("Launching external Qalculate! app", className);
QProcess process;
process.startDetached("qalculate", QStringList());
qApp->quit();
}
void apps::on_koboxAppsOpenButton_clicked()
{
void AppsWidget::on_koboxAppsOpenButton_clicked() {
log("Showing KoBox Apps Dialog", className);
koboxAppsDialogWindow = new koboxAppsDialog();
koboxAppsDialogWindow = new KoboxAppsDialog();
connect(koboxAppsDialogWindow, SIGNAL(showToast(QString)), SLOT(showToastNative(QString)));
koboxAppsDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
koboxAppsDialogWindow->show();
}
void apps::on_vncLaunchBtn_clicked()
{
void AppsWidget::on_vncLaunchBtn_clicked() {
log("Showing VNC dialog", className);
global::keyboard::keyboardDialog = true;
global::keyboard::vncDialog = true;
global::keyboard::keyboardText = "";
generalDialogWindow = new generalDialog();
generalDialogWindow = new GeneralDialog();
generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
connect(generalDialogWindow, SIGNAL(refreshScreen()), SLOT(refreshScreenNative()));
generalDialogWindow->show();
}
void apps::refreshScreenNative() {
void AppsWidget::refreshScreenNative() {
emit refreshScreen();
}
void apps::on_reversiLaunchBtn_clicked()
{
void AppsWidget::on_reversiLaunchBtn_clicked() {
log("Launching external Reversi app", className);
QProcess process;
process.startDetached("qreversi", QStringList());
qApp->quit();
}
void apps::on_g2048LaunchBtn_clicked()
{
void AppsWidget::on_g2048LaunchBtn_clicked() {
log("Launching external 2048 app", className);
QProcess process;
process.startDetached("2048", QStringList());
qApp->quit();
}
void apps::showToastNative(QString messageToDisplay) {
void AppsWidget::showToastNative(QString 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.
*/
bool apps::parseJson() {
bool AppsWidget::parseJson() {
// If the path changes, it is also used statically in showUserApps()
jsonFile.setFileName("/mnt/onboard/onboard/.apps/apps.json");
bool jsonCheckSuccess = true;
@ -166,8 +156,7 @@ bool apps::parseJson() {
if (jsonFile.exists() == false) {
log("GUI user applications' main JSON file is missing", className);
jsonCheckSuccess = false;
}
else {
} else {
jsonFile.open(QIODevice::ReadOnly | QIODevice::Text);
QString fileRead = jsonFile.readAll();
jsonFile.close();
@ -176,8 +165,7 @@ bool apps::parseJson() {
if (jsonDocument.isNull() == true) {
log("GUI user applications' main JSON file is invalid", className);
jsonCheckSuccess = false;
}
else {
} else {
QJsonObject jsonObject = jsonDocument.object();
if (jsonObject["list"].isArray() == true) {
QJsonArray jsonArray = jsonObject["list"].toArray();
@ -186,87 +174,89 @@ bool apps::parseJson() {
QJsonObject jsonMainObject = refJsonObject.toObject();
if (jsonMainObject.size() == 9) {
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;
}
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;
}
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;
}
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;
}
if (!jsonMainObject["IconPath"].isString()) {
log("JSON: Invalid IconPath type inside object", className);
jsonCheckSuccess = false;
}
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;
}
else {
} else {
if (jsonMainObject["ExecPath"].toString().contains("..")) {
// Possible security risk
showToastNative("ERROR: 'ExecPath' has invalid path");
QString function = __func__; log(function + ": 'ExecPath' contains \"..\"", className);
QString function = __func__;
log(function + ": 'ExecPath' contains \"..\"", className);
jsonCheckSuccess = false;
}
}
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);
QString function = __func__;
log(function + ": Invalid 'SupportedDevices' type inside object", className);
jsonCheckSuccess = false;
}
else {
} else {
QJsonArray jsonArray = jsonMainObject["SupportedDevices"].toArray();
for (QJsonValueRef refJsonObject : jsonArray) {
// https://doc.qt.io/qt-5/qjsonvalue.html#toInt
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;
}
}
}
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;
}
else {
} else {
QJsonArray jsonArray = jsonMainObject["RequiredFeatures"].toArray();
for (QJsonValueRef refJsonObject : jsonArray) {
// https://doc.qt.io/qt-5/qjsonvalue.html#toInt
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;
}
}
}
}
else {
QString function = __func__; QString message = function + ": An object inside list array has too many items (or not enough): ";
} else {
QString function = __func__;
QString message = function + ": An object inside list array has too many items (or not enough): ";
message.append(QString::number(jsonMainObject.size()));
log(message, className);
jsonCheckSuccess = false;
}
}
else {
QString function = __func__; log(function + ": List array has an item of other type than object", className);
} else {
QString function = __func__;
log(function + ": List array has an item of other type than object", className);
jsonCheckSuccess = false;
}
}
@ -276,8 +266,7 @@ bool apps::parseJson() {
return jsonCheckSuccess;
}
void apps::on_editUserAppsBtn_clicked()
{
void AppsWidget::on_editUserAppsBtn_clicked() {
if (userAppsSecondPage == false) {
userAppsSecondPage = true;
@ -287,8 +276,7 @@ void apps::on_editUserAppsBtn_clicked()
emit showUserAppsEdit(userAppsSecondPage);
QTimer::singleShot(500, this, SLOT(refreshScreenNative()));
}
else {
} else {
userAppsSecondPage = false;
userAppsAvailable = false;
@ -307,18 +295,18 @@ void apps::on_editUserAppsBtn_clicked()
}
}
void apps::showUserApps(bool showDisabledJson)
{
void AppsWidget::showUserApps(bool showDisabledJson) {
emit clearAppsLayout();
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();
for (QJsonValueRef refJsonObject : jsonListArray) {
QJsonObject appInfo = refJsonObject.toObject();
if (appInfo["Enabled"].toBool() == true or showDisabledJson == true) {
userAppsAvailable = true;
userapps * newUserApp = new userapps;
UserAppsWidget *newUserApp = new UserAppsWidget;
newUserApp->provideInfo(appInfo);
connect(this, SIGNAL(clearAppsLayout()), newUserApp, SLOT(deleteLater()));
connect(this, SIGNAL(showUserAppsEdit(bool)), newUserApp, SLOT(changePageEnabling(bool)));
@ -332,18 +320,17 @@ void apps::showUserApps(bool showDisabledJson)
if (userAppsAvailable == false) {
ui->noUserAppsAvailableLabel->show();
}
else {
} else {
ui->noUserAppsAvailableLabel->hide();
}
}
else {
} else {
if (QFile::exists("/mnt/onboard/onboard/.apps/apps.json")) {
QString function = __func__; log(function + ": Main user applications' JSON file is invalid", className);
QString function = __func__;
log(function + ": Main user applications' JSON file is invalid", className);
QTimer::singleShot(500, this, SLOT(showFailedToParseMainUserAppsJsonFile()));
}
else {
QString function = __func__; log(function + ": Main user applications' JSON file doesn't exist; assuming that no user applications are currently installed", className);
} else {
QString function = __func__;
log(function + ": Main user applications' JSON file doesn't exist; assuming that no user applications are currently installed", className);
}
ui->editUserAppsBtn->hide();
@ -358,20 +345,18 @@ void apps::showUserApps(bool showDisabledJson)
}
}
void apps::updateJsonFileSlot(QJsonDocument jsonDocumentFunc)
{
void AppsWidget::updateJsonFileSlot(QJsonDocument jsonDocumentFunc) {
jsonDocument = jsonDocumentFunc;
emit updateJsonFileSignal(jsonDocument);
}
void apps::showFailedToParseMainUserAppsJsonFile() {
void AppsWidget::showFailedToParseMainUserAppsJsonFile() {
emit showToast("Failed to parse 'apps.json'");
}
void apps::on_todoLaunchBtn_clicked()
{
todo * todoWindow = new todo();
QObject::connect(todoWindow, &todo::showToast, this, &apps::showToast);
void AppsWidget::on_todoLaunchBtn_clicked() {
TodoAppWidget *todoWindow = new TodoAppWidget();
QObject::connect(todoWindow, &TodoAppWidget::showToast, this, &AppsWidget::showToast);
todoWindow->setAttribute(Qt::WA_DeleteOnClose);
todoWindow->setGeometry(QRect(QPoint(0, 0), qApp->primaryScreen()->geometry().size()));
todoWindow->show();

View file

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

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>apps</class>
<widget class="QWidget" name="apps">
<class>AppsWidget</class>
<widget class="QWidget" name="AppsWidget">
<property name="geometry">
<rect>
<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>
namespace Ui {
class calendarApp;
class CalendarAppWidget;
}
class calendarApp : public QWidget
class CalendarAppWidget : public QWidget
{
Q_OBJECT
public:
QString className = this->metaObject()->className();
explicit calendarApp(QWidget *parent = nullptr);
~calendarApp();
explicit CalendarAppWidget(QWidget *parent = nullptr);
~CalendarAppWidget();
private slots:
void on_backBtn_clicked();
private:
Ui::calendarApp *ui;
Ui::CalendarAppWidget *ui;
};
#endif // CALENDARAPP_H

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>calendarApp</class>
<widget class="QWidget" name="calendarApp">
<class>CalendarAppWidget</class>
<widget class="QWidget" name="CalendarAppWidget">
<property name="geometry">
<rect>
<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;
namespace Ui {
class savedwords;
class SavedWordsAppWidget;
}
class savedwords : public QWidget
class SavedWordsAppWidget : public QWidget
{
Q_OBJECT
public:
QString className = this->metaObject()->className();
explicit savedwords(QWidget *parent = nullptr);
~savedwords();
explicit SavedWordsAppWidget(QWidget *parent = nullptr);
~SavedWordsAppWidget();
QString words;
void checkwords();
void save_word_init();
@ -31,7 +31,7 @@ private slots:
void on_clearBtn_clicked();
private:
Ui::savedwords *ui;
Ui::SavedWordsAppWidget *ui;
};
#endif // SAVEDWORDS_H

View file

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

View file

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

View file

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

View file

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

View file

@ -3,9 +3,9 @@
#include "mainwindow.h"
#include "generaldialog.h"
userapps::userapps(QWidget *parent) :
UserAppsWidget::UserAppsWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::userapps)
ui(new Ui::UserAppsWidget)
{
ui->setupUi(this);
ui->launchBtn->setProperty("type", "borderless");
@ -21,12 +21,12 @@ userapps::userapps(QWidget *parent) :
ui->statusBtn->setStyleSheet("background: lightGrey; font-size: 9pt; padding: 8px");
}
userapps::~userapps()
UserAppsWidget::~UserAppsWidget()
{
delete ui;
}
void userapps::provideInfo(QJsonObject jsonInfo)
void UserAppsWidget::provideInfo(QJsonObject jsonInfo)
{
QString name = jsonInfo["Name"].toString();
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)
void userapps::changePageEnabling(bool SecondPage)
void UserAppsWidget::changePageEnabling(bool SecondPage)
{
if(SecondPage == true){
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);
// 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::userApps::appInfoDialog = true;
generalDialogWindow = new generalDialog();
generalDialogWindow = new GeneralDialog();
generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
generalDialogWindow->show();
}
void userapps::on_statusBtn_clicked()
void UserAppsWidget::on_statusBtn_clicked()
{
ui->statusBtn->setEnabled(false);
@ -129,22 +129,22 @@ void userapps::on_statusBtn_clicked()
ui->statusBtn->setEnabled(true);
}
void userapps::updateJsonFileSlotUA(QJsonDocument jsonDocumentProvided)
void UserAppsWidget::updateJsonFileSlotUA(QJsonDocument jsonDocumentProvided)
{
jsonDocument = jsonDocumentProvided;
}
void userapps::on_launchBtn_clicked()
void UserAppsWidget::on_launchBtn_clicked()
{
// Some command to execute script or binary at "ExecPath"
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
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);
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>";
generalDialogWindow = new generalDialog();
generalDialogWindow = new GeneralDialog();
generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
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
global::userApps::appCompatibilityLastContinueStatus = true;
@ -183,13 +183,11 @@ bool userapps::manageRequiredFeatures()
int featureId = refJsonObject.toInt();
// Wi-Fi connection required
if(featureId == 0) {
// Double 'if' conditions to avoid launching unnecesery testPing() in emu
if(global::deviceID != "emu\n") {
if(checkWifiState() != global::wifi::wifiState::configured) {
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
if(featureId == 1) {
@ -202,7 +200,7 @@ bool userapps::manageRequiredFeatures()
if(launchDialog == true) {
global::userApps::appCompatibilityDialog = true;
generalDialogWindow = new generalDialog();
generalDialogWindow = new GeneralDialog();
generalDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
generalDialogWindow->exec();
}
@ -214,7 +212,7 @@ bool userapps::manageRequiredFeatures()
return true;
}
QString userapps::parseJsonShow(QJsonObject json)
QString UserAppsWidget::parseJsonShow(QJsonObject json)
{
QString mainString;
foreach(const QString& key, json.keys()) {

View file

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

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>userapps</class>
<widget class="QWidget" name="userapps">
<class>UserAppsWidget</class>
<widget class="QWidget" name="UserAppsWidget">
<property name="geometry">
<rect>
<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 "toast.h"
#include "hourglassanimationwidget.h"
#include "alert.h"
#include "splashAlert.h"
namespace Ui {
class encryptionManager;
class CryptoManagerWidget;
}
class encryptionManager : public QWidget
class CryptoManagerWidget : public QWidget
{
Q_OBJECT
public:
QString className = this->metaObject()->className();
explicit encryptionManager(QWidget *parent = nullptr);
~encryptionManager();
explicit CryptoManagerWidget(QWidget *parent = nullptr);
~CryptoManagerWidget();
bool setupExitWidgetRan = false;
int setupPassphraseDialogMode;
bool setupMessageBoxRan = false;
@ -43,12 +43,12 @@ private slots:
void repackEncryptedStorage();
private:
Ui::encryptionManager *ui;
generalDialog * generalDialogWindow;
Ui::CryptoManagerWidget *ui;
GeneralDialog * generalDialogWindow;
toast * toastWindow;
hourglassAnimationWidget * hourglassAnimationWidgetWindow;
alert * alertWindow;
usbmsSplash *usbmsWindow;
SplashAlertWidget * alertWindow;
USBMSSplashWidget *usbmsWindow;
};
#endif // ENCRYPTIONMANAGER_H

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>encryptionManager</class>
<widget class="QWidget" name="encryptionManager">
<class>CryptoManagerWidget</class>
<widget class="QWidget" name="CryptoManagerWidget">
<property name="geometry">
<rect>
<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 "ui_homepagewidget.h"
#include "device.h"
#include <QScreen>
#include "functions.h"
homePageWidget::homePageWidget(QWidget *parent) :
HomePageWidget::HomePageWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::homePageWidget)
ui(new Ui::HomePageWidget)
{
Device * device = Device::getSingleton();
Device::ScreenSize screenSize = device->getScreenSize();
ui->setupUi(this);
// Getting the screen's size
sW = QGuiApplication::screens()[0]->size().width();
sH = QGuiApplication::screens()[0]->size().height();
if(global::deviceID == "n705\n") {
if(screenSize == Device::ScreenSize::SMALL) {
stdIconWidth = sW / 23;
stdIconHeight = sH / 23;
}
else if(global::deviceID == "n905\n" or global::deviceID == "kt\n") {
stdIconWidth = sW / 25;
stdIconHeight = sH / 25;
}
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") {
bookTitleTruncateThreshold = 20;
stdIconWidthDivider = 8;
stdIconHeightDivider = 8;
} else if(screenSize == Device::ScreenSize::MEDIUM) {
stdIconWidth = sW / 23.5;
stdIconHeight = sH / 23.5;
}
else {
bookTitleTruncateThreshold = 25;
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;
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->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);
pinnedBooksTitleArray.resize(global::homePageWidget::pinnedBooksNumber);
if(global::deviceID == "n705\n") {
bookTitleTruncateThreshold = 20;
}
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)) {
global::toast::modalToast = true;
@ -95,12 +73,12 @@ homePageWidget::homePageWidget(QWidget *parent) :
}
}
homePageWidget::~homePageWidget()
HomePageWidget::~HomePageWidget()
{
delete ui;
}
void homePageWidget::openBook(QString bookPath) {
void HomePageWidget::openBook(QString bookPath) {
if(!bookPath.isEmpty()) {
emit openBookSignal(bookPath, false);
}
@ -109,11 +87,11 @@ void homePageWidget::openBook(QString bookPath) {
}
}
void homePageWidget::refreshScreenNative() {
void HomePageWidget::refreshScreenNative() {
emit refreshScreen();
}
void homePageWidget::setupDisplay(bool databaseGenerated) {
void HomePageWidget::setupDisplay(bool databaseGenerated) {
if(databaseGenerated == true) {
toastWindow->close();
}
@ -173,8 +151,8 @@ void homePageWidget::setupDisplay(bool databaseGenerated) {
verticalLayoutArray[i] = new QVBoxLayout();
// Book icon button
QObject::connect(bookBtnArray[i], &QClickableLabel::bookPath, this, &homePageWidget::openBook);
QObject::connect(bookBtnArray[i], &QClickableLabel::longPressString, this, &homePageWidget::openBookOptionsDialog);
QObject::connect(bookBtnArray[i], &QClickableLabel::bookPath, this, &HomePageWidget::openBook);
QObject::connect(bookBtnArray[i], &QClickableLabel::longPressString, this, &HomePageWidget::openBookOptionsDialog);
bookBtnArray[i]->setAlignment(Qt::AlignCenter);
bookBtnArray[i]->setFont(QFont("u001"));
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();
// Book icon button
QObject::connect(pinnedBooksBtnArray[i], &QClickableLabel::bookPath, this, &homePageWidget::openBook);
QObject::connect(pinnedBooksBtnArray[i], &QClickableLabel::longPressString, this, &homePageWidget::openBookOptionsDialog);
QObject::connect(pinnedBooksBtnArray[i], &QClickableLabel::bookPath, this, &HomePageWidget::openBook);
QObject::connect(pinnedBooksBtnArray[i], &QClickableLabel::longPressString, this, &HomePageWidget::openBookOptionsDialog);
pinnedBooksBtnArray[i]->setAlignment(Qt::AlignCenter);
pinnedBooksBtnArray[i]->setFont(QFont("u001"));
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()));
}
void homePageWidget::setupDisplaySlot() {
void HomePageWidget::setupDisplaySlot() {
setupDisplay(true);
}
void homePageWidget::setupDisplayWithDatabase() {
void HomePageWidget::setupDisplayWithDatabase() {
global::localLibrary::headless = true;
localLibraryWidget * localLibraryWidgetWindow = new localLibraryWidget(this);
LocalLibraryWidget * localLibraryWidgetWindow = new LocalLibraryWidget(this);
localLibraryWidgetWindow->setAttribute(Qt::WA_DeleteOnClose);
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;
toastWindow = new toast(this);
toastWindow->setAttribute(Qt::WA_DeleteOnClose);
toastWindow->show();
}
void homePageWidget::openBookOptionsDialog(QString bookPath) {
void HomePageWidget::openBookOptionsDialog(QString bookPath) {
int bookID;
// 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);
global::localLibrary::bookOptionsDialog::bookID = bookID;
global::localLibrary::bookOptionsDialog::deleteOption = false;
bookOptionsDialog * bookOptionsDialogWindow = new bookOptionsDialog(this);
QObject::connect(bookOptionsDialogWindow, &bookOptionsDialog::openLocalBookInfoDialog, this, &homePageWidget::openLocalBookInfoDialog);
QObject::connect(bookOptionsDialogWindow, &bookOptionsDialog::showToast, this, &homePageWidget::showToast);
QObject::connect(bookOptionsDialogWindow, &bookOptionsDialog::destroyed, this, &homePageWidget::handlePossibleBookPin);
BookOptionsDialog * bookOptionsDialogWindow = new BookOptionsDialog(this);
QObject::connect(bookOptionsDialogWindow, &BookOptionsDialog::openLocalBookInfoDialog, this, &HomePageWidget::openLocalBookInfoDialog);
QObject::connect(bookOptionsDialogWindow, &BookOptionsDialog::showToast, this, &HomePageWidget::showToast);
QObject::connect(bookOptionsDialogWindow, &BookOptionsDialog::destroyed, this, &HomePageWidget::handlePossibleBookPin);
bookOptionsDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
bookOptionsDialogWindow->setWindowFlags(Qt::FramelessWindowHint | Qt::Popup);
bookOptionsDialogWindow->show();
}
void homePageWidget::openLocalBookInfoDialog() {
void HomePageWidget::openLocalBookInfoDialog() {
global::bookInfoDialog::localInfoDialog = true;
bookInfoDialog * bookInfoDialogWindow = new bookInfoDialog(this);
BookInfoDialog * bookInfoDialogWindow = new BookInfoDialog(this);
bookInfoDialogWindow->setAttribute(Qt::WA_DeleteOnClose);
bookInfoDialogWindow->show();
}
void homePageWidget::handlePossibleBookPin() {
void HomePageWidget::handlePossibleBookPin() {
if(global::localLibrary::bookOptionsDialog::bookPinAction == true) {
QTimer::singleShot(3100, this, [&]() {
emit relaunchHomePageWidget();

View file

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

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>homePageWidget</class>
<widget class="QWidget" name="homePageWidget">
<class>HomePageWidget</class>
<widget class="QWidget" name="HomePageWidget">
<property name="geometry">
<rect>
<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 "reader.h"
#include "quit.h"
#include "alert.h"
#include "splashAlert.h"
#include "usbmsSplash.h"
#include "brightnessdialog.h"
#include "generaldialog.h"
@ -110,24 +110,24 @@ private slots:
private:
Ui::MainWindow * ui;
settingsChooser * settingsChooserWindow;
apps * appsWindow;
reader * readerWindow;
quit * quitWindow;
alert * alertWindow;
usbmsSplash * usbmsWindow;
brightnessDialog * brightnessDialogWindow;
generalDialog * generalDialogWindow;
koboxSettings * koboxSettingsWindow;
koboxAppsDialog * koboxAppsDialogWindow;
SettingsChooserWidget * settingsChooserWindow;
AppsWidget * appsWindow;
ReaderWidget * readerWindow;
QuitWidget * quitWindow;
SplashAlertWidget * alertWindow;
USBMSSplashWidget * usbmsWindow;
BrightnessDialog * brightnessDialogWindow;
GeneralDialog * generalDialogWindow;
KoboxSettingsWidget * koboxSettingsWindow;
KoboxAppsDialog * koboxAppsDialogWindow;
textwidget * textwidgetWindow;
virtualkeypad * keypadWidget;
toast * toastWindow;
otaManager * otaManagerWindow;
libraryWidget * libraryWidgetWindow;
localLibraryWidget * localLibraryWidgetWindow;
homePageWidget * homePageWidgetWindow;
telemetry * telemetryInstance;
OTAUpdateManagerWidget * otaManagerWindow;
LibraryWidget * libraryWidgetWindow;
LocalLibraryWidget * localLibraryWidgetWindow;
HomePageWidget * homePageWidgetWindow;
Telemetry * telemetryInstance;
};
#endif // MAINWINDOW_H

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>otaManager</class>
<widget class="QWidget" name="otaManager">
<class>OTAUpdateManagerWidget</class>
<widget class="QWidget" name="OTAUpdateManagerWidget">
<property name="geometry">
<rect>
<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;
namespace Ui {
class quit;
class QuitWidget;
}
class quit : public QWidget
class QuitWidget : public QWidget
{
Q_OBJECT
public:
QString className = this->metaObject()->className();
explicit quit(QWidget *parent = nullptr);
~quit();
explicit QuitWidget(QWidget *parent = nullptr);
~QuitWidget();
private slots:
void on_pushButton_clicked();
@ -26,7 +26,7 @@ private slots:
void on_pushButton_3_clicked();
private:
Ui::quit *ui;
Ui::QuitWidget *ui;
};
#endif // QUIT_H

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>quit</class>
<widget class="QWidget" name="quit">
<class>QuitWidget</class>
<widget class="QWidget" name="QuitWidget">
<property name="geometry">
<rect>
<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
#include "functions.h"
#include "alert.h"
#include "splashAlert.h"
#include "generaldialog.h"
#include "toast.h"
#include "quit.h"
@ -41,17 +41,17 @@ namespace mupdf {
}
namespace Ui {
class reader;
class ReaderWidget;
}
class reader : public QWidget
class ReaderWidget : public QWidget
{
Q_OBJECT
public:
QString className = this->metaObject()->className();
explicit reader(QWidget *parent = nullptr);
~reader();
explicit ReaderWidget(QWidget *parent = nullptr);
~ReaderWidget();
int split_total;
int split_files_number;
@ -174,15 +174,15 @@ signals:
void openBookFile(QString book, bool relativePath);
private:
Ui::reader * ui;
alert * alertWindow;
generalDialog * generalDialogWindow;
Ui::ReaderWidget * ui;
SplashAlertWidget * alertWindow;
GeneralDialog * generalDialogWindow;
toast * toastWindow;
quit * quitWindow;
textDialog * textDialogWindow;
highlightsListDialog * highlightsListDialogWindow;
QuitWidget * quitWindow;
TextDialog * textDialogWindow;
HighlightsListDialog * highlightsListDialogWindow;
QGraphicsScene * graphicsScene;
brightnessDialog * brightnessDialogWindow;
BrightnessDialog * brightnessDialogWindow;
};
#endif // READER_H

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>reader</class>
<widget class="QWidget" name="reader">
<class>ReaderWidget</class>
<widget class="QWidget" name="ReaderWidget">
<property name="geometry">
<rect>
<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"
namespace Ui {
class koboxSettings;
class KoboxSettingsWidget;
}
class koboxSettings : public QWidget
class KoboxSettingsWidget : public QWidget
{
Q_OBJECT
public:
QString className = this->metaObject()->className();
explicit koboxSettings(QWidget *parent = nullptr);
~koboxSettings();
explicit KoboxSettingsWidget(QWidget *parent = nullptr);
~KoboxSettingsWidget();
bool not_user_change = false;
void openSettingsRebootDialog();
@ -31,9 +31,9 @@ private slots:
void on_resetKoboxBtn_clicked();
private:
Ui::koboxSettings *ui;
generalDialog *generalDialogWindow;
usbmsSplash *usbmsWindow;
Ui::KoboxSettingsWidget *ui;
GeneralDialog *generalDialogWindow;
USBMSSplashWidget *usbmsWindow;
};
#endif // KOBOXSETTINGS_H

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>koboxSettings</class>
<widget class="QWidget" name="koboxSettings">
<class>KoboxSettingsWidget</class>
<widget class="QWidget" name="KoboxSettingsWidget">
<property name="geometry">
<rect>
<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>
namespace Ui {
class powerDaemonSettings;
class PowerDaemonSettingsWidget;
}
class powerDaemonSettings : public QWidget
class PowerDaemonSettingsWidget : public QWidget
{
Q_OBJECT
public:
QString className = this->metaObject()->className();
explicit powerDaemonSettings(QWidget *parent = nullptr);
~powerDaemonSettings();
explicit PowerDaemonSettingsWidget(QWidget *parent = nullptr);
~PowerDaemonSettingsWidget();
int cinematicBrightnessMs;
private slots:
@ -39,7 +39,7 @@ private slots:
void on_idleSleepDecreaseMBtn_clicked();
private:
Ui::powerDaemonSettings * ui;
Ui::PowerDaemonSettingsWidget * ui;
bool whenChargerSleepBool;
bool chargerWakeUpBool;
bool wifiReconnectBool;

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>powerDaemonSettings</class>
<widget class="QWidget" name="powerDaemonSettings">
<class>PowerDaemonSettingsWidget</class>
<widget class="QWidget" name="PowerDaemonSettingsWidget">
<property name="geometry">
<rect>
<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;
namespace Ui {
class settings;
class SettingsWidget;
}
class settings : public QWidget
class SettingsWidget : public QWidget
{
Q_OBJECT
@ -33,8 +33,8 @@ public:
float homeIconWidth;
float homeIconHeight;
explicit settings(QWidget *parent = nullptr);
~settings();
explicit SettingsWidget(QWidget *parent = nullptr);
~SettingsWidget();
private slots:
void on_demoCheckBox_toggled(bool);
@ -46,7 +46,6 @@ private slots:
void on_usbmsBtn_clicked();
void on_updateBtn_clicked();
void on_darkModeCheckBox_toggled(bool checked);
void on_uiScalingSlider_valueChanged(int value);
void on_menuBarCheckBox_toggled(bool checked);
void on_comboBox_currentIndexChanged(const QString &arg1);
void on_resetBtn_clicked();
@ -97,10 +96,10 @@ signals:
void closeIndefiniteToast();
private:
Ui::settings * ui;
usbmsSplash * usbmsWindow;
generalDialog * generalDialogWindow;
otaManager * otaManagerWindow;
Ui::SettingsWidget * ui;
USBMSSplashWidget * usbmsWindow;
GeneralDialog * generalDialogWindow;
OTAUpdateManagerWidget * otaManagerWindow;
toast * toastWindow;
int pageSizeHeightSaved;

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>settings</class>
<widget class="QWidget" name="settings">
<class>SettingsWidget</class>
<widget class="QWidget" name="SettingsWidget">
<property name="geometry">
<rect>
<x>0</x>
@ -64,6 +64,7 @@
<widget class="QLabel" name="label">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
@ -169,7 +170,7 @@
<item>
<widget class="QStackedWidget" name="settingsStackedWidget">
<property name="currentIndex">
<number>0</number>
<number>5</number>
</property>
<widget class="QWidget" name="General">
<layout class="QVBoxLayout" name="verticalLayout_7">
@ -200,8 +201,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>461</width>
<height>636</height>
<width>457</width>
<height>622</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
@ -363,6 +364,7 @@
<widget class="QPushButton" name="okBtn">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
@ -407,8 +409,8 @@ Save &amp;&amp; Quit
<rect>
<x>0</x>
<y>0</y>
<width>423</width>
<height>738</height>
<width>235</width>
<height>258</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
@ -690,6 +692,7 @@ Save &amp;&amp; Quit
<widget class="QPushButton" name="exportHighlightsBtn">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
@ -868,6 +871,7 @@ Save &amp;&amp; Quit
<widget class="QPushButton" name="usbmsBtn">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
@ -937,7 +941,7 @@ Save &amp;&amp; Quit
<property name="bottomMargin">
<number>0</number>
</property>
<item row="5" column="0">
<item row="4" column="0">
<layout class="QGridLayout" name="gridLayout_7">
<property name="bottomMargin">
<number>0</number>
@ -969,6 +973,7 @@ Save &amp;&amp; Quit
<widget class="QPushButton" name="showSystemInfoBtn">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
@ -979,7 +984,54 @@ Save &amp;&amp; Quit
</item>
</layout>
</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">
<property name="bottomMargin">
<number>0</number>
@ -988,6 +1040,7 @@ Save &amp;&amp; Quit
<widget class="QPushButton" name="checkOtaUpdateBtn">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
@ -1018,7 +1071,80 @@ Save &amp;&amp; Quit
</item>
</layout>
</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">
<property name="orientation">
<enum>Qt::Vertical</enum>
@ -1060,6 +1186,7 @@ Save &amp;&amp; Quit
<widget class="QPushButton" name="requestLeaseBtn">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
@ -1070,56 +1197,27 @@ Save &amp;&amp; Quit
</item>
</layout>
</item>
<item row="8" 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>
<bold>true</bold>
</font>
<item row="9" 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>Update</string>
<string>Automatically check for updates</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="3" column="0">
<item row="2" column="0">
<widget class="QCheckBox" name="darkModeCheckBox">
<property name="text">
<string>Enable night mode</string>
</property>
</widget>
</item>
<item row="4" column="0">
<item row="3" column="0">
<layout class="QGridLayout" name="gridLayout_12">
<property name="bottomMargin">
<number>0</number>
@ -1128,6 +1226,7 @@ Save &amp;&amp; Quit
<widget class="QPushButton" name="resetBtn">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
@ -1158,146 +1257,6 @@ Save &amp;&amp; Quit
</item>
</layout>
</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>
</item>
</layout>
@ -1350,6 +1309,7 @@ Save &amp;&amp; Quit
<widget class="QPushButton" name="repackBtn">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
@ -1472,6 +1432,7 @@ Save &amp;&amp; Quit
<widget class="QPushButton" name="setPasscodeBtn">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</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"
namespace Ui {
class settingsChooser;
class SettingsChooserWidget;
}
class settingsChooser : public QWidget
class SettingsChooserWidget : public QWidget
{
Q_OBJECT
public:
QString className = this->metaObject()->className();
explicit settingsChooser(QWidget *parent = nullptr);
~settingsChooser();
explicit SettingsChooserWidget(QWidget *parent = nullptr);
~SettingsChooserWidget();
float sW;
float sH;
@ -36,9 +36,9 @@ signals:
void closeIndefiniteToast();
private:
Ui::settingsChooser *ui;
settings *settingsWindow;
koboxSettings *koboxSettingsWindow;
Ui::SettingsChooserWidget *ui;
SettingsWidget *settingsWindow;
KoboxSettingsWidget *koboxSettingsWindow;
};
#endif // SETTINGSCHOOSER_H

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>settingsChooser</class>
<widget class="QWidget" name="settingsChooser">
<class>SettingsChooserWidget</class>
<widget class="QWidget" name="SettingsChooserWidget">
<property name="geometry">
<rect>
<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
#define ALERT_H
#ifndef SPLASHALERT_H
#define SPLASHALERT_H
#include <QWidget>
namespace Ui {
class alert;
class SplashAlertWidget;
}
using namespace std;
class alert : public QWidget
class SplashAlertWidget : public QWidget
{
Q_OBJECT
public:
QString className = this->metaObject()->className();
explicit alert(QWidget *parent = nullptr);
~alert();
explicit SplashAlertWidget(QWidget *parent = nullptr);
~SplashAlertWidget();
bool signatureError = false;
bool downgradeError = false;
bool criticalBattery = false;
@ -29,7 +29,7 @@ private slots:
void quit();
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