v0.5.1
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
<manifest package="org.qtproject.friendiqa" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="0.5" android:versionCode="13" android:installLocation="auto">
|
<manifest package="org.qtproject.friendiqa" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="0.5.1" android:versionCode="14" android:installLocation="auto">
|
||||||
<application android:hardwareAccelerated="true" android:vmSafeMode="true" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="Friendiqa" android:icon="@drawable/friendiqa" android:logo="@drawable/friendiqa" android:theme="@android:style/Theme.Holo.Light">
|
<application android:hardwareAccelerated="true" android:vmSafeMode="true" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="Friendiqa" android:icon="@drawable/friendiqa" android:logo="@drawable/friendiqa" android:theme="@android:style/Theme.Holo.Light">
|
||||||
<activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation" android:name="androidnative.friendiqa.FriendiqaActivity" android:label="Friendiqa" android:screenOrientation="unspecified" android:launchMode="singleInstance" android:taskAffinity="">
|
<activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation" android:name="androidnative.friendiqa.FriendiqaActivity" android:label="Friendiqa" android:screenOrientation="unspecified" android:launchMode="singleTask" android:taskAffinity="">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN"/>
|
<action android:name="android.intent.action.MAIN"/>
|
||||||
<category android:name="android.intent.category.LAUNCHER"/>
|
<category android:name="android.intent.category.LAUNCHER"/>
|
||||||
|
@ -50,6 +50,7 @@
|
||||||
<!-- Background running -->
|
<!-- Background running -->
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
|
|
||||||
<service android:name="androidnative.friendiqa.FriendiqaService" android:permission="android.permission.BIND_JOB_SERVICE">
|
<service android:name="androidnative.friendiqa.FriendiqaService" android:permission="android.permission.BIND_JOB_SERVICE">
|
||||||
<meta-data android:name="android.app.background_running" android:value="true"/>
|
<meta-data android:name="android.app.background_running" android:value="true"/>
|
||||||
</service>
|
</service>
|
||||||
|
@ -61,21 +62,21 @@
|
||||||
<meta-data android:name="android.app.repository" android:value="default"/>
|
<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.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.bundled_libs_resource_id" android:resource="@array/bundled_libs"/>
|
||||||
<!-- 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.bundle_local_qt_libs" android:value="-- %%BUNDLE_LOCAL_QT_LIBS%% --"/>
|
||||||
<meta-data android:name="android.app.bundled_in_lib_resource_id" android:resource="@array/bundled_in_lib"/>
|
<meta-data android:name="android.app.bundled_in_lib_resource_id" android:resource="@array/bundled_in_lib"/>
|
||||||
<meta-data android:name="android.app.bundled_in_assets_resource_id" android:resource="@array/bundled_in_assets"/>
|
<meta-data android:name="android.app.bundled_in_assets_resource_id" android:resource="@array/bundled_in_assets"/>
|
||||||
<!-- 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.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.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_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.load_local_jars" android:value="-- %%INSERT_LOCAL_JARS%% --"/>
|
||||||
<meta-data android:name="android.app.static_init_classes" android:value="-- %%INSERT_INIT_CLASSES%% --"/>
|
<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_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/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"/>
|
<meta-data android:value="@string/fatal_error_msg" android:name="android.app.fatal_error_msg"/>
|
||||||
<!-- Messages maps -->
|
|
||||||
<meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/splash"/>
|
<meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/splash"/>
|
||||||
</service>
|
</service>
|
||||||
|
|
||||||
|
@ -85,7 +86,7 @@
|
||||||
|
|
||||||
|
|
||||||
</application>
|
</application>
|
||||||
<uses-sdk android:minSdkVersion="18" android:targetSdkVersion="26"/>
|
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28"/>
|
||||||
<supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/>
|
<supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/>
|
||||||
|
|
||||||
<!-- The following comment will be replaced upon deployment with default permissions based on the dependencies of the application.
|
<!-- The following comment will be replaced upon deployment with default permissions based on the dependencies of the application.
|
||||||
|
|
|
@ -11,6 +11,9 @@ buildscript {
|
||||||
allprojects {
|
allprojects {
|
||||||
repositories {
|
repositories {
|
||||||
jcenter()
|
jcenter()
|
||||||
|
maven {
|
||||||
|
url "https://maven.google.com"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,11 +26,11 @@ dependencies {
|
||||||
//apply plugin: 'android-library'
|
//apply plugin: 'android-library'
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compile 'com.android.support:support-v4:25.3.1'
|
compile 'com.android.support:support-v4:25.4.0'
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compile 'com.android.support:support-compat:25.3.1'
|
compile 'com.android.support:support-compat:25.4.0'
|
||||||
}
|
}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
|
|
69
source-android/android/build.gradle.backup
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
buildscript {
|
||||||
|
repositories {
|
||||||
|
jcenter()
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
classpath 'com.android.tools.build:gradle:1.1.0'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
allprojects {
|
||||||
|
repositories {
|
||||||
|
jcenter()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
apply plugin: 'com.android.application'
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
compile fileTree(dir: 'libs', include: ['*.jar'])
|
||||||
|
}
|
||||||
|
|
||||||
|
//apply plugin: 'android-library'
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
compile 'com.android.support:support-v4:25.3.1'
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
compile 'com.android.support:support-compat:25.3.1'
|
||||||
|
}
|
||||||
|
|
||||||
|
android {
|
||||||
|
/*******************************************************
|
||||||
|
* The following variables:
|
||||||
|
* - androidBuildToolsVersion,
|
||||||
|
* - androidCompileSdkVersion
|
||||||
|
* - qt5AndroidDir - holds the path to qt android files
|
||||||
|
* needed to build any Qt application
|
||||||
|
* on Android.
|
||||||
|
*
|
||||||
|
* are defined in gradle.properties file. This file is
|
||||||
|
* updated by QtCreator and androiddeployqt tools.
|
||||||
|
* Changing them manually might break the compilation!
|
||||||
|
*******************************************************/
|
||||||
|
|
||||||
|
compileSdkVersion androidCompileSdkVersion.toInteger()
|
||||||
|
|
||||||
|
buildToolsVersion androidBuildToolsVersion
|
||||||
|
|
||||||
|
sourceSets {
|
||||||
|
main {
|
||||||
|
manifest.srcFile 'AndroidManifest.xml'
|
||||||
|
java.srcDirs = [qt5AndroidDir + '/src', 'src', 'java']
|
||||||
|
aidl.srcDirs = [qt5AndroidDir + '/src', 'src', 'aidl']
|
||||||
|
res.srcDirs = [qt5AndroidDir + '/res', 'res']
|
||||||
|
resources.srcDirs = ['src']
|
||||||
|
renderscript.srcDirs = ['src']
|
||||||
|
assets.srcDirs = ['assets']
|
||||||
|
jniLibs.srcDirs = ['libs']
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lintOptions {
|
||||||
|
abortOnError false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
apply from: "androidnative.gradle"
|
||||||
|
setAndroidNativePath("/../androidnative.pri");
|
BIN
source-android/android/libcrypto_1_1.so
Executable file
BIN
source-android/android/libssl_1_1.so
Executable file
|
@ -43,6 +43,7 @@ public class AndroidNativeActivity extends org.qtproject.qt5.android.bindings.Qt
|
||||||
if((getIntent().getFlags() == (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)) || (getIntent().getFlags() == Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) || (getIntent().getFlags() == Intent.FLAG_ACTIVITY_NEW_TASK) || (getIntent().getFlags() == Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) || (getIntent().getFlags() == (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED))) {
|
if((getIntent().getFlags() == (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)) || (getIntent().getFlags() == Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) || (getIntent().getFlags() == Intent.FLAG_ACTIVITY_NEW_TASK) || (getIntent().getFlags() == Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) || (getIntent().getFlags() == (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED))) {
|
||||||
SystemDispatcher.onActivityResume();
|
SystemDispatcher.onActivityResume();
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
Intent data = getIntent();
|
Intent data = getIntent();
|
||||||
if ((data!=null) && (data.getType() != null) && !(data.getBooleanExtra("used",false))){
|
if ((data!=null) && (data.getType() != null) && !(data.getBooleanExtra("used",false))){
|
||||||
String type = data.getType();
|
String type = data.getType();
|
||||||
|
|
|
@ -62,6 +62,7 @@ public class ImagePicker {
|
||||||
|
|
||||||
// >= API 18
|
// >= API 18
|
||||||
activity.startActivityForResult(intent, PICK_IMAGE_ACTION);
|
activity.startActivityForResult(intent, PICK_IMAGE_ACTION);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void takePhoto(Map message) {
|
static void takePhoto(Map message) {
|
||||||
|
|
|
@ -139,6 +139,9 @@ public class Util {
|
||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
//Log.d(TAG,"Friendiqa schedule Androidnative service");
|
//Log.d(TAG,"Friendiqa schedule Androidnative service");
|
||||||
final Integer value = (Integer) message.get("value");
|
final Integer value = (Integer) message.get("value");
|
||||||
//final Activity activity = QtNative.activity();
|
//final Activity activity = QtNative.activity();
|
||||||
|
|
|
@ -1,235 +0,0 @@
|
||||||
<RCC>
|
|
||||||
<qresource prefix="/">
|
|
||||||
<file>qtquickcontrols2.conf</file>
|
|
||||||
<file>qml/friendiqa.qml</file>
|
|
||||||
<file>qml/newsqml/NewsTab.qml</file>
|
|
||||||
<file>qml/newsqml/Newsitem.qml</file>
|
|
||||||
<file>qml/newsqml/MessageSend.qml</file>
|
|
||||||
<file>qml/newsqml/Conversation.qml</file>
|
|
||||||
<file>qml/newsqml/FriendicaActivities.qml</file>
|
|
||||||
<file>qml/contactqml/FriendsTab.qml</file>
|
|
||||||
<file>qml/contactqml/GroupComponent.qml</file>
|
|
||||||
<file>qml/contactqml/ContactComponent.qml</file>
|
|
||||||
<file>qml/contactqml/ContactDetailsComponent.qml</file>
|
|
||||||
<file>qml/contactqml/Contactlist.qml</file>
|
|
||||||
<file>qml/genericqml/BlueButton.qml</file>
|
|
||||||
<file>qml/photoqml/PhotoComponent.qml</file>
|
|
||||||
<file>qml/photoqml/PhotogroupComponent.qml</file>
|
|
||||||
<file>qml/photoqml/PhotoTab.qml</file>
|
|
||||||
<file>qml/configqml/InfoBox.qml</file>
|
|
||||||
<file>qml/configqml/ConfigPage.qml</file>
|
|
||||||
<file>js/layout.js</file>
|
|
||||||
<file>js/photoworker.js</file>
|
|
||||||
<file>js/service.js</file>
|
|
||||||
<file>js/news.js</file>
|
|
||||||
<file>js/newsworker.js</file>
|
|
||||||
<file>js/helper.js</file>
|
|
||||||
<file>images/defaultcontact.jpg</file>
|
|
||||||
<file>images/fontawesome-webfont.ttf</file>
|
|
||||||
<file>images/folder-blue.png</file>
|
|
||||||
<file>qml/configqml/OSSettingsAndroid.qml</file>
|
|
||||||
<file>qml/genericqml/MButton.qml</file>
|
|
||||||
<file>qml/configqml/OSSettingsLinux.qml</file>
|
|
||||||
<file>qml/newsqml/SmileyDialog.qml</file>
|
|
||||||
<file>js/smiley.js</file>
|
|
||||||
<file>images/smileys/animals/bee.gif</file>
|
|
||||||
<file>images/smileys/animals/bigspider.gif</file>
|
|
||||||
<file>images/smileys/animals/bunny.gif</file>
|
|
||||||
<file>images/smileys/animals/bunnyflowers.gif</file>
|
|
||||||
<file>images/smileys/animals/cat.gif</file>
|
|
||||||
<file>images/smileys/animals/chick.gif</file>
|
|
||||||
<file>images/smileys/animals/cow.gif</file>
|
|
||||||
<file>images/smileys/animals/crab.gif</file>
|
|
||||||
<file>images/smileys/animals/dog.gif</file>
|
|
||||||
<file>images/smileys/animals/dolphin.gif</file>
|
|
||||||
<file>images/smileys/animals/dragonfly.gif</file>
|
|
||||||
<file>images/smileys/animals/elephant.gif</file>
|
|
||||||
<file>images/smileys/animals/fish.gif</file>
|
|
||||||
<file>images/smileys/animals/frog.gif</file>
|
|
||||||
<file>images/smileys/animals/giraffe.gif</file>
|
|
||||||
<file>images/smileys/animals/hamster.gif</file>
|
|
||||||
<file>images/smileys/animals/horse.gif</file>
|
|
||||||
<file>images/smileys/animals/ladybird.gif</file>
|
|
||||||
<file>images/smileys/animals/monkey.gif</file>
|
|
||||||
<file>images/smileys/animals/parrot.gif</file>
|
|
||||||
<file>images/smileys/animals/pig.gif</file>
|
|
||||||
<file>images/smileys/animals/sheep.gif</file>
|
|
||||||
<file>images/smileys/animals/snail.gif</file>
|
|
||||||
<file>images/smileys/animals/tux.gif</file>
|
|
||||||
<file>images/smileys/babies/baby.gif</file>
|
|
||||||
<file>images/smileys/babies/babycot.gif</file>
|
|
||||||
<file>images/smileys/babies/pregnant.gif</file>
|
|
||||||
<file>images/smileys/babies/stork.gif</file>
|
|
||||||
<file>images/smileys/confused/confused.gif</file>
|
|
||||||
<file>images/smileys/confused/dazed.gif</file>
|
|
||||||
<file>images/smileys/confused/shrug.gif</file>
|
|
||||||
<file>images/smileys/confused/stupid.gif</file>
|
|
||||||
<file>images/smileys/cool/affro.gif</file>
|
|
||||||
<file>images/smileys/cool/cool.gif</file>
|
|
||||||
<file>images/smileys/devilangel/angel.gif</file>
|
|
||||||
<file>images/smileys/devilangel/blondedevil.gif</file>
|
|
||||||
<file>images/smileys/devilangel/catdevil.gif</file>
|
|
||||||
<file>images/smileys/devilangel/cherub.gif</file>
|
|
||||||
<file>images/smileys/devilangel/daseesaw.gif</file>
|
|
||||||
<file>images/smileys/devilangel/devil.gif</file>
|
|
||||||
<file>images/smileys/devilangel/graveside.gif</file>
|
|
||||||
<file>images/smileys/devilangel/saint.gif</file>
|
|
||||||
<file>images/smileys/devilangel/turnevil.gif</file>
|
|
||||||
<file>images/smileys/disgust/fartblush.gif</file>
|
|
||||||
<file>images/smileys/disgust/fartinbed.gif</file>
|
|
||||||
<file>images/smileys/disgust/toilet.gif</file>
|
|
||||||
<file>images/smileys/disgust/vomit.gif</file>
|
|
||||||
<file>images/smileys/drink/tea.gif</file>
|
|
||||||
<file>images/smileys/drool/drool.gif</file>
|
|
||||||
<file>images/smileys/fantasy/alienmonster.gif</file>
|
|
||||||
<file>images/smileys/fantasy/barbarian.gif</file>
|
|
||||||
<file>images/smileys/fantasy/dinosaur.gif</file>
|
|
||||||
<file>images/smileys/fantasy/dragon.gif</file>
|
|
||||||
<file>images/smileys/fantasy/dragonwhelp.gif</file>
|
|
||||||
<file>images/smileys/fantasy/ghost.gif</file>
|
|
||||||
<file>images/smileys/fantasy/mummy.gif</file>
|
|
||||||
<file>images/smileys/fight/2guns.gif</file>
|
|
||||||
<file>images/smileys/fight/acid.gif</file>
|
|
||||||
<file>images/smileys/fight/alienfight.gif</file>
|
|
||||||
<file>images/smileys/fight/alpha.png</file>
|
|
||||||
<file>images/smileys/fight/army.gif</file>
|
|
||||||
<file>images/smileys/fight/arrowhead.gif</file>
|
|
||||||
<file>images/smileys/fight/bfg.gif</file>
|
|
||||||
<file>images/smileys/fight/bowman.gif</file>
|
|
||||||
<file>images/smileys/fight/chainsaw.gif</file>
|
|
||||||
<file>images/smileys/fight/crossbow.gif</file>
|
|
||||||
<file>images/smileys/fight/crusader.gif</file>
|
|
||||||
<file>images/smileys/fight/dead.gif</file>
|
|
||||||
<file>images/smileys/fight/gangs.gif</file>
|
|
||||||
<file>images/smileys/fight/hammersplat.gif</file>
|
|
||||||
<file>images/smileys/fight/lasergun.gif</file>
|
|
||||||
<file>images/smileys/fight/machinegun.gif</file>
|
|
||||||
<file>images/smileys/fight/marine.gif</file>
|
|
||||||
<file>images/smileys/fight/sabre.gif</file>
|
|
||||||
<file>images/smileys/fight/samurai.gif</file>
|
|
||||||
<file>images/smileys/fight/tank.gif</file>
|
|
||||||
<file>images/smileys/fight/viking.gif</file>
|
|
||||||
<file>images/smileys/food/apple.gif</file>
|
|
||||||
<file>images/smileys/food/banana.gif</file>
|
|
||||||
<file>images/smileys/food/birthdaycake.gif</file>
|
|
||||||
<file>images/smileys/food/broccoli.gif</file>
|
|
||||||
<file>images/smileys/food/cake.gif</file>
|
|
||||||
<file>images/smileys/food/carrot.gif</file>
|
|
||||||
<file>images/smileys/food/cooking.gif</file>
|
|
||||||
<file>images/smileys/food/fryegg.gif</file>
|
|
||||||
<file>images/smileys/food/popcorn.gif</file>
|
|
||||||
<file>images/smileys/food/tomato.gif</file>
|
|
||||||
<file>images/smileys/happy/cloud9.gif</file>
|
|
||||||
<file>images/smileys/happy/tearsofjoy.gif</file>
|
|
||||||
<file>images/smileys/laugh/hahaha.gif</file>
|
|
||||||
<file>images/smileys/laugh/loltv.gif</file>
|
|
||||||
<file>images/smileys/laugh/rofl.gif</file>
|
|
||||||
<file>images/smileys/love/iloveyou.gif</file>
|
|
||||||
<file>images/smileys/love/inlove.gif</file>
|
|
||||||
<file>images/smileys/love/love.gif</file>
|
|
||||||
<file>images/smileys/love/lovebear.gif</file>
|
|
||||||
<file>images/smileys/love/lovebed.gif</file>
|
|
||||||
<file>images/smileys/love/loveheart.gif</file>
|
|
||||||
<file>images/smileys/music/dj.gif</file>
|
|
||||||
<file>images/smileys/music/drums.gif</file>
|
|
||||||
<file>images/smileys/music/elvis.gif</file>
|
|
||||||
<file>images/smileys/music/guitar.gif</file>
|
|
||||||
<file>images/smileys/music/trumpet.gif</file>
|
|
||||||
<file>images/smileys/music/violin.gif</file>
|
|
||||||
<file>images/smileys/oldcore/beard.png</file>
|
|
||||||
<file>images/smileys/oldcore/headbang.gif</file>
|
|
||||||
<file>images/smileys/oldcore/laughing.gif</file>
|
|
||||||
<file>images/smileys/oldcore/shaka.gif</file>
|
|
||||||
<file>images/smileys/oldcore/surprised.gif</file>
|
|
||||||
<file>images/smileys/oldcore/whitebeard.png</file>
|
|
||||||
<file>images/smileys/respect/bow.gif</file>
|
|
||||||
<file>images/smileys/respect/bravo.gif</file>
|
|
||||||
<file>images/smileys/respect/hailking.gif</file>
|
|
||||||
<file>images/smileys/respect/number1.gif</file>
|
|
||||||
<file>images/smileys/sad/crying.png</file>
|
|
||||||
<file>images/smileys/sad/prisoner.gif</file>
|
|
||||||
<file>images/smileys/sad/sigh.gif</file>
|
|
||||||
<file>images/smileys/smoking/smoking.gif</file>
|
|
||||||
<file>images/smileys/sport/archery.gif</file>
|
|
||||||
<file>images/smileys/sport/basketball.gif</file>
|
|
||||||
<file>images/smileys/sport/bowling.gif</file>
|
|
||||||
<file>images/smileys/sport/cycling.gif</file>
|
|
||||||
<file>images/smileys/sport/darts.gif</file>
|
|
||||||
<file>images/smileys/sport/fencing.gif</file>
|
|
||||||
<file>images/smileys/sport/football.gif</file>
|
|
||||||
<file>images/smileys/sport/golf.gif</file>
|
|
||||||
<file>images/smileys/sport/horseriding.gif</file>
|
|
||||||
<file>images/smileys/sport/juggling.gif</file>
|
|
||||||
<file>images/smileys/sport/skipping.gif</file>
|
|
||||||
<file>images/smileys/sport/snooker.gif</file>
|
|
||||||
<file>images/smileys/sport/surfing.gif</file>
|
|
||||||
<file>images/smileys/sport/tennis.gif</file>
|
|
||||||
<file>images/smileys/tired/countsheep.gif</file>
|
|
||||||
<file>images/smileys/tired/hammock.gif</file>
|
|
||||||
<file>images/smileys/tired/pillow.gif</file>
|
|
||||||
<file>images/smileys/tired/yawn.gif</file>
|
|
||||||
<file>images/smileys/core/beer_mug.gif</file>
|
|
||||||
<file>images/smileys/core/coffee.gif</file>
|
|
||||||
<file>images/smileys/core/dislike.gif</file>
|
|
||||||
<file>images/smileys/core/friendica-16.png</file>
|
|
||||||
<file>images/smileys/core/like.gif</file>
|
|
||||||
<file>images/smileys/core/rm-16.png</file>
|
|
||||||
<file>images/smileys/core/smiley-bangheaddesk.gif</file>
|
|
||||||
<file>images/smileys/core/smiley-brokenheart.gif</file>
|
|
||||||
<file>images/smileys/core/smiley-cool.gif</file>
|
|
||||||
<file>images/smileys/core/smiley-cry.gif</file>
|
|
||||||
<file>images/smileys/core/smiley-embarassed.gif</file>
|
|
||||||
<file>images/smileys/core/smiley-facepalm.gif</file>
|
|
||||||
<file>images/smileys/core/smiley-foot-in-mouth.gif</file>
|
|
||||||
<file>images/smileys/core/smiley-heart.gif</file>
|
|
||||||
<file>images/smileys/core/smiley-kiss.gif</file>
|
|
||||||
<file>images/smileys/core/smiley-laughing.gif</file>
|
|
||||||
<file>images/smileys/core/smiley-Oo.gif</file>
|
|
||||||
<file>images/smileys/core/smiley-smile.gif</file>
|
|
||||||
<file>images/smileys/core/smiley-surprised.gif</file>
|
|
||||||
<file>images/smileys/core/smiley-thumbsup.gif</file>
|
|
||||||
<file>images/smileys/core/smiley-tongue-out.gif</file>
|
|
||||||
<file>images/smileys/core/smiley-undecided.gif</file>
|
|
||||||
<file>images/smileys/core/smiley-wink.gif</file>
|
|
||||||
<file>images/smileys/core/smiley-frown.gif</file>
|
|
||||||
<file>images/smileys/adult/bong.gif</file>
|
|
||||||
<file>images/smileys/adult/drunk.gif</file>
|
|
||||||
<file>images/smileys/adult/finger.gif</file>
|
|
||||||
<file>images/smileys/adult/sperm.gif</file>
|
|
||||||
<file>images/smileys/adult/tits.gif</file>
|
|
||||||
<file>common/filesystem.cpp</file>
|
|
||||||
<file>common/filesystem.h</file>
|
|
||||||
<file>common/friendiqa.cpp</file>
|
|
||||||
<file>common/uploadableimage.cpp</file>
|
|
||||||
<file>common/uploadableimage.h</file>
|
|
||||||
<file>common/xhr.cpp</file>
|
|
||||||
<file>common/xhr.h</file>
|
|
||||||
<file>qml/calendarqml/CalendarTab.qml</file>
|
|
||||||
<file>qml/calendarqml/CalendarDay.qml</file>
|
|
||||||
<file>qml/calendarqml/EventList.qml</file>
|
|
||||||
<file>translations/friendiqa-de.qm</file>
|
|
||||||
<file>translations/friendiqa-de.ts</file>
|
|
||||||
<file>translations/friendiqa-es.qm</file>
|
|
||||||
<file>translations/friendiqa-es.ts</file>
|
|
||||||
<file>qml/photoqml/ImageUploadDialog.qml</file>
|
|
||||||
<file>qml/genericqml/PermissionDialog.qml</file>
|
|
||||||
<file>images/addImage.png</file>
|
|
||||||
<file>qml/genericqml/ImagePicker.qml</file>
|
|
||||||
<file>qml/genericqml/ImagePickerLinux.qml</file>
|
|
||||||
<file>js/image.js</file>
|
|
||||||
<file>qml/contactqml/ProfileComponent.qml</file>
|
|
||||||
<file>translations/friendiqa-it.ts</file>
|
|
||||||
<file>qml/genericqml/Search.qml</file>
|
|
||||||
<file>qml/newsqml/Hashtag.qml</file>
|
|
||||||
<file>qml/genericqml/IntentReceiver.qml</file>
|
|
||||||
<file>qml/newsqml/NewsImage.qml</file>
|
|
||||||
<file>qml/newsqml/NewsVideo.qml</file>
|
|
||||||
<file>qml/newsqml/ContactPage.qml</file>
|
|
||||||
<file>qml/newsqml/NewsLink.qml</file>
|
|
||||||
<file>qml/configqml/RegisterPage.qml</file>
|
|
||||||
<file>qml/configqml/AccountPage.qml</file>
|
|
||||||
<file>qml/newsqml/NewsStack.qml</file>
|
|
||||||
<file>qml/configqml/SyncConfig.qml</file>
|
|
||||||
<file>qml/configqml/SyncComponent.qml</file>
|
|
||||||
</qresource>
|
|
||||||
</RCC>
|
|
1
source-android/application.qrc
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../source-linux/application.qrc
|
|
@ -1,60 +0,0 @@
|
||||||
// This file is part of Friendiqa
|
|
||||||
// https://git.friendi.ca/lubuwest/Friendiqa
|
|
||||||
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net>
|
|
||||||
//
|
|
||||||
// This program is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// In addition, as a special exception, the copyright holders give
|
|
||||||
// permission to link the code of portions of this program with the
|
|
||||||
// OpenSSL library under certain conditions as described in each
|
|
||||||
// individual source file, and distribute linked combinations including
|
|
||||||
// the two.
|
|
||||||
//
|
|
||||||
// You must obey the GNU General Public License in all respects for all
|
|
||||||
// of the code used other than OpenSSL. If you modify file(s) with this
|
|
||||||
// exception, you may extend this exception to your version of the
|
|
||||||
// file(s), but you are not obligated to do so. If you do not wish to do
|
|
||||||
// so, delete this exception statement from your version. If you delete
|
|
||||||
// this exception statement from all source files in the program, then
|
|
||||||
// also delete it here.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#ifndef ALARM_H
|
|
||||||
#define ALARM_H
|
|
||||||
|
|
||||||
#include <QObject>
|
|
||||||
|
|
||||||
class ALARM : public QObject
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
//Q_PROPERTY(int alarmtime READ alarmtime WRITE setAlarm NOTIFY alarmChanged)
|
|
||||||
public:
|
|
||||||
static ALARM *instance();
|
|
||||||
|
|
||||||
explicit ALARM(QObject *parent = 0);
|
|
||||||
|
|
||||||
//int alarmtime() const;
|
|
||||||
|
|
||||||
signals:
|
|
||||||
|
|
||||||
void alarmChanged(QString url);
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
void setAlarm(int time);
|
|
||||||
void notify(QString title, QString text, int id);
|
|
||||||
|
|
||||||
private:
|
|
||||||
int m_time;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // UPDATENEWS_H
|
|
1
source-android/common/alarm.h
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../../source-linux/common/alarm.h
|
|
@ -1,62 +0,0 @@
|
||||||
// This file is part of Friendiqa
|
|
||||||
// https://git.friendi.ca/lubuwest/Friendiqa
|
|
||||||
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net>
|
|
||||||
//
|
|
||||||
// This program is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// In addition, as a special exception, the copyright holders give
|
|
||||||
// permission to link the code of portions of this program with the
|
|
||||||
// OpenSSL library under certain conditions as described in each
|
|
||||||
// individual source file, and distribute linked combinations including
|
|
||||||
// the two.
|
|
||||||
//
|
|
||||||
// You must obey the GNU General Public License in all respects for all
|
|
||||||
// of the code used other than OpenSSL. If you modify file(s) with this
|
|
||||||
// exception, you may extend this exception to your version of the
|
|
||||||
// file(s), but you are not obligated to do so. If you do not wish to do
|
|
||||||
// so, delete this exception statement from your version. If you delete
|
|
||||||
// this exception statement from all source files in the program, then
|
|
||||||
// also delete it here.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#include "alarm.h"
|
|
||||||
#include <QtCore/QDebug>
|
|
||||||
#include "AndroidNative/systemdispatcher.h"
|
|
||||||
|
|
||||||
ALARM *ALARM::instance()
|
|
||||||
{
|
|
||||||
static ALARM alarm;
|
|
||||||
return &alarm;
|
|
||||||
}
|
|
||||||
|
|
||||||
ALARM::ALARM(QObject *parent) : QObject(parent){}
|
|
||||||
|
|
||||||
void ALARM::setAlarm(int interval)
|
|
||||||
{
|
|
||||||
QVariantMap message;
|
|
||||||
message["value"] = interval;
|
|
||||||
AndroidNative::SystemDispatcher::instance()->loadClass("androidnative.Util");
|
|
||||||
AndroidNative::SystemDispatcher::instance()->dispatch("androidnative.Util.setSchedule", message);
|
|
||||||
AndroidNative::SystemDispatcher::instance()->dispatch("androidnative.Util.stopService", message);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ALARM::notify(QString title, QString text, int id)
|
|
||||||
{
|
|
||||||
//qDebug() << "notify "<< title << text;
|
|
||||||
QVariantMap message;
|
|
||||||
message["title"] = title;
|
|
||||||
message["message"] = text;
|
|
||||||
message["id"] = id;
|
|
||||||
AndroidNative::SystemDispatcher::instance()->loadClass("androidnative.Util");
|
|
||||||
AndroidNative::SystemDispatcher::instance()->dispatch("androidnative.Util.setNotification", message);
|
|
||||||
}
|
|
1
source-android/common/alarmandroid.cpp
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../../source-linux/common/alarmandroid.cpp
|
|
@ -1,73 +0,0 @@
|
||||||
// This file is part of Friendiqa
|
|
||||||
// https://git.friendi.ca/lubuwest/Friendiqa
|
|
||||||
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net>
|
|
||||||
//
|
|
||||||
// This program is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// In addition, as a special exception, the copyright holders give
|
|
||||||
// permission to link the code of portions of this program with the
|
|
||||||
// OpenSSL library under certain conditions as described in each
|
|
||||||
// individual source file, and distribute linked combinations including
|
|
||||||
// the two.
|
|
||||||
//
|
|
||||||
// You must obey the GNU General Public License in all respects for all
|
|
||||||
// of the code used other than OpenSSL. If you modify file(s) with this
|
|
||||||
// exception, you may extend this exception to your version of the
|
|
||||||
// file(s), but you are not obligated to do so. If you do not wish to do
|
|
||||||
// so, delete this exception statement from your version. If you delete
|
|
||||||
// this exception statement from all source files in the program, then
|
|
||||||
// also delete it here.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
//#include <QtAndroidExtras/QAndroidJniObject>
|
|
||||||
//#include <QtAndroidExtras/QAndroidJniEnvironment>
|
|
||||||
#include "alarm.h"
|
|
||||||
#include <QtCore/QDebug>
|
|
||||||
#include <QtDBus/QtDBus>
|
|
||||||
//#include "AndroidNative/systemdispatcher.h"
|
|
||||||
|
|
||||||
ALARM *ALARM::instance()
|
|
||||||
{
|
|
||||||
static ALARM alarm;
|
|
||||||
return &alarm;
|
|
||||||
}
|
|
||||||
|
|
||||||
ALARM::ALARM(QObject *parent) : QObject(parent){}
|
|
||||||
|
|
||||||
void ALARM::setAlarm(int interval)
|
|
||||||
{
|
|
||||||
qDebug() << interval;
|
|
||||||
QVariantMap message;
|
|
||||||
message["value"] = interval;
|
|
||||||
// AndroidNative::SystemDispatcher::instance()->loadClass("androidnative.Util");
|
|
||||||
// AndroidNative::SystemDispatcher::instance()->dispatch("androidnative.Util.setSchedule", message);
|
|
||||||
//AndroidNative::SystemDispatcher::instance()->dispatch("androidnative.Util.stopService", message);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ALARM::notify(QString title, QString text, int id)
|
|
||||||
{
|
|
||||||
qDebug() << title << text;
|
|
||||||
QVariantMap message;
|
|
||||||
message["title"] = title;
|
|
||||||
message["message"] = text;
|
|
||||||
QDBusConnection bus = QDBusConnection::sessionBus();
|
|
||||||
QDBusInterface dbus_iface("org.freedesktop.Notifications", "/org/freedesktop/Notifications",
|
|
||||||
"org.freedesktop.Notifications", bus);
|
|
||||||
QString appname="Friendiqa";
|
|
||||||
uint v=12321;
|
|
||||||
if (dbus_iface.isValid()){
|
|
||||||
|
|
||||||
dbus_iface.call("Notify",appname,v,"",title,text,"","",5000);
|
|
||||||
}
|
|
||||||
// AndroidNative::SystemDispatcher::instance()->dispatch("Notifier.notify", message);
|
|
||||||
}
|
|
1
source-android/common/alarmlinux.cpp
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../../source-linux/common/alarmlinux.cpp
|
|
@ -1,119 +0,0 @@
|
||||||
// This file is part of Friendiqa
|
|
||||||
// https://github.com/lubuwest/Friendiqa
|
|
||||||
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net>
|
|
||||||
//
|
|
||||||
// This program is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// In addition, as a special exception, the copyright holders give
|
|
||||||
// permission to link the code of portions of this program with the
|
|
||||||
// OpenSSL library under certain conditions as described in each
|
|
||||||
// individual source file, and distribute linked combinations including
|
|
||||||
// the two.
|
|
||||||
//
|
|
||||||
// You must obey the GNU General Public License in all respects for all
|
|
||||||
// of the code used other than OpenSSL. If you modify file(s) with this
|
|
||||||
// exception, you may extend this exception to your version of the
|
|
||||||
// file(s), but you are not obligated to do so. If you do not wish to do
|
|
||||||
// so, delete this exception statement from your version. If you delete
|
|
||||||
// this exception statement from all source files in the program, then
|
|
||||||
// also delete it here.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#include "filesystem.h"
|
|
||||||
|
|
||||||
FILESYSTEM *FILESYSTEM::instance()
|
|
||||||
{
|
|
||||||
static FILESYSTEM filesystem;
|
|
||||||
return &filesystem;
|
|
||||||
}
|
|
||||||
|
|
||||||
FILESYSTEM::FILESYSTEM(QObject *parent) : QObject(parent){}
|
|
||||||
|
|
||||||
void FILESYSTEM::setDirectory(QString Directory)
|
|
||||||
{
|
|
||||||
if (Directory!=m_Directory) {
|
|
||||||
m_Directory = Directory;
|
|
||||||
emit directoryChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QString FILESYSTEM::Directory() const
|
|
||||||
{
|
|
||||||
return m_Directory;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString FILESYSTEM::homePath() const
|
|
||||||
{
|
|
||||||
QDir dir(m_Directory);
|
|
||||||
QString homeDir=dir.homePath();
|
|
||||||
//qDebug(homeDir);
|
|
||||||
return homeDir;
|
|
||||||
}
|
|
||||||
|
|
||||||
//QString FILESYSTEM::cameraPath() const
|
|
||||||
//{
|
|
||||||
//QAndroidJniObject object = QAndroidJniObject::getStaticObjectField<jstring>("android.os.Environment", "DIRECTORY_DCIM");
|
|
||||||
//QAndroidJniObject dcim =QAndroidJniObject::callStaticObjectMethod("android.os.Environment","getExternalStoragePublicDirectory", "(Ljava/lang/String;)Ljava/io/File;", object.object<jobject>());
|
|
||||||
// return dcim.toString();
|
|
||||||
//}
|
|
||||||
|
|
||||||
|
|
||||||
//bool FILESYSTEM::direxist(QString Directory) const
|
|
||||||
//{QDir dir(Directory);
|
|
||||||
// return dir.exists();
|
|
||||||
//}
|
|
||||||
|
|
||||||
bool FILESYSTEM::fileexist(QString name)
|
|
||||||
{ return QFile::exists(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
void FILESYSTEM::makeDir(QString name)
|
|
||||||
{
|
|
||||||
QDir dir(m_Directory);
|
|
||||||
if (dir.mkdir(name)){
|
|
||||||
emit success(name);
|
|
||||||
}
|
|
||||||
else {emit error(name,1);}
|
|
||||||
}
|
|
||||||
|
|
||||||
void FILESYSTEM::rmDir()
|
|
||||||
{
|
|
||||||
QDir dir(m_Directory);
|
|
||||||
//qDebug()<<m_Directory;
|
|
||||||
if (dir.removeRecursively()){
|
|
||||||
emit success(m_Directory);
|
|
||||||
}
|
|
||||||
else {emit error(m_Directory,1);}
|
|
||||||
}
|
|
||||||
|
|
||||||
void FILESYSTEM::rmFile(QString name)
|
|
||||||
{
|
|
||||||
QDir dir(m_Directory);
|
|
||||||
//qDebug()<<m_Directory;
|
|
||||||
//qDebug(name);
|
|
||||||
if(dir.remove(name)){
|
|
||||||
emit success(name);
|
|
||||||
}
|
|
||||||
else {emit error(name,1);}
|
|
||||||
}
|
|
||||||
QFileInfoList FILESYSTEM::fileList()
|
|
||||||
{
|
|
||||||
QDir dir(m_Directory);
|
|
||||||
QStringList filters;
|
|
||||||
filters << "*.png" <<"*.PNG" << "*.jpg" << "*.JPG" << "*.JPEG";
|
|
||||||
dir.setNameFilters(filters);
|
|
||||||
dir.setSorting(QDir::Time | QDir::Reversed);
|
|
||||||
//QStringList m_Filelist=dir.entryInfoList();
|
|
||||||
//qDebug() << "filelist " << m_Filelist;
|
|
||||||
return dir.entryInfoList();
|
|
||||||
}
|
|
1
source-android/common/filesystem.cpp
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../../source-linux/common/filesystem.cpp
|
|
@ -1,81 +0,0 @@
|
||||||
// This file is part of Friendiqa
|
|
||||||
// https://github.com/lubuwest/Friendiqa
|
|
||||||
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net>
|
|
||||||
//
|
|
||||||
// This program is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// In addition, as a special exception, the copyright holders give
|
|
||||||
// permission to link the code of portions of this program with the
|
|
||||||
// OpenSSL library under certain conditions as described in each
|
|
||||||
// individual source file, and distribute linked combinations including
|
|
||||||
// the two.
|
|
||||||
//
|
|
||||||
// You must obey the GNU General Public License in all respects for all
|
|
||||||
// of the code used other than OpenSSL. If you modify file(s) with this
|
|
||||||
// exception, you may extend this exception to your version of the
|
|
||||||
// file(s), but you are not obligated to do so. If you do not wish to do
|
|
||||||
// so, delete this exception statement from your version. If you delete
|
|
||||||
// this exception statement from all source files in the program, then
|
|
||||||
// also delete it here.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#ifndef FILESYSTEM_H
|
|
||||||
#define FILESYSTEM_H
|
|
||||||
|
|
||||||
#include <QDir>
|
|
||||||
#include <QObject>
|
|
||||||
//#include <QtAndroidExtras>
|
|
||||||
//#include <QAndroidActivityResultReceiver>
|
|
||||||
|
|
||||||
class FILESYSTEM : public QObject//, public QAndroidActivityResultReceiver
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
Q_PROPERTY(QString Directory READ Directory WRITE setDirectory NOTIFY directoryChanged)
|
|
||||||
//Q_PROPERTY(bool direxist READ direxist)
|
|
||||||
Q_PROPERTY(QString homePath READ homePath)
|
|
||||||
//Q_PROPERTY(QString cameraPath READ cameraPath)
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
static FILESYSTEM *instance();
|
|
||||||
explicit FILESYSTEM(QObject *parent = 0);
|
|
||||||
void setDirectory(QString Directory);
|
|
||||||
QString Directory() const;
|
|
||||||
QFileInfoList fileList();
|
|
||||||
//bool direxist(QString Directory);
|
|
||||||
QString homePath() const;
|
|
||||||
//QString cameraPath() const;
|
|
||||||
// virtual void handleActivityResult(int receiverRequestCode, int resultCode, const QAndroidJniObject &data);
|
|
||||||
|
|
||||||
signals:
|
|
||||||
//void imageselected(QString);
|
|
||||||
void directoryChanged();
|
|
||||||
//void fileListContent(QList data);
|
|
||||||
void success(QString data);
|
|
||||||
void error(QString data, int code);
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
bool fileexist(QString name);
|
|
||||||
void makeDir(QString name);
|
|
||||||
void rmDir();
|
|
||||||
void rmFile(QString name);
|
|
||||||
//void searchImage();
|
|
||||||
//void fileList();
|
|
||||||
|
|
||||||
private:
|
|
||||||
QString m_Directory;
|
|
||||||
QString homeDir;
|
|
||||||
//QList m_Filelist;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // FILSYSTEM_H
|
|
1
source-android/common/filesystem.h
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../../source-linux/common/filesystem.h
|
|
@ -57,8 +57,8 @@ JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void*) {
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
//qDebug()<< "argv Friendiqa"<< argv[0] <<" argv2" <<argv[1];
|
//qDebug()<< "argv Friendiqa"<< argv[0]; //<<" argv2" <<argv[1];
|
||||||
if (qstrcmp(argv[1],"-service")==0){
|
if ((argc>1) && (qstrcmp(argv[1],"-service")==0)){
|
||||||
//qDebug()<<"FriendiqaMain Service";
|
//qDebug()<<"FriendiqaMain Service";
|
||||||
QAndroidService app(argc, argv);
|
QAndroidService app(argc, argv);
|
||||||
UPDATENEWS* updatenews= UPDATENEWS::instance();
|
UPDATENEWS* updatenews= UPDATENEWS::instance();
|
||||||
|
@ -71,6 +71,7 @@ int main(int argc, char *argv[]) {
|
||||||
else{
|
else{
|
||||||
QApplication app(argc, argv);
|
QApplication app(argc, argv);
|
||||||
QQuickView view;
|
QQuickView view;
|
||||||
|
qDebug()<<"FriendiqaMain started";
|
||||||
QTranslator qtTranslator;
|
QTranslator qtTranslator;
|
||||||
qtTranslator.load("friendiqa-" + QLocale::system().name(),":/translations");
|
qtTranslator.load("friendiqa-" + QLocale::system().name(),":/translations");
|
||||||
app.installTranslator(&qtTranslator);
|
app.installTranslator(&qtTranslator);
|
||||||
|
@ -86,8 +87,10 @@ int main(int argc, char *argv[]) {
|
||||||
UPDATENEWS* updatenews = UPDATENEWS::instance();
|
UPDATENEWS* updatenews = UPDATENEWS::instance();
|
||||||
view.rootContext()->setContextProperty("updatenews", updatenews);
|
view.rootContext()->setContextProperty("updatenews", updatenews);
|
||||||
view.setSource(QUrl("qrc:/qml/friendiqa.qml"));
|
view.setSource(QUrl("qrc:/qml/friendiqa.qml"));
|
||||||
|
//QtWebEngine::initialize();
|
||||||
view.show();
|
view.show();
|
||||||
view.connect(view.rootContext()->engine(), SIGNAL(quit()), &app, SLOT(quit()));
|
view.connect(view.rootContext()->engine(), SIGNAL(quit()), &app, SLOT(quit()));
|
||||||
|
|
||||||
return app.exec();
|
return app.exec();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,123 +0,0 @@
|
||||||
// This file is part of Friendiqa
|
|
||||||
// https://github.com/lubuwest/Friendiqa
|
|
||||||
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net>
|
|
||||||
//
|
|
||||||
// This program is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// In addition, as a special exception, the copyright holders give
|
|
||||||
// permission to link the code of portions of this program with the
|
|
||||||
// OpenSSL library under certain conditions as described in each
|
|
||||||
// individual source file, and distribute linked combinations including
|
|
||||||
// the two.
|
|
||||||
//
|
|
||||||
// You must obey the GNU General Public License in all respects for all
|
|
||||||
// of the code used other than OpenSSL. If you modify file(s) with this
|
|
||||||
// exception, you may extend this exception to your version of the
|
|
||||||
// file(s), but you are not obligated to do so. If you do not wish to do
|
|
||||||
// so, delete this exception statement from your version. If you delete
|
|
||||||
// this exception statement from all source files in the program, then
|
|
||||||
// also delete it here.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#include "remoteauthasyncimageprovider.h"
|
|
||||||
#include <QQuickAsyncImageProvider>
|
|
||||||
#include <QImage>
|
|
||||||
|
|
||||||
AsyncImageResponse::AsyncImageResponse(QNetworkRequest req, QSize reqSize)
|
|
||||||
{
|
|
||||||
m_reply = m_imageLoader.get(req);
|
|
||||||
m_requestedSize = reqSize;
|
|
||||||
connect(m_reply, &QNetworkReply::finished, this, &AsyncImageResponse::onResponseFinished);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void AsyncImageResponse::onResponseFinished()
|
|
||||||
{
|
|
||||||
QByteArray myImageData = m_reply->readAll();
|
|
||||||
m_resultImage = QImage::fromData(myImageData);
|
|
||||||
if (m_requestedSize.isValid())
|
|
||||||
{
|
|
||||||
m_resultImage = m_resultImage.scaled(m_requestedSize);
|
|
||||||
}
|
|
||||||
emit finished();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
QQuickTextureFactory *AsyncImageResponse::textureFactory() const
|
|
||||||
{
|
|
||||||
return QQuickTextureFactory::textureFactoryForImage(m_resultImage);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RemoteAuthAsyncImageProvider::RemoteAuthAsyncImageProvider()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
QQuickImageResponse* RemoteAuthAsyncImageProvider::requestImageResponse(const QString &id, const QSize &requestedSize)
|
|
||||||
{
|
|
||||||
QUrl iUrl=url()+"/api/friendica/remoteauth?c_url="+contacturl()+"&url="+id;
|
|
||||||
QByteArray loginData = m_login.toLocal8Bit().toBase64();
|
|
||||||
QString headerData = "Basic " + loginData;
|
|
||||||
|
|
||||||
QNetworkRequest request(iUrl);
|
|
||||||
request.setRawHeader("Authorization", headerData.toLocal8Bit());
|
|
||||||
request.setAttribute(QNetworkRequest::FollowRedirectsAttribute,true);
|
|
||||||
request.setUrl(iUrl);
|
|
||||||
return new AsyncImageResponse(request, requestedSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void RemoteAuthAsyncImageProvider::setContacturl(QString contacturl)
|
|
||||||
{
|
|
||||||
if (contacturl!=m_contacturl) {
|
|
||||||
m_contacturl = contacturl;
|
|
||||||
emit contacturlChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void RemoteAuthAsyncImageProvider::setUrl(QString url)
|
|
||||||
{
|
|
||||||
if (url!=m_url) {
|
|
||||||
m_url = url;
|
|
||||||
emit urlChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void RemoteAuthAsyncImageProvider::setLogin(QString login)
|
|
||||||
{
|
|
||||||
if (login!=m_login) {
|
|
||||||
m_login = login;
|
|
||||||
emit loginChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
QString RemoteAuthAsyncImageProvider::contacturl() const
|
|
||||||
{
|
|
||||||
return m_contacturl;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
QString RemoteAuthAsyncImageProvider::url() const
|
|
||||||
{
|
|
||||||
return m_url;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
QString RemoteAuthAsyncImageProvider::login() const
|
|
||||||
{
|
|
||||||
return m_login;
|
|
||||||
}
|
|
1
source-android/common/remoteauthasyncimageprovider.cpp
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../../source-linux/common/remoteauthasyncimageprovider.cpp
|
|
@ -1,95 +0,0 @@
|
||||||
// This file is part of Friendiqa
|
|
||||||
// https://github.com/lubuwest/Friendiqa
|
|
||||||
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net>
|
|
||||||
//
|
|
||||||
// This program is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// In addition, as a special exception, the copyright holders give
|
|
||||||
// permission to link the code of portions of this program with the
|
|
||||||
// OpenSSL library under certain conditions as described in each
|
|
||||||
// individual source file, and distribute linked combinations including
|
|
||||||
// the two.
|
|
||||||
//
|
|
||||||
// You must obey the GNU General Public License in all respects for all
|
|
||||||
// of the code used other than OpenSSL. If you modify file(s) with this
|
|
||||||
// exception, you may extend this exception to your version of the
|
|
||||||
// file(s), but you are not obligated to do so. If you do not wish to do
|
|
||||||
// so, delete this exception statement from your version. If you delete
|
|
||||||
// this exception statement from all source files in the program, then
|
|
||||||
// also delete it here.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#ifndef REMOTEAUTHIMAGEPROVIDER_H
|
|
||||||
#define REMOTEAUTHIMAGEPROVIDER_H
|
|
||||||
|
|
||||||
#include <QObject>
|
|
||||||
#include <QQuickAsyncImageProvider>
|
|
||||||
#include <QImage>
|
|
||||||
#include <QNetworkAccessManager>
|
|
||||||
#include <QNetworkReply>
|
|
||||||
#include <QNetworkRequest>
|
|
||||||
|
|
||||||
|
|
||||||
class AsyncImageResponse : public QQuickImageResponse
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
explicit AsyncImageResponse(QNetworkRequest req, QSize requestedSize);
|
|
||||||
QQuickTextureFactory *textureFactory() const;
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
void onResponseFinished();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
QNetworkAccessManager m_imageLoader;
|
|
||||||
QNetworkReply* m_reply;
|
|
||||||
QSize m_requestedSize;
|
|
||||||
QImage m_resultImage;
|
|
||||||
int m_index;
|
|
||||||
QString m_id;
|
|
||||||
QImage m_image;
|
|
||||||
};
|
|
||||||
|
|
||||||
class RemoteAuthAsyncImageProvider : public QObject, public QQuickAsyncImageProvider
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
Q_PROPERTY(QString url READ url WRITE setUrl NOTIFY urlChanged)
|
|
||||||
Q_PROPERTY(QString contacturl READ contacturl WRITE setContacturl NOTIFY contacturlChanged)
|
|
||||||
Q_PROPERTY(QString login READ login WRITE setLogin NOTIFY loginChanged)
|
|
||||||
|
|
||||||
public:
|
|
||||||
explicit RemoteAuthAsyncImageProvider();
|
|
||||||
QQuickImageResponse *requestImageResponse(const QString &id, const QSize &requestedSize) override;
|
|
||||||
QString url() const;
|
|
||||||
QString contacturl() const;
|
|
||||||
QString login() const;
|
|
||||||
|
|
||||||
signals:
|
|
||||||
void contacturlChanged();
|
|
||||||
void urlChanged();
|
|
||||||
void loginChanged();
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
void setContacturl(QString contacturl);
|
|
||||||
void setUrl(QString url);
|
|
||||||
void setLogin(QString login);
|
|
||||||
|
|
||||||
private:
|
|
||||||
QByteArray buffer;
|
|
||||||
QString m_url;
|
|
||||||
QString m_contacturl;
|
|
||||||
QString m_login;
|
|
||||||
QString bufferToString();
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // REMOTEAUTHIMAGEPROVIDER_H
|
|
1
source-android/common/remoteauthasyncimageprovider.h
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../../source-linux/common/remoteauthasyncimageprovider.h
|
|
@ -1,568 +0,0 @@
|
||||||
// This file is part of Friendiqa
|
|
||||||
// https://git.friendi.ca/lubuwest/Friendiqa
|
|
||||||
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net>
|
|
||||||
//
|
|
||||||
// This program is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// In addition, as a special exception, the copyright holders give
|
|
||||||
// permission to link the code of portions of this program with the
|
|
||||||
// OpenSSL library under certain conditions as described in each
|
|
||||||
// individual source file, and distribute linked combinations including
|
|
||||||
// the two.
|
|
||||||
//
|
|
||||||
// You must obey the GNU General Public License in all respects for all
|
|
||||||
// of the code used other than OpenSSL. If you modify file(s) with this
|
|
||||||
// exception, you may extend this exception to your version of the
|
|
||||||
// file(s), but you are not obligated to do so. If you do not wish to do
|
|
||||||
// so, delete this exception statement from your version. If you delete
|
|
||||||
// this exception statement from all source files in the program, then
|
|
||||||
// also delete it here.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#include "updatenews.h"
|
|
||||||
|
|
||||||
#include <QHttpPart>
|
|
||||||
#include <QTextCodec>
|
|
||||||
#include <QUrlQuery>
|
|
||||||
#include <QList>
|
|
||||||
#include <QDataStream>
|
|
||||||
#include <QJsonDocument>
|
|
||||||
#include <QJsonObject>
|
|
||||||
#include <QJsonArray>
|
|
||||||
#include <QQmlEngine>
|
|
||||||
#include <QSqlQuery>
|
|
||||||
#include <QSqlRecord>
|
|
||||||
#include <QSqlDatabase>
|
|
||||||
#include <QSqlError>
|
|
||||||
#include <QDateTime>
|
|
||||||
//#include "AndroidNative/systemdispatcher.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
UPDATENEWS *UPDATENEWS::instance()
|
|
||||||
{
|
|
||||||
static UPDATENEWS udn;
|
|
||||||
return &udn;
|
|
||||||
}
|
|
||||||
|
|
||||||
UPDATENEWS::UPDATENEWS(QObject *parent) : QObject(parent)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void UPDATENEWS::setUrl(QString url)
|
|
||||||
{
|
|
||||||
if (url!=m_url) {
|
|
||||||
m_url = url;
|
|
||||||
xhr.setUrl(url);
|
|
||||||
emit urlChanged(m_url);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void UPDATENEWS::setDatabase()
|
|
||||||
{
|
|
||||||
static QQmlEngine qe;
|
|
||||||
QString db_url=qe.offlineStorageDatabaseFilePath("Friendiqa");
|
|
||||||
m_db = QSqlDatabase::addDatabase("QSQLITE");
|
|
||||||
m_db.setDatabaseName(QUrl("file://"+db_url+".sqlite").toLocalFile());
|
|
||||||
//qDebug() << db_url;
|
|
||||||
|
|
||||||
if (!m_db.open())
|
|
||||||
{
|
|
||||||
qDebug() << "Error: connection with database fail " << m_db.lastError();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void UPDATENEWS::login()
|
|
||||||
{
|
|
||||||
QSqlQuery query("SELECT * FROM config WHERE isActive=0",m_db);
|
|
||||||
while (query.next())
|
|
||||||
{
|
|
||||||
username = query.value(1).toString();
|
|
||||||
QByteArray bpassword=query.value(2).toByteArray();
|
|
||||||
QString password=QByteArray::fromBase64(bpassword);
|
|
||||||
m_login=username+":"+password ;
|
|
||||||
xhr.setLogin(m_login);
|
|
||||||
m_url=query.value(0).toString();
|
|
||||||
xhr.setUrl(m_url);
|
|
||||||
m_imagedir=query.value(3).toString();
|
|
||||||
xhr.setImagedir(m_imagedir);
|
|
||||||
QString isActive=query.value(7).toString();
|
|
||||||
}
|
|
||||||
//m_updateInterval=query.value(5).toInt();
|
|
||||||
|
|
||||||
|
|
||||||
QSqlQuery syncquery("SELECT * FROM globaloptions",m_db);
|
|
||||||
// QSqlQuery delquery("DELETE FROM globaloptions WHERE k='sync_interval'",m_db);
|
|
||||||
// delquery.exec();
|
|
||||||
m_updateInterval=0;
|
|
||||||
syncindex=0;
|
|
||||||
synclist.clear();
|
|
||||||
//QSqlQuery syncquery("SELECT * FROM globaloptions WHERE k like 'sync_%' AND v=1",m_db);
|
|
||||||
while (syncquery.next()){
|
|
||||||
if (syncquery.value(0).toString()=="syncinterval"){
|
|
||||||
m_updateInterval=syncquery.value(1).toInt();
|
|
||||||
}
|
|
||||||
if (syncquery.value(0).toString().left(5)=="sync_" && syncquery.value(1).toInt()==1){
|
|
||||||
synclist.append(syncquery.value(0).toString());
|
|
||||||
//qDebug() << " sync " << syncquery.value(0).toString() << " " <<syncquery.value(1).toString();
|
|
||||||
}
|
|
||||||
if (syncquery.value(0).toString().left(7)=="notify_" && syncquery.value(1).toInt()==1){
|
|
||||||
notifylist.append(syncquery.value(0).toString());
|
|
||||||
//qDebug() << " notify " << syncquery.value(0).toString() << " " <<syncquery.value(1).toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// QSqlQuery notifyquery("SELECT * FROM globaloptions WHERE k like 'notify_%' AND v=1",m_db);
|
|
||||||
//qDebug() << "size " << notifyquery.size();
|
|
||||||
// while (notifyquery.next()){
|
|
||||||
// notifylist.append(syncquery.value(0).toString());
|
|
||||||
// qDebug() << " notify " << syncquery.value(0).toString();
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
|
|
||||||
void UPDATENEWS::startsync()
|
|
||||||
{ //qDebug()<<"Friendiqa start syncing " <<synclist.length()<<" index "<<syncindex;
|
|
||||||
QObject::connect(&xhr,SIGNAL(success(QByteArray,QString)),this,SLOT(store(QByteArray,QString)));
|
|
||||||
QObject::connect(&xhr,SIGNAL(error(QString,QString,QString,int)),this,SLOT(showError(QString,QString,QString,int)));
|
|
||||||
if (syncindex<synclist.length()){
|
|
||||||
if (synclist[syncindex]=="sync_Timeline"){
|
|
||||||
timeline();
|
|
||||||
} else if (synclist[syncindex]=="sync_Replies") {
|
|
||||||
replies();
|
|
||||||
} else if (synclist[syncindex]=="sync_DirectMessages") {
|
|
||||||
directmessages();
|
|
||||||
} else if (synclist[syncindex]=="sync_Notifications") {
|
|
||||||
notifications();
|
|
||||||
}
|
|
||||||
} else if (syncindex==synclist.length()) {
|
|
||||||
m_api="";
|
|
||||||
if(m_updateInterval!=0){
|
|
||||||
syncindex=0;
|
|
||||||
synclist.clear();
|
|
||||||
m_db.close();
|
|
||||||
m_db.removeDatabase(m_db.connectionName());
|
|
||||||
emit quitapp();
|
|
||||||
alarm.setAlarm(m_updateInterval);
|
|
||||||
m_updateInterval=0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void UPDATENEWS::timeline()
|
|
||||||
{
|
|
||||||
m_api="/api/statuses/friends_timeline";
|
|
||||||
xhr.clearParams();
|
|
||||||
xhr.setUrl(m_url);
|
|
||||||
xhr.setApi(m_api);
|
|
||||||
QSqlQuery query("SELECT status_id FROM news WHERE messagetype=0 AND username='"+ username +"' ORDER BY status_id DESC LIMIT 1",m_db);
|
|
||||||
if (query.isActive() && query.isSelect()){
|
|
||||||
if (query.first()){
|
|
||||||
QString lastid=query.value(0).toString();
|
|
||||||
xhr.setParam("since_id",lastid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
xhr.setParam("count","50");
|
|
||||||
xhr.get();
|
|
||||||
QObject::connect(&xhr,SIGNAL(success(QByteArray,QString)),this,SLOT(store(QByteArray,QString)));
|
|
||||||
QObject::connect(&xhr,SIGNAL(error(QString,QString,QString,int)),this,SLOT(showError(QString,QString,QString,int)));
|
|
||||||
QObject::connect(&xhr, SIGNAL(downloaded(QString, QString, QString, int)), this, SLOT(updateImageLocation(QString,QString, QString, int)));
|
|
||||||
}
|
|
||||||
|
|
||||||
void UPDATENEWS::replies()
|
|
||||||
{
|
|
||||||
m_api="/api/statuses/replies";
|
|
||||||
xhr.clearParams();
|
|
||||||
xhr.setUrl(m_url);
|
|
||||||
xhr.setApi(m_api);
|
|
||||||
QSqlQuery query("SELECT status_id FROM news WHERE messagetype=3 AND username='"+ username +"' ORDER BY status_id DESC LIMIT 1",m_db);
|
|
||||||
if (query.isActive() && query.isSelect()){
|
|
||||||
if (query.first()){
|
|
||||||
QString lastid=query.value(0).toString();
|
|
||||||
xhr.setParam("since_id",lastid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
xhr.setParam("count","50");
|
|
||||||
xhr.get();
|
|
||||||
QObject::connect(&xhr,SIGNAL(success(QByteArray,QString)),this,SLOT(store(QByteArray,QString)));
|
|
||||||
QObject::connect(&xhr,SIGNAL(error(QString,QString,QString,int)),this,SLOT(showError(QString,QString,QString,int)));
|
|
||||||
QObject::connect(&xhr, SIGNAL(downloaded(QString, QString, QString, int)), this, SLOT(updateImageLocation(QString,QString, QString, int)));
|
|
||||||
}
|
|
||||||
|
|
||||||
void UPDATENEWS::directmessages()
|
|
||||||
{
|
|
||||||
m_api="/api/direct_messages/all";
|
|
||||||
xhr.clearParams();
|
|
||||||
xhr.setUrl(m_url);
|
|
||||||
xhr.setApi(m_api);
|
|
||||||
QSqlQuery query("SELECT status_id FROM news WHERE messagetype=1 AND username='"+ username +"' ORDER BY status_id DESC LIMIT 1",m_db);
|
|
||||||
if (query.isActive() && query.isSelect()){
|
|
||||||
if (query.first()){
|
|
||||||
QString lastid=query.value(0).toString();
|
|
||||||
xhr.setParam("since_id",lastid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
xhr.get();
|
|
||||||
QObject::connect(&xhr,SIGNAL(success(QByteArray,QString)),this,SLOT(store(QByteArray,QString)));
|
|
||||||
QObject::connect(&xhr,SIGNAL(error(QString,QString,QString,int)),this,SLOT(showError(QString,QString,QString,int)));
|
|
||||||
QObject::connect(&xhr, SIGNAL(downloaded(QString, QString, QString, int)), this, SLOT(updateImageLocation(QString,QString, QString, int)));
|
|
||||||
}
|
|
||||||
|
|
||||||
void UPDATENEWS::notifications()
|
|
||||||
{
|
|
||||||
m_api="/api/friendica/notifications";
|
|
||||||
xhr.clearParams();
|
|
||||||
xhr.setUrl(m_url);
|
|
||||||
xhr.setApi(m_api);
|
|
||||||
xhr.get();
|
|
||||||
QObject::connect(&xhr,SIGNAL(success(QByteArray,QString)),this,SLOT(store(QByteArray,QString)));
|
|
||||||
QObject::connect(&xhr,SIGNAL(error(QString,QString,QString,int)),this,SLOT(showError(QString,QString,QString,int)));
|
|
||||||
QObject::connect(&xhr, SIGNAL(downloaded(QString, QString, QString, int)), this, SLOT(updateImageLocation(QString,QString, QString, int)));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void UPDATENEWS::store(QByteArray serverreply,QString apiname)
|
|
||||||
{ if (apiname!=m_api || xhr.downloadtype()!=""){} else {
|
|
||||||
QJsonDocument news;
|
|
||||||
//qDebug()<<apiname << serverreply;
|
|
||||||
QJsonParseError jsonerror;
|
|
||||||
news=QJsonDocument::fromJson(serverreply,&jsonerror);
|
|
||||||
if (news.isArray()){
|
|
||||||
for (int i=0; i < news.array().count();i++){
|
|
||||||
QJsonValue newsitem=news[i];
|
|
||||||
if (apiname=="/api/friendica/notifications"){
|
|
||||||
QSqlQuery testquery("SELECT status_id FROM news WHERE status_id=" + QString::number(newsitem["id"].toInt()) + " AND messagetype=2 AND username='"+ username +"'",m_db);
|
|
||||||
if (testquery.first()) {continue;}
|
|
||||||
}
|
|
||||||
QSqlQuery query(m_db);
|
|
||||||
query.prepare("INSERT INTO news (username,messagetype,text,created_at,in_reply_to_status_id,source,status_id,in_reply_to_user_id,geo,favorited,uid,statusnet_html,statusnet_conversation_id,friendica_activities,friendica_activities_self,attachments,friendica_owner) " "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
|
|
||||||
query.bindValue(0,username);
|
|
||||||
query.bindValue(1,"0");
|
|
||||||
query.bindValue(2, newsitem["text"].toString().toUtf8().toBase64());
|
|
||||||
QString sourcedate=newsitem["created_at"].toString();
|
|
||||||
QString formateddate=sourcedate.mid(0,3)+", "+sourcedate.mid(8,3)+sourcedate.mid(4,3)+sourcedate.mid(25,5)+sourcedate.mid(10,15);
|
|
||||||
query.bindValue(3,QDateTime::fromString(formateddate,Qt::RFC2822Date).toMSecsSinceEpoch() );
|
|
||||||
if(newsitem["in_reply_to_status_id"]!=QJsonValue::Null){query.bindValue(4, newsitem["in_reply_to_status_id"].toInt());}
|
|
||||||
query.bindValue(5,newsitem["source"]);
|
|
||||||
query.bindValue(6,newsitem["id"].toInt());
|
|
||||||
if(newsitem["in_reply_to_user_id"]!=QJsonValue::Null){ query.bindValue(7,newsitem["in_reply_to_user_id"].toInt());}
|
|
||||||
query.bindValue(8,newsitem["geo"]);
|
|
||||||
query.bindValue( 9, newsitem["favorited"].toInt());
|
|
||||||
query.bindValue(10, newsitem["user"]["id"].toInt());
|
|
||||||
query.bindValue(11, newsitem["statusnet_html"].toString().toUtf8().toBase64());
|
|
||||||
query.bindValue(12, newsitem["statusnet_conversation_id"].toInt());
|
|
||||||
QJsonArray likeArray;QJsonArray dislikeArray;QJsonArray attendyesArray;QJsonArray attendnoArray;QJsonArray attendmaybeArray;
|
|
||||||
if (newsitem.toObject().contains("friendica_activities")){
|
|
||||||
for (int a=0; a < newsitem["friendica_activities"]["like"].toArray().count();a++){
|
|
||||||
likeArray.append(newsitem["friendica_activities"]["like"][a]["url"].toString());
|
|
||||||
}
|
|
||||||
for (int b=0; b < newsitem["friendica_activities"]["dislike"].toArray().count();b++){
|
|
||||||
dislikeArray.append(newsitem["friendica_activities"]["dislike"][b]["url"].toString());
|
|
||||||
}
|
|
||||||
for (int c=0; c < newsitem["friendica_activities"]["attendyes"].toArray().count();c++){
|
|
||||||
attendyesArray.append(newsitem["friendica_activities"]["attendyes"][c]["url"].toString());
|
|
||||||
}
|
|
||||||
for (int d=0; d < newsitem["friendica_activities"]["attendno"].toArray().count();d++){
|
|
||||||
attendnoArray.append(newsitem["friendica_activities"]["attendno"][d]["url"].toString());
|
|
||||||
}
|
|
||||||
for (int e = 0; e < newsitem["friendica_activities"]["attendmaybe"].toArray().count();e++){
|
|
||||||
attendmaybeArray.append(newsitem["friendica_activities"]["attendmaybe"][e]["url"].toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
QJsonArray friendica_activities; friendica_activities={likeArray,dislikeArray,attendyesArray,attendnoArray,attendmaybeArray};
|
|
||||||
QJsonDocument activities; activities.setArray(friendica_activities);
|
|
||||||
query.bindValue(13,activities.toJson(QJsonDocument::Compact).toBase64());
|
|
||||||
query.bindValue(14,"[]");
|
|
||||||
|
|
||||||
if (newsitem["attachments"]!=QJsonValue::Undefined){
|
|
||||||
query.bindValue(15, QJsonDocument(newsitem["attachments"].toArray()).toJson(QJsonDocument::Compact).toBase64());
|
|
||||||
}else {
|
|
||||||
query.bindValue(15, "");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (newsitem["friendica_author"]!=QJsonValue::Undefined){
|
|
||||||
query.bindValue(16, newsitem["friendica_author"]["url"]);
|
|
||||||
}else {
|
|
||||||
query.bindValue(16, newsitem["user"]["url"]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (apiname=="/api/statuses/replies"){
|
|
||||||
query.bindValue(1,"3");
|
|
||||||
}
|
|
||||||
if (apiname == "/api/direct_messages/all"){
|
|
||||||
query.bindValue(1,"1");
|
|
||||||
query.bindValue(5,"Friendica");
|
|
||||||
if(newsitem["recipient"]["id"]!=QJsonValue::Null){ query.bindValue(7,newsitem["recipient"]["id"].toInt());}
|
|
||||||
query.bindValue(10, newsitem["sender_id"].toInt());
|
|
||||||
query.bindValue(11, newsitem["text"].toString().toUtf8().toBase64());
|
|
||||||
if(newsitem["friendica_parent_uri"]!=QJsonValue::Null){ query.bindValue(12,newsitem["friendica_parent_uri"]);}
|
|
||||||
query.bindValue(16, newsitem["sender"]["url"]);
|
|
||||||
}
|
|
||||||
if (apiname == "/api/friendica/notifications"){
|
|
||||||
query.bindValue(1,"2");
|
|
||||||
query.bindValue(3,QDateTime::fromString(newsitem["date"].toString(),"yyyy-MM-dd hh:mm:ss").toMSecsSinceEpoch());
|
|
||||||
query.bindValue(5,"Friendica");
|
|
||||||
QJsonObject cleancontact= findNotificationContact(newsitem["url"].toString());
|
|
||||||
query.bindValue(10, cleancontact["id"].toInt());
|
|
||||||
query.bindValue(11, newsitem["msg_html"].toString().toUtf8().toBase64());
|
|
||||||
if(newsitem["parent"]!=QJsonValue::Null){ query.bindValue(12,newsitem["parent"]);}
|
|
||||||
query.bindValue(16, newsitem["url"]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!(query.exec())) {qDebug()<<query.lastError();}
|
|
||||||
|
|
||||||
// notifications
|
|
||||||
if (apiname=="/api/statuses/friends_timeline"){
|
|
||||||
if(notifylist.contains("notify_Timeline")){
|
|
||||||
alarm.notify("Home: "+ newsitem["user"]["name"].toString(),newsitem["text"].toString(),0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (apiname=="/api/statuses/replies"){
|
|
||||||
if(notifylist.contains("notify_Replies")){
|
|
||||||
alarm.notify("Replies: "+newsitem["user"]["name"].toString(),newsitem["text"].toString(),1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (apiname=="/api/direct_messages/all"){
|
|
||||||
if(notifylist.contains("notify_DirectMessages")){
|
|
||||||
alarm.notify("DirectMessage: "+newsitem["sender"]["name"].toString(),newsitem["text"].toString(),2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (apiname=="/api/friendica/notifications"){
|
|
||||||
if(notifylist.contains("notify_Notifications")){
|
|
||||||
alarm.notify("Notification: "+newsitem["name"].toString(),newsitem["text"].toString(),3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
QList<QJsonValue> newcontacts=findNewContacts(news);
|
|
||||||
//qDebug()<< "new contacts count " << newcontacts.size();
|
|
||||||
if (newcontacts.size()>0){
|
|
||||||
updateContacts(newcontacts);
|
|
||||||
startImagedownload();
|
|
||||||
|
|
||||||
} else {
|
|
||||||
if(m_updateInterval!=0){
|
|
||||||
syncindex+=1;
|
|
||||||
startsync();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
qDebug()<< "Friendiqa updatenews error " << serverreply;
|
|
||||||
emit this->error(m_api,QTextCodec::codecForName("utf-8")->toUnicode(serverreply));
|
|
||||||
syncindex+=1;
|
|
||||||
startsync();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void UPDATENEWS::updateImageLocation(QString downloadtype,QString imageurl, QString filename, int index){
|
|
||||||
if (downloadtype=="contactlist"){
|
|
||||||
QSqlQuery testquery("SELECT profile_image FROM contacts WHERE profile_image_url ='"+imageurl+ "' AND username = '" +username+"'",m_db);
|
|
||||||
testquery.first();
|
|
||||||
//qDebug()<< "update imageurl for " <<imageurl << " from " <<testquery.value(0).toString() <<" to "<< filename <<" index " << index << " newcontactnames.length " <<newcontactnames.length();
|
|
||||||
QSqlQuery query("UPDATE contacts SET profile_image='"+ filename +"' WHERE profile_image_url ='"+imageurl+ "' AND username = '" +username+"'",m_db);
|
|
||||||
query.exec();
|
|
||||||
if (index==(newcontactnames.length()-1)){
|
|
||||||
newcontactnames.clear();
|
|
||||||
newcontactimagelinks.clear();
|
|
||||||
if(m_updateInterval!=0){
|
|
||||||
syncindex+=1;
|
|
||||||
startsync();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QJsonObject UPDATENEWS::findNotificationContact(QString contacturl){
|
|
||||||
QSqlQuery query("SELECT id,url FROM contacts WHERE url='"+contacturl+"' AND username='"+ username+"'",m_db);
|
|
||||||
query.first();
|
|
||||||
QJsonObject contact{
|
|
||||||
{"id", query.value(0).toInt()},
|
|
||||||
{"url", query.value(1).toString()}
|
|
||||||
};
|
|
||||||
return contact;
|
|
||||||
}
|
|
||||||
|
|
||||||
QList <QJsonValue> UPDATENEWS::findNewContacts(QJsonDocument news){
|
|
||||||
QSqlQuery query("SELECT profile_image_url FROM contacts",m_db);
|
|
||||||
QList<QString> imageurls;
|
|
||||||
while (query.next()){
|
|
||||||
imageurls.append(query.value(0).toString());
|
|
||||||
}
|
|
||||||
QList<QJsonValue> newcontacts;
|
|
||||||
//qDebug()<<"updatenews findcontacts news count "<<news.array().count();
|
|
||||||
|
|
||||||
for (int i=0; i<news.array().count();i++){
|
|
||||||
//main contacts
|
|
||||||
if(imageurls.contains(news[i]["user"]["profile_image_url"].toString().section('?',0,0)) || newcontactimagelinks.contains(news[i]["user"]["profile_image_url"].toString().section('?',0,0))){
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
newcontacts.append(news[i]["user"]);
|
|
||||||
newcontactimagelinks.append(news[i]["user"]["profile_image_url"].toString().section('?',0,0));
|
|
||||||
newcontactnames.append(news[i]["user"]["screen_name"].toString());
|
|
||||||
}
|
|
||||||
//like/dislike contacts
|
|
||||||
if (news[i].toObject().contains("friendica_activities") ){
|
|
||||||
for (int a=0; a < news[i]["friendica_activities"]["like"].toArray().count();a++){
|
|
||||||
if(imageurls.contains(news[i]["friendica_activities"]["like"][a]["profile_image_url"].toString().section('?',0,0)) || newcontactimagelinks.contains(news[i]["friendica_activities"]["like"][a]["profile_image_url"].toString().section('?',0,0))){
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
newcontacts.append(news[i]["friendica_activities"]["like"][a]);
|
|
||||||
newcontactimagelinks.append(news[i]["friendica_activities"]["like"][a]["profile_image_url"].toString().section('?',0,0));
|
|
||||||
newcontactnames.append(news[i]["friendica_activities"][a]["screen_name"].toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (int b=0; b < news[i]["friendica_activities"]["dislike"].toArray().count();b++){
|
|
||||||
if(imageurls.contains(news[i]["friendica_activities"]["dislike"][b]["profile_image_url"].toString().section('?',0,0)) || newcontactimagelinks.contains(news[i]["friendica_activities"]["dislike"][b]["profile_image_url"].toString().section('?',0,0))){
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
newcontacts.append(news[i]["friendica_activities"]["dislike"][b]);
|
|
||||||
newcontactimagelinks.append(news[i]["friendica_activities"]["dislike"][b]["profile_image_url"].toString().section('?',0,0));
|
|
||||||
newcontactnames.append(news[i]["friendica_activities"][b]["screen_name"].toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//owner contacts
|
|
||||||
if (news[i].toObject().contains("friendica_author") ){
|
|
||||||
if(imageurls.contains(news[i]["friendica_author"]["profile_image_url"].toString().section('?',0,0)) || newcontactimagelinks.contains(news[i]["friendica_owner"]["profile_image_url"].toString().section('?',0,0))){
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
newcontacts.append(news[i]["friendica_author"]);
|
|
||||||
newcontactimagelinks.append(news[i]["friendica_author"]["profile_image_url"].toString().section('?',0,0));
|
|
||||||
newcontactnames.append(news[i]["friendica_author"]["screen_name"].toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return newcontacts;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void UPDATENEWS::updateContacts(QList<QJsonValue> contacts){
|
|
||||||
qint64 currentTime =QDateTime::currentMSecsSinceEpoch();
|
|
||||||
for (int i=0; i < contacts.count();i++){
|
|
||||||
QJsonValue contact=contacts[i];
|
|
||||||
QSqlQuery query(m_db);
|
|
||||||
//qDebug() << "updatecontact " << contact["screen_name"];
|
|
||||||
QSqlQuery testquery("SELECT url FROM contacts WHERE username='"+ username +"' AND url='" + contact["url"].toString() +"'",m_db);
|
|
||||||
if (testquery.first()){
|
|
||||||
query.prepare("UPDATE contacts SET id=?, name=?, screen_name=?, location=?,imageAge=?,"
|
|
||||||
"profile_image_url=?, description=?, protected=?, followers_count=?,"
|
|
||||||
"friends_count=?, created_at=?, favourites_count=?, utc_offset=?, time_zone=?, statuses_count=?,"
|
|
||||||
"following=?, verified=?, statusnet_blocking=?, notifications=?, statusnet_profile_url=?, cid=?, network=?, timestamp=? "
|
|
||||||
" WHERE username='"+ username +"' AND url='" + contact["url"].toString() +"'");
|
|
||||||
query.bindValue(0, contact["id"].toInt());
|
|
||||||
query.bindValue(1, contact["name"].toString().toUtf8().toBase64());
|
|
||||||
query.bindValue(2, contact["screen_name"]);
|
|
||||||
query.bindValue(3, contact["location"]);
|
|
||||||
query.bindValue(4, currentTime);
|
|
||||||
query.bindValue(5, contact["profile_image_url"].toString().section('?',0,0));
|
|
||||||
if(contact["description"].isNull() ){query.bindValue(6,"");}else{query.bindValue(6, contact["description"].toString().toUtf8().toBase64());}
|
|
||||||
query.bindValue(7,contact["protected"].toBool());
|
|
||||||
query.bindValue(8,contact["followers_count"].toInt());
|
|
||||||
query.bindValue(9,contact["friends_count"].toInt());
|
|
||||||
QString sourcedate=contact["created_at"].toString();
|
|
||||||
QString formateddate=sourcedate.mid(0,3)+", "+sourcedate.mid(8,3)+sourcedate.mid(4,3)+sourcedate.mid(25,5)+sourcedate.mid(10,15);
|
|
||||||
query.bindValue(10,QDateTime::fromString(formateddate,Qt::RFC2822Date).toMSecsSinceEpoch() );
|
|
||||||
query.bindValue(11,contact["favorites_count"].toInt());
|
|
||||||
query.bindValue(12,contact["utc_offset"].toInt());
|
|
||||||
query.bindValue(13,contact["time_zone"].toString());
|
|
||||||
query.bindValue(14,contact["statuses_count"].toInt());
|
|
||||||
query.bindValue(15,contact["following"].toBool());
|
|
||||||
query.bindValue(16,contact["verfied"].toBool());
|
|
||||||
query.bindValue(17,contact["statusnet_blocking"].toBool());
|
|
||||||
query.bindValue(18,contact["notifications"].toBool());
|
|
||||||
query.bindValue(19,contact["statusnet_profile_url"]);
|
|
||||||
query.bindValue(20,contact["cid"].toInt());
|
|
||||||
query.bindValue(21,contact["network"]);
|
|
||||||
qint64 timestamp=0;
|
|
||||||
QString timestamphelper=contact["profile_image_url"].toString();
|
|
||||||
try {timestamp=timestamphelper.mid(timestamphelper.indexOf("?ts")+4,timestamphelper.length()).toUInt();} catch(...){}
|
|
||||||
query.bindValue(22,timestamp);
|
|
||||||
}
|
|
||||||
|
|
||||||
else{
|
|
||||||
query.prepare("INSERT INTO contacts (username, id, name, screen_name, location,imageAge,"
|
|
||||||
"profile_image_url, description, profile_image, url, protected, followers_count,"
|
|
||||||
"friends_count, created_at, favourites_count, utc_offset, time_zone, statuses_count,"
|
|
||||||
"following, verified, statusnet_blocking, notifications, statusnet_profile_url, cid, network, isFriend, timestamp)"
|
|
||||||
"VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
|
|
||||||
|
|
||||||
query.bindValue(0,username);
|
|
||||||
query.bindValue(1, contact["id"].toInt());
|
|
||||||
query.bindValue(2, contact["name"].toString().toUtf8().toBase64());
|
|
||||||
query.bindValue(3, contact["screen_name"]);
|
|
||||||
query.bindValue(4, contact["location"]);
|
|
||||||
query.bindValue(5, currentTime);
|
|
||||||
query.bindValue(6, contact["profile_image_url"].toString().section('?',0,0));
|
|
||||||
if(contact["description"].isNull() ){query.bindValue(7,"");}else{query.bindValue(7, contact["description"].toString().toUtf8().toBase64());}
|
|
||||||
query.bindValue(8,"none");
|
|
||||||
query.bindValue(9, contact["url"].toString());
|
|
||||||
query.bindValue(10,contact["protected"].toBool());
|
|
||||||
query.bindValue(11,contact["followers_count"].toInt());
|
|
||||||
query.bindValue(12,contact["friends_count"].toInt());
|
|
||||||
QString sourcedate=contact["created_at"].toString();
|
|
||||||
QString formateddate=sourcedate.mid(0,3)+", "+sourcedate.mid(8,3)+sourcedate.mid(4,3)+sourcedate.mid(25,5)+sourcedate.mid(10,15);
|
|
||||||
query.bindValue(13,QDateTime::fromString(formateddate,Qt::RFC2822Date).toMSecsSinceEpoch() );
|
|
||||||
query.bindValue(14,contact["favorites_count"].toInt());
|
|
||||||
query.bindValue(15,contact["utc_offset"].toInt());
|
|
||||||
query.bindValue(16,contact["time_zone"].toString());
|
|
||||||
query.bindValue(17,contact["statuses_count"].toInt());
|
|
||||||
query.bindValue(18,contact["following"].toBool());
|
|
||||||
query.bindValue(19,contact["verfied"].toBool());
|
|
||||||
query.bindValue(20,contact["statusnet_blocking"].toBool());
|
|
||||||
query.bindValue(21,contact["notifications"].toBool());
|
|
||||||
query.bindValue(22,contact["statusnet_profile_url"]);
|
|
||||||
query.bindValue(23,contact["cid"].toInt());
|
|
||||||
query.bindValue(24,contact["network"]);
|
|
||||||
query.bindValue(25, 0);
|
|
||||||
qint64 timestamp=0;
|
|
||||||
QString timestamphelper=contact["profile_image_url"].toString();
|
|
||||||
try {timestamp=timestamphelper.mid(timestamphelper.indexOf("?ts")+4,timestamphelper.length()).toUInt();} catch(...){}
|
|
||||||
query.bindValue(26,timestamp);
|
|
||||||
|
|
||||||
}
|
|
||||||
query.exec() ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QString UPDATENEWS::url() const
|
|
||||||
{
|
|
||||||
return m_url;
|
|
||||||
}
|
|
||||||
|
|
||||||
void UPDATENEWS::startImagedownload()
|
|
||||||
{
|
|
||||||
//qDebug() << "start image download";
|
|
||||||
xhr.setDownloadtype("contactlist");
|
|
||||||
xhr.setFilelist(newcontactimagelinks);
|
|
||||||
xhr.setContactlist(newcontactnames);
|
|
||||||
xhr.setImagedir(m_imagedir);
|
|
||||||
xhr.getlist();
|
|
||||||
}
|
|
||||||
|
|
||||||
void UPDATENEWS::showError(QString data, QString url,QString api, int code )
|
|
||||||
{
|
|
||||||
qDebug() << "showerror " << api << " data " << data;
|
|
||||||
emit this->error(api,data);
|
|
||||||
if (api!=m_api || xhr.downloadtype()!=""){} else{
|
|
||||||
if(m_updateInterval!=0){
|
|
||||||
syncindex+=1;
|
|
||||||
startsync();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
1
source-android/common/updatenews.cpp
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../../source-linux/common/updatenews.cpp
|
|
@ -1,100 +0,0 @@
|
||||||
// This file is part of Friendiqa
|
|
||||||
// https://git.friendi.ca/lubuwest/Friendiqa
|
|
||||||
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net>
|
|
||||||
//
|
|
||||||
// This program is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// In addition, as a special exception, the copyright holders give
|
|
||||||
// permission to link the code of portions of this program with the
|
|
||||||
// OpenSSL library under certain conditions as described in each
|
|
||||||
// individual source file, and distribute linked combinations including
|
|
||||||
// the two.
|
|
||||||
//
|
|
||||||
// You must obey the GNU General Public License in all respects for all
|
|
||||||
// of the code used other than OpenSSL. If you modify file(s) with this
|
|
||||||
// exception, you may extend this exception to your version of the
|
|
||||||
// file(s), but you are not obligated to do so. If you do not wish to do
|
|
||||||
// so, delete this exception statement from your version. If you delete
|
|
||||||
// this exception statement from all source files in the program, then
|
|
||||||
// also delete it here.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#ifndef UPDATENEWS_H
|
|
||||||
#define UPDATENEWS_H
|
|
||||||
|
|
||||||
#include <QObject>
|
|
||||||
#include <QJsonObject>
|
|
||||||
#include <QSqlDatabase>
|
|
||||||
#include "xhr.h"
|
|
||||||
#include "alarm.h"
|
|
||||||
//#include "AndroidNative/systemdispatcher.h"
|
|
||||||
|
|
||||||
class UPDATENEWS : public QObject
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
Q_PROPERTY(QString url READ url WRITE setUrl NOTIFY urlChanged)
|
|
||||||
// Q_PROPERTY(QString login READ login NOTIFY loginChanged)
|
|
||||||
public:
|
|
||||||
static UPDATENEWS *instance();
|
|
||||||
|
|
||||||
explicit UPDATENEWS(QObject *parent = 0);
|
|
||||||
|
|
||||||
QString url() const;
|
|
||||||
//QString login() const;
|
|
||||||
|
|
||||||
signals:
|
|
||||||
|
|
||||||
void urlChanged(QString url);
|
|
||||||
void success(QString api);
|
|
||||||
void error(QString api, QString content);
|
|
||||||
void quitapp();
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
void setUrl(QString url);
|
|
||||||
void setDatabase();
|
|
||||||
void login();
|
|
||||||
void timeline();
|
|
||||||
void replies();
|
|
||||||
void startsync();
|
|
||||||
void directmessages();
|
|
||||||
void notifications();
|
|
||||||
//void startservice(QString type,QVariantMap map);
|
|
||||||
void startImagedownload();
|
|
||||||
void updateImageLocation(QString downloadtype,QString imageurl, QString filename, int index);
|
|
||||||
void store(QByteArray serverreply,QString apiname);
|
|
||||||
void showError(QString data, QString url,QString api, int code);
|
|
||||||
|
|
||||||
private:
|
|
||||||
QString m_url;
|
|
||||||
QString m_api;
|
|
||||||
QString m_imagedir;
|
|
||||||
QString m_login;
|
|
||||||
QString username;
|
|
||||||
int syncindex;
|
|
||||||
QSqlDatabase m_db;
|
|
||||||
QList<QString> synclist;
|
|
||||||
QList <QString> notifylist;
|
|
||||||
QList<QJsonValue> findNewContacts(QJsonDocument news);
|
|
||||||
QJsonObject findNotificationContact(QString imagelink);
|
|
||||||
int m_updateInterval;
|
|
||||||
//void timeline();
|
|
||||||
//void store(QByteArray serverreply,QString apiname);
|
|
||||||
void updateContacts(QList<QJsonValue> contacts);
|
|
||||||
|
|
||||||
XHR xhr;
|
|
||||||
ALARM alarm;
|
|
||||||
QList<QString> newcontactimagelinks;
|
|
||||||
QList<QString> newcontactnames;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // UPDATENEWS_H
|
|
1
source-android/common/updatenews.h
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../../source-linux/common/updatenews.h
|
|
@ -1,121 +0,0 @@
|
||||||
// This file is part of Friendiqa
|
|
||||||
// https://github.com/lubuwest/Friendiqa
|
|
||||||
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net>
|
|
||||||
//
|
|
||||||
// This program is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// In addition, as a special exception, the copyright holders give
|
|
||||||
// permission to link the code of portions of this program with the
|
|
||||||
// OpenSSL library under certain conditions as described in each
|
|
||||||
// individual source file, and distribute linked combinations including
|
|
||||||
// the two.
|
|
||||||
//
|
|
||||||
// You must obey the GNU General Public License in all respects for all
|
|
||||||
// of the code used other than OpenSSL. If you modify file(s) with this
|
|
||||||
// exception, you may extend this exception to your version of the
|
|
||||||
// file(s), but you are not obligated to do so. If you do not wish to do
|
|
||||||
// so, delete this exception statement from your version. If you delete
|
|
||||||
// this exception statement from all source files in the program, then
|
|
||||||
// also delete it here.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#include "uploadableimage.h"
|
|
||||||
|
|
||||||
|
|
||||||
#include <QBuffer>
|
|
||||||
#include <QDebug>
|
|
||||||
#include <QFileInfo>
|
|
||||||
#include <QUrl>
|
|
||||||
|
|
||||||
void UploadableImage::setSource(const QString &a) {
|
|
||||||
if (a != m_source) {
|
|
||||||
m_source = a;
|
|
||||||
//m_base64 = "";
|
|
||||||
m_mimetype = "";
|
|
||||||
m_filename = "";
|
|
||||||
|
|
||||||
qDebug() << "UploadableImage::setSource : " << m_source;
|
|
||||||
|
|
||||||
if (m_source=="") {
|
|
||||||
emit sourceChanged();
|
|
||||||
//emit base64Changed();
|
|
||||||
emit mimetypeChanged();
|
|
||||||
emit filenameChanged();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
QImage fullimage = QImage(QUrl(m_source).toLocalFile());
|
|
||||||
if (fullimage.width() > 800 || fullimage.height() > 800) {
|
|
||||||
if (fullimage.width() > fullimage.height()) {
|
|
||||||
m_image = fullimage.scaledToWidth(800);
|
|
||||||
} else {
|
|
||||||
m_image = fullimage.scaledToHeight(800);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
m_image = fullimage;
|
|
||||||
}
|
|
||||||
qDebug() << "UploadableImage::setSource : " << m_image.width() << "x" << m_image.height();
|
|
||||||
emit sourceChanged();
|
|
||||||
|
|
||||||
QFileInfo fi(m_source);
|
|
||||||
|
|
||||||
m_filename = fi.fileName();
|
|
||||||
emit filenameChanged();
|
|
||||||
|
|
||||||
QString filetype = fi.suffix().toUpper();
|
|
||||||
if (filetype!="PNG" && filetype!="JPG") {
|
|
||||||
filetype = "JPG";
|
|
||||||
}
|
|
||||||
qDebug() << "UploadableImage::setSource : " << "Saving as " << filetype;
|
|
||||||
|
|
||||||
m_mimetype = "image/"+filetype.toLower();
|
|
||||||
emit mimetypeChanged();
|
|
||||||
|
|
||||||
/*
|
|
||||||
QByteArray byteArray;
|
|
||||||
QBuffer buffer(&byteArray);
|
|
||||||
m_image.save(&buffer, filetype.toLatin1().constData());
|
|
||||||
QString b64 = QString::fromLatin1(byteArray.toBase64().data());
|
|
||||||
|
|
||||||
for(int k=0; k<b64.length(); k+=76) {
|
|
||||||
m_base64 += b64.mid(k,76) + "\n";
|
|
||||||
}
|
|
||||||
m_base64 = m_base64.trimmed();
|
|
||||||
|
|
||||||
emit base64Changed();
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QString UploadableImage::source() const {
|
|
||||||
return m_source;
|
|
||||||
}
|
|
||||||
|
|
||||||
//QString UploadableImage::base64() const {
|
|
||||||
// return m_base64;
|
|
||||||
//}
|
|
||||||
|
|
||||||
QString UploadableImage::filename() const {
|
|
||||||
return m_filename;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString UploadableImage::mimetype() const {
|
|
||||||
return m_mimetype;
|
|
||||||
}
|
|
||||||
|
|
||||||
QByteArray UploadableImage::bytes() {
|
|
||||||
QByteArray byteArray;
|
|
||||||
QBuffer buffer(&byteArray);
|
|
||||||
m_image.save(&buffer, "PNG");
|
|
||||||
return byteArray;
|
|
||||||
}
|
|
1
source-android/common/uploadableimage.cpp
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../../source-linux/common/uploadableimage.cpp
|
|
@ -1,71 +0,0 @@
|
||||||
// This file is part of Friendiqa
|
|
||||||
// https://github.com/lubuwest/Friendiqa
|
|
||||||
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net>
|
|
||||||
//
|
|
||||||
// This program is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// In addition, as a special exception, the copyright holders give
|
|
||||||
// permission to link the code of portions of this program with the
|
|
||||||
// OpenSSL library under certain conditions as described in each
|
|
||||||
// individual source file, and distribute linked combinations including
|
|
||||||
// the two.
|
|
||||||
//
|
|
||||||
// You must obey the GNU General Public License in all respects for all
|
|
||||||
// of the code used other than OpenSSL. If you modify file(s) with this
|
|
||||||
// exception, you may extend this exception to your version of the
|
|
||||||
// file(s), but you are not obligated to do so. If you do not wish to do
|
|
||||||
// so, delete this exception statement from your version. If you delete
|
|
||||||
// this exception statement from all source files in the program, then
|
|
||||||
// also delete it here.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#ifndef UPLOADABLEIMAGE_H
|
|
||||||
#define UPLOADABLEIMAGE_H
|
|
||||||
|
|
||||||
#include <QObject>
|
|
||||||
#include <QQuickItem>
|
|
||||||
#include <QImage>
|
|
||||||
|
|
||||||
class UploadableImage : public QObject
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
Q_PROPERTY(QString source READ source WRITE setSource NOTIFY sourceChanged)
|
|
||||||
//Q_PROPERTY(QString base64 READ base64 NOTIFY base64Changed)
|
|
||||||
Q_PROPERTY(QString filename READ filename NOTIFY filenameChanged)
|
|
||||||
Q_PROPERTY(QString mimetype READ mimetype NOTIFY mimetypeChanged)
|
|
||||||
Q_PROPERTY(QByteArray bytes READ bytes)
|
|
||||||
|
|
||||||
public:
|
|
||||||
void setSource(const QString &a);
|
|
||||||
QString source() const;
|
|
||||||
|
|
||||||
//QString base64() const;
|
|
||||||
QString filename() const;
|
|
||||||
QString mimetype() const;
|
|
||||||
|
|
||||||
QByteArray bytes();
|
|
||||||
signals:
|
|
||||||
void sourceChanged();
|
|
||||||
//void base64Changed();
|
|
||||||
void filenameChanged();
|
|
||||||
void mimetypeChanged();
|
|
||||||
|
|
||||||
private:
|
|
||||||
QString m_source;
|
|
||||||
QImage m_image;
|
|
||||||
//QString m_base64;
|
|
||||||
QString m_filename;
|
|
||||||
QString m_mimetype;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // UPLOADABLEIMAGE_H
|
|
1
source-android/common/uploadableimage.h
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../../source-linux/common/uploadableimage.h
|
|
@ -1,369 +0,0 @@
|
||||||
// This file is part of Friendiqa
|
|
||||||
// https://github.com/lubuwest/Friendiqa
|
|
||||||
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net>
|
|
||||||
//
|
|
||||||
// This program is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// In addition, as a special exception, the copyright holders give
|
|
||||||
// permission to link the code of portions of this program with the
|
|
||||||
// OpenSSL library under certain conditions as described in each
|
|
||||||
// individual source file, and distribute linked combinations including
|
|
||||||
// the two.
|
|
||||||
//
|
|
||||||
// You must obey the GNU General Public License in all respects for all
|
|
||||||
// of the code used other than OpenSSL. If you modify file(s) with this
|
|
||||||
// exception, you may extend this exception to your version of the
|
|
||||||
// file(s), but you are not obligated to do so. If you do not wish to do
|
|
||||||
// so, delete this exception statement from your version. If you delete
|
|
||||||
// this exception statement from all source files in the program, then
|
|
||||||
// also delete it here.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#include "xhr.h"
|
|
||||||
|
|
||||||
#include <QHttpPart>
|
|
||||||
#include <QTextCodec>
|
|
||||||
#include <QUrlQuery>
|
|
||||||
#include <QList>
|
|
||||||
#include <QDataStream>
|
|
||||||
#include <QJsonDocument>
|
|
||||||
#include <QJsonObject>
|
|
||||||
#include "uploadableimage.h"
|
|
||||||
|
|
||||||
XHR *XHR::instance()
|
|
||||||
{
|
|
||||||
static XHR xhr;
|
|
||||||
return &xhr;
|
|
||||||
}
|
|
||||||
|
|
||||||
XHR::XHR(QObject *parent) : QObject(parent)
|
|
||||||
{
|
|
||||||
request.setSslConfiguration(QSslConfiguration::defaultConfiguration());
|
|
||||||
}
|
|
||||||
|
|
||||||
void XHR::setUrl(QString url)
|
|
||||||
{
|
|
||||||
if (url!=m_url) {
|
|
||||||
m_url = url;
|
|
||||||
emit urlChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void XHR::setApi(QString api)
|
|
||||||
{
|
|
||||||
if (api!=m_api) {
|
|
||||||
m_api = api;
|
|
||||||
emit apiChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void XHR::setLogin(QString login)
|
|
||||||
{
|
|
||||||
if (login!=m_login) {
|
|
||||||
m_login = login;
|
|
||||||
emit loginChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void XHR::setFilename(QString filename)
|
|
||||||
{
|
|
||||||
if (filename!=m_filename) {
|
|
||||||
m_filename = filename;
|
|
||||||
emit filenameChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void XHR::setContactlist(QList<QString> contactlist)
|
|
||||||
{
|
|
||||||
if (contactlist!=m_contactlist) {
|
|
||||||
m_contactlist = contactlist;
|
|
||||||
emit contactlistChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void XHR::setFilelist(QList<QString> filelist)
|
|
||||||
{
|
|
||||||
if (filelist!=m_filelist) {
|
|
||||||
m_filelist = filelist;
|
|
||||||
emit filelistChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void XHR::setImagedir(QString imagedir)
|
|
||||||
{
|
|
||||||
if (imagedir!=m_imagedir) {
|
|
||||||
m_imagedir = imagedir;
|
|
||||||
emit imagedirChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void XHR::setDownloadtype(QString downloadtype)
|
|
||||||
{
|
|
||||||
if (downloadtype!=m_downloadtype) {
|
|
||||||
m_downloadtype = downloadtype;
|
|
||||||
emit downloadtypeChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QString XHR::url() const
|
|
||||||
{
|
|
||||||
return m_url;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString XHR::api() const
|
|
||||||
{
|
|
||||||
return m_api;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString XHR::login() const
|
|
||||||
{
|
|
||||||
return m_login;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString XHR::filename() const
|
|
||||||
{
|
|
||||||
return m_filename;
|
|
||||||
}
|
|
||||||
|
|
||||||
QList<QString> XHR::contactlist() const
|
|
||||||
{
|
|
||||||
return m_contactlist;
|
|
||||||
}
|
|
||||||
|
|
||||||
QList<QString> XHR::filelist() const
|
|
||||||
{
|
|
||||||
return m_filelist;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString XHR::imagedir() const
|
|
||||||
{
|
|
||||||
return m_imagedir;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString XHR::downloadtype() const
|
|
||||||
{
|
|
||||||
return m_downloadtype;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString XHR::networktype()
|
|
||||||
{
|
|
||||||
return nc.bearerTypeFamily() + nc.bearerTypeName();
|
|
||||||
}
|
|
||||||
|
|
||||||
void XHR::setParam(QString name, QString value)
|
|
||||||
{
|
|
||||||
params.insert(name, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
void XHR::setImageFileParam(QString name, QString url)
|
|
||||||
{
|
|
||||||
files.insert(name, url);
|
|
||||||
}
|
|
||||||
|
|
||||||
void XHR::clearParams()
|
|
||||||
{
|
|
||||||
files.clear();
|
|
||||||
params.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
void XHR::download()
|
|
||||||
{
|
|
||||||
QUrl requrl(m_url);
|
|
||||||
if(m_downloadtype=="picturelist"){
|
|
||||||
QByteArray loginData = m_login.toLocal8Bit().toBase64();
|
|
||||||
QString headerData = "Basic " + loginData;
|
|
||||||
request.setRawHeader("Authorization", headerData.toLocal8Bit());
|
|
||||||
}
|
|
||||||
request.setUrl(requrl);
|
|
||||||
reply = manager.get(request);
|
|
||||||
reply->ignoreSslErrors();
|
|
||||||
connect(reply, &QNetworkReply::readyRead,this, &XHR::onReadyRead);
|
|
||||||
//connect(reply,SIGNAL(downloadProgress(qint64,qint64)), this,SLOT(updateDownloadProgress(qint64,qint64)));
|
|
||||||
connect(reply, &QNetworkReply::finished,this, &XHR::onRequestFinished);
|
|
||||||
connect(reply, &QNetworkReply::sslErrors, this, &XHR::onSSLError);
|
|
||||||
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onReplyError(QNetworkReply::NetworkError)));
|
|
||||||
}
|
|
||||||
|
|
||||||
void XHR::get()
|
|
||||||
{
|
|
||||||
QUrlQuery query;
|
|
||||||
|
|
||||||
QHashIterator<QString, QString> i(params);
|
|
||||||
while(i.hasNext()) {
|
|
||||||
i.next();
|
|
||||||
query.addQueryItem(i.key(), i.value());
|
|
||||||
//qDebug()<<i.key() << " value "<< i.value();
|
|
||||||
}
|
|
||||||
|
|
||||||
QUrl requrl(m_url+m_api);
|
|
||||||
//qDebug() << "API "<< requrl<<m_api;
|
|
||||||
requrl.setQuery(query);
|
|
||||||
QByteArray loginData = m_login.toLocal8Bit().toBase64();
|
|
||||||
QString headerData = "Basic " + loginData;
|
|
||||||
request.setRawHeader("Authorization", headerData.toLocal8Bit());
|
|
||||||
request.setUrl(requrl);
|
|
||||||
reply = manager.get(request);
|
|
||||||
|
|
||||||
connect(reply, &QNetworkReply::finished, this, &XHR::onReplySuccess);
|
|
||||||
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onReplyError(QNetworkReply::NetworkError)));
|
|
||||||
connect(reply, &QNetworkReply::readyRead, this, &XHR::onReadyRead);
|
|
||||||
connect(reply, &QNetworkReply::sslErrors, this, &XHR::onSSLError);
|
|
||||||
}
|
|
||||||
|
|
||||||
void XHR::getlist()
|
|
||||||
{
|
|
||||||
if(dlindex < m_filelist.size()) {
|
|
||||||
QString cleanfilename;
|
|
||||||
if (m_downloadtype=="contactlist"){cleanfilename = m_contactlist.at(dlindex)+"-"+ m_filelist.at(dlindex).section('/',-1).section('?',0,0);
|
|
||||||
XHR::setFilename(imagedir()+"contacts/"+cleanfilename);
|
|
||||||
XHR::setUrl(m_filelist.at(dlindex));}
|
|
||||||
else {
|
|
||||||
XHR::setUrl(m_filelist.at(dlindex));}
|
|
||||||
XHR::download();
|
|
||||||
} else {dlindex=0;m_downloadtype="";m_contactlist.clear();m_filelist.clear();}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void XHR::post()
|
|
||||||
{
|
|
||||||
//qDebug() << "start post to " << m_url;
|
|
||||||
QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
|
|
||||||
|
|
||||||
QHashIterator<QString, QString> iparams(params);
|
|
||||||
while(iparams.hasNext()) {
|
|
||||||
iparams.next();
|
|
||||||
//qDebug() << "\t add param " << iparams.key() << " : " << iparams.value();
|
|
||||||
QHttpPart textPart;
|
|
||||||
textPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"" + iparams.key() + "\""));
|
|
||||||
|
|
||||||
|
|
||||||
textPart.setBody(iparams.value().toUtf8());
|
|
||||||
multiPart->append(textPart);
|
|
||||||
}
|
|
||||||
|
|
||||||
UploadableImage uimg;
|
|
||||||
QHashIterator<QString, QString> ifiles(files);
|
|
||||||
while(ifiles.hasNext()) {
|
|
||||||
ifiles.next();
|
|
||||||
|
|
||||||
uimg.setSource(ifiles.value());
|
|
||||||
//qDebug() << "\t image: " << uimg.mimetype() << ", " << ifiles.key();
|
|
||||||
|
|
||||||
QHttpPart imagePart;
|
|
||||||
imagePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant(uimg.mimetype()));
|
|
||||||
imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"" + ifiles.key() + "\"; filename=\""+uimg.filename()+"\""));
|
|
||||||
imagePart.setBody(uimg.bytes());
|
|
||||||
multiPart->append(imagePart);
|
|
||||||
}
|
|
||||||
|
|
||||||
QByteArray loginData = m_login.toLocal8Bit().toBase64();
|
|
||||||
QString headerData = "Basic " + loginData;
|
|
||||||
request.setRawHeader(QByteArray("Authorization"), headerData.toLocal8Bit());
|
|
||||||
|
|
||||||
request.setUrl(m_url+m_api);
|
|
||||||
reply = manager.post(request, multiPart);
|
|
||||||
qDebug() << "\t request sent";
|
|
||||||
connect(reply, &QNetworkReply::finished, this, &XHR::onReplySuccess);
|
|
||||||
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(onReplyError(QNetworkReply::NetworkError)));
|
|
||||||
connect(reply, &QNetworkReply::readyRead, this, &XHR::onReadyRead);
|
|
||||||
connect(reply, &QNetworkReply::sslErrors, this, &XHR::onSSLError);
|
|
||||||
qDebug() << "\t reply signals connected";
|
|
||||||
}
|
|
||||||
|
|
||||||
void XHR::onReplyError(QNetworkReply::NetworkError code)
|
|
||||||
{
|
|
||||||
qDebug() << code;
|
|
||||||
emit this->error( bufferToString(), m_url,m_api, (int) code);
|
|
||||||
buffer.clear();
|
|
||||||
reply->deleteLater();
|
|
||||||
}
|
|
||||||
|
|
||||||
void XHR::onReplySuccess()
|
|
||||||
{
|
|
||||||
qDebug() << "!";
|
|
||||||
emit this->success(buffer, m_api);
|
|
||||||
buffer.clear();
|
|
||||||
// reply->deleteLater();
|
|
||||||
}
|
|
||||||
|
|
||||||
void XHR::onRequestFinished()
|
|
||||||
{
|
|
||||||
qDebug()<<"download requestFinished ";
|
|
||||||
// Save the file here
|
|
||||||
if (buffer.isNull()){qDebug() << "File empty"<<m_url; buffer.clear(); emit this->error(m_downloadtype,m_url,m_api,1);}
|
|
||||||
else if (m_downloadtype=="picturelist") {
|
|
||||||
QJsonDocument jsonResponse = QJsonDocument::fromJson(buffer);
|
|
||||||
QJsonObject jsonObject = jsonResponse.object();
|
|
||||||
int arraystart=buffer.indexOf('{"data":"')+8;
|
|
||||||
int arraylength=buffer.indexOf('"',9)-arraystart;
|
|
||||||
QByteArray b64=buffer.mid(arraystart,arraylength);
|
|
||||||
QString helpfilename=jsonObject["filename"].toString();
|
|
||||||
QString helpfile=helpfilename.left(helpfilename.lastIndexOf("."));
|
|
||||||
QString filesuffix="";
|
|
||||||
if (jsonObject["type"].toString()=="image/jpeg"){filesuffix=".jpg";}
|
|
||||||
else if (jsonObject["type"].toString()=="image/png"){filesuffix=".png";}
|
|
||||||
else {filesuffix="";}
|
|
||||||
if (helpfilename==""){// check if file has any filename
|
|
||||||
helpfile=jsonObject["id"].toString();
|
|
||||||
setFilename(imagedir()+"albums/"+jsonObject["album"].toString()+"/"+jsonObject["id"].toString()+filesuffix);
|
|
||||||
}
|
|
||||||
else{setFilename(imagedir()+"albums/"+jsonObject["album"].toString()+"/"+helpfile+filesuffix);}
|
|
||||||
//qDebug()<<"Filename "<<m_filename;
|
|
||||||
QFile file(m_filename);
|
|
||||||
file.open(QIODevice::WriteOnly);
|
|
||||||
file.write(QByteArray::fromBase64(b64));
|
|
||||||
buffer.clear();
|
|
||||||
b64.clear();
|
|
||||||
file.close();
|
|
||||||
jsonObject["data"]="";
|
|
||||||
jsonObject["filename"]=helpfile+filesuffix;
|
|
||||||
emit this->downloadedjson(m_downloadtype,m_url,m_filename,dlindex,jsonObject);
|
|
||||||
if(downloadtype()=="picturelist"){dlindex=dlindex+1;XHR::getlist();}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
QFile file(m_filename);
|
|
||||||
file.open(QIODevice::WriteOnly);
|
|
||||||
file.write(buffer);
|
|
||||||
buffer.clear();
|
|
||||||
file.close();
|
|
||||||
emit this->downloaded(m_downloadtype,m_url,m_filename,dlindex);
|
|
||||||
if(downloadtype()=="contactlist"){dlindex=dlindex+1;XHR::getlist();}
|
|
||||||
|
|
||||||
//reply->deleteLater();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void XHR::onReadyRead()
|
|
||||||
{
|
|
||||||
qDebug() << ".";
|
|
||||||
buffer += reply->readAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
//void XHR::updateDownloadProgress(qint64 bytesRead, qint64 totalBytes)
|
|
||||||
//{
|
|
||||||
// qDebug() << "Bytes: " << bytesRead<<" / "<<totalBytes;
|
|
||||||
|
|
||||||
//}
|
|
||||||
|
|
||||||
void XHR::onSSLError(const QList<QSslError> &errors)
|
|
||||||
{
|
|
||||||
qDebug() << "XHR::onSSLError :" ;
|
|
||||||
QListIterator<QSslError> ierrs(errors);
|
|
||||||
while(ierrs.hasNext()) {
|
|
||||||
qDebug() << "\t" << ierrs.next().errorString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QString XHR::bufferToString()
|
|
||||||
{
|
|
||||||
return QTextCodec::codecForName("utf-8")->toUnicode(buffer);
|
|
||||||
}
|
|
1
source-android/common/xhr.cpp
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../../source-linux/common/xhr.cpp
|
|
@ -1,134 +0,0 @@
|
||||||
// This file is part of Friendiqa
|
|
||||||
// https://github.com/lubuwest/Friendiqa
|
|
||||||
// Copyright (C) 2017 Marco R. <thomasschmidt45@gmx.net>
|
|
||||||
//
|
|
||||||
// This program is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
//
|
|
||||||
// In addition, as a special exception, the copyright holders give
|
|
||||||
// permission to link the code of portions of this program with the
|
|
||||||
// OpenSSL library under certain conditions as described in each
|
|
||||||
// individual source file, and distribute linked combinations including
|
|
||||||
// the two.
|
|
||||||
//
|
|
||||||
// You must obey the GNU General Public License in all respects for all
|
|
||||||
// of the code used other than OpenSSL. If you modify file(s) with this
|
|
||||||
// exception, you may extend this exception to your version of the
|
|
||||||
// file(s), but you are not obligated to do so. If you do not wish to do
|
|
||||||
// so, delete this exception statement from your version. If you delete
|
|
||||||
// this exception statement from all source files in the program, then
|
|
||||||
// also delete it here.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#ifndef XHR_H
|
|
||||||
#define XHR_H
|
|
||||||
|
|
||||||
#include <QNetworkAccessManager>
|
|
||||||
#include <QNetworkReply>
|
|
||||||
#include <QNetworkRequest>
|
|
||||||
#include <QObject>
|
|
||||||
#include <QJsonObject>
|
|
||||||
#include <QNetworkConfiguration>
|
|
||||||
|
|
||||||
class XHR : public QObject
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
Q_PROPERTY(QString url READ url WRITE setUrl NOTIFY urlChanged)
|
|
||||||
Q_PROPERTY(QString login READ login WRITE setLogin NOTIFY loginChanged)
|
|
||||||
Q_PROPERTY(QString filename READ filename WRITE setFilename NOTIFY filenameChanged)
|
|
||||||
Q_PROPERTY(QString imagedir READ imagedir WRITE setImagedir NOTIFY imagedirChanged)
|
|
||||||
Q_PROPERTY(QList<QString> contactlist READ contactlist WRITE setContactlist NOTIFY contactlistChanged)
|
|
||||||
Q_PROPERTY(QList<QString> filelist READ filelist WRITE setFilelist NOTIFY filelistChanged)
|
|
||||||
Q_PROPERTY(QString downloadtype READ downloadtype WRITE setDownloadtype NOTIFY downloadtypeChanged)
|
|
||||||
Q_PROPERTY(QString networktype READ networktype() NOTIFY networktypeChanged)
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
static XHR *instance();
|
|
||||||
|
|
||||||
explicit XHR(QObject *parent = 0);
|
|
||||||
|
|
||||||
QString url() const;
|
|
||||||
QString api() const;
|
|
||||||
QString login() const;
|
|
||||||
QString filename() const;
|
|
||||||
QList<QString> contactlist() const;
|
|
||||||
QList<QString> filelist() const;
|
|
||||||
QString imagedir() const;
|
|
||||||
QString downloadtype() const;
|
|
||||||
QString networktype();
|
|
||||||
|
|
||||||
signals:
|
|
||||||
void urlChanged();
|
|
||||||
void apiChanged();
|
|
||||||
void loginChanged();
|
|
||||||
void filenameChanged();
|
|
||||||
void contactlistChanged();
|
|
||||||
void filelistChanged();
|
|
||||||
void imagedirChanged();
|
|
||||||
void downloadtypeChanged();
|
|
||||||
void networktypeChanged();
|
|
||||||
void downloaded(QString type, QString url, QString filename, int i);
|
|
||||||
void downloadedjson(QString type, QString url, QString filename, int i,QJsonObject jsonObject);
|
|
||||||
void success(QByteArray data, QString api);
|
|
||||||
void error(QString data, QString url,QString api, int code);
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
void setUrl(QString url);
|
|
||||||
void setApi(QString api);
|
|
||||||
void setLogin(QString login);
|
|
||||||
void setDownloadtype(QString downloadtype);
|
|
||||||
void setFilename(QString filename);
|
|
||||||
void setContactlist(QList<QString> filename);
|
|
||||||
void setFilelist(QList<QString> filename);
|
|
||||||
void setImagedir(QString filename);
|
|
||||||
void setParam(QString name, QString value);
|
|
||||||
void setImageFileParam(QString name, QString url);
|
|
||||||
void clearParams();
|
|
||||||
void post();
|
|
||||||
void get();
|
|
||||||
void getlist();
|
|
||||||
void download();
|
|
||||||
|
|
||||||
// void networktype();
|
|
||||||
|
|
||||||
private slots:
|
|
||||||
void onReplyError(QNetworkReply::NetworkError code);
|
|
||||||
void onReplySuccess();
|
|
||||||
void onRequestFinished();
|
|
||||||
void onReadyRead();
|
|
||||||
void onSSLError(const QList<QSslError> &errors);
|
|
||||||
//void updateDownloadProgress(qint64 bytesRead, qint64 totalBytes);
|
|
||||||
|
|
||||||
private:
|
|
||||||
QByteArray buffer;
|
|
||||||
QString m_url;
|
|
||||||
QString m_api;
|
|
||||||
QString m_login;
|
|
||||||
QString m_filename;
|
|
||||||
QString m_downloadtype;
|
|
||||||
QString m_networktype;
|
|
||||||
QHash<QString, QString> params;
|
|
||||||
QHash<QString, QString> files;
|
|
||||||
QList<QString> m_filelist;
|
|
||||||
QList<QString> m_contactlist;
|
|
||||||
QString m_imagedir;
|
|
||||||
int dlindex;
|
|
||||||
|
|
||||||
QNetworkAccessManager manager;
|
|
||||||
QNetworkRequest request;
|
|
||||||
QNetworkReply *reply;
|
|
||||||
QNetworkConfiguration nc;
|
|
||||||
QString bufferToString();
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // XHR_H
|
|
1
source-android/common/xhr.h
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../../source-linux/common/xhr.h
|
|
@ -13,7 +13,7 @@
|
||||||
TEMPLATE = app
|
TEMPLATE = app
|
||||||
TARGET = friendiqa
|
TARGET = friendiqa
|
||||||
CONFIG += release
|
CONFIG += release
|
||||||
QT += qml quick gui widgets androidextras sql webview
|
QT += qml quick gui widgets androidextras sql webview #webengine
|
||||||
|
|
||||||
include(androidnative.pri/androidnative.pri)
|
include(androidnative.pri/androidnative.pri)
|
||||||
|
|
||||||
|
@ -74,6 +74,6 @@ DISTFILES += \
|
||||||
|
|
||||||
contains(ANDROID_TARGET_ARCH,armeabi-v7a) {
|
contains(ANDROID_TARGET_ARCH,armeabi-v7a) {
|
||||||
ANDROID_EXTRA_LIBS = \
|
ANDROID_EXTRA_LIBS = \
|
||||||
$$PWD/android/libcrypto.so \
|
$$PWD/android/libcrypto_1_1.so \
|
||||||
$$PWD/android/libssl.so
|
$$PWD/android/libssl_1_1.so
|
||||||
}
|
}
|
||||||
|
|
1
source-android/images
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
./../source-linux/images/
|
Before Width: | Height: | Size: 371 B |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 648 B |
Before Width: | Height: | Size: 115 B |
Before Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 696 B |
Before Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 6.5 KiB |
Before Width: | Height: | Size: 864 B |
Before Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 780 B |
Before Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 5.2 KiB |
Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 951 B |
Before Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 4.8 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 990 B |
Before Width: | Height: | Size: 4.8 KiB |
Before Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 925 B |
Before Width: | Height: | Size: 7.5 KiB |
Before Width: | Height: | Size: 645 B |
Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 334 B |
Before Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 594 B |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 184 B |
Before Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 158 B |
Before Width: | Height: | Size: 5 KiB |
Before Width: | Height: | Size: 1,021 B |
Before Width: | Height: | Size: 231 B |
Before Width: | Height: | Size: 119 B |
Before Width: | Height: | Size: 756 B |
Before Width: | Height: | Size: 119 B |
Before Width: | Height: | Size: 676 B |
Before Width: | Height: | Size: 1,003 B |
Before Width: | Height: | Size: 885 B |
Before Width: | Height: | Size: 598 B |
Before Width: | Height: | Size: 315 B |
Before Width: | Height: | Size: 303 B |
Before Width: | Height: | Size: 300 B |
Before Width: | Height: | Size: 582 B |
Before Width: | Height: | Size: 306 B |
Before Width: | Height: | Size: 301 B |
Before Width: | Height: | Size: 577 B |
Before Width: | Height: | Size: 299 B |
Before Width: | Height: | Size: 306 B |