diff --git a/CHANGELOG.md b/CHANGELOG.md index 4456066..be80c14 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -88,3 +88,13 @@ * Bugfix: random crashes for conversations * Bugfix: attach image to message works again * Bugfix: check for nickname on Server has been removed due to API change + + +## v0.3.3 ## +* Update for OpenSSL and Qt +* Experimental support for Peertube (links are expanded for video widget) +* Some unicode emojis +* Redesign of contact details (click on contact opens in new stack and shows last news) +* Experimental support for Peertube (links are expanded to video widget) +* Some Unicode emojis +* Redesign of contact details (click on contact opens in new stack and shows last news) diff --git a/README.md b/README.md index 4723979..72efcea 100644 --- a/README.md +++ b/README.md @@ -22,8 +22,9 @@ Currently supported: * Search button for news * Click on hashtag in newsitem starts search for news with that word * Click on image shows image fullscreen +* For news containing urls ending with mp3, mp4, avi, webm, ogg or to a Peertube instance: media can be played in the app * Open links in external browser -* Click on contact photo for contact details +* Click on contact photo for contact details and last news * Click on like text for additional contact info * Deletion, Reposting, Answering of Posts * Expand truncated news items @@ -31,16 +32,15 @@ Currently supported: * Attending for event posts * Update fetches new posts (up to last 50) since last in local DB * More shows older posts from local DB -* Create new Message with images or direct messages, Contact/Group access rights(can be stored), smileys +* Create new Message with images or direct messages, Contact/Group access rights (can be stored), smileys * Send image from Android gallery * Send text or urls from other apps to Friendiqa * Native Android image dialog ToDo: -* Videos and other binary data as attachment (sending and receiving) +* Videos and other binary data as attachment (sending) * More than one attachment (currently not supported in API) -* Rich text editing in Send Dialog (currently not possible in QML) * Attachments for Direct messages (currently not supported in API) @@ -49,9 +49,8 @@ Currently supported: * Tabs for own profiles, friends, other contacts and groups * Show profile(s) of user and change profile picture -* Grid of all known contacts with locally downloaded pictures -* Large friend item for additional information and functionality -* Show news of contact from local database +* List of all known contacts with locally downloaded pictures +* Additional information, last messages and other functionality shown in news tab * Send direct message, if contact is following * Show public and private (Friendica 3.6 required) pictures of contact (screenscraping of contact's website, works only with certain theme) * Show public and private (Friendica 3.6 required) events of contact @@ -71,12 +70,12 @@ Currently supported: * Download public and private own images to local directory * Upload picture to album with descriptions(public), send from gallery * Delete own pictures and albums on client and server +* Change name or album of existing picture * Show albums in grid, show images in album in grid and fullscreen * Show public and private (Friendica 3.6 server required) albums and images of contacts * Pinch to zoom, swipe to scroll ToDo: -* Change name or album of existing picture * Upload private images diff --git a/source-android/android/AndroidManifest.xml b/source-android/android/AndroidManifest.xml index f688812..f9258a6 100644 --- a/source-android/android/AndroidManifest.xml +++ b/source-android/android/AndroidManifest.xml @@ -1,5 +1,5 @@ - + diff --git a/source-android/android/libcrypto.so b/source-android/android/libcrypto.so old mode 100644 new mode 100755 index 5c87b67..54e1a05 Binary files a/source-android/android/libcrypto.so and b/source-android/android/libcrypto.so differ diff --git a/source-android/android/libssl.so b/source-android/android/libssl.so old mode 100644 new mode 100755 index 8cbe056..4ffd83f Binary files a/source-android/android/libssl.so and b/source-android/android/libssl.so differ diff --git a/source-android/androidnative.pri/java/src/androidnative/AndroidNativeActivity.java b/source-android/androidnative.pri/java/src/androidnative/AndroidNativeActivity.java index e03622f..2a8eab1 100644 --- a/source-android/androidnative.pri/java/src/androidnative/AndroidNativeActivity.java +++ b/source-android/androidnative.pri/java/src/androidnative/AndroidNativeActivity.java @@ -21,6 +21,7 @@ public class AndroidNativeActivity extends org.qtproject.qt5.android.bindings.Qt protected void onResume() { super.onResume(); + System.loadLibrary("friendiqa"); 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(); } else { @@ -48,7 +49,8 @@ public class AndroidNativeActivity extends org.qtproject.qt5.android.bindings.Qt }} } - protected void onNewIntent(Intent data) { + protected void onNewIntent(Intent data) { + System.loadLibrary("friendiqa"); super.onNewIntent(data); if ((data!=null) && (data.getType() != null) && !(data.getBooleanExtra("used",false))){ String type = data.getType(); diff --git a/source-android/application.qrc b/source-android/application.qrc index 305c556..3f6862f 100644 --- a/source-android/application.qrc +++ b/source-android/application.qrc @@ -222,5 +222,6 @@ qml/genericqml/IntentReceiver.qml qml/newsqml/NewsImage.qml qml/newsqml/NewsVideo.qml + qml/newsqml/ContactPage.qml diff --git a/source-android/common/xhr.cpp b/source-android/common/xhr.cpp index d9e04b4..72940d2 100644 --- a/source-android/common/xhr.cpp +++ b/source-android/common/xhr.cpp @@ -235,13 +235,13 @@ void XHR::getlist() void XHR::post() { - qDebug() << "start post to " << m_url; + //qDebug() << "start post to " << m_url; QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); QHashIterator iparams(params); while(iparams.hasNext()) { iparams.next(); - qDebug() << "\t add param " << iparams.key() << " : " << iparams.value(); + //qDebug() << "\t add param " << iparams.key() << " : " << iparams.value(); QHttpPart textPart; textPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"" + iparams.key() + "\"")); @@ -256,7 +256,7 @@ void XHR::post() ifiles.next(); uimg.setSource(ifiles.value()); - qDebug() << "\t image: " << uimg.mimetype() << ", " << ifiles.key(); + //qDebug() << "\t image: " << uimg.mimetype() << ", " << ifiles.key(); QHttpPart imagePart; imagePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant(uimg.mimetype())); diff --git a/source-android/js/news.js b/source-android/js/news.js index f1c1ef7..7f2d68f 100644 --- a/source-android/js/news.js +++ b/source-android/js/news.js @@ -40,7 +40,10 @@ function requestFriends(login,database,rootwindow,callback){ var result = tx.executeSql('UPDATE contacts SET isFriend=0 where username="'+login.username+'"')}); // clean old friends Helperjs.friendicaRequest(login,"/api/statuses/friends?count=9999", rootwindow,function (obj){ var friends=JSON.parse(obj); - for (var i=0;i. +function findend (text, startpos) { + var indexOf = text.substring(startpos || 0).search(/\s/); + return (indexOf >= 0) ? (indexOf + (startpos || 0)) : indexOf; +} + + WorkerScript.onMessage = function(msg) { if(msg.deleteId!==undefined) {msg.model.remove(msg.deleteId); @@ -97,8 +103,10 @@ else{ } else {attachhelper.url=attachArray[image].url} attachmentList.push(attachhelper) - + //print("Attachhelper "+attachhelper.url) newsitemobject.statusnet_html=newsitemobject.statusnet_html.replace(attachhelper.url,"") + newsitemobject.statusnet_html=newsitemobject.statusnet_html.replace(attachhelper.url.substring(0,attachhelper.url.length-4)+".jpeg","") + newsitemobject.statusnet_html=newsitemobject.statusnet_html.replace(attachhelper.url.substring(0,attachhelper.url.length-4),"") } } }catch(e){print("attachment "+e)} @@ -114,6 +122,20 @@ else{ } } } + if (newsitemobject.text.indexOf("/videos/watch/")>-1){ + var ptvideohelper={mimetype:"video/mp4"} + var ptvideotext=newsitemobject.text; + while (ptvideotext.indexOf("/videos/watch/")>-1){ + var ptvideohelperstringposition=ptvideotext.indexOf("/videos/watch/"); + var ptposend=findend(ptvideotext,ptvideohelperstringposition); + if(ptposend==-1){ptposend=ptvideotext.length}; + ptvideohelper.url=ptvideotext.substring(ptvideotext.lastIndexOf("http",ptvideohelperstringposition),ptposend)+"-480.mp4"; + ptvideohelper.url=ptvideohelper.url.replace("/videos/watch","/static/webseed"); + ptvideotext=ptvideotext.substring(ptposend,ptvideotext.length) + if ((attachmentList.length==0) || (attachmentList[attachmentList.length-1].url!=ptvideohelper.url)){attachmentList.push(ptvideohelper)} + } + } + newsitemobject.attachmentList=attachmentList; var seconds=(msg.currentTime-newsitemobject.created_at)/1000; diff --git a/source-android/js/service.js b/source-android/js/service.js index e8a44e0..4043488 100644 --- a/source-android/js/service.js +++ b/source-android/js/service.js @@ -394,7 +394,7 @@ function processNews(api,data){ newslist[n].statusnet_html=newslist[n].msg_html; newslist[n].text=newslist[n].msg; } - } else { + } else {//if(api!="/api/statuses/user_timeline"){ var chatlist=[]; var conversationIds=[]; var commentCount=[]; @@ -458,6 +458,9 @@ function processNews(api,data){ newslist.reverse(); newstab.conversation=newslist } + else if (api=="/api/statuses/user_timeline"){ + newstab.contactposts=newslist + } else if (newstab.newstabstatus==="Conversations"){ showNews(chatlist);root.news=newslist} else {showNews(newslist);root.news=newslist}; diff --git a/source-android/js/smiley.js b/source-android/js/smiley.js index d840df8..0667a3b 100644 --- a/source-android/js/smiley.js +++ b/source-android/js/smiley.js @@ -30,6 +30,53 @@ // along with this program. If not, see . +var html=[//Smileys + '\u263A', + '\u2639', + '\u263B', + //Weather + '\u2600', + '\u2601', + '\u263C', + '\u2614', + '\u2602', + '\u2603', + '\u2604', + '\u26C4', + '\u26C5', + '\u26C8', + //Leisure + '\u2615', + '\u26BD', + '\u26BE', + '\u26F1', + '\u26F2', + '\u26F3', + '\u26F4', + '\u26F5', + '\u26F7', + '\u26F8', + '\u26F9', + '\u26FA', + '\u26FD', + //Hand + '\u261C', + '\u261D', + '\u261E', + '\u261F', + '\u2620', + '\u2622', + '\u2623', + //Religion + '\u2626', + '\u262A', + '\u262C', + '\u262E', + '\u262F', + '\u26EA', + '\u26E9' +] + var core=[ {name:'<3',url: 'qrc:///images/smileys/core/smiley-heart.gif'}, diff --git a/source-android/qml/configqml/InfoBox.qml b/source-android/qml/configqml/InfoBox.qml index 9c82b77..af16e28 100644 --- a/source-android/qml/configqml/InfoBox.qml +++ b/source-android/qml/configqml/InfoBox.qml @@ -43,7 +43,7 @@ Rectangle{ textFormat: Text.RichText width: parent.width wrapMode: Text.WrapAtWordBoundaryOrAnywhere - text: "Friendiqa v0.3.2
Licensed under GPL 3 with the exception of OpenSSL
"+ + text: "Friendiqa v0.3.3
Licensed under GPL 3 with the exception of OpenSSL
"+ "Profile https://freunde.ma-nic.de/profile/friendiqa
"+ "Sourcecode: https://git.friendi.ca/LubuWest/Friendiqa
"+ "Most of C++ code by Fabio
"+ diff --git a/source-android/qml/contactqml/ContactComponent.qml b/source-android/qml/contactqml/ContactComponent.qml index 0231094..71066a1 100644 --- a/source-android/qml/contactqml/ContactComponent.qml +++ b/source-android/qml/contactqml/ContactComponent.qml @@ -34,55 +34,58 @@ import QtQuick.Controls 1.3 import "qrc:/qml/genericqml" Item { -id: contactComponent -property var createdAtDate: new Date(contact.created_at) -property string connectUrl: (contact.network!=="dfrn")||(contact.isFriend==1)?"":( ""+qsTr("Connect")+"
") + id: contactComponent + height: 8*mm + width: parent.width + property var createdAtDate: new Date(contact.created_at) + property string connectUrl: (contact.network!=="dfrn")||(contact.isFriend==1)?"":( ""+qsTr("Connect")+"
") -Rectangle { - id: wrapper - width: 16*mm - height: 15*mm - border.color: "grey" - color:"white" - Image { - id: photoImage - x:1 - y:1 - width: 10*mm - height:10*mm - source:((contact.profile_image!="") && (typeof(contact.profile_image)=="string"))? "file://"+contact.profile_image : contact.profile_image_url - onStatusChanged: {if (photoImage.status == Image.Error) {source="qrc:/images/defaultcontact.jpg"}} - } + Rectangle { + id: wrapper + width:parent.width + height: 8*mm + border.color: "grey" + color:"white" + Image { + id: photoImage + x:0.5*mm + y:0.5*mm + width: 7*mm + height:7*mm + source:((contact.profile_image!="") && (typeof(contact.profile_image)=="string"))? "file://"+contact.profile_image : contact.profile_image_url + onStatusChanged: {if (photoImage.status == Image.Error) {source="qrc:/images/defaultcontact.jpg"}} + } - Label { - id: namelabel - x: 1 - width: wrapper.width-4 - height: 3*mm - text: contact.screen_name - elide:Text.ElideRight - anchors.topMargin: 0 - anchors.left: photoImage.left - color: "#303030" - font.pixelSize: 3*mm - anchors.top: photoImage.bottom - } - BlueButton{ - id:infobutton - width: 5*mm - height: 5*mm - color:"transparent" - text:"?" - anchors.left: photoImage.right - anchors.leftMargin: 0.5*mm - anchors.topMargin: mm - anchors.top: parent.top - onClicked:{ - var component = Qt.createComponent("qrc:/qml/contactqml/ContactDetailsComponent.qml"); - if (component.status== Component.Ready){ - var contactDetails = component.createObject(friendstab,{"contact": contact})} + Column{ + width: wrapper.width-8*mm + anchors.left: photoImage.right + anchors.margins: 1*mm + spacing: mm + Label { + id: namelabel + width: wrapper.width-4 + height: 3*mm + text: contact.name + elide:Text.ElideRight + color: "#303030" + font.pixelSize: 3*mm + } + Label { + id: screennamelabel + width: wrapper.width-8*mm + height: 2.5*mm + text: "@"+contact.screen_name + elide:Text.ElideRight + color: "#303030" + font.pixelSize: 2.5*mm } } - } - + MouseArea{ + anchors.fill: parent + onClicked:{ + root.currentIndex=0; + root.contactdetailsSignal(contact) + } + } + } } diff --git a/source-android/qml/contactqml/FriendsTab.qml b/source-android/qml/contactqml/FriendsTab.qml index db32907..26926ac 100644 --- a/source-android/qml/contactqml/FriendsTab.qml +++ b/source-android/qml/contactqml/FriendsTab.qml @@ -153,7 +153,7 @@ Rectangle { anchors.right: parent.right onClicked: { try {friendsModel.clear()} catch(e){print(e)}; - root.contactLoadType="friends"; + //root.contactLoadType="friends"; Newsjs.requestFriends(root.login,db,root,function(nc){ root.newContacts=nc }) @@ -171,15 +171,15 @@ Rectangle { value: currentContact/root.newContacts.length } - GridView { + //GridView { + ListView{ id: friendsView x:mm y:updateFriendsButton.height+2*mm width:friendsGridTab.width-2*mm height:friendsGridTab.height-updateFriendsButton.height-2*mm clip: true - cellHeight: 16*mm - cellWidth: 17*mm + spacing: 2 //add: Transition { // NumberAnimation { properties: "x,y"; from: 300; duration: 1000 } // } @@ -233,15 +233,13 @@ Rectangle { }) } } - GridView { + ListView { id: contactsView x:mm y:cleanButton.height+2*mm width:contactsGridTab.width-2*mm height:contactsGridTab.height-cleanButton.height-2*mm clip: true - cellHeight: 16*mm - cellWidth: 17*mm //add: Transition { // NumberAnimation { properties: "x,y"; from: 300; duration: 1000 } // } diff --git a/source-android/qml/contactqml/GroupComponent.qml b/source-android/qml/contactqml/GroupComponent.qml index bf6ecb6..bf243f0 100644 --- a/source-android/qml/contactqml/GroupComponent.qml +++ b/source-android/qml/contactqml/GroupComponent.qml @@ -93,7 +93,11 @@ Item { groupmembers=JSON.parse(groups); for (var user in groupmembers){ Helperjs.readData(root.db,"contacts",root.login.username,function(userdata){ - if (userdata[0]){groupModel.append({"groupmember":userdata[0]})} + if (userdata[0]){ + userdata[0].name=Qt.atob(userdata[0].name); + userdata[0].description=Qt.atob(userdata[0].description) + groupModel.append({"groupmember":userdata[0] + })} },"id",groupmembers[user]) } //catch(e){} },"groupname",group.groupname); @@ -132,13 +136,15 @@ Item { anchors.left: memberImage.right anchors.margins: 1*mm width:parent.width-1 - text:Qt.atob(groupmember.name) + text:groupmember.name } MouseArea{ anchors.fill: parent onClicked:{ - root.currentIndex=1; - friendstab.active=true; +// root.currentIndex=1; +// friendstab.active=true; +// root.contactdetailsSignal(groupmember) + root.currentIndex=0; root.contactdetailsSignal(groupmember) } } diff --git a/source-android/qml/friendiqa.qml b/source-android/qml/friendiqa.qml index 719eb9b..c615b54 100644 --- a/source-android/qml/friendiqa.qml +++ b/source-android/qml/friendiqa.qml @@ -70,7 +70,7 @@ TabView{ signal changeimage(var method, var type, var id) property var news:[] property var newContacts:[] - property string contactLoadType: "" + //property string contactLoadType: "" property bool imagePicking: false onLoginChanged:{ @@ -95,23 +95,14 @@ TabView{ xhr.setContactlist(contactnames); xhr.setImagedir(login.imagestore); xhr.getlist(); -// Service.processNews(function(){ -// root.contactLoadType=""; -// root.news=[]; -// }) } -// else if (contactLoadType!=""){ -// Service.processNews(function(){ -// root.contactLoadType=""; -// root.news=[]; -// })} + } Connections{ target:xhr onDownloaded:{ if(type=="contactlist"){ - //print("contact image saved"+Date.now()+" "+filename+" "+url); var database=LocalStorage.openDatabaseSync(root.db[0],root.db[1],root.db[2],root.db[3]); var result; database.transaction( function(tx) { @@ -173,6 +164,7 @@ TabView{ id: newstab property string newstabstatus property var conversation:[] + property var contactposts:[] source:(root.currentIndex==0)? "qrc:/qml/newsqml/NewsTab.qml":"" } Tab{ diff --git a/source-android/qml/newsqml/ContactPage.qml b/source-android/qml/newsqml/ContactPage.qml new file mode 100644 index 0000000..7e9f604 --- /dev/null +++ b/source-android/qml/newsqml/ContactPage.qml @@ -0,0 +1,203 @@ +// This file is part of Friendiqa +// https://github.com/lubuwest/Friendiqa +// Copyright (C) 2017 Marco R. +// +// 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 . + + +import QtQuick 2.0 +import QtQuick.Controls 1.2 +import "qrc:/js/helper.js" as Helperjs +import "qrc:/qml/genericqml" + +Rectangle { + id:contactList + color: "white" + property var contact:({}) + property string profileimagesource:contact.profile_image + ListView { + id: contactView + x:mm + y:8*mm + width: contactList.width-4*mm + height:contactList.height-10*mm + clip: true + spacing: 0 + header: contactHeader + model: contactModel + delegate: Newsitem{} + } + BusyIndicator{ + id: contactBusy + anchors.centerIn:parent + width:10*mm + height: 10*mm + running: true + } + + Component { id: contactHeader + Rectangle{ + border.color: "#EEEEEE" + border.width: 1 + color:"white" + width:contactView.width + height: profileImage.height+namelabel.height+detailtext.height+7*mm + //height: wrapper.height + property var createdAtDate: new Date(contact.created_at) + property string connectUrl: (contact.network!=="dfrn")||(contact.isFriend!=0)?"":( ""+qsTr("Connect")+"
") + + Image { + id: profileImage + x:mm + y:mm + width: contactView.width/2 + height:width + source:(contact.profile_image!="")? "file://"+contact.profile_image : contact.profile_image_url + onStatusChanged: if (profileImage.status == Image.Error) {source="qrc:/images/defaultcontact.jpg"} + Connections{ + target:contactList + onProfileimagesourceChanged:profileImage.source=profileimagesource + } + } + Column{id:buttoncolumn + anchors.right: parent.right + anchors.rightMargin: mm + y: mm + spacing:4 + + BlueButton{ + id:photobutton + text: "\uf03e" // "Photos" + visible:(contact.network=="dfrn") + onClicked:{print(createdAtDate + " contact.created_at"+contact.created_at) + fotostab.phototabstatus="Contact"; + currentIndex=2; + fotostab.active=true; + fotoSignal(root.login,contact) ; + newsStack.pop(); + } + } + + BlueButton{ + id:dmbutton + visible: (contact.following=="true") + text: "\uf040" //"DM" + onClicked:{ + currentIndex=0; + directmessageSignal(contact.screen_name) + newsStack.pop() + } + } + + BlueButton{ + id:eventbutton + visible:(contact.network=="dfrn") + text:"\uf073" + onClicked:{ + currentIndex=3; + calendartab.calendartabstatus="Friend" + eventSignal(contact); + newsStack.pop() + } + } + + }//Row end + Label { + id: namelabel + x:mm + width: contactView.width-2*mm + height: implicitHeight + text:contact.name+" (@"+contact.screen_name+")" + wrapMode: Text.Wrap//elide:Text.ElideRight + color: "#303030" + font.pixelSize: 4*mm + anchors.top: profileImage.bottom + anchors.topMargin: mm + } + Text{ + id:detailtext + anchors.top: namelabel.bottom + anchors.topMargin: 2*mm + x:mm + width: contactView.width-2*mm + height: implicitHeight + font.pixelSize: 2.5*mm + textFormat:Text.RichText + wrapMode: Text.Wrap + text:""+qsTr("Description")+": "+contact.description+"
"+qsTr("Location")+": "+contact.location+"
"+qsTr("Posts")+": "+contact.statuses_count+ + "
"+qsTr("URL")+": "+contact.url+"
"+ + connectUrl+ ""+qsTr("Created at")+": "+createdAtDate.toLocaleString(Qt.locale()) + onLinkActivated: { + Qt.openUrlExternally(link)} + } + + + //} + } + + }//Component end + Connections{ + target:newstab + onContactpostsChanged:{ + if (newstab.contactposts.length>0){profileimagesource=newstab.contactposts[0].user.profile_image_url_large} + contactBusy.running=false; + contactModel.clear(); + var currentTime= new Date(); + var msg = {'currentTime': currentTime, 'model': contactModel,'news':newstab.contactposts}; + contactWorker.sendMessage(msg) + } + } + + ListModel{id: contactModel} + + WorkerScript { + id: contactWorker + source: "qrc:/js/newsworker.js" + } + + BlueButton { + id: closeButton + width:10*mm + anchors.top: parent.top + anchors.topMargin: 1*mm + anchors.right: parent.right + anchors.rightMargin: 1*mm + text: "\uf057" + onClicked: { + newsStack.pop() + } + } + Component.onCompleted: { + xhr.clearParams(); + xhr.setLogin(login.username+":"+Qt.atob(login.password)); + xhr.setUrl(login.server); + xhr.setApi("/api/statuses/user_timeline"); + xhr.setParam("user_id",contact.id) + xhr.get(); + } +} diff --git a/source-android/qml/newsqml/NewsTab.qml b/source-android/qml/newsqml/NewsTab.qml index e68d00c..67b8071 100644 --- a/source-android/qml/newsqml/NewsTab.qml +++ b/source-android/qml/newsqml/NewsTab.qml @@ -65,7 +65,6 @@ Item { showConversation(newsStack.timelineIndex-1,newsModel.get(0).newsitemobject)} else{ Service.updateView(newstab.newstabstatus) - root.contactLoadType="news"; } } } @@ -81,7 +80,9 @@ Item { function showNews(newsToShow){ - try{if (newsStack.depth>1){newsStack.pop()}}catch(e){} + try{ + if (newsStack.depth>1){newsStack.pop()} + }catch(e){} newsBusy.running=false; var currentTime= new Date(); // downloadNotice.text=downloadNotice.text + "\n shownews start "+ Date.now(); @@ -94,10 +95,6 @@ Item { function showConversation(conversationIndex,newsitemobject){ - //newsBusy.running=true; - root.contactLoadType="conversation"; - newsStack.conversationIndex= conversationIndex; - //print(newsitemobject.id); if(newsitemobject.messagetype==0){ xhr.clearParams(); xhr.setLogin(login.username+":"+Qt.atob(login.password)); @@ -117,10 +114,8 @@ Item { } function showContact(contact){ - var component = Qt.createComponent("qrc:/qml/contactqml/ContactDetailsComponent.qml"); - if (component.status== Component.Ready){ - var contactDetails = component.createObject(newstab,{"contact": contact}) - } + newstab.newstabstatus="Contact"; + newsStack.push({item:"qrc:/qml/newsqml/ContactPage.qml",properties:{"contact": contact}}); } function search(term){//print("Search "+term) @@ -134,7 +129,6 @@ Item { xhr.clearParams(); xhr.setParam("q",term) xhr.get();} - //newsSearch.visible=false; newsView.anchors.topMargin=7*mm } @@ -174,7 +168,6 @@ Item { StackView{ id: newsStack anchors.fill:parent - property int conversationIndex: 0 property string updateMethodNews: "refresh" property var allchats: ({}) initialItem:Rectangle { @@ -284,17 +277,9 @@ Item { id: searchButton text: "\uf002" onClicked: { - //if (newsSearch.visible==false){ - newsView.anchors.topMargin=18*mm; + newsView.anchors.topMargin=18*mm; var component = Qt.createComponent("qrc:/qml/genericqml/Search.qml"); - var searchItem = component.createObject(newsStack,{y:8*mm,width:root.width,height: 8*mm}); - //searchItem.forceActiveFocus() - - // newsSearch.visible=true} - //else{ - // newsSearch.visible=false; - // newsView.anchors.topMargin=7*mm; - //} + var searchItem = component.createObject(newsStack,{y:8*mm,width:root.width,height: 8*mm}); } } @@ -327,7 +312,7 @@ Item { if (newstab.newstabstatus=="Timeline"){ newsStack.updateMethodNews="append" } else {newsStack.updateMethodNews="refresh"} - root.contactLoadType="news"; + //root.contactLoadType="news"; Service.updateView(newstab.newstabstatus) } } @@ -358,32 +343,21 @@ Item { var msg = {'currentTime': currentTime, 'model': newsModel,'news':news,'appendnews':true}; newsWorker.sendMessage(msg); },lastnews_id)} - else if(newstab.newstabstatus=="Contact"){ - Newsjs.newsfromdb(root.db,root.login.username, function(news){ - var msg = {'currentTime': currentTime, 'model': newsModel,'news':news,'appendnews':true}; - newsWorker.sendMessage(msg); - },newsModel.get(newsModel.count-1).newsitemobject.uid,lastnews_id)} +// else if(newstab.newstabstatus=="Contact"){ +// Newsjs.newsfromdb(root.db,root.login.username, function(news){ +// var msg = {'currentTime': currentTime, 'model': newsModel,'news':news,'appendnews':true}; +// newsWorker.sendMessage(msg); +// },newsModel.get(newsModel.count-1).newsitemobject.uid,lastnews_id)} else if (newstab.newstabstatus=="Notifications"){} else{ - newsStack.appendNews=true; + //newsStack.appendNews=true; xhr.setParam("max_id",newsModel.get(newsModel.count-1).newsitemobject.id-1); xhr.get() }} } } } -// Rectangle{ -// id: newsSearch -// color: "#FFFAFA" -// y:8*mm -// width:root.width -// height: 8*mm -// //visible:false -// Search{ -// anchors.fill: parent -// anchors.margins: mm -// } -// } + ListView { id: newsView @@ -398,11 +372,9 @@ Item { delegate: Newsitem{} //onContentYChanged:{if(contentY<-8*mm&&contentY>(-8*mm-1)){print("refreshing"); onDragEnded:{if(contentY<-5*mm){ - root.contactLoadType="news"; - var onlynew=true; + var onlynew=true; Service.updateView(newstab.newstabstatus) }} - //Component.onCompleted: currentIndex=count } ListModel{id: newsModel} @@ -447,6 +419,7 @@ Item { Component.onCompleted: { root.messageSignal.connect(onFriendsMessages); root.directmessageSignal.connect(onDirectMessage); + root.contactdetailsSignal.connect(showContact); root.newsSignal.connect(showNews); root.uploadSignal.connect(sendUrls); root.sendtextSignal.connect(sendtext); diff --git a/source-android/qml/newsqml/NewsVideo.qml b/source-android/qml/newsqml/NewsVideo.qml index 97fefcb..73116ae 100644 --- a/source-android/qml/newsqml/NewsVideo.qml +++ b/source-android/qml/newsqml/NewsVideo.qml @@ -38,7 +38,7 @@ Rectangle{ color:"black" //border.color: "light grey" width:newscolumn.width; - height:video.hasVideo?newscolumn.width/4*3:10*mm + height:newscolumn.width/4*3//video.hasVideo?newscolumn.width/4*3:10*mm property alias source:video.source Text{ id:noticeText diff --git a/source-android/qml/newsqml/Newsitem.qml b/source-android/qml/newsqml/Newsitem.qml index 0b75445..c3f8953 100644 --- a/source-android/qml/newsqml/Newsitem.qml +++ b/source-android/qml/newsqml/Newsitem.qml @@ -298,7 +298,7 @@ Item { font.pixelSize: 2.5*mm font.family:fontAwesome.name color:control.checked?"black": "grey" - text:"\uf118" + text:control.checked?"\uf118"+"!":"\uf118" } } } @@ -320,7 +320,7 @@ Item { font.pixelSize: 2.5*mm font.family:fontAwesome.name color:control.checked?"black": "grey" - text: "\uf119" + text: control.checked?"\uf119"+"!":"\uf119" } } } diff --git a/source-android/qml/newsqml/SmileyDialog.qml b/source-android/qml/newsqml/SmileyDialog.qml index 82ee0e9..8acd4ce 100644 --- a/source-android/qml/newsqml/SmileyDialog.qml +++ b/source-android/qml/newsqml/SmileyDialog.qml @@ -40,7 +40,7 @@ Rectangle{ id:smileyDialog x: mm width: messageColumn.width-5*mm - height:root.height/3 + height:root.height/2 BlueButton{ id:closeButton @@ -64,7 +64,7 @@ Rectangle{ frameOverlap: 1 tab: Rectangle { color: "white" - implicitWidth: smileyTabView.width/3-2*mm + implicitWidth: smileyTabView.width/4-2*mm implicitHeight: 4*mm Text { id: text anchors.centerIn: parent @@ -78,6 +78,30 @@ Rectangle{ tabsAlignment:Qt.AlignHCenter } + Tab{ + title: qsTr("Unicode") + Rectangle{ + id: htmlGridTab + GridView { + id:htmlView + anchors.fill: parent + cellWidth: 5*mm + cellHeight: 5*mm + clip: true + model: htmlModel + delegate: htmlItem + } + + ListModel{ + id:htmlModel + } + Component.onCompleted:{ + for (var icon in Smileyjs.html){ + htmlModel.append({"emoji":Smileyjs.html[icon]}) + } + } + } + } Tab{ title: qsTr("Standard") Rectangle{ @@ -152,6 +176,9 @@ Rectangle{ } } } + + + } Component{ id:smileyItem @@ -166,9 +193,31 @@ Rectangle{ onClicked:{ //bodyField.append(emoji.name+" ") bodyField.insert(bodyField.cursorPosition,emoji.name+" "); - smileyDialog.destroy() + smileyDialog.visible=false } } } } + + Component{ + id:htmlItem + Text{id:smileText + width:4.5*mm + height: 4.5*mm + textFormat:Text.RichText + font.pixelSize: 4*mm + text: emoji + + MouseArea{ + anchors.fill: parent + onClicked:{ + //bodyField.append(emoji.name+" ") + bodyField.insert(bodyField.cursorPosition,emoji+" "); + smileyDialog.visible=false + } + } + } + } + + } diff --git a/source-android/translations/friendiqa-de.qm b/source-android/translations/friendiqa-de.qm index d088dcf..6a51d25 100644 Binary files a/source-android/translations/friendiqa-de.qm and b/source-android/translations/friendiqa-de.qm differ diff --git a/source-android/translations/friendiqa-de.ts b/source-android/translations/friendiqa-de.ts index 2a64567..00399f4 100644 --- a/source-android/translations/friendiqa-de.ts +++ b/source-android/translations/friendiqa-de.ts @@ -59,16 +59,14 @@ Intervall (0=keins) - Error Fehler - Nickname not registered at given server! - Name auf der Seite nicht registriert! + Name auf der Seite nicht registriert! @@ -138,7 +136,7 @@ ContactComponent - + Connect Kontaktanfrage @@ -176,6 +174,39 @@ Erstellt + + ContactPage + + + Connect + Kontaktanfrage + + + + Description + Beschreibung + + + + Location + Ort + + + + Posts + Beiträge + + + + URL + Profilseite + + + + Created at + Erstellt + + FriendsTab @@ -194,7 +225,7 @@ Kontakte - + Groups Gruppen @@ -213,37 +244,40 @@ ImageUploadDialog - + Upload to album In Album hochladen - Album - Album + Album - Image - Bild + Bild - + Description Beschreibung - + Upload Hochladen - + + Change + Ändern + + + Error Fehler - + No album name given Kein Albumname angegeben @@ -251,17 +285,17 @@ MessageSend - + Title (optional) Überschrift (optional) - + Error Fehler - + Only one attachment supported at the moment. Remove other attachment first! Nur ein Anhang derzeit unterstützt. @@ -275,52 +309,56 @@ Lade Profilbild für - + More Mehr - + Timeline Chronologisch - Error - Fehler + Fehler - + Favorites Markierte News - + Conversations Unterhaltungen - + + Network Error + Netzwerk-Fehler + + + Public timeline Gemeinschaft - + Direct Messages Direktnachrichten - + Notifications Meldungen - + Group news News Gruppe - + Quit Schliessen @@ -353,57 +391,57 @@ Kommentare - + Attending: Teilnahme: - + Reply Antworten - + DM Direktnachricht - + Repost Teilen - + Success! Erledigt! - + Conversation Unterhaltung - + Attending Teilnahme - + yes ja - + maybe vielleicht - + no nein - + Delete Löschen @@ -424,28 +462,28 @@ PhotoTab - + 's images s Bilder - + All Images Alle Bilder - + Only new Nur neue - - + + Own Images Eigene Bilder - + More Mehr @@ -677,16 +715,21 @@ SmileyDialog + Unicode + Unicode + + + Standard Standard - + Addon Addon - + Adult XXX @@ -694,131 +737,131 @@ newsworker - + likes this. mag das. - + like this. mögen das. - + doesn't like this. mag das nicht. - + don't like this. mögen das nicht. - + will attend. nehmen teil. - + persons will attend. Personen nehmen teil. - + will not attend. nimmt nicht teil. - + persons will not attend. Personen nehmen nicht teil. - + may attend. nimmt vielleicht teil. - + persons may attend. Personen nehmen vielleicht teil. - + yes ja - + no nein - + maybe vielleicht - + seconds Sekunden - - - - - - - - - - + + + + + + + + + + ago her - + minute Minute - + minutes Minuten - + hour Stunde - + hours Stunden - + day Tag - + days Tage - + month Monat - + months Monate - + years @@ -826,11 +869,18 @@ service - - - Error - Fehler + Fehler + + + + Undefined Array Error + Antwort-Array ungültig + + + + JSON status Error + Server-Antwort: Fehler diff --git a/source-android/translations/friendiqa-es.qm b/source-android/translations/friendiqa-es.qm index 4bd80da..a905e3d 100644 Binary files a/source-android/translations/friendiqa-es.qm and b/source-android/translations/friendiqa-es.qm differ diff --git a/source-android/translations/friendiqa-es.ts b/source-android/translations/friendiqa-es.ts index 1b22144..fe0db25 100644 --- a/source-android/translations/friendiqa-es.ts +++ b/source-android/translations/friendiqa-es.ts @@ -31,7 +31,7 @@ Nickname - + Usuario @@ -59,16 +59,10 @@ Intervalo (0=ningún) - Error - Error - - - - Nickname not registered at given server! - + Error @@ -83,12 +77,12 @@ No nickname given! - + ¡Usuario incorrecto! Nickname not registered at given server! - + ¡Usuario incorrecto! No username given! @@ -112,17 +106,17 @@ Wrong password! - + ¡Contraseña incorrecta! Success - + éxito! Name - + Nombre @@ -138,7 +132,7 @@ ContactComponent - + Connect Conectar @@ -176,12 +170,45 @@ Creado en + + ContactPage + + + Connect + Conectar + + + + Description + Descripción + + + + Location + Localización + + + + Posts + Mensajes + + + + URL + URL + + + + Created at + Creado en + + FriendsTab Me - + Yo @@ -194,7 +221,7 @@ Contactos - + Groups Grupos @@ -202,37 +229,40 @@ ImageUploadDialog - + Upload to album - + Subir álbum - Album - álbum + álbum - Image - imagen + imagen - + Description Descripción - + Upload Subir - + + Change + Cambiar + + + Error Error - + No album name given ¡Nombre del álbum no encontrado! @@ -240,17 +270,17 @@ MessageSend - + Title (optional) Título (opcional) - + Error Error - + Only one attachment supported at the moment. Remove other attachment first! Solo se admite adjuntar un solo archivo en este momento. @@ -264,54 +294,58 @@ Descargar la imagen del perfil para - + More Mas - + Timeline Cronología - Error - Error + Error - + Favorites Favoritos - + Conversations Conversaciones - + + Network Error + Fallo de red + + + Public timeline - + Cronología pública - + Direct Messages - + Mensaje directo - + Notifications Notificaciones - + Group news - + Grupos - + Quit - + Salida @@ -342,57 +376,57 @@ comentarios - + Attending: Asistiendo: - + Reply Respuesta - + DM Mensaje directo - + Repost Volver a publicar - + Success! éxito! - + Conversation Conversación - + Attending Asistiendo - + yes si - + maybe quizás - + no no - + Delete Borrar @@ -413,28 +447,28 @@ PhotoTab - + 's images s Imágenes - + All Images - + Todas las imagenes - + Only new - + Solo nueva - - + + Own Images Mis imágenes - + More Mas @@ -444,7 +478,7 @@ profile name - + Nombre de perfil @@ -666,16 +700,21 @@ SmileyDialog + Unicode + Unicode + + + Standard Standard - + Addon Addon - + Adult XXX @@ -683,131 +722,131 @@ newsworker - + likes this. le gusta esto. - + like this. me gusta esto. - + doesn't like this. no de ése. - + don't like this. no me gusta. - + will attend. asistirá. - + persons will attend. Personas que asistirán. - + will not attend. no asistirá. - + persons will not attend. Personas que no asistirán.. - + may attend. Puede asistir. - + persons may attend. Personas que pueden asistir. - + yes si - + no no - + maybe quizás - + seconds Segundos - - - - - - - - - - + + + + + + + + + + ago hace - + minute Minuto - + minutes Minutos - + hour Hora - + hours Horas - + day Dia - + days Dias - + month Mes - + months Meses - + years Años @@ -815,11 +854,18 @@ service - - - Error - Error + Error + + + + Undefined Array Error + + + + + JSON status Error + diff --git a/source-android/translations/friendiqa-it.qm b/source-android/translations/friendiqa-it.qm index 4dfcf94..20371c7 100644 Binary files a/source-android/translations/friendiqa-it.qm and b/source-android/translations/friendiqa-it.qm differ diff --git a/source-android/translations/friendiqa-it.ts b/source-android/translations/friendiqa-it.ts index 658670b..8e673ca 100644 --- a/source-android/translations/friendiqa-it.ts +++ b/source-android/translations/friendiqa-it.ts @@ -31,7 +31,7 @@ Nickname - + Utente @@ -59,16 +59,10 @@ Intervallo (0=nessuno) - Error - Errore - - - - Nickname not registered at given server! - + Errore @@ -83,12 +77,12 @@ No nickname given! - + Nessun utente inserito! Nickname not registered at given server! - + No username given! @@ -112,17 +106,17 @@ Wrong password! - + Success - + Ha funzionato! Name - + @@ -138,7 +132,7 @@ ContactComponent - + Connect Connetti @@ -176,6 +170,39 @@ Creato il + + ContactPage + + + Connect + Connetti + + + + Description + Descrizione + + + + Location + Località + + + + Posts + Messaggi + + + + URL + URL + + + + Created at + Creato il + + FriendsTab @@ -194,7 +221,7 @@ Contatti - + Groups Gruppi @@ -202,37 +229,40 @@ ImageUploadDialog - + Upload to album - Album - Album + Album - Image - Immagine + Immagine - + Description Descrizione - + Upload Carica - + + Change + + + + Error Errore - + No album name given Nessun nome album inserito! @@ -240,17 +270,17 @@ MessageSend - + Title (optional) Titolo (opzionale) - + Error Errore - + Only one attachment supported at the moment. Remove other attachment first! Solo un allegato è attualmente supportato. @@ -264,52 +294,56 @@ Download immagine profilo per - + More Ancora - + Timeline Cronologia - Error - Errore + Errore - + Favorites Favoriti - + Conversations Conversazioni - + + Network Error + + + + Public timeline - + Direct Messages - + Messaggio diretto - + Notifications Notifiche - + Group news - + Gruppi - + Quit @@ -342,57 +376,57 @@ commenti - + Attending: Attendi: - + Reply Risposta - + DM Messaggio diretto - + Repost Condividi - + Success! Ha funzionato! - + Conversation Conversazione - + Attending Attendi - + yes si - + maybe potrebbe - + no no - + Delete Cancella @@ -413,28 +447,28 @@ PhotoTab - + 's images Immagini - + All Images - + Only new - - + + Own Images Mie immagini - + More Ancora @@ -666,16 +700,21 @@ SmileyDialog + Unicode + Unicode + + + Standard Standard - + Addon Addon - + Adult XXX @@ -683,131 +722,131 @@ newsworker - + likes this. mi piace. - + like this. mi piace. - + doesn't like this. non mi piace. - + don't like this. non mi piace. - + will attend. attendere. - + persons will attend. Persone che attendono. - + will not attend. non aspettare. - + persons will not attend. Persone che non aspettano. - + may attend. puoi attendere. - + persons may attend. Persone che possono attendere. - + yes si - + no no - + maybe potrebbe - + seconds secondi - - - - - - - - - - + + + + + + + + + + ago fa - + minute minuti - + minutes minuti - + hour ora - + hours ore - + day giorno - + days giorni - + month mese - + months mesi - + years anni @@ -815,11 +854,18 @@ service - - - Error - Errore + Errore + + + + Undefined Array Error + + + + + JSON status Error + diff --git a/source-linux/application.qrc b/source-linux/application.qrc index 305c556..3f6862f 100644 --- a/source-linux/application.qrc +++ b/source-linux/application.qrc @@ -222,5 +222,6 @@ qml/genericqml/IntentReceiver.qml qml/newsqml/NewsImage.qml qml/newsqml/NewsVideo.qml + qml/newsqml/ContactPage.qml diff --git a/source-linux/js/news.js b/source-linux/js/news.js index f1c1ef7..7f2d68f 100644 --- a/source-linux/js/news.js +++ b/source-linux/js/news.js @@ -40,7 +40,10 @@ function requestFriends(login,database,rootwindow,callback){ var result = tx.executeSql('UPDATE contacts SET isFriend=0 where username="'+login.username+'"')}); // clean old friends Helperjs.friendicaRequest(login,"/api/statuses/friends?count=9999", rootwindow,function (obj){ var friends=JSON.parse(obj); - for (var i=0;i. +function findend (text, startpos) { + var indexOf = text.substring(startpos || 0).search(/\s/); + return (indexOf >= 0) ? (indexOf + (startpos || 0)) : indexOf; +} + + WorkerScript.onMessage = function(msg) { if(msg.deleteId!==undefined) {msg.model.remove(msg.deleteId); @@ -97,8 +103,10 @@ else{ } else {attachhelper.url=attachArray[image].url} attachmentList.push(attachhelper) - + //print("Attachhelper "+attachhelper.url) newsitemobject.statusnet_html=newsitemobject.statusnet_html.replace(attachhelper.url,"") + newsitemobject.statusnet_html=newsitemobject.statusnet_html.replace(attachhelper.url.substring(0,attachhelper.url.length-4)+".jpeg","") + newsitemobject.statusnet_html=newsitemobject.statusnet_html.replace(attachhelper.url.substring(0,attachhelper.url.length-4),"") } } }catch(e){print("attachment "+e)} @@ -114,6 +122,20 @@ else{ } } } + if (newsitemobject.text.indexOf("/videos/watch/")>-1){ + var ptvideohelper={mimetype:"video/mp4"} + var ptvideotext=newsitemobject.text; + while (ptvideotext.indexOf("/videos/watch/")>-1){ + var ptvideohelperstringposition=ptvideotext.indexOf("/videos/watch/"); + var ptposend=findend(ptvideotext,ptvideohelperstringposition); + if(ptposend==-1){ptposend=ptvideotext.length}; + ptvideohelper.url=ptvideotext.substring(ptvideotext.lastIndexOf("http",ptvideohelperstringposition),ptposend)+"-480.mp4"; + ptvideohelper.url=ptvideohelper.url.replace("/videos/watch","/static/webseed"); + ptvideotext=ptvideotext.substring(ptposend,ptvideotext.length) + if ((attachmentList.length==0) || (attachmentList[attachmentList.length-1].url!=ptvideohelper.url)){attachmentList.push(ptvideohelper)} + } + } + newsitemobject.attachmentList=attachmentList; var seconds=(msg.currentTime-newsitemobject.created_at)/1000; diff --git a/source-linux/js/service.js b/source-linux/js/service.js index e8a44e0..4043488 100644 --- a/source-linux/js/service.js +++ b/source-linux/js/service.js @@ -394,7 +394,7 @@ function processNews(api,data){ newslist[n].statusnet_html=newslist[n].msg_html; newslist[n].text=newslist[n].msg; } - } else { + } else {//if(api!="/api/statuses/user_timeline"){ var chatlist=[]; var conversationIds=[]; var commentCount=[]; @@ -458,6 +458,9 @@ function processNews(api,data){ newslist.reverse(); newstab.conversation=newslist } + else if (api=="/api/statuses/user_timeline"){ + newstab.contactposts=newslist + } else if (newstab.newstabstatus==="Conversations"){ showNews(chatlist);root.news=newslist} else {showNews(newslist);root.news=newslist}; diff --git a/source-linux/js/smiley.js b/source-linux/js/smiley.js index d840df8..0667a3b 100644 --- a/source-linux/js/smiley.js +++ b/source-linux/js/smiley.js @@ -30,6 +30,53 @@ // along with this program. If not, see . +var html=[//Smileys + '\u263A', + '\u2639', + '\u263B', + //Weather + '\u2600', + '\u2601', + '\u263C', + '\u2614', + '\u2602', + '\u2603', + '\u2604', + '\u26C4', + '\u26C5', + '\u26C8', + //Leisure + '\u2615', + '\u26BD', + '\u26BE', + '\u26F1', + '\u26F2', + '\u26F3', + '\u26F4', + '\u26F5', + '\u26F7', + '\u26F8', + '\u26F9', + '\u26FA', + '\u26FD', + //Hand + '\u261C', + '\u261D', + '\u261E', + '\u261F', + '\u2620', + '\u2622', + '\u2623', + //Religion + '\u2626', + '\u262A', + '\u262C', + '\u262E', + '\u262F', + '\u26EA', + '\u26E9' +] + var core=[ {name:'<3',url: 'qrc:///images/smileys/core/smiley-heart.gif'}, diff --git a/source-linux/qml/configqml/InfoBox.qml b/source-linux/qml/configqml/InfoBox.qml index 9c82b77..af16e28 100644 --- a/source-linux/qml/configqml/InfoBox.qml +++ b/source-linux/qml/configqml/InfoBox.qml @@ -43,7 +43,7 @@ Rectangle{ textFormat: Text.RichText width: parent.width wrapMode: Text.WrapAtWordBoundaryOrAnywhere - text: "Friendiqa v0.3.2
Licensed under GPL 3 with the exception of OpenSSL
"+ + text: "Friendiqa v0.3.3
Licensed under GPL 3 with the exception of OpenSSL
"+ "Profile https://freunde.ma-nic.de/profile/friendiqa
"+ "Sourcecode: https://git.friendi.ca/LubuWest/Friendiqa
"+ "Most of C++ code by Fabio
"+ diff --git a/source-linux/qml/contactqml/ContactComponent.qml b/source-linux/qml/contactqml/ContactComponent.qml index 0231094..71066a1 100644 --- a/source-linux/qml/contactqml/ContactComponent.qml +++ b/source-linux/qml/contactqml/ContactComponent.qml @@ -34,55 +34,58 @@ import QtQuick.Controls 1.3 import "qrc:/qml/genericqml" Item { -id: contactComponent -property var createdAtDate: new Date(contact.created_at) -property string connectUrl: (contact.network!=="dfrn")||(contact.isFriend==1)?"":( ""+qsTr("Connect")+"
") + id: contactComponent + height: 8*mm + width: parent.width + property var createdAtDate: new Date(contact.created_at) + property string connectUrl: (contact.network!=="dfrn")||(contact.isFriend==1)?"":( ""+qsTr("Connect")+"
") -Rectangle { - id: wrapper - width: 16*mm - height: 15*mm - border.color: "grey" - color:"white" - Image { - id: photoImage - x:1 - y:1 - width: 10*mm - height:10*mm - source:((contact.profile_image!="") && (typeof(contact.profile_image)=="string"))? "file://"+contact.profile_image : contact.profile_image_url - onStatusChanged: {if (photoImage.status == Image.Error) {source="qrc:/images/defaultcontact.jpg"}} - } + Rectangle { + id: wrapper + width:parent.width + height: 8*mm + border.color: "grey" + color:"white" + Image { + id: photoImage + x:0.5*mm + y:0.5*mm + width: 7*mm + height:7*mm + source:((contact.profile_image!="") && (typeof(contact.profile_image)=="string"))? "file://"+contact.profile_image : contact.profile_image_url + onStatusChanged: {if (photoImage.status == Image.Error) {source="qrc:/images/defaultcontact.jpg"}} + } - Label { - id: namelabel - x: 1 - width: wrapper.width-4 - height: 3*mm - text: contact.screen_name - elide:Text.ElideRight - anchors.topMargin: 0 - anchors.left: photoImage.left - color: "#303030" - font.pixelSize: 3*mm - anchors.top: photoImage.bottom - } - BlueButton{ - id:infobutton - width: 5*mm - height: 5*mm - color:"transparent" - text:"?" - anchors.left: photoImage.right - anchors.leftMargin: 0.5*mm - anchors.topMargin: mm - anchors.top: parent.top - onClicked:{ - var component = Qt.createComponent("qrc:/qml/contactqml/ContactDetailsComponent.qml"); - if (component.status== Component.Ready){ - var contactDetails = component.createObject(friendstab,{"contact": contact})} + Column{ + width: wrapper.width-8*mm + anchors.left: photoImage.right + anchors.margins: 1*mm + spacing: mm + Label { + id: namelabel + width: wrapper.width-4 + height: 3*mm + text: contact.name + elide:Text.ElideRight + color: "#303030" + font.pixelSize: 3*mm + } + Label { + id: screennamelabel + width: wrapper.width-8*mm + height: 2.5*mm + text: "@"+contact.screen_name + elide:Text.ElideRight + color: "#303030" + font.pixelSize: 2.5*mm } } - } - + MouseArea{ + anchors.fill: parent + onClicked:{ + root.currentIndex=0; + root.contactdetailsSignal(contact) + } + } + } } diff --git a/source-linux/qml/contactqml/FriendsTab.qml b/source-linux/qml/contactqml/FriendsTab.qml index db32907..26926ac 100644 --- a/source-linux/qml/contactqml/FriendsTab.qml +++ b/source-linux/qml/contactqml/FriendsTab.qml @@ -153,7 +153,7 @@ Rectangle { anchors.right: parent.right onClicked: { try {friendsModel.clear()} catch(e){print(e)}; - root.contactLoadType="friends"; + //root.contactLoadType="friends"; Newsjs.requestFriends(root.login,db,root,function(nc){ root.newContacts=nc }) @@ -171,15 +171,15 @@ Rectangle { value: currentContact/root.newContacts.length } - GridView { + //GridView { + ListView{ id: friendsView x:mm y:updateFriendsButton.height+2*mm width:friendsGridTab.width-2*mm height:friendsGridTab.height-updateFriendsButton.height-2*mm clip: true - cellHeight: 16*mm - cellWidth: 17*mm + spacing: 2 //add: Transition { // NumberAnimation { properties: "x,y"; from: 300; duration: 1000 } // } @@ -233,15 +233,13 @@ Rectangle { }) } } - GridView { + ListView { id: contactsView x:mm y:cleanButton.height+2*mm width:contactsGridTab.width-2*mm height:contactsGridTab.height-cleanButton.height-2*mm clip: true - cellHeight: 16*mm - cellWidth: 17*mm //add: Transition { // NumberAnimation { properties: "x,y"; from: 300; duration: 1000 } // } diff --git a/source-linux/qml/contactqml/GroupComponent.qml b/source-linux/qml/contactqml/GroupComponent.qml index bf6ecb6..bf243f0 100644 --- a/source-linux/qml/contactqml/GroupComponent.qml +++ b/source-linux/qml/contactqml/GroupComponent.qml @@ -93,7 +93,11 @@ Item { groupmembers=JSON.parse(groups); for (var user in groupmembers){ Helperjs.readData(root.db,"contacts",root.login.username,function(userdata){ - if (userdata[0]){groupModel.append({"groupmember":userdata[0]})} + if (userdata[0]){ + userdata[0].name=Qt.atob(userdata[0].name); + userdata[0].description=Qt.atob(userdata[0].description) + groupModel.append({"groupmember":userdata[0] + })} },"id",groupmembers[user]) } //catch(e){} },"groupname",group.groupname); @@ -132,13 +136,15 @@ Item { anchors.left: memberImage.right anchors.margins: 1*mm width:parent.width-1 - text:Qt.atob(groupmember.name) + text:groupmember.name } MouseArea{ anchors.fill: parent onClicked:{ - root.currentIndex=1; - friendstab.active=true; +// root.currentIndex=1; +// friendstab.active=true; +// root.contactdetailsSignal(groupmember) + root.currentIndex=0; root.contactdetailsSignal(groupmember) } } diff --git a/source-linux/qml/friendiqa.qml b/source-linux/qml/friendiqa.qml index 1499b73..c8832b8 100644 --- a/source-linux/qml/friendiqa.qml +++ b/source-linux/qml/friendiqa.qml @@ -70,7 +70,7 @@ TabView{ signal changeimage(var method, var type, var id) property var news:[] property var newContacts:[] - property string contactLoadType: "" + //property string contactLoadType: "" property bool imagePicking: false onLoginChanged:{ @@ -95,23 +95,14 @@ TabView{ xhr.setContactlist(contactnames); xhr.setImagedir(login.imagestore); xhr.getlist(); -// Service.processNews(function(){ -// root.contactLoadType=""; -// root.news=[]; -// }) } -// else if (contactLoadType!=""){ -// Service.processNews(function(){ -// root.contactLoadType=""; -// root.news=[]; -// })} + } Connections{ target:xhr onDownloaded:{ if(type=="contactlist"){ - //print("contact image saved"+Date.now()+" "+filename+" "+url); var database=LocalStorage.openDatabaseSync(root.db[0],root.db[1],root.db[2],root.db[3]); var result; database.transaction( function(tx) { @@ -173,6 +164,7 @@ TabView{ id: newstab property string newstabstatus property var conversation:[] + property var contactposts:[] source:(root.currentIndex==0)? "qrc:/qml/newsqml/NewsTab.qml":"" } Tab{ diff --git a/source-linux/qml/newsqml/ContactPage.qml b/source-linux/qml/newsqml/ContactPage.qml new file mode 100644 index 0000000..7e9f604 --- /dev/null +++ b/source-linux/qml/newsqml/ContactPage.qml @@ -0,0 +1,203 @@ +// This file is part of Friendiqa +// https://github.com/lubuwest/Friendiqa +// Copyright (C) 2017 Marco R. +// +// 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 . + + +import QtQuick 2.0 +import QtQuick.Controls 1.2 +import "qrc:/js/helper.js" as Helperjs +import "qrc:/qml/genericqml" + +Rectangle { + id:contactList + color: "white" + property var contact:({}) + property string profileimagesource:contact.profile_image + ListView { + id: contactView + x:mm + y:8*mm + width: contactList.width-4*mm + height:contactList.height-10*mm + clip: true + spacing: 0 + header: contactHeader + model: contactModel + delegate: Newsitem{} + } + BusyIndicator{ + id: contactBusy + anchors.centerIn:parent + width:10*mm + height: 10*mm + running: true + } + + Component { id: contactHeader + Rectangle{ + border.color: "#EEEEEE" + border.width: 1 + color:"white" + width:contactView.width + height: profileImage.height+namelabel.height+detailtext.height+7*mm + //height: wrapper.height + property var createdAtDate: new Date(contact.created_at) + property string connectUrl: (contact.network!=="dfrn")||(contact.isFriend!=0)?"":( ""+qsTr("Connect")+"
") + + Image { + id: profileImage + x:mm + y:mm + width: contactView.width/2 + height:width + source:(contact.profile_image!="")? "file://"+contact.profile_image : contact.profile_image_url + onStatusChanged: if (profileImage.status == Image.Error) {source="qrc:/images/defaultcontact.jpg"} + Connections{ + target:contactList + onProfileimagesourceChanged:profileImage.source=profileimagesource + } + } + Column{id:buttoncolumn + anchors.right: parent.right + anchors.rightMargin: mm + y: mm + spacing:4 + + BlueButton{ + id:photobutton + text: "\uf03e" // "Photos" + visible:(contact.network=="dfrn") + onClicked:{print(createdAtDate + " contact.created_at"+contact.created_at) + fotostab.phototabstatus="Contact"; + currentIndex=2; + fotostab.active=true; + fotoSignal(root.login,contact) ; + newsStack.pop(); + } + } + + BlueButton{ + id:dmbutton + visible: (contact.following=="true") + text: "\uf040" //"DM" + onClicked:{ + currentIndex=0; + directmessageSignal(contact.screen_name) + newsStack.pop() + } + } + + BlueButton{ + id:eventbutton + visible:(contact.network=="dfrn") + text:"\uf073" + onClicked:{ + currentIndex=3; + calendartab.calendartabstatus="Friend" + eventSignal(contact); + newsStack.pop() + } + } + + }//Row end + Label { + id: namelabel + x:mm + width: contactView.width-2*mm + height: implicitHeight + text:contact.name+" (@"+contact.screen_name+")" + wrapMode: Text.Wrap//elide:Text.ElideRight + color: "#303030" + font.pixelSize: 4*mm + anchors.top: profileImage.bottom + anchors.topMargin: mm + } + Text{ + id:detailtext + anchors.top: namelabel.bottom + anchors.topMargin: 2*mm + x:mm + width: contactView.width-2*mm + height: implicitHeight + font.pixelSize: 2.5*mm + textFormat:Text.RichText + wrapMode: Text.Wrap + text:""+qsTr("Description")+": "+contact.description+"
"+qsTr("Location")+": "+contact.location+"
"+qsTr("Posts")+": "+contact.statuses_count+ + "
"+qsTr("URL")+": "+contact.url+"
"+ + connectUrl+ ""+qsTr("Created at")+": "+createdAtDate.toLocaleString(Qt.locale()) + onLinkActivated: { + Qt.openUrlExternally(link)} + } + + + //} + } + + }//Component end + Connections{ + target:newstab + onContactpostsChanged:{ + if (newstab.contactposts.length>0){profileimagesource=newstab.contactposts[0].user.profile_image_url_large} + contactBusy.running=false; + contactModel.clear(); + var currentTime= new Date(); + var msg = {'currentTime': currentTime, 'model': contactModel,'news':newstab.contactposts}; + contactWorker.sendMessage(msg) + } + } + + ListModel{id: contactModel} + + WorkerScript { + id: contactWorker + source: "qrc:/js/newsworker.js" + } + + BlueButton { + id: closeButton + width:10*mm + anchors.top: parent.top + anchors.topMargin: 1*mm + anchors.right: parent.right + anchors.rightMargin: 1*mm + text: "\uf057" + onClicked: { + newsStack.pop() + } + } + Component.onCompleted: { + xhr.clearParams(); + xhr.setLogin(login.username+":"+Qt.atob(login.password)); + xhr.setUrl(login.server); + xhr.setApi("/api/statuses/user_timeline"); + xhr.setParam("user_id",contact.id) + xhr.get(); + } +} diff --git a/source-linux/qml/newsqml/NewsTab.qml b/source-linux/qml/newsqml/NewsTab.qml index e68d00c..67b8071 100644 --- a/source-linux/qml/newsqml/NewsTab.qml +++ b/source-linux/qml/newsqml/NewsTab.qml @@ -65,7 +65,6 @@ Item { showConversation(newsStack.timelineIndex-1,newsModel.get(0).newsitemobject)} else{ Service.updateView(newstab.newstabstatus) - root.contactLoadType="news"; } } } @@ -81,7 +80,9 @@ Item { function showNews(newsToShow){ - try{if (newsStack.depth>1){newsStack.pop()}}catch(e){} + try{ + if (newsStack.depth>1){newsStack.pop()} + }catch(e){} newsBusy.running=false; var currentTime= new Date(); // downloadNotice.text=downloadNotice.text + "\n shownews start "+ Date.now(); @@ -94,10 +95,6 @@ Item { function showConversation(conversationIndex,newsitemobject){ - //newsBusy.running=true; - root.contactLoadType="conversation"; - newsStack.conversationIndex= conversationIndex; - //print(newsitemobject.id); if(newsitemobject.messagetype==0){ xhr.clearParams(); xhr.setLogin(login.username+":"+Qt.atob(login.password)); @@ -117,10 +114,8 @@ Item { } function showContact(contact){ - var component = Qt.createComponent("qrc:/qml/contactqml/ContactDetailsComponent.qml"); - if (component.status== Component.Ready){ - var contactDetails = component.createObject(newstab,{"contact": contact}) - } + newstab.newstabstatus="Contact"; + newsStack.push({item:"qrc:/qml/newsqml/ContactPage.qml",properties:{"contact": contact}}); } function search(term){//print("Search "+term) @@ -134,7 +129,6 @@ Item { xhr.clearParams(); xhr.setParam("q",term) xhr.get();} - //newsSearch.visible=false; newsView.anchors.topMargin=7*mm } @@ -174,7 +168,6 @@ Item { StackView{ id: newsStack anchors.fill:parent - property int conversationIndex: 0 property string updateMethodNews: "refresh" property var allchats: ({}) initialItem:Rectangle { @@ -284,17 +277,9 @@ Item { id: searchButton text: "\uf002" onClicked: { - //if (newsSearch.visible==false){ - newsView.anchors.topMargin=18*mm; + newsView.anchors.topMargin=18*mm; var component = Qt.createComponent("qrc:/qml/genericqml/Search.qml"); - var searchItem = component.createObject(newsStack,{y:8*mm,width:root.width,height: 8*mm}); - //searchItem.forceActiveFocus() - - // newsSearch.visible=true} - //else{ - // newsSearch.visible=false; - // newsView.anchors.topMargin=7*mm; - //} + var searchItem = component.createObject(newsStack,{y:8*mm,width:root.width,height: 8*mm}); } } @@ -327,7 +312,7 @@ Item { if (newstab.newstabstatus=="Timeline"){ newsStack.updateMethodNews="append" } else {newsStack.updateMethodNews="refresh"} - root.contactLoadType="news"; + //root.contactLoadType="news"; Service.updateView(newstab.newstabstatus) } } @@ -358,32 +343,21 @@ Item { var msg = {'currentTime': currentTime, 'model': newsModel,'news':news,'appendnews':true}; newsWorker.sendMessage(msg); },lastnews_id)} - else if(newstab.newstabstatus=="Contact"){ - Newsjs.newsfromdb(root.db,root.login.username, function(news){ - var msg = {'currentTime': currentTime, 'model': newsModel,'news':news,'appendnews':true}; - newsWorker.sendMessage(msg); - },newsModel.get(newsModel.count-1).newsitemobject.uid,lastnews_id)} +// else if(newstab.newstabstatus=="Contact"){ +// Newsjs.newsfromdb(root.db,root.login.username, function(news){ +// var msg = {'currentTime': currentTime, 'model': newsModel,'news':news,'appendnews':true}; +// newsWorker.sendMessage(msg); +// },newsModel.get(newsModel.count-1).newsitemobject.uid,lastnews_id)} else if (newstab.newstabstatus=="Notifications"){} else{ - newsStack.appendNews=true; + //newsStack.appendNews=true; xhr.setParam("max_id",newsModel.get(newsModel.count-1).newsitemobject.id-1); xhr.get() }} } } } -// Rectangle{ -// id: newsSearch -// color: "#FFFAFA" -// y:8*mm -// width:root.width -// height: 8*mm -// //visible:false -// Search{ -// anchors.fill: parent -// anchors.margins: mm -// } -// } + ListView { id: newsView @@ -398,11 +372,9 @@ Item { delegate: Newsitem{} //onContentYChanged:{if(contentY<-8*mm&&contentY>(-8*mm-1)){print("refreshing"); onDragEnded:{if(contentY<-5*mm){ - root.contactLoadType="news"; - var onlynew=true; + var onlynew=true; Service.updateView(newstab.newstabstatus) }} - //Component.onCompleted: currentIndex=count } ListModel{id: newsModel} @@ -447,6 +419,7 @@ Item { Component.onCompleted: { root.messageSignal.connect(onFriendsMessages); root.directmessageSignal.connect(onDirectMessage); + root.contactdetailsSignal.connect(showContact); root.newsSignal.connect(showNews); root.uploadSignal.connect(sendUrls); root.sendtextSignal.connect(sendtext); diff --git a/source-linux/qml/newsqml/NewsVideo.qml b/source-linux/qml/newsqml/NewsVideo.qml index 97fefcb..73116ae 100644 --- a/source-linux/qml/newsqml/NewsVideo.qml +++ b/source-linux/qml/newsqml/NewsVideo.qml @@ -38,7 +38,7 @@ Rectangle{ color:"black" //border.color: "light grey" width:newscolumn.width; - height:video.hasVideo?newscolumn.width/4*3:10*mm + height:newscolumn.width/4*3//video.hasVideo?newscolumn.width/4*3:10*mm property alias source:video.source Text{ id:noticeText diff --git a/source-linux/qml/newsqml/Newsitem.qml b/source-linux/qml/newsqml/Newsitem.qml index 0b75445..c3f8953 100644 --- a/source-linux/qml/newsqml/Newsitem.qml +++ b/source-linux/qml/newsqml/Newsitem.qml @@ -298,7 +298,7 @@ Item { font.pixelSize: 2.5*mm font.family:fontAwesome.name color:control.checked?"black": "grey" - text:"\uf118" + text:control.checked?"\uf118"+"!":"\uf118" } } } @@ -320,7 +320,7 @@ Item { font.pixelSize: 2.5*mm font.family:fontAwesome.name color:control.checked?"black": "grey" - text: "\uf119" + text: control.checked?"\uf119"+"!":"\uf119" } } } diff --git a/source-linux/qml/newsqml/SmileyDialog.qml b/source-linux/qml/newsqml/SmileyDialog.qml index 82ee0e9..8acd4ce 100644 --- a/source-linux/qml/newsqml/SmileyDialog.qml +++ b/source-linux/qml/newsqml/SmileyDialog.qml @@ -40,7 +40,7 @@ Rectangle{ id:smileyDialog x: mm width: messageColumn.width-5*mm - height:root.height/3 + height:root.height/2 BlueButton{ id:closeButton @@ -64,7 +64,7 @@ Rectangle{ frameOverlap: 1 tab: Rectangle { color: "white" - implicitWidth: smileyTabView.width/3-2*mm + implicitWidth: smileyTabView.width/4-2*mm implicitHeight: 4*mm Text { id: text anchors.centerIn: parent @@ -78,6 +78,30 @@ Rectangle{ tabsAlignment:Qt.AlignHCenter } + Tab{ + title: qsTr("Unicode") + Rectangle{ + id: htmlGridTab + GridView { + id:htmlView + anchors.fill: parent + cellWidth: 5*mm + cellHeight: 5*mm + clip: true + model: htmlModel + delegate: htmlItem + } + + ListModel{ + id:htmlModel + } + Component.onCompleted:{ + for (var icon in Smileyjs.html){ + htmlModel.append({"emoji":Smileyjs.html[icon]}) + } + } + } + } Tab{ title: qsTr("Standard") Rectangle{ @@ -152,6 +176,9 @@ Rectangle{ } } } + + + } Component{ id:smileyItem @@ -166,9 +193,31 @@ Rectangle{ onClicked:{ //bodyField.append(emoji.name+" ") bodyField.insert(bodyField.cursorPosition,emoji.name+" "); - smileyDialog.destroy() + smileyDialog.visible=false } } } } + + Component{ + id:htmlItem + Text{id:smileText + width:4.5*mm + height: 4.5*mm + textFormat:Text.RichText + font.pixelSize: 4*mm + text: emoji + + MouseArea{ + anchors.fill: parent + onClicked:{ + //bodyField.append(emoji.name+" ") + bodyField.insert(bodyField.cursorPosition,emoji+" "); + smileyDialog.visible=false + } + } + } + } + + } diff --git a/source-linux/translations/friendiqa-de.qm b/source-linux/translations/friendiqa-de.qm index d088dcf..6a51d25 100644 Binary files a/source-linux/translations/friendiqa-de.qm and b/source-linux/translations/friendiqa-de.qm differ diff --git a/source-linux/translations/friendiqa-de.ts b/source-linux/translations/friendiqa-de.ts index 2a64567..00399f4 100644 --- a/source-linux/translations/friendiqa-de.ts +++ b/source-linux/translations/friendiqa-de.ts @@ -59,16 +59,14 @@ Intervall (0=keins) - Error Fehler - Nickname not registered at given server! - Name auf der Seite nicht registriert! + Name auf der Seite nicht registriert! @@ -138,7 +136,7 @@ ContactComponent - + Connect Kontaktanfrage @@ -176,6 +174,39 @@ Erstellt
+ + ContactPage + + + Connect + Kontaktanfrage + + + + Description + Beschreibung + + + + Location + Ort + + + + Posts + Beiträge + + + + URL + Profilseite + + + + Created at + Erstellt + + FriendsTab @@ -194,7 +225,7 @@ Kontakte - + Groups Gruppen @@ -213,37 +244,40 @@ ImageUploadDialog - + Upload to album In Album hochladen - Album - Album + Album - Image - Bild + Bild - + Description Beschreibung - + Upload Hochladen - + + Change + Ändern + + + Error Fehler - + No album name given Kein Albumname angegeben @@ -251,17 +285,17 @@ MessageSend - + Title (optional) Überschrift (optional) - + Error Fehler - + Only one attachment supported at the moment. Remove other attachment first! Nur ein Anhang derzeit unterstützt. @@ -275,52 +309,56 @@ Lade Profilbild für - + More Mehr - + Timeline Chronologisch - Error - Fehler + Fehler - + Favorites Markierte News - + Conversations Unterhaltungen - + + Network Error + Netzwerk-Fehler + + + Public timeline Gemeinschaft - + Direct Messages Direktnachrichten - + Notifications Meldungen - + Group news News Gruppe - + Quit Schliessen @@ -353,57 +391,57 @@ Kommentare - + Attending: Teilnahme: - + Reply Antworten - + DM Direktnachricht - + Repost Teilen - + Success! Erledigt! - + Conversation Unterhaltung - + Attending Teilnahme - + yes ja - + maybe vielleicht - + no nein - + Delete Löschen @@ -424,28 +462,28 @@ PhotoTab - + 's images s Bilder - + All Images Alle Bilder - + Only new Nur neue - - + + Own Images Eigene Bilder - + More Mehr @@ -677,16 +715,21 @@ SmileyDialog + Unicode + Unicode + + + Standard Standard - + Addon Addon - + Adult XXX @@ -694,131 +737,131 @@ newsworker - + likes this. mag das. - + like this. mögen das. - + doesn't like this. mag das nicht. - + don't like this. mögen das nicht. - + will attend. nehmen teil. - + persons will attend. Personen nehmen teil. - + will not attend. nimmt nicht teil. - + persons will not attend. Personen nehmen nicht teil. - + may attend. nimmt vielleicht teil. - + persons may attend. Personen nehmen vielleicht teil. - + yes ja - + no nein - + maybe vielleicht - + seconds Sekunden - - - - - - - - - - + + + + + + + + + + ago her - + minute Minute - + minutes Minuten - + hour Stunde - + hours Stunden - + day Tag - + days Tage - + month Monat - + months Monate - + years @@ -826,11 +869,18 @@ service - - - Error - Fehler + Fehler + + + + Undefined Array Error + Antwort-Array ungültig + + + + JSON status Error + Server-Antwort: Fehler diff --git a/source-linux/translations/friendiqa-es.qm b/source-linux/translations/friendiqa-es.qm index 4bd80da..a905e3d 100644 Binary files a/source-linux/translations/friendiqa-es.qm and b/source-linux/translations/friendiqa-es.qm differ diff --git a/source-linux/translations/friendiqa-es.ts b/source-linux/translations/friendiqa-es.ts index 1b22144..fe0db25 100644 --- a/source-linux/translations/friendiqa-es.ts +++ b/source-linux/translations/friendiqa-es.ts @@ -31,7 +31,7 @@ Nickname - + Usuario @@ -59,16 +59,10 @@ Intervalo (0=ningún) - Error - Error - - - - Nickname not registered at given server! - + Error @@ -83,12 +77,12 @@ No nickname given! - + ¡Usuario incorrecto! Nickname not registered at given server! - + ¡Usuario incorrecto! No username given! @@ -112,17 +106,17 @@ Wrong password! - + ¡Contraseña incorrecta! Success - + éxito! Name - + Nombre @@ -138,7 +132,7 @@ ContactComponent - + Connect Conectar @@ -176,12 +170,45 @@ Creado en + + ContactPage + + + Connect + Conectar + + + + Description + Descripción + + + + Location + Localización + + + + Posts + Mensajes + + + + URL + URL + + + + Created at + Creado en + + FriendsTab Me - + Yo @@ -194,7 +221,7 @@ Contactos - + Groups Grupos @@ -202,37 +229,40 @@ ImageUploadDialog - + Upload to album - + Subir álbum - Album - álbum + álbum - Image - imagen + imagen - + Description Descripción - + Upload Subir - + + Change + Cambiar + + + Error Error - + No album name given ¡Nombre del álbum no encontrado! @@ -240,17 +270,17 @@ MessageSend - + Title (optional) Título (opcional) - + Error Error - + Only one attachment supported at the moment. Remove other attachment first! Solo se admite adjuntar un solo archivo en este momento. @@ -264,54 +294,58 @@ Descargar la imagen del perfil para - + More Mas - + Timeline Cronología - Error - Error + Error - + Favorites Favoritos - + Conversations Conversaciones - + + Network Error + Fallo de red + + + Public timeline - + Cronología pública - + Direct Messages - + Mensaje directo - + Notifications Notificaciones - + Group news - + Grupos - + Quit - + Salida @@ -342,57 +376,57 @@ comentarios - + Attending: Asistiendo: - + Reply Respuesta - + DM Mensaje directo - + Repost Volver a publicar - + Success! éxito! - + Conversation Conversación - + Attending Asistiendo - + yes si - + maybe quizás - + no no - + Delete Borrar @@ -413,28 +447,28 @@ PhotoTab - + 's images s Imágenes - + All Images - + Todas las imagenes - + Only new - + Solo nueva - - + + Own Images Mis imágenes - + More Mas @@ -444,7 +478,7 @@ profile name - + Nombre de perfil @@ -666,16 +700,21 @@ SmileyDialog + Unicode + Unicode + + + Standard Standard - + Addon Addon - + Adult XXX @@ -683,131 +722,131 @@ newsworker - + likes this. le gusta esto. - + like this. me gusta esto. - + doesn't like this. no de ése. - + don't like this. no me gusta. - + will attend. asistirá. - + persons will attend. Personas que asistirán. - + will not attend. no asistirá. - + persons will not attend. Personas que no asistirán.. - + may attend. Puede asistir. - + persons may attend. Personas que pueden asistir. - + yes si - + no no - + maybe quizás - + seconds Segundos - - - - - - - - - - + + + + + + + + + + ago hace - + minute Minuto - + minutes Minutos - + hour Hora - + hours Horas - + day Dia - + days Dias - + month Mes - + months Meses - + years Años @@ -815,11 +854,18 @@ service - - - Error - Error + Error + + + + Undefined Array Error + + + + + JSON status Error + diff --git a/source-linux/translations/friendiqa-it.qm b/source-linux/translations/friendiqa-it.qm index 4dfcf94..20371c7 100644 Binary files a/source-linux/translations/friendiqa-it.qm and b/source-linux/translations/friendiqa-it.qm differ diff --git a/source-linux/translations/friendiqa-it.ts b/source-linux/translations/friendiqa-it.ts index 658670b..8e673ca 100644 --- a/source-linux/translations/friendiqa-it.ts +++ b/source-linux/translations/friendiqa-it.ts @@ -31,7 +31,7 @@ Nickname - + Utente @@ -59,16 +59,10 @@ Intervallo (0=nessuno) - Error - Errore - - - - Nickname not registered at given server! - + Errore @@ -83,12 +77,12 @@ No nickname given! - + Nessun utente inserito! Nickname not registered at given server! - + No username given! @@ -112,17 +106,17 @@ Wrong password! - + Success - + Ha funzionato! Name - + @@ -138,7 +132,7 @@ ContactComponent - + Connect Connetti @@ -176,6 +170,39 @@ Creato il + + ContactPage + + + Connect + Connetti + + + + Description + Descrizione + + + + Location + Località + + + + Posts + Messaggi + + + + URL + URL + + + + Created at + Creato il + + FriendsTab @@ -194,7 +221,7 @@ Contatti - + Groups Gruppi @@ -202,37 +229,40 @@ ImageUploadDialog - + Upload to album - Album - Album + Album - Image - Immagine + Immagine - + Description Descrizione - + Upload Carica - + + Change + + + + Error Errore - + No album name given Nessun nome album inserito! @@ -240,17 +270,17 @@ MessageSend - + Title (optional) Titolo (opzionale) - + Error Errore - + Only one attachment supported at the moment. Remove other attachment first! Solo un allegato è attualmente supportato. @@ -264,52 +294,56 @@ Download immagine profilo per - + More Ancora - + Timeline Cronologia - Error - Errore + Errore - + Favorites Favoriti - + Conversations Conversazioni - + + Network Error + + + + Public timeline - + Direct Messages - + Messaggio diretto - + Notifications Notifiche - + Group news - + Gruppi - + Quit @@ -342,57 +376,57 @@ commenti - + Attending: Attendi: - + Reply Risposta - + DM Messaggio diretto - + Repost Condividi - + Success! Ha funzionato! - + Conversation Conversazione - + Attending Attendi - + yes si - + maybe potrebbe - + no no - + Delete Cancella @@ -413,28 +447,28 @@ PhotoTab - + 's images Immagini - + All Images - + Only new - - + + Own Images Mie immagini - + More Ancora @@ -666,16 +700,21 @@ SmileyDialog + Unicode + Unicode + + + Standard Standard - + Addon Addon - + Adult XXX @@ -683,131 +722,131 @@ newsworker - + likes this. mi piace. - + like this. mi piace. - + doesn't like this. non mi piace. - + don't like this. non mi piace. - + will attend. attendere. - + persons will attend. Persone che attendono. - + will not attend. non aspettare. - + persons will not attend. Persone che non aspettano. - + may attend. puoi attendere. - + persons may attend. Persone che possono attendere. - + yes si - + no no - + maybe potrebbe - + seconds secondi - - - - - - - - - - + + + + + + + + + + ago fa - + minute minuti - + minutes minuti - + hour ora - + hours ore - + day giorno - + days giorni - + month mese - + months mesi - + years anni @@ -815,11 +854,18 @@ service - - - Error - Errore + Errore + + + + Undefined Array Error + + + + + JSON status Error +