mirror of
https://github.com/nextcloud/android.git
synced 2024-11-21 20:55:31 +03:00
Merge pull request #13927 from nextcloud/replace-status-async-task
refactor(ui): coroutine based user status retrieval.
This commit is contained in:
commit
6d0aaa6499
3 changed files with 51 additions and 65 deletions
|
@ -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)
|
||||
|
|
37
app/src/main/java/com/nextcloud/ui/RetrieveStatus.kt
Normal file
37
app/src/main/java/com/nextcloud/ui/RetrieveStatus.kt
Normal 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)
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue