Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[New arch] Fix bottom navigation shortcuts #3719

Merged
merged 16 commits into from
Aug 18, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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