Skip to content

Commit

Permalink
Merge pull request #3719 from owncloud/new_arch/bottom_nav_improvements
Browse files Browse the repository at this point in the history
[New arch] Fix bottom navigation shortcuts
  • Loading branch information
abelgardep authored Aug 18, 2022
2 parents e9b7e24 + 3dd8979 commit cfdafcc
Show file tree
Hide file tree
Showing 27 changed files with 555 additions and 354 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -64,16 +64,15 @@ import com.owncloud.android.db.ProviderMeta.ProviderTableMeta.FILE_ACCOUNT_OWNER
import com.owncloud.android.db.ProviderMeta.ProviderTableMeta.FILE_PATH
import com.owncloud.android.domain.capabilities.model.CapabilityBooleanType
import com.owncloud.android.domain.capabilities.model.OCCapability
import com.owncloud.android.extensions.getIntFromColumnOrThrow
import com.owncloud.android.extensions.getStringFromColumnOrEmpty
import com.owncloud.android.extensions.getStringFromColumnOrThrow
import com.owncloud.android.domain.files.model.OCFile
import com.owncloud.android.domain.files.usecases.GetFileByIdUseCase
import com.owncloud.android.domain.files.usecases.GetFileByRemotePathUseCase
import com.owncloud.android.domain.files.usecases.GetFilesSharedByLinkUseCase
import com.owncloud.android.domain.files.usecases.GetFolderContentUseCase
import com.owncloud.android.domain.files.usecases.GetFolderImagesUseCase
import com.owncloud.android.domain.files.usecases.SaveFileOrFolderUseCase
import com.owncloud.android.extensions.getIntFromColumnOrThrow
import com.owncloud.android.extensions.getStringFromColumnOrEmpty
import com.owncloud.android.extensions.getStringFromColumnOrThrow
import com.owncloud.android.lib.resources.status.RemoteCapability
import com.owncloud.android.providers.CoroutinesDispatcherProvider
import kotlinx.coroutines.CoroutineScope
Expand Down Expand Up @@ -104,15 +103,6 @@ class FileDataStorageManager : KoinComponent {
mContext = activity
}

fun sharedByLinkFilesFromCurrentAccount(): List<OCFile>? = runBlocking(CoroutinesDispatcherProvider().io) {
val getFilesSharedByLinkUseCase: GetFilesSharedByLinkUseCase by inject()

val result = withContext(CoroutineScope(CoroutinesDispatcherProvider().io).coroutineContext) {
getFilesSharedByLinkUseCase.execute(GetFilesSharedByLinkUseCase.Params(account.name))
}.getDataOrNull() ?: emptyList()
result
}

// TODO: New_arch: Remove this and call usecase inside FilesViewModel
fun getFileByPath(path: String): OCFile? = runBlocking(CoroutinesDispatcherProvider().io) {
val getFileByRemotePathUseCase: GetFileByRemotePathUseCase by inject()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,22 +37,27 @@
import androidx.core.content.ContextCompat;
import com.owncloud.android.MainApp;
import com.owncloud.android.R;
import com.owncloud.android.domain.files.model.OCFile;
import com.owncloud.android.domain.files.usecases.DisableThumbnailsForFileUseCase;
import com.owncloud.android.lib.common.OwnCloudAccount;
import com.owncloud.android.lib.common.OwnCloudClient;
import com.owncloud.android.lib.common.SingleSessionManager;
import com.owncloud.android.lib.common.http.HttpConstants;
import com.owncloud.android.lib.common.http.methods.nonwebdav.GetMethod;
import com.owncloud.android.ui.adapter.DiskLruImageCache;
import com.owncloud.android.utils.BitmapUtils;
import kotlin.Lazy;
import org.jetbrains.annotations.NotNull;
import timber.log.Timber;
import com.owncloud.android.domain.files.model.OCFile;

import java.io.File;
import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.net.URL;
import java.util.Locale;

import static org.koin.java.KoinJavaComponent.inject;

/**
* Manager for concurrent access to thumbnails cache.
*/
Expand Down Expand Up @@ -295,6 +300,10 @@ private Bitmap doOCFileInBackground() {
} else {
mClient.exhaustResponse(get.getResponseBodyAsStream());
}
if (status == HttpConstants.HTTP_OK || status == HttpConstants.HTTP_NOT_FOUND) {
@NotNull Lazy<DisableThumbnailsForFileUseCase> disableThumbnailsForFileUseCaseLazy = inject(DisableThumbnailsForFileUseCase.class);
disableThumbnailsForFileUseCaseLazy.getValue().execute(new DisableThumbnailsForFileUseCase.Params(file.getId()));
}
} catch (Exception e) {
Timber.e(e);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import com.owncloud.android.domain.authentication.usecases.GetBaseUrlUseCase
import com.owncloud.android.domain.authentication.usecases.LoginBasicAsyncUseCase
import com.owncloud.android.domain.authentication.usecases.LoginOAuthAsyncUseCase
import com.owncloud.android.domain.authentication.usecases.SupportsOAuth2UseCase
import com.owncloud.android.domain.availableoffline.usecases.GetFilesAvailableOfflineFromAccountAsStreamUseCase
import com.owncloud.android.domain.availableoffline.usecases.GetFilesAvailableOfflineFromAccountUseCase
import com.owncloud.android.domain.availableoffline.usecases.GetFilesAvailableOfflineFromEveryAccountUseCase
import com.owncloud.android.domain.availableoffline.usecases.SetFilesAsAvailableOfflineUseCase
Expand All @@ -45,13 +46,14 @@ import com.owncloud.android.domain.capabilities.usecases.GetStoredCapabilitiesUs
import com.owncloud.android.domain.capabilities.usecases.RefreshCapabilitiesFromServerAsyncUseCase
import com.owncloud.android.domain.files.usecases.CopyFileUseCase
import com.owncloud.android.domain.files.usecases.CreateFolderAsyncUseCase
import com.owncloud.android.domain.files.usecases.DisableThumbnailsForFileUseCase
import com.owncloud.android.domain.files.usecases.GetFileByIdUseCase
import com.owncloud.android.domain.files.usecases.GetFileByRemotePathUseCase
import com.owncloud.android.domain.files.usecases.GetFilesSharedByLinkUseCase
import com.owncloud.android.domain.files.usecases.GetFolderContentAsLiveDataUseCase
import com.owncloud.android.domain.files.usecases.GetFolderContentAsStreamUseCase
import com.owncloud.android.domain.files.usecases.GetFolderContentUseCase
import com.owncloud.android.domain.files.usecases.GetFolderImagesUseCase
import com.owncloud.android.domain.files.usecases.GetSearchFolderContentUseCase
import com.owncloud.android.domain.files.usecases.GetSharedByLinkForAccountAsStreamUseCase
import com.owncloud.android.domain.files.usecases.MoveFileUseCase
import com.owncloud.android.domain.files.usecases.RemoveFileUseCase
import com.owncloud.android.domain.files.usecases.RenameFileUseCase
Expand Down Expand Up @@ -118,20 +120,22 @@ val useCaseModule = module {
factory { GetFileByIdUseCase(get()) }
factory { GetFileByRemotePathUseCase(get()) }
factory { GetFolderContentUseCase(get()) }
factory { GetFolderContentAsLiveDataUseCase(get()) }
factory { GetFolderContentAsStreamUseCase(get()) }
factory { GetFolderImagesUseCase(get()) }
factory { MoveFileUseCase(get()) }
factory { RemoveFileUseCase(get()) }
factory { RenameFileUseCase(get()) }
factory { SaveFileOrFolderUseCase(get()) }
factory { GetFilesSharedByLinkUseCase(get()) }
factory { GetSharedByLinkForAccountAsStreamUseCase(get()) }
factory { GetSearchFolderContentUseCase(get()) }
factory { SynchronizeFileUseCase(get(), get(), get(), get()) }
factory { SynchronizeFolderUseCase(get(), get()) }
factory { DisableThumbnailsForFileUseCase(get()) }
factory { SortFilesUseCase() }

// Av Offline
factory { GetFilesAvailableOfflineFromAccountUseCase(get()) }
factory { GetFilesAvailableOfflineFromAccountAsStreamUseCase(get()) }
factory { GetFilesAvailableOfflineFromEveryAccountUseCase(get()) }
factory { SetFilesAsAvailableOfflineUseCase(get()) }
factory { UnsetFilesAsAvailableOfflineUseCase(get()) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
package com.owncloud.android.dependecyinjection

import com.owncloud.android.MainApp
import com.owncloud.android.domain.files.model.OCFile
import com.owncloud.android.presentation.ui.files.filelist.MainFileListViewModel
import com.owncloud.android.presentation.ui.files.operations.FileOperationsViewModel
import com.owncloud.android.presentation.ui.security.passcode.PasscodeAction
Expand Down Expand Up @@ -87,7 +88,6 @@ val viewModelModule = module {
viewModel { PreviewImageViewModel(get(), get(), get()) }
viewModel { FileDetailsViewModel(get(), get(), get(), get(), get()) }
viewModel { FileOperationsViewModel(get(), get(), get(), get(), get(), get(), get(), get(), get(), get()) }
viewModel { MainFileListViewModel(get(), get(), get(), get(), get(), get(), get(), get(), get(), get()) }
viewModel { (accountName: String, initialFolderToDisplay: OCFile) -> MainFileListViewModel(get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), accountName, initialFolderToDisplay) }
viewModel { TransfersViewModel(get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get()) }

}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,13 @@ import android.content.Context
import android.content.DialogInterface
import android.view.inputmethod.InputMethodManager
import androidx.fragment.app.Fragment
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import com.google.android.material.snackbar.Snackbar
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch

fun Fragment.showErrorInSnackbar(genericErrorMessageId: Int, throwable: Throwable?) =
throwable?.let {
Expand Down Expand Up @@ -66,4 +72,16 @@ fun Fragment.hideSoftKeyboard() {
0
)
}
}
}

fun <T> Fragment.collectLatestLifecycleFlow(
flow: Flow<T>,
lifecycleState: Lifecycle.State = Lifecycle.State.STARTED,
collect: suspend (T) -> Unit
) {
lifecycleScope.launch {
repeatOnLifecycle(lifecycleState) {
flow.collectLatest(collect)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ import com.owncloud.android.databinding.GridItemBinding
import com.owncloud.android.databinding.ItemFileListBinding
import com.owncloud.android.databinding.ListFooterBinding
import com.owncloud.android.datamodel.ThumbnailsCacheManager
import com.owncloud.android.domain.files.model.FileListOption
import com.owncloud.android.domain.files.model.OCFile
import com.owncloud.android.domain.files.model.OCFooterFile
import com.owncloud.android.presentation.diffutils.FileListDiffCallback
Expand All @@ -55,20 +56,27 @@ class FileListAdapter(

var files = mutableListOf<Any>()
private var account: Account? = AccountUtils.getCurrentOwnCloudAccount(context)
private var fileListOption: FileListOption = FileListOption.ALL_FILES

fun updateFileList(filesToAdd: List<OCFile>) {
fun updateFileList(filesToAdd: List<OCFile>, fileListOption: FileListOption) {
val listWithFooter = mutableListOf<Any>()
listWithFooter.addAll(filesToAdd)

if (listWithFooter.isNotEmpty()) {
listWithFooter.add(OCFooterFile(manageListOfFilesAndGenerateText(filesToAdd)))
}

val diffUtilCallback = FileListDiffCallback(oldList = files, newList = listWithFooter)
val diffUtilCallback = FileListDiffCallback(
oldList = files,
newList = listWithFooter,
oldFileListOption = this.fileListOption,
newFileListOption = fileListOption,
)
val diffResult = DiffUtil.calculateDiff(diffUtilCallback)

files.clear()
files.addAll(listWithFooter)
this.fileListOption = fileListOption

diffResult.dispatchUpdatesTo(this)
}
Expand Down Expand Up @@ -185,6 +193,10 @@ class FileListAdapter(
it.Filename.text = file.fileName
it.fileListSize.text = DisplayUtils.bytesToHumanReadable(file.length, context)
it.fileListLastMod.text = DisplayUtils.getRelativeTimestamp(context, file.modificationTimestamp)
it.fileListPath.apply {
text = file.remotePath
isVisible = !fileListOption.isAllFiles()
}
}
}
ViewType.GRID_ITEM.ordinal -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,16 @@
package com.owncloud.android.presentation.diffutils

import androidx.recyclerview.widget.DiffUtil
import com.owncloud.android.domain.files.model.FileListOption
import com.owncloud.android.domain.files.model.OCFile
import com.owncloud.android.domain.files.model.OCFooterFile

class FileListDiffCallback(private val oldList: List<Any>, private val newList: List<Any>) : DiffUtil.Callback() {
class FileListDiffCallback(
private val oldList: List<Any>,
private val newList: List<Any>,
private val oldFileListOption: FileListOption,
private val newFileListOption: FileListOption,
) : DiffUtil.Callback() {

override fun getOldListSize(): Int = oldList.size

Expand Down Expand Up @@ -54,5 +60,5 @@ class FileListDiffCallback(private val oldList: List<Any>, private val newList:
}

override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean =
oldList[oldItemPosition] == newList[newItemPosition]
oldList[oldItemPosition] == newList[newItemPosition] && oldFileListOption == newFileListOption
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,11 @@ import android.view.LayoutInflater
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.ContextCompat
import com.owncloud.android.R
import com.owncloud.android.data.preferences.datasources.SharedPreferencesProvider
import com.owncloud.android.data.preferences.datasources.implementation.SharedPreferencesProviderImpl
import com.owncloud.android.databinding.SortOptionsLayoutBinding
import com.owncloud.android.db.PreferenceManager
import com.owncloud.android.presentation.ui.files.SortOrder.Companion.fromPreference
import com.owncloud.android.presentation.ui.files.SortType.Companion.fromPreference
import com.owncloud.android.utils.FileStorageUtils
import com.owncloud.android.presentation.ui.files.SortOrder.Companion.PREF_FILE_LIST_SORT_ORDER
import com.owncloud.android.presentation.ui.files.SortType.Companion.PREF_FILE_LIST_SORT_TYPE

class SortOptionsView @JvmOverloads constructor(
context: Context,
Expand Down Expand Up @@ -70,12 +70,11 @@ class SortOptionsView @JvmOverloads constructor(
init {
_binding = SortOptionsLayoutBinding.inflate(LayoutInflater.from(context), this, true)

// Select sort type and order according to preference.
val sortBy = PreferenceManager.getSortOrder(getContext(), FileStorageUtils.FILE_DISPLAY_SORT)
sortTypeSelected = fromPreference(sortBy)
val sharedPreferencesProvider: SharedPreferencesProvider = SharedPreferencesProviderImpl(context)

val isAscending = PreferenceManager.getSortAscending(getContext(), FileStorageUtils.FILE_DISPLAY_SORT)
sortOrderSelected = fromPreference(isAscending)
// Select sort type and order according to preferences.
sortTypeSelected = SortType.values()[sharedPreferencesProvider.getInt(PREF_FILE_LIST_SORT_TYPE, SortType.SORT_TYPE_BY_NAME.ordinal)]
sortOrderSelected = SortOrder.values()[sharedPreferencesProvider.getInt(PREF_FILE_LIST_SORT_ORDER, SortOrder.SORT_ORDER_ASCENDING.ordinal)]

binding.sortTypeSelector.setOnClickListener {
onSortOptionsListener?.onSortTypeListener(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ enum class SortType : Parcelable {
}

companion object {
const val PREF_FILE_LIST_SORT_TYPE = "PREF_FILE_LIST_SORT_TYPE"

fun fromPreference(value: Int): SortType =
when (value) {
FileStorageUtils.SORT_NAME -> SORT_TYPE_BY_NAME
Expand Down Expand Up @@ -66,6 +68,8 @@ enum class SortOrder : Parcelable {
}

companion object {
const val PREF_FILE_LIST_SORT_ORDER = "PREF_FILE_LIST_SORT_ORDER"

fun fromPreference(isAscending: Boolean) =
if (isAscending) {
SORT_ORDER_ASCENDING
Expand Down
Loading

0 comments on commit cfdafcc

Please sign in to comment.