Эх сурвалжийг харах

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

refactor(ui): coroutine based user status retrieval.
Tobias Kaminsky 5 сар өмнө
parent
commit
6d0aaa6499

+ 14 - 2
app/src/main/java/com/nextcloud/ui/ChooseAccountDialogFragment.kt

@@ -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 - 0
app/src/main/java/com/nextcloud/ui/RetrieveStatus.kt

@@ -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)

+ 0 - 63
app/src/main/java/com/owncloud/android/ui/asynctasks/RetrieveStatusAsyncTask.java

@@ -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());
-        }
-    }
-}