File indexing completed on 2024-04-21 04:56:31
0001 /* 0002 * SPDX-FileCopyrightText: 2020 Dan Leinir Turthra Jensen <admin@leinir.dk> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "accountservicetogglejob.h" 0008 0009 #include "core.h" 0010 #include <Accounts/Manager> 0011 #include <QDebug> 0012 0013 namespace KAccounts 0014 { 0015 0016 class AccountServiceToggleJob::Private 0017 { 0018 public: 0019 Private() 0020 { 0021 } 0022 QString accountId; 0023 QString serviceId; 0024 bool serviceEnabled{false}; 0025 }; 0026 0027 AccountServiceToggleJob::AccountServiceToggleJob(QObject *parent) 0028 : KJob(parent) 0029 , d(new Private) 0030 { 0031 } 0032 0033 AccountServiceToggleJob::~AccountServiceToggleJob() 0034 { 0035 delete d; 0036 } 0037 0038 QString AccountServiceToggleJob::accountId() const 0039 { 0040 return d->accountId; 0041 } 0042 0043 void AccountServiceToggleJob::setAccountId(const QString &accountId) 0044 { 0045 d->accountId = accountId; 0046 Q_EMIT accountIdChanged(); 0047 } 0048 0049 QString AccountServiceToggleJob::serviceId() const 0050 { 0051 return d->serviceId; 0052 } 0053 0054 void AccountServiceToggleJob::setServiceId(const QString &serviceId) 0055 { 0056 d->serviceId = serviceId; 0057 Q_EMIT serviceIdChanged(); 0058 } 0059 0060 bool AccountServiceToggleJob::serviceEnabled() const 0061 { 0062 return d->serviceEnabled; 0063 } 0064 0065 void AccountServiceToggleJob::setServiceEnabled(bool serviceEnabled) 0066 { 0067 d->serviceEnabled = serviceEnabled; 0068 Q_EMIT serviceEnabledChanged(); 0069 } 0070 0071 void AccountServiceToggleJob::start() 0072 { 0073 Accounts::Manager *accountsManager = KAccounts::accountsManager(); 0074 if (accountsManager) { 0075 Accounts::Account *account = accountsManager->account(d->accountId.toInt()); 0076 if (account) { 0077 Accounts::Service service = accountsManager->service(d->serviceId); 0078 if (!service.isValid()) { 0079 // qWarning() << "Looks like we might have been given a name instead of an ID for the service, which will be expected when using the Ubuntu 0080 // AccountServiceModel, which only gives you the name"; 0081 const auto services = account->services(); 0082 for (const Accounts::Service &aService : services) { 0083 if (aService.displayName() == d->serviceId) { 0084 service = aService; 0085 break; 0086 } 0087 } 0088 } 0089 if (service.isValid()) { 0090 account->selectService(service); 0091 account->setEnabled(d->serviceEnabled); 0092 0093 if (d->serviceEnabled) { 0094 account->selectService(); 0095 account->setEnabled(true); 0096 } else { 0097 bool shouldStayEnabled = false; 0098 const auto services = account->services(); 0099 for (const Accounts::Service &accountService : services) { 0100 // Skip the current service, that is not synced to the account yet 0101 // so it would return the state before the user clicked the checkbox 0102 if (accountService == service) { 0103 continue; 0104 } 0105 account->selectService(accountService); 0106 if (account->isEnabled()) { 0107 // At least one service is enabled, leave the account enabled 0108 shouldStayEnabled = true; 0109 break; 0110 } 0111 } 0112 0113 // Make sure we're operating on the global account 0114 account->selectService(); 0115 account->setEnabled(shouldStayEnabled); 0116 } 0117 0118 connect(account, &Accounts::Account::synced, this, [this]() { 0119 emitResult(); 0120 }); 0121 account->sync(); 0122 } else { 0123 qWarning() << "No service found with the ID" << d->serviceId << "on account" << account->displayName(); 0124 emitResult(); 0125 } 0126 } else { 0127 qWarning() << "No account found with the ID" << d->accountId; 0128 emitResult(); 0129 } 0130 } else { 0131 qWarning() << "No accounts manager, this is not awesome."; 0132 emitResult(); 0133 } 0134 } 0135 }