Skip to content

Commit 2dd3cc2

Browse files
- Solving bugs when getting the file.
- Navigating to the correct file.
1 parent 6d0805d commit 2dd3cc2

File tree

6 files changed

+104
-57
lines changed

6 files changed

+104
-57
lines changed

owncloudApp/src/main/java/com/owncloud/android/extensions/ActivityExt.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ import androidx.appcompat.app.AppCompatActivity
3737
import androidx.core.content.FileProvider
3838
import androidx.fragment.app.DialogFragment
3939
import androidx.fragment.app.FragmentActivity
40+
import androidx.lifecycle.Lifecycle
41+
import androidx.lifecycle.lifecycleScope
42+
import androidx.lifecycle.repeatOnLifecycle
4043
import com.google.android.material.snackbar.Snackbar
4144
import com.owncloud.android.R
4245
import com.owncloud.android.data.providers.implementation.OCSharedPreferencesProvider
@@ -61,6 +64,9 @@ import com.owncloud.android.ui.dialog.ShareLinkToDialog
6164
import com.owncloud.android.utils.CONFIGURATION_DEVICE_PROTECTION
6265
import com.owncloud.android.utils.MimetypeIconUtil
6366
import com.owncloud.android.utils.UriUtilsKt.getExposedFileUriForOCFile
67+
import kotlinx.coroutines.flow.Flow
68+
import kotlinx.coroutines.flow.collectLatest
69+
import kotlinx.coroutines.launch
6470
import org.koin.android.ext.android.inject
6571
import timber.log.Timber
6672
import java.io.File
@@ -437,3 +443,15 @@ fun Activity.openOCFile(ocFile: OCFile) {
437443
showErrorInSnackbar(genericErrorMessageId = R.string.file_list_no_app_for_file_type, anfe)
438444
}
439445
}
446+
447+
fun <T> FragmentActivity.collectLatestLifecycleFlow(
448+
flow: Flow<T>,
449+
lifecycleState: Lifecycle.State = Lifecycle.State.STARTED,
450+
collect: suspend (T) -> Unit
451+
) {
452+
lifecycleScope.launch {
453+
repeatOnLifecycle(lifecycleState) {
454+
flow.collectLatest(collect)
455+
}
456+
}
457+
}

owncloudApp/src/main/java/com/owncloud/android/presentation/files/filelist/MainFileListFragment.kt

Lines changed: 0 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,10 @@ import com.google.android.material.bottomsheet.BottomSheetDialog
5656
import com.google.android.material.snackbar.Snackbar
5757
import com.google.android.material.textfield.TextInputEditText
5858
import com.google.android.material.textfield.TextInputLayout
59-
import com.owncloud.android.MainApp
6059
import com.owncloud.android.R
6160
import com.owncloud.android.databinding.MainFileListFragmentBinding
6261
import com.owncloud.android.datamodel.ThumbnailsCacheManager
6362
import com.owncloud.android.domain.appregistry.model.AppRegistryMimeType
64-
import com.owncloud.android.domain.exceptions.DeepLinkException
65-
import com.owncloud.android.domain.exceptions.FileNotFoundException
6663
import com.owncloud.android.domain.exceptions.InstanceNotConfiguredException
6764
import com.owncloud.android.domain.exceptions.TooEarlyException
6865
import com.owncloud.android.domain.files.model.FileListOption
@@ -623,38 +620,11 @@ class MainFileListFragment : Fragment(),
623620
}
624621
}
625622

626-
observeDeepLink()
627-
628623
/* TransfersViewModel observables */
629624
observeTransfers()
630625

631626
}
632627

633-
private fun observeDeepLink() {
634-
collectLatestLifecycleFlow(fileOperationsViewModel.deepLinkFlow) {
635-
val uiResult = it?.peekContent()
636-
if (uiResult is UIResult.Error) {
637-
if (uiResult.error is FileNotFoundException) {
638-
showMessageInSnackbar("User haven't access to file")
639-
changeUser()
640-
}
641-
showMessageInSnackbar(
642-
getString(
643-
if (uiResult.error is DeepLinkException) {
644-
R.string.invalid_deep_link_format
645-
} else {
646-
R.string.default_error_msg
647-
}
648-
)
649-
)
650-
} else if (uiResult is UIResult.Success) {
651-
//TODO "Remove this message when end with managing the deep links"
652-
activity?.intent?.data = null
653-
showMessageInSnackbar("Deep link managed correctly")
654-
}
655-
}
656-
}
657-
658628
private fun observeTransfers() {
659629
val maxUploadsToRefresh = resources.getInteger(R.integer.max_uploads_to_refresh)
660630
collectLatestLifecycleFlow(transfersViewModel.transfersWithSpaceStateFlow) { transfers ->
@@ -697,26 +667,6 @@ class MainFileListFragment : Fragment(),
697667

698668
}
699669

700-
private fun changeUser() {
701-
val currentUser = AccountUtils.getCurrentOwnCloudAccount(context)
702-
val usersChecked = activity?.intent?.getStringArrayListExtra(FileDisplayActivity.KEY_DEEP_LINK_ACCOUNTS_CHECKED) ?: arrayListOf()
703-
usersChecked.add(currentUser.name)
704-
AccountUtils.getAccounts(context).forEach {
705-
if (!usersChecked.contains(it.name)) {
706-
MainApp.initDependencyInjection()
707-
val i = Intent(
708-
activity,
709-
FileDisplayActivity::class.java
710-
)
711-
i.data = activity?.intent?.data
712-
i.putExtra(FileActivity.EXTRA_ACCOUNT, it)
713-
i.putExtra(FileDisplayActivity.KEY_DEEP_LINK_ACCOUNTS_CHECKED, usersChecked)
714-
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
715-
startActivity(i)
716-
}
717-
}
718-
}
719-
720670
fun navigateToFolderId(folderId: Long) {
721671
mainFileListViewModel.navigateToFolderId(folderId)
722672
}

owncloudApp/src/main/java/com/owncloud/android/presentation/files/operations/FileOperationsViewModel.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,7 @@ class FileOperationsViewModel(
314314
fun handleDeepLink(uri: Uri, currentAccount: Account) {
315315
runUseCaseWithResult(
316316
coroutineDispatcher = coroutinesDispatcherProvider.io,
317+
showLoading = true,
317318
flow = _deepLinkFlow,
318319
useCase = manageDeepLinkUseCase,
319320
useCaseParams = ManageDeepLinkUseCase.Params(URI(uri.toString()), currentAccount.name),

owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ import com.owncloud.android.data.providers.SharedPreferencesProvider
5656
import com.owncloud.android.databinding.ActivityMainBinding
5757
import com.owncloud.android.domain.camerauploads.model.UploadBehavior
5858
import com.owncloud.android.domain.capabilities.model.OCCapability
59+
import com.owncloud.android.domain.exceptions.DeepLinkException
60+
import com.owncloud.android.domain.exceptions.FileNotFoundException
5961
import com.owncloud.android.domain.exceptions.SSLRecoverablePeerUnverifiedException
6062
import com.owncloud.android.domain.exceptions.UnauthorizedException
6163
import com.owncloud.android.domain.files.model.FileListOption
@@ -64,6 +66,7 @@ import com.owncloud.android.domain.files.model.OCFile.Companion.ROOT_PARENT_ID
6466
import com.owncloud.android.domain.spaces.model.OCSpace
6567
import com.owncloud.android.domain.utils.Event
6668
import com.owncloud.android.extensions.checkPasscodeEnforced
69+
import com.owncloud.android.extensions.collectLatestLifecycleFlow
6770
import com.owncloud.android.extensions.isDownloadPending
6871
import com.owncloud.android.extensions.manageOptionLockSelected
6972
import com.owncloud.android.extensions.observeWorkerTillItFinishes
@@ -188,6 +191,7 @@ class FileDisplayActivity : FileActivity(),
188191
localBroadcastManager = LocalBroadcastManager.getInstance(this)
189192

190193
handleDeepLink()
194+
onDeeplLinkManaged()
191195

192196
/// Load of saved instance state
193197
if (savedInstanceState != null) {
@@ -1773,6 +1777,74 @@ class FileDisplayActivity : FileActivity(),
17731777
}
17741778
}
17751779

1780+
private fun onDeeplLinkManaged() {
1781+
collectLatestLifecycleFlow(fileOperationsViewModel.deepLinkFlow) {
1782+
it?.getContentIfNotHandled()?.let { uiResult ->
1783+
when (uiResult) {
1784+
is UIResult.Error -> {
1785+
dismissLoadingDialog()
1786+
if (uiResult.error is FileNotFoundException) {
1787+
showMessageInSnackbar(message = getString(R.string.deep_link_user_no_access))
1788+
changeUser()
1789+
}
1790+
showMessageInSnackbar(
1791+
message =
1792+
getString(
1793+
if (uiResult.error is DeepLinkException) {
1794+
R.string.invalid_deep_link_format
1795+
} else {
1796+
R.string.default_error_msg
1797+
}
1798+
)
1799+
)
1800+
}
1801+
1802+
is UIResult.Success -> {
1803+
intent?.data = null
1804+
dismissLoadingDialog()
1805+
uiResult.data?.let { it1 -> manageItem(it1) }
1806+
}
1807+
1808+
is UIResult.Loading -> {
1809+
showLoadingDialog(R.string.deep_link_loading)
1810+
}
1811+
}
1812+
}
1813+
}
1814+
}
1815+
1816+
private fun changeUser() {
1817+
val currentUser = getCurrentOwnCloudAccount(this)
1818+
val usersChecked = intent?.getStringArrayListExtra(KEY_DEEP_LINK_ACCOUNTS_CHECKED) ?: arrayListOf()
1819+
usersChecked.add(currentUser.name)
1820+
com.owncloud.android.presentation.authentication.AccountUtils.getAccounts(this).forEach {
1821+
if (!usersChecked.contains(it.name)) {
1822+
MainApp.initDependencyInjection()
1823+
val i = Intent(
1824+
this,
1825+
FileDisplayActivity::class.java
1826+
)
1827+
i.data = intent?.data
1828+
i.putExtra(EXTRA_ACCOUNT, it)
1829+
i.putExtra(KEY_DEEP_LINK_ACCOUNTS_CHECKED, usersChecked)
1830+
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
1831+
startActivity(i)
1832+
}
1833+
}
1834+
}
1835+
1836+
private fun manageItem(file: OCFile) {
1837+
setFile(file)
1838+
account = com.owncloud.android.presentation.authentication.AccountUtils.getOwnCloudAccountByName(this, file.owner)
1839+
1840+
if (file.isFolder) {
1841+
refreshListOfFilesFragment()
1842+
} else {
1843+
initFragmentsWithFile()
1844+
onFileClicked(file)
1845+
}
1846+
}
1847+
17761848
companion object {
17771849
private const val TAG_LIST_OF_FILES = "LIST_OF_FILES"
17781850
private const val TAG_LIST_OF_SPACES = "LIST_OF_SPACES"

owncloudApp/src/main/res/values/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -753,6 +753,8 @@
753753

754754
<!-- DeepLinks -->
755755
<string name="invalid_deep_link_format">Invalid link format</string>
756+
<string name="deep_link_user_no_access">User haven\'t access to file</string>
757+
<string name="deep_link_loading">Opening file from link</string>
756758

757759
<string name="fab_refresh_text">New content</string>
758760
<string name="fab_refresh_sync_in_progress">Synchronization already in progress</string>

owncloudData/src/main/java/com/owncloud/android/data/files/repository/OCFileRepository.kt

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -535,20 +535,24 @@ class OCFileRepository(
535535
val spaceId = if (!isOcis) null else fileId.split("!")[0]
536536
val splitPath = result.split(PATH_SEPARATOR)
537537
var containerFolder = listOf<OCFile>()
538-
for (i in 1..splitPath.size - 2) {
538+
for (i in 0..splitPath.size - 2) {
539539
var path = splitPath[0]
540540
for (j in 1..i) {
541541
path += "$PATH_SEPARATOR${splitPath[j]}"
542542
}
543543
containerFolder = refreshFolder(path, accountName, spaceId)
544544
}
545545
refreshFolder(result, accountName, spaceId)
546-
return containerFolder.find { file ->
547-
if (file.isFolder) {
548-
file.remotePath.dropLast(1)
549-
} else {
550-
file.remotePath
551-
} == result
546+
return if (result == ROOT_PATH) {
547+
getFileByRemotePath(result, accountName, spaceId)
548+
} else {
549+
containerFolder.find { file ->
550+
if (file.isFolder) {
551+
file.remotePath.dropLast(1)
552+
} else {
553+
file.remotePath
554+
} == result
555+
}
552556
}
553557
}
554558

0 commit comments

Comments
 (0)