File indexing completed on 2024-05-12 04:45:59

0001 #include "androidinterface.h"
0002 
0003 #include <QDomDocument>
0004 #include <QFuture>
0005 #include <QFutureWatcher>
0006 #include <QtConcurrent/QtConcurrentRun>
0007 #include <QtConcurrent>
0008 #include <QException>
0009 
0010 #include <QImage>
0011 
0012 #include <MauiKit3/Core/mauiandroid.h>
0013 #include <MauiKit3/Core/fmh.h>
0014 
0015 class InterfaceConnFailedException : public QException
0016 {
0017 public:
0018     void raise() const { throw *this; }
0019     InterfaceConnFailedException *clone() const { return new InterfaceConnFailedException(*this); }
0020 };
0021 
0022 
0023 AndroidInterface *AndroidInterface::getInstance()
0024 {
0025     if (!instance) {
0026         instance = new AndroidInterface();
0027         qDebug() << "getInstance(AndroidInterface): First AndroidInterface instance\n";
0028         return instance;
0029     } else {
0030         qDebug() << "getInstance(AndroidInterface): previous AndroidInterface instance\n";
0031         return instance;
0032     }
0033 }
0034 
0035 bool AndroidInterface::insertContact(const FMH::MODEL &contact)
0036 {
0037     qDebug() << "ADDING CONTACT TO ACCOUNT" << contact;
0038     AndroidInterface::addContact(contact[FMH::MODEL_KEY::N],
0039             contact[FMH::MODEL_KEY::TEL],
0040             contact[FMH::MODEL_KEY::TEL_2],
0041             contact[FMH::MODEL_KEY::TEL_3],
0042             contact[FMH::MODEL_KEY::EMAIL],
0043             contact[FMH::MODEL_KEY::TITLE],
0044             contact[FMH::MODEL_KEY::ORG],
0045             contact[FMH::MODEL_KEY::PHOTO],
0046             contact[FMH::MODEL_KEY::ACCOUNT],
0047             contact[FMH::MODEL_KEY::ACCOUNTTYPE]);
0048 
0049     return true;
0050 }
0051 
0052 FMH::MODEL_LIST AndroidInterface::getAccounts(const GET_TYPE &type)
0053 {
0054     if (type == GET_TYPE::CACHED) {
0055         if (!m_accounts.isEmpty())
0056             return this->m_accounts;
0057         else
0058             this->fetchAccounts();
0059 
0060     } else if (type == GET_TYPE::FETCH)
0061         return this->fetchAccounts();
0062 
0063     return FMH::MODEL_LIST();
0064 }
0065 
0066 void AndroidInterface::getContacts(const GET_TYPE &type)
0067 {
0068     if (type == GET_TYPE::CACHED) {
0069         if (!this->m_contacts.isEmpty())
0070             emit this->contactsReady(this->m_contacts);
0071         else
0072             this->fetchContacts();
0073 
0074     } else if (type == GET_TYPE::FETCH)
0075         this->fetchContacts();
0076 }
0077 
0078 void AndroidInterface::getContacts()
0079 {
0080     this->getContacts(GET_TYPE::FETCH);
0081 }
0082 
0083 QVariantList AndroidInterface::getCallLogs()
0084 {    
0085     QAndroidJniObject logsObj = QAndroidJniObject::callStaticObjectMethod("com/kde/maui/tools/Union",
0086                                                                           "callLogs",
0087                                                                           "(Landroid/content/Context;)Ljava/util/List;",
0088                                                                           QtAndroid::androidActivity().object<jobject>());
0089 
0090     return MAUIAndroid::transform(logsObj);
0091 
0092 }
0093 
0094 FMH::MODEL AndroidInterface::getContact(const QString &id)
0095 {
0096     QAndroidJniObject contactObj = QAndroidJniObject::callStaticObjectMethod("com/kde/maui/tools/Union",
0097                                                                              "getContact",
0098                                                                              "(Landroid/content/Context;Ljava/lang/String;)Ljava/util/HashMap;",
0099                                                                              QtAndroid::androidActivity().object<jobject>(),
0100                                                                              QAndroidJniObject::fromString(id).object<jstring>());
0101 
0102 
0103     return FMH::toModel(MAUIAndroid::createVariantMap(contactObj.object<jobject>()));
0104 }
0105 
0106 bool AndroidInterface::updateContact(const QString &id, const FMH::MODEL &contact)
0107 {
0108     for (const auto &key : contact.keys())
0109         updateContact(id, FMH::MODEL_NAME[key], contact[key]);
0110 
0111     return true;
0112 }
0113 
0114 bool AndroidInterface::removeContact(const QString &id)
0115 {
0116     return false;
0117 }
0118 
0119 QImage AndroidInterface::contactPhoto(const QString &id)
0120 {
0121     return QImage();
0122 }
0123 
0124 void AndroidInterface::addContact(const QString &name, const QString &tel, const QString &tel2, const QString &tel3, const QString &email, const QString &title, const QString &org, const QString &photo, const QString &account, const QString &accountType)
0125 {
0126     qDebug()<< "Adding new contact to android";
0127        QAndroidJniObject::callStaticMethod<void>("com/kde/maui/tools/Union",
0128                                                  "addContact",
0129                                                  "(Landroid/content/Context;"
0130                                                  "Ljava/lang/String;"
0131                                                  "Ljava/lang/String;"
0132                                                  "Ljava/lang/String;"
0133                                                  "Ljava/lang/String;"
0134                                                  "Ljava/lang/String;"
0135                                                  "Ljava/lang/String;"
0136                                                  "Ljava/lang/String;"
0137                                                  "Ljava/lang/String;"
0138                                                  "Ljava/lang/String;"
0139                                                  "Ljava/lang/String;)V",
0140                                                  QtAndroid::androidActivity().object<jobject>(),
0141                                                  QAndroidJniObject::fromString(name).object<jstring>(),
0142                                                  QAndroidJniObject::fromString(tel).object<jstring>(),
0143                                                  QAndroidJniObject::fromString(tel2).object<jstring>(),
0144                                                  QAndroidJniObject::fromString(tel3).object<jstring>(),
0145                                                  QAndroidJniObject::fromString(email).object<jstring>(),
0146                                                  QAndroidJniObject::fromString(title).object<jstring>(),
0147                                                  QAndroidJniObject::fromString(org).object<jstring>(),
0148                                                  QAndroidJniObject::fromString(photo).object<jstring>(),
0149                                                  QAndroidJniObject::fromString(account).object<jstring>(),
0150                                                  QAndroidJniObject::fromString(accountType).object<jstring>() );
0151 
0152 }
0153 
0154 void AndroidInterface::updateContact(const QString &id, const QString &field, const QString &value)
0155 {
0156     QAndroidJniObject::callStaticMethod<void>("com/kde/maui/tools/Union",
0157                                                  "updateContact",
0158                                                  "(Landroid/content/Context;"
0159                                                  "Ljava/lang/String;"
0160                                                  "Ljava/lang/String;"
0161                                                  "Ljava/lang/String;)V",
0162                                                  QtAndroid::androidActivity().object<jobject>(),
0163                                                  QAndroidJniObject::fromString(id).object<jstring>(),
0164                                                  QAndroidJniObject::fromString(field).object<jstring>(),
0165                                                  QAndroidJniObject::fromString(value).object<jstring>() );
0166 
0167 }
0168 
0169 
0170 static QVariantList getAllContacts()
0171 {
0172     QAndroidJniObject contactsObj = QAndroidJniObject::callStaticObjectMethod("com/kde/maui/tools/Union",
0173                                                                               "fetchContacts",
0174                                                                               "(Landroid/content/Context;)Ljava/util/List;",
0175                                                                               QtAndroid::androidActivity().object<jobject>());
0176 
0177     return MAUIAndroid::transform(contactsObj);
0178 
0179 }
0180 
0181 void AndroidInterface::fetchContacts()
0182 {
0183     QFutureWatcher<FMH::MODEL_LIST> *watcher = new QFutureWatcher<FMH::MODEL_LIST>;
0184     connect(watcher, &QFutureWatcher<FMH::MODEL_LIST>::finished, [=]() {
0185         this->m_contacts = watcher->future().result();
0186         emit this->contactsReady(this->m_contacts);
0187 
0188         watcher->deleteLater();
0189     });
0190 
0191     const auto func = []() -> FMH::MODEL_LIST {
0192             FMH::MODEL_LIST data;
0193 
0194             auto list = getAllContacts();
0195 
0196             for (auto item : list)
0197             data << FMH::toModel(item.toMap());
0198 
0199             return data;
0200 };
0201 
0202     QFuture<FMH::MODEL_LIST> t1 = QtConcurrent::run(func);
0203     watcher->setFuture(t1);
0204 }
0205 
0206 FMH::MODEL_LIST AndroidInterface::fetchAccounts()
0207 {
0208     FMH::MODEL_LIST data;
0209 
0210 //    const auto array = MAUIAndroid::getAccounts();
0211 //    QString xmlData(array);
0212 //    QDomDocument doc;
0213 
0214 //    if (!doc.setContent(xmlData))
0215 //        return data;
0216 
0217 //    const QDomNodeList nodeList = doc.documentElement().childNodes();
0218 
0219 //    for (int i = 0; i < nodeList.count(); i++) {
0220 //        QDomNode n = nodeList.item(i);
0221 
0222 //        if (n.nodeName() == "account") {
0223 //            FMH::MODEL model;
0224 //            auto contact = n.toElement().childNodes();
0225 
0226 //            for (int i = 0; i < contact.count(); i++) {
0227 //                const QDomNode m = contact.item(i);
0228 
0229 //                if (m.nodeName() == "name") {
0230 //                    const auto account = m.toElement().text();
0231 //                    model.insert(FMH::MODEL_KEY::ACCOUNT, account);
0232 
0233 //                } else if (m.nodeName() == "type") {
0234 //                    const auto type = m.toElement().text();
0235 //                    model.insert(FMH::MODEL_KEY::ACCOUNTTYPE, type);
0236 //                }
0237 //            }
0238 
0239 //            data << model;
0240 //        }
0241 //    }
0242     return data;
0243 }
0244 
0245 void AndroidInterface::call(const QString &tel)
0246 {
0247     QAndroidJniEnvironment _env;
0248        QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;");   //activity is valid
0249        if (_env->ExceptionCheck()) {
0250            _env->ExceptionClear();
0251            throw InterfaceConnFailedException();
0252        }
0253        if ( activity.isValid() )
0254        {
0255            qDebug()<< "trying to call from senitents" << tel;
0256 
0257            QAndroidJniObject::callStaticMethod<void>("com/kde/maui/tools/Union",
0258                                                      "call",
0259                                                      "(Landroid/app/Activity;Ljava/lang/String;)V",
0260                                                      activity.object<jobject>(),
0261                                                      QAndroidJniObject::fromString(tel).object<jstring>());
0262 
0263 
0264            if (_env->ExceptionCheck())
0265            {
0266                _env->ExceptionClear();
0267                throw InterfaceConnFailedException();
0268            }
0269        }else
0270            throw InterfaceConnFailedException();
0271 
0272 }
0273 
0274 void AndroidInterface::sendSMS(const QString &tel, const QString &subject, const QString &message)
0275 {
0276     qDebug() << "trying to send sms text";
0277     QAndroidJniEnvironment _env;
0278     QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;"); // activity is valid
0279     if (_env->ExceptionCheck()) {
0280         _env->ExceptionClear();
0281         throw InterfaceConnFailedException();
0282     }
0283     if (activity.isValid()) {
0284         QAndroidJniObject::callStaticMethod<void>("com/kde/maui/tools/Union",
0285                                                   "sendSMS",
0286                                                   "(Landroid/app/Activity;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V",
0287                                                   activity.object<jobject>(),
0288                                                   QAndroidJniObject::fromString(tel).object<jstring>(),
0289                                                   QAndroidJniObject::fromString(subject).object<jstring>(),
0290                                                   QAndroidJniObject::fromString(message).object<jstring>());
0291 
0292         if (_env->ExceptionCheck()) {
0293             _env->ExceptionClear();
0294             throw InterfaceConnFailedException();
0295         }
0296     } else
0297         throw InterfaceConnFailedException();
0298 }
0299 
0300 
0301 void AndroidInterface::shareContact(const QString &id)
0302 {
0303     QAndroidJniObject::callStaticMethod<void>("com/kde/maui/tools/Union",
0304                                               "shareContact",
0305                                               "(Landroid/content/Context;"
0306                                               "Ljava/lang/String;)V",
0307                                               QtAndroid::androidActivity().object<jobject>(),
0308                                               QAndroidJniObject::fromString(id).object<jstring>());
0309 }
0310 
0311