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