Merge pull request #13927 from nextcloud/replace-status-async-task

refactor(ui): coroutine based user status retrieval.
This commit is contained in:
Tobias Kaminsky 2024-11-07 07:38:21 +01:00 committed by GitHub
commit 6d0aaa6499
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 51 additions and 65 deletions

View file

@ -18,6 +18,7 @@ import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import androidx.fragment.app.DialogFragment
import androidx.lifecycle.lifecycleScope
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.nextcloud.client.account.User
import com.nextcloud.client.account.UserAccountManager
@ -33,10 +34,10 @@ import com.owncloud.android.ui.activity.BaseActivity
import com.owncloud.android.ui.activity.DrawerActivity
import com.owncloud.android.ui.adapter.UserListAdapter
import com.owncloud.android.ui.adapter.UserListItem
import com.owncloud.android.ui.asynctasks.RetrieveStatusAsyncTask
import com.owncloud.android.utils.DisplayUtils
import com.owncloud.android.utils.DisplayUtils.AvatarGenerationListener
import com.owncloud.android.utils.theme.ViewThemeUtils
import kotlinx.coroutines.launch
import javax.inject.Inject
private const val ARG_CURRENT_USER_PARAM = "currentUser"
@ -151,12 +152,23 @@ class ChooseAccountDialogFragment :
binding.statusView.visibility = View.VISIBLE
}
RetrieveStatusAsyncTask(user, this, clientFactory).execute()
loadAndSetUserStatus(user)
}
themeViews()
}
private fun loadAndSetUserStatus(user: User) {
viewLifecycleOwner.lifecycleScope.launch {
val status = retrieveUserStatus(user, clientFactory)
if (isAdded && !isDetached) {
val context = requireContext()
setStatus(status, context)
}
}
}
private fun themeViews() {
viewThemeUtils.platform.themeDialogDivider(binding.separatorLine)
viewThemeUtils.platform.themeDialog(binding.root)

View file

@ -0,0 +1,37 @@
/*
* Nextcloud - Android Client
*
* SPDX-FileCopyrightText: 2024 Edvard Holst <edvard.holst@gmail.com>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
package com.nextcloud.ui
import com.nextcloud.client.account.User
import com.nextcloud.client.network.ClientFactory
import com.owncloud.android.lib.resources.users.GetStatusRemoteOperation
import com.owncloud.android.lib.resources.users.Status
import com.owncloud.android.lib.resources.users.StatusType
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import java.io.IOException
suspend fun retrieveUserStatus(user: User, clientFactory: ClientFactory): Status {
return withContext(Dispatchers.IO) {
try {
val client = clientFactory.createNextcloudClient(user)
val result = GetStatusRemoteOperation().execute(client)
if (result.isSuccess && result.resultData is Status) {
result.resultData as Status
} else {
offlineStatus()
}
} catch (e: ClientFactory.CreationException) {
offlineStatus()
} catch (e: IOException) {
offlineStatus()
}
}
}
private fun offlineStatus() = Status(StatusType.OFFLINE, "", "", -1)

View file

@ -1,63 +0,0 @@
/*
* Nextcloud - Android Client
*
* SPDX-FileCopyrightText: 2020 Tobias Kaminsky <tobias@kaminsky.me>
* SPDX-FileCopyrightText: 2020 Nextcloud GmbH
* SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only
*/
package com.owncloud.android.ui.asynctasks;
import android.os.AsyncTask;
import com.nextcloud.client.account.User;
import com.nextcloud.client.network.ClientFactory;
import com.nextcloud.common.NextcloudClient;
import com.nextcloud.ui.ChooseAccountDialogFragment;
import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.lib.resources.users.GetStatusRemoteOperation;
import com.owncloud.android.lib.resources.users.Status;
import com.owncloud.android.lib.resources.users.StatusType;
import java.lang.ref.WeakReference;
import androidx.lifecycle.Lifecycle;
public class RetrieveStatusAsyncTask extends AsyncTask<Void, Void, Status> {
private final User user;
private final WeakReference<ChooseAccountDialogFragment> chooseAccountDialogFragment;
private final ClientFactory clientFactory;
public RetrieveStatusAsyncTask(User user,
ChooseAccountDialogFragment chooseAccountDialogFragment,
ClientFactory clientFactory) {
this.user = user;
this.chooseAccountDialogFragment = new WeakReference<>(chooseAccountDialogFragment);
this.clientFactory = clientFactory;
}
@Override
protected com.owncloud.android.lib.resources.users.Status doInBackground(Void... voids) {
try {
NextcloudClient client = clientFactory.createNextcloudClient(user);
RemoteOperationResult<com.owncloud.android.lib.resources.users.Status> result =
new GetStatusRemoteOperation().execute(client);
if (result.isSuccess()) {
return result.getResultData();
} else {
return new com.owncloud.android.lib.resources.users.Status(StatusType.OFFLINE, "", "", -1);
}
} catch (ClientFactory.CreationException | NullPointerException e) {
return new com.owncloud.android.lib.resources.users.Status(StatusType.OFFLINE, "", "", -1);
}
}
@Override
protected void onPostExecute(com.owncloud.android.lib.resources.users.Status status) {
ChooseAccountDialogFragment fragment = chooseAccountDialogFragment.get();
if (fragment != null && fragment.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) {
fragment.setStatus(status, fragment.requireContext());
}
}
}