浏览代码

SyncedFoldersActivity: load content asynchronously

Signed-off-by: Álvaro Brey Vilas <alvaro.brey@nextcloud.com>
Álvaro Brey Vilas 3 年之前
父节点
当前提交
c488b0b330
共有 2 个文件被更改,包括 46 次插入37 次删除
  1. 1 1
      detekt.yml
  2. 45 36
      src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.kt

+ 1 - 1
detekt.yml

@@ -1,5 +1,5 @@
 build:
-  maxIssues: 12
+  maxIssues: 11
   weights:
     # complexity: 2
     # LongParameterList: 1

+ 45 - 36
src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.kt

@@ -68,6 +68,9 @@ import com.owncloud.android.utils.PermissionUtil
 import com.owncloud.android.utils.SyncedFolderUtils
 import com.owncloud.android.utils.theme.ThemeButtonUtils
 import com.owncloud.android.utils.theme.ThemeUtils
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
 import java.io.File
 import java.util.Locale
 import javax.inject.Inject
@@ -84,7 +87,6 @@ class SyncedFoldersActivity :
 
     companion object {
         private const val SYNCED_FOLDER_PREFERENCES_DIALOG_TAG = "SYNCED_FOLDER_PREFERENCES_DIALOG"
-        private const val MAX_DISPLAY_FILES_PER_FOLDER = 7
         // yes, there is a typo in this value
         private const val KEY_SYNCED_FOLDER_INITIATED_PREFIX = "syncedFolderIntitiated_"
         private val PRIORITIZED_FOLDERS = arrayOf("Camera", "Screenshots")
@@ -197,7 +199,6 @@ class SyncedFoldersActivity :
             mDrawerToggle.isDrawerIndicatorEnabled = false
         }
 
-        // TODO: The content loading should be done asynchronously
         setupContent()
         if (ThemeUtils.themingEnabled(this)) {
             setTheme(R.style.FallbackThemingTheme)
@@ -252,7 +253,7 @@ class SyncedFoldersActivity :
         binding.list.addItemDecoration(MediaGridItemDecoration(spacing))
         binding.list.layoutManager = lm
         binding.list.adapter = adapter
-        load(gridWidth * 2, false)
+        load(getItemsDisplayedPerFolder(), false)
     }
 
     private fun showHiddenItems() {
@@ -274,39 +275,43 @@ class SyncedFoldersActivity :
             return
         }
         showLoadingContent()
-        val mediaFolders = MediaProvider.getImageFolders(
-            contentResolver,
-            perFolderMediaItemLimit, this, false
-        )
-        mediaFolders.addAll(
-            MediaProvider.getVideoFolders(
-                contentResolver, perFolderMediaItemLimit,
-                this, false
+        CoroutineScope(Dispatchers.IO).launch {
+            val mediaFolders = MediaProvider.getImageFolders(
+                contentResolver,
+                perFolderMediaItemLimit, this@SyncedFoldersActivity, false
             )
-        )
-        val syncedFolderArrayList = syncedFolderProvider.syncedFolders
-        val currentAccountSyncedFoldersList: MutableList<SyncedFolder> = ArrayList()
-        val user = userAccountManager.user
-        for (syncedFolder in syncedFolderArrayList) {
-            if (syncedFolder.account == user.accountName) {
-                // delete non-existing & disabled synced folders
-                if (!File(syncedFolder.localPath).exists() && !syncedFolder.isEnabled) {
-                    syncedFolderProvider.deleteSyncedFolder(syncedFolder.id)
-                } else {
-                    currentAccountSyncedFoldersList.add(syncedFolder)
+            mediaFolders.addAll(
+                MediaProvider.getVideoFolders(
+                    contentResolver, perFolderMediaItemLimit,
+                    this@SyncedFoldersActivity, false
+                )
+            )
+            val syncedFolderArrayList = syncedFolderProvider.syncedFolders
+            val currentAccountSyncedFoldersList: MutableList<SyncedFolder> = ArrayList()
+            val user = userAccountManager.user
+            for (syncedFolder in syncedFolderArrayList) {
+                if (syncedFolder.account == user.accountName) {
+                    // delete non-existing & disabled synced folders
+                    if (!File(syncedFolder.localPath).exists() && !syncedFolder.isEnabled) {
+                        syncedFolderProvider.deleteSyncedFolder(syncedFolder.id)
+                    } else {
+                        currentAccountSyncedFoldersList.add(syncedFolder)
+                    }
                 }
             }
-        }
-        val syncFolderItems = sortSyncedFolderItems(
-            mergeFolderData(currentAccountSyncedFoldersList, mediaFolders)
-        )
-        adapter.setSyncFolderItems(syncFolderItems)
-        adapter.notifyDataSetChanged()
-        showList()
-        if (!TextUtils.isEmpty(path)) {
-            val section = adapter.getSectionByLocalPathAndType(path, type)
-            if (section >= 0) {
-                onSyncFolderSettingsClick(section, adapter[section])
+            val syncFolderItems = sortSyncedFolderItems(
+                mergeFolderData(currentAccountSyncedFoldersList, mediaFolders)
+            )
+            CoroutineScope(Dispatchers.Main).launch {
+                adapter.setSyncFolderItems(syncFolderItems)
+                adapter.notifyDataSetChanged()
+                showList()
+                if (!TextUtils.isEmpty(path)) {
+                    val section = adapter.getSectionByLocalPathAndType(path, type)
+                    if (section >= 0) {
+                        onSyncFolderSettingsClick(section, adapter[section])
+                    }
+                }
             }
         }
     }
@@ -429,9 +434,13 @@ class SyncedFoldersActivity :
         )
     }
 
+    private fun getItemsDisplayedPerFolder(): Int {
+        return resources.getInteger(R.integer.media_grid_width) * 2
+    }
+
     private fun getDisplayFilePathList(files: List<File>?): List<String>? {
         if (!files.isNullOrEmpty()) {
-            return files.take(MAX_DISPLAY_FILES_PER_FOLDER)
+            return files.take(getItemsDisplayedPerFolder())
                 .map { it.absolutePath }
         }
         return null
@@ -737,8 +746,8 @@ class SyncedFoldersActivity :
                 // If request is cancelled, result arrays are empty.
                 if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                     // permission was granted
-                    val gridWidth = resources.getInteger(R.integer.media_grid_width)
-                    load(gridWidth * 2, true)
+
+                    load(getItemsDisplayedPerFolder(), true)
                 } else {
                     // permission denied --> do nothing
                     return