Add basic android port
This commit is contained in:
@@ -19,11 +19,16 @@ include(KDEClangFormat)
|
|||||||
include(KDECMakeSettings)
|
include(KDECMakeSettings)
|
||||||
include(KDECompilerSettings NO_POLICY_SCOPE)
|
include(KDECompilerSettings NO_POLICY_SCOPE)
|
||||||
|
|
||||||
find_package(Qt5 ${QT_MIN_VERSION} REQUIRED NO_MODULE COMPONENTS Widgets Core Quick Gui QuickControls2 Multimedia)
|
find_package(Qt5 ${QT_MIN_VERSION} REQUIRED NO_MODULE COMPONENTS Widgets Core Quick Gui QuickControls2 Multimedia Svg)
|
||||||
find_package(KF5 ${REQUIRED_KF5_VERSION} REQUIRED COMPONENTS Kirigami2 ItemModels I18n Notifications)
|
find_package(KF5 ${REQUIRED_KF5_VERSION} REQUIRED COMPONENTS Kirigami2 ItemModels I18n Notifications Config)
|
||||||
|
|
||||||
|
if(ANDROID)
|
||||||
|
find_package(OpenSSL REQUIRED)
|
||||||
|
else()
|
||||||
|
find_package(Qt5Keychain REQUIRED)
|
||||||
|
endif()
|
||||||
|
|
||||||
find_package(Quotient 0.7 REQUIRED)
|
find_package(Quotient 0.7 REQUIRED)
|
||||||
find_package(Qt5Keychain REQUIRED)
|
|
||||||
find_package(cmark REQUIRED)
|
find_package(cmark REQUIRED)
|
||||||
|
|
||||||
install(PROGRAMS org.kde.neochat.desktop DESTINATION ${KDE_INSTALL_APPDIR})
|
install(PROGRAMS org.kde.neochat.desktop DESTINATION ${KDE_INSTALL_APPDIR})
|
||||||
|
|||||||
62
android/AndroidManifest.xml
Normal file
62
android/AndroidManifest.xml
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
|
<!--
|
||||||
|
- SPDX-License-Identifier: BSD-2-Clause
|
||||||
|
- SPDX-FileCopyrightText: 2020 Nicolas Fella <nicolas.fella@gmx.de>
|
||||||
|
- SPDX-FileCopyrightText: 2020 Volker Krause <vkrause@kde.org>
|
||||||
|
-->
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="org.kde.neochat"
|
||||||
|
android:versionName="0.0.1"
|
||||||
|
android:versionCode="1604412458"
|
||||||
|
android:installLocation="auto">
|
||||||
|
<application android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="Neochat" android:icon="@drawable/neochat">
|
||||||
|
<activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation"
|
||||||
|
android:name="org.qtproject.qt5.android.bindings.QtActivity"
|
||||||
|
android:label="Neochat"
|
||||||
|
android:windowSoftInputMode="adjustResize"
|
||||||
|
android:launchMode="singleTop">
|
||||||
|
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN"/>
|
||||||
|
<category android:name="android.intent.category.LAUNCHER"/>
|
||||||
|
</intent-filter>
|
||||||
|
|
||||||
|
<meta-data android:name="android.app.lib_name" android:value="neochat"/>
|
||||||
|
<meta-data android:name="android.app.qt_sources_resource_id" android:resource="@array/qt_sources"/>
|
||||||
|
<meta-data android:name="android.app.repository" android:value="default"/>
|
||||||
|
<meta-data android:name="android.app.qt_libs_resource_id" android:resource="@array/qt_libs"/>
|
||||||
|
<meta-data android:name="android.app.bundled_libs_resource_id" android:resource="@array/bundled_libs"/>
|
||||||
|
<meta-data android:name="android.app.extract_android_style" android:value="minimal"/>
|
||||||
|
|
||||||
|
<!-- Deploy Qt libs as part of package -->
|
||||||
|
<meta-data android:name="android.app.bundle_local_qt_libs" android:value="-- %%BUNDLE_LOCAL_QT_LIBS%% --"/>
|
||||||
|
<meta-data android:name="android.app.load_local_libs_resource_id" android:resource="@array/load_local_libs"/>
|
||||||
|
<!-- Run with local libs -->
|
||||||
|
<meta-data android:name="android.app.use_local_qt_libs" android:value="-- %%USE_LOCAL_QT_LIBS%% --"/>
|
||||||
|
<meta-data android:name="android.app.libs_prefix" android:value="/data/local/tmp/qt/"/>
|
||||||
|
<meta-data android:name="android.app.load_local_libs" android:value="-- %%INSERT_LOCAL_LIBS%% --"/>
|
||||||
|
<meta-data android:name="android.app.load_local_jars" android:value="-- %%INSERT_LOCAL_JARS%% --"/>
|
||||||
|
<meta-data android:name="android.app.static_init_classes" android:value="-- %%INSERT_INIT_CLASSES%% --"/>
|
||||||
|
<!-- Messages maps -->
|
||||||
|
<meta-data android:value="@string/ministro_not_found_msg" android:name="android.app.ministro_not_found_msg"/>
|
||||||
|
<meta-data android:value="@string/ministro_needed_msg" android:name="android.app.ministro_needed_msg"/>
|
||||||
|
<meta-data android:value="@string/fatal_error_msg" android:name="android.app.fatal_error_msg"/>
|
||||||
|
|
||||||
|
<!-- Splash screen -->
|
||||||
|
<meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/splash"/>
|
||||||
|
|
||||||
|
<!-- Background running -->
|
||||||
|
<meta-data android:name="android.app.background_running" android:value="false"/>
|
||||||
|
|
||||||
|
<!-- auto screen scale factor -->
|
||||||
|
<meta-data android:name="android.app.auto_screen_scale_factor" android:value="true"/>
|
||||||
|
</activity>
|
||||||
|
</application>
|
||||||
|
|
||||||
|
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28"/>
|
||||||
|
<supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/>
|
||||||
|
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
|
||||||
|
</manifest>
|
||||||
BIN
android/res/drawable/neochat.png
Normal file
BIN
android/res/drawable/neochat.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.2 KiB |
11
android/res/drawable/splash.xml
Normal file
11
android/res/drawable/splash.xml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item android:width="128dp" android:height="128dp" android:gravity="center">
|
||||||
|
<bitmap
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="fill_parent"
|
||||||
|
android:scaleType="fitXY"
|
||||||
|
android:src="@drawable/neochat"/>
|
||||||
|
</item>
|
||||||
|
</layer-list>
|
||||||
|
|
||||||
@@ -18,6 +18,15 @@ add_executable(neochat
|
|||||||
../res.qrc
|
../res.qrc
|
||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries(neochat Qt5::Widgets Qt5::Quick Qt5::Qml Qt5::Gui Qt5::Network Qt5::QuickControls2 KF5::I18n KF5::Kirigami2 KF5::Notifications Quotient cmark::cmark ${QTKEYCHAIN_LIBRARIES})
|
target_link_libraries(neochat PRIVATE Qt5::Quick Qt5::Qml Qt5::Gui Qt5::Network Qt5::QuickControls2 KF5::I18n KF5::Kirigami2 KF5::Notifications KF5::ConfigCore Quotient cmark::cmark)
|
||||||
|
|
||||||
|
if(ANDROID)
|
||||||
|
target_link_libraries(neochat PRIVATE Qt5::Svg OpenSSL::SSL)
|
||||||
|
kirigami_package_breeze_icons(ICONS
|
||||||
|
"document-send"
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
target_link_libraries(neochat PRIVATE Qt5::Widgets ${QTKEYCHAIN_LIBRARIES})
|
||||||
|
endif()
|
||||||
|
|
||||||
install(TARGETS neochat ${KF5_INSTALL_TARGETS_DEFAULT_ARGS})
|
install(TARGETS neochat ${KF5_INSTALL_TARGETS_DEFAULT_ARGS})
|
||||||
|
|||||||
@@ -5,7 +5,12 @@
|
|||||||
*/
|
*/
|
||||||
#include "controller.h"
|
#include "controller.h"
|
||||||
|
|
||||||
|
#ifndef Q_OS_ANDROID
|
||||||
#include <qt5keychain/keychain.h>
|
#include <qt5keychain/keychain.h>
|
||||||
|
#else
|
||||||
|
#include <KConfig>
|
||||||
|
#include <KConfigGroup>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <QClipboard>
|
#include <QClipboard>
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
@@ -148,6 +153,7 @@ void Controller::logout(Connection *conn)
|
|||||||
SettingsGroup("Accounts").remove(conn->userId());
|
SettingsGroup("Accounts").remove(conn->userId());
|
||||||
QFile(accessTokenFileName(AccountSettings(conn->userId()))).remove();
|
QFile(accessTokenFileName(AccountSettings(conn->userId()))).remove();
|
||||||
|
|
||||||
|
#ifndef Q_OS_ANDROID
|
||||||
QKeychain::DeletePasswordJob job(qAppName());
|
QKeychain::DeletePasswordJob job(qAppName());
|
||||||
job.setAutoDelete(true);
|
job.setAutoDelete(true);
|
||||||
job.setKey(conn->userId());
|
job.setKey(conn->userId());
|
||||||
@@ -155,6 +161,11 @@ void Controller::logout(Connection *conn)
|
|||||||
QKeychain::DeletePasswordJob::connect(&job, &QKeychain::Job::finished, &loop, &QEventLoop::quit);
|
QKeychain::DeletePasswordJob::connect(&job, &QKeychain::Job::finished, &loop, &QEventLoop::quit);
|
||||||
job.start();
|
job.start();
|
||||||
loop.exec();
|
loop.exec();
|
||||||
|
#else
|
||||||
|
KConfig config("neochat_tokens");
|
||||||
|
KConfigGroup tokensGroup(&config, "Tokens");
|
||||||
|
tokensGroup.deleteEntry(conn->userId());
|
||||||
|
#endif
|
||||||
|
|
||||||
auto logoutJob = conn->callApi<LogoutJob>();
|
auto logoutJob = conn->callApi<LogoutJob>();
|
||||||
connect(logoutJob, &LogoutJob::finished, conn, [=] {
|
connect(logoutJob, &LogoutJob::finished, conn, [=] {
|
||||||
@@ -264,6 +275,7 @@ QByteArray Controller::loadAccessTokenFromFile(const AccountSettings &account)
|
|||||||
|
|
||||||
QByteArray Controller::loadAccessTokenFromKeyChain(const AccountSettings &account)
|
QByteArray Controller::loadAccessTokenFromKeyChain(const AccountSettings &account)
|
||||||
{
|
{
|
||||||
|
#ifndef Q_OS_ANDROID
|
||||||
qDebug() << "Read the access token from the keychain for " << account.userId();
|
qDebug() << "Read the access token from the keychain for " << account.userId();
|
||||||
QKeychain::ReadPasswordJob job(qAppName());
|
QKeychain::ReadPasswordJob job(qAppName());
|
||||||
job.setAutoDelete(false);
|
job.setAutoDelete(false);
|
||||||
@@ -297,6 +309,13 @@ QByteArray Controller::loadAccessTokenFromKeyChain(const AccountSettings &accoun
|
|||||||
}
|
}
|
||||||
|
|
||||||
return accessToken;
|
return accessToken;
|
||||||
|
#else
|
||||||
|
qDebug() << "Saving access token to KConfig";
|
||||||
|
KConfig config("neochat_tokens");
|
||||||
|
KConfigGroup tokensGroup(&config, "Tokens");
|
||||||
|
QString token = tokensGroup.readEntry(account.userId(), QString());
|
||||||
|
return token.toLatin1();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Controller::saveAccessTokenToFile(const AccountSettings &account, const QByteArray &accessToken)
|
bool Controller::saveAccessTokenToFile(const AccountSettings &account, const QByteArray &accessToken)
|
||||||
@@ -317,6 +336,7 @@ bool Controller::saveAccessTokenToFile(const AccountSettings &account, const QBy
|
|||||||
|
|
||||||
bool Controller::saveAccessTokenToKeyChain(const AccountSettings &account, const QByteArray &accessToken)
|
bool Controller::saveAccessTokenToKeyChain(const AccountSettings &account, const QByteArray &accessToken)
|
||||||
{
|
{
|
||||||
|
#ifndef Q_OS_ANDROID
|
||||||
qDebug() << "Save the access token to the keychain for " << account.userId();
|
qDebug() << "Save the access token to the keychain for " << account.userId();
|
||||||
QKeychain::WritePasswordJob job(qAppName());
|
QKeychain::WritePasswordJob job(qAppName());
|
||||||
job.setAutoDelete(false);
|
job.setAutoDelete(false);
|
||||||
@@ -332,6 +352,11 @@ bool Controller::saveAccessTokenToKeyChain(const AccountSettings &account, const
|
|||||||
return saveAccessTokenToFile(account, accessToken);
|
return saveAccessTokenToFile(account, accessToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
KConfig config("neochat_tokens");
|
||||||
|
KConfigGroup tokensGroup(&config, "Tokens");
|
||||||
|
tokensGroup.writeEntry(account.userId(), accessToken);
|
||||||
|
#endif
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
14
src/main.cpp
14
src/main.cpp
@@ -9,6 +9,10 @@
|
|||||||
#include <QNetworkProxyFactory>
|
#include <QNetworkProxyFactory>
|
||||||
#include <QQmlApplicationEngine>
|
#include <QQmlApplicationEngine>
|
||||||
#include <QQmlContext>
|
#include <QQmlContext>
|
||||||
|
#include <QQuickStyle>
|
||||||
|
|
||||||
|
#include <KLocalizedContext>
|
||||||
|
#include <KLocalizedString>
|
||||||
|
|
||||||
#include "accountlistmodel.h"
|
#include "accountlistmodel.h"
|
||||||
#include "controller.h"
|
#include "controller.h"
|
||||||
@@ -30,13 +34,21 @@
|
|||||||
|
|
||||||
using namespace Quotient;
|
using namespace Quotient;
|
||||||
|
|
||||||
|
#ifdef Q_OS_ANDROID
|
||||||
|
Q_DECL_EXPORT
|
||||||
|
#endif
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
|
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
|
||||||
|
|
||||||
QNetworkProxyFactory::setUseSystemConfiguration(true);
|
QNetworkProxyFactory::setUseSystemConfiguration(true);
|
||||||
|
|
||||||
|
#ifdef Q_OS_ANDROID
|
||||||
|
QGuiApplication app(argc, argv);
|
||||||
|
QQuickStyle::setStyle(QStringLiteral("Material"));
|
||||||
|
#else
|
||||||
QApplication app(argc, argv);
|
QApplication app(argc, argv);
|
||||||
|
#endif
|
||||||
|
|
||||||
app.setOrganizationName("KDE");
|
app.setOrganizationName("KDE");
|
||||||
app.setOrganizationDomain("kde.org");
|
app.setOrganizationDomain("kde.org");
|
||||||
@@ -71,6 +83,8 @@ int main(int argc, char *argv[])
|
|||||||
qRegisterMetaTypeStreamOperators<Emoji>();
|
qRegisterMetaTypeStreamOperators<Emoji>();
|
||||||
|
|
||||||
QQmlApplicationEngine engine;
|
QQmlApplicationEngine engine;
|
||||||
|
engine.rootContext()->setContextObject(new KLocalizedContext(&engine));
|
||||||
|
KLocalizedString::setApplicationDomain("neochat");
|
||||||
|
|
||||||
engine.addImportPath("qrc:/imports");
|
engine.addImportPath("qrc:/imports");
|
||||||
MatrixImageProvider *matrixImageProvider = new MatrixImageProvider();
|
MatrixImageProvider *matrixImageProvider = new MatrixImageProvider();
|
||||||
|
|||||||
Reference in New Issue
Block a user