From a3cb17a8299528c6b9cbd5f34199fb634a86860e Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Fri, 24 Jul 2020 13:12:31 +0200 Subject: [PATCH] add TestActivity to launch fragments in it fix wrong class cast exception message Signed-off-by: tobiasKaminsky --- ...tStaticServerIT_showDetails_Activities.png | Bin 0 -> 9182 bytes ...mentStaticServerIT_showDetails_Sharing.png | Bin 0 -> 14702 bytes ...verIT_showFileDetailActivitiesFragment.png | Bin 0 -> 4918 bytes ...ServerIT_showFileDetailSharingFragment.png | Bin 0 -> 10454 bytes ...leListFragmentStaticServerIT_showFiles.png | Bin 0 -> 9786 bytes ...ListFragmentStaticServerIT_showOneFile.png | Bin 0 -> 3794 bytes scripts/androidScreenshotTest | 8 +- .../FileDetailFragmentStaticServerIT.kt | 78 +++++++++++ .../OCFileListFragmentStaticServerIT.kt | 79 +++++++++++ src/debug/AndroidManifest.xml | 5 +- .../client/di/BuildTypeComponentsModule.java | 37 +++++ .../kotlin/com/nextcloud/TestActivity.kt | 128 ++++++++++++++++++ .../com/nextcloud/client/di/AppModule.java | 2 +- .../nextcloud/client/di/ComponentsModule.java | 6 +- .../datamodel/FileDataStorageManager.java | 1 + .../owncloud/android/datamodel/OCFile.java | 7 + .../datamodel/ThumbnailsCacheManager.java | 4 +- .../ui/adapter/FileDetailTabAdapter.java | 7 +- .../FileDetailActivitiesFragment.java | 4 +- .../ui/fragment/FileDetailFragment.java | 13 +- .../ui/fragment/OCFileListFragment.java | 35 +++-- src/main/res/layout/file_details_fragment.xml | 21 ++- src/main/res/layout/test_layout.xml | 27 ++++ .../client/di/BuildTypeComponentsModule.java | 32 +++++ 24 files changed, 442 insertions(+), 52 deletions(-) create mode 100644 screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetails_Activities.png create mode 100644 screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetails_Sharing.png create mode 100644 screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailActivitiesFragment.png create mode 100644 screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showFileDetailSharingFragment.png create mode 100644 screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showFiles.png create mode 100644 screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showOneFile.png create mode 100644 src/androidTest/java/com/owncloud/android/ui/fragment/FileDetailFragmentStaticServerIT.kt create mode 100644 src/androidTest/java/com/owncloud/android/ui/fragment/OCFileListFragmentStaticServerIT.kt create mode 100644 src/debug/java/com/nextcloud/client/di/BuildTypeComponentsModule.java create mode 100644 src/debug/kotlin/com/nextcloud/TestActivity.kt create mode 100755 src/main/res/layout/test_layout.xml create mode 100644 src/release/java/com/nextcloud/client/di/BuildTypeComponentsModule.java diff --git a/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetails_Activities.png b/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetails_Activities.png new file mode 100644 index 0000000000000000000000000000000000000000..a95c5c6de1c02d656b372e5c101369882ead9976 GIT binary patch literal 9182 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�~ zJJ9<&xt${3aBoV#WFrju$yw>-_S@duE;`g87sx;jq*M2dSu2L0HB-~!5ewL1&pK9) z33A)R7C)P!+{6J$4j@)66Wa@h~2n0IHZmUf`{yGPD6G*p;7PlCmA z`+L0;TgjQ#+vGaOT^A8y#4Rz6UFZcPBpGjYVq(6!AotEk^bAR*NLQ9sR7xsTdf)0B zitY;ST9!zqNqrg>&w&rRw2(H+KLDQhcTUyQyb6K@4Qt?hCN}cYS-v* zBTSC=bxy6-1;ty0RRC7$ARo#Gg;y4uqRjs6mU zW-gd7?p|^J063fa{dg+jaW*aD?J#_kNDPEU`T43c?6jZ95-E-n9l=yvBO0t7m*SUM z&8Ov*h{Z*}efgfwY^KMWzd{iGUFVe`-GkTv`xxx^b-|g}H^*N8JpLEQV88wT&zJZs zFZn;6*ZnmQ`i&X>{oC^=XOn-;yZ*My-%m*Y)Qa2N>m#rvLv$BB^}eM8-dl|F~V>c++1RDSy1ne}GZGdAH9V;?2c4 XJM|WK*%t7>9mt7eHb+YjpO5`7toPJ8 literal 0 HcmV?d00001 diff --git a/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetails_Sharing.png b/screenshots/gplay/debug/com.owncloud.android.ui.fragment.FileDetailFragmentStaticServerIT_showDetails_Sharing.png new file mode 100644 index 0000000000000000000000000000000000000000..555209fd7077a27cff0dc7399ba2714caf7a752a GIT binary patch literal 14702 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 F{2%J9-8cXM literal 0 HcmV?d00001 diff --git a/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showFiles.png b/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showFiles.png new file mode 100644 index 0000000000000000000000000000000000000000..554aa789400808f3f2d549024e25a0fed7688e56 GIT binary patch literal 9786 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 literal 0 HcmV?d00001 diff --git a/scripts/androidScreenshotTest b/scripts/androidScreenshotTest index af75e64abc..f91b8e1cd6 100755 --- a/scripts/androidScreenshotTest +++ b/scripts/androidScreenshotTest @@ -10,10 +10,6 @@ if [ $# -lt 2 ]; then exit fi -sed -i s'#false#true#'g src/main/res/values/setup.xml - -emulator -writable-system -avd uiComparison -no-snapshot -gpu swiftshader_indirect -no-audio -skin 500x833 & - cd src/androidTest/java class=$(find | grep $2 | grep -E "java$|kt$" | head -n1|sed s'/\//\./'g | sed s'#^\.\.##' | sed s'#\.java##'| sed s'#\.kt##') @@ -49,6 +45,10 @@ else darkMode="-Pandroid.testInstrumentationRunnerArguments.DARKMODE=$4" fi +sed -i s'#false#true#'g src/main/res/values/setup.xml + +emulator -writable-system -avd uiComparison -no-snapshot -gpu swiftshader_indirect -no-audio -skin 500x833 & + if [ -e $5 ] ; then color="" else diff --git a/src/androidTest/java/com/owncloud/android/ui/fragment/FileDetailFragmentStaticServerIT.kt b/src/androidTest/java/com/owncloud/android/ui/fragment/FileDetailFragmentStaticServerIT.kt new file mode 100644 index 0000000000..c77d5c049e --- /dev/null +++ b/src/androidTest/java/com/owncloud/android/ui/fragment/FileDetailFragmentStaticServerIT.kt @@ -0,0 +1,78 @@ +/* + * + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2020 Tobias Kaminsky + * Copyright (C) 2020 Nextcloud GmbH + * Copyright (C) 2020 Chris Narkiewicz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package com.owncloud.android.ui.fragment + +import androidx.test.espresso.intent.rule.IntentsTestRule +import com.nextcloud.client.TestActivity +import com.owncloud.android.AbstractIT +import com.owncloud.android.datamodel.OCFile +import com.owncloud.android.utils.ScreenshotTest +import org.junit.Rule +import org.junit.Test + +class FileDetailFragmentStaticServerIT : AbstractIT() { + @get:Rule + val testActivityRule = IntentsTestRule(TestActivity::class.java, true, false) + + val file = OCFile("/", "00000001") + + @Test + @ScreenshotTest + fun showFileDetailActivitiesFragment() { + val sut = testActivityRule.launchActivity(null) + sut.addFragment(FileDetailActivitiesFragment.newInstance(file, user)) + + waitForIdleSync() + screenshot(sut) + } + + @Test + @ScreenshotTest + fun showFileDetailSharingFragment() { + val sut = testActivityRule.launchActivity(null) + sut.addFragment(FileDetailSharingFragment.newInstance(file, user)) + + waitForIdleSync() + screenshot(sut) + } + + @Test + @ScreenshotTest + fun showDetails_Activities() { + val sut = testActivityRule.launchActivity(null) + sut.addFragment(FileDetailFragment.newInstance(file, user, 0)) + + waitForIdleSync() + screenshot(sut) + } + + @Test + @ScreenshotTest + fun showDetails_Sharing() { + val sut = testActivityRule.launchActivity(null) + sut.addFragment(FileDetailFragment.newInstance(file, user, 1)) + + waitForIdleSync() + screenshot(sut) + } +} diff --git a/src/androidTest/java/com/owncloud/android/ui/fragment/OCFileListFragmentStaticServerIT.kt b/src/androidTest/java/com/owncloud/android/ui/fragment/OCFileListFragmentStaticServerIT.kt new file mode 100644 index 0000000000..7d60ab21c8 --- /dev/null +++ b/src/androidTest/java/com/owncloud/android/ui/fragment/OCFileListFragmentStaticServerIT.kt @@ -0,0 +1,79 @@ +/* + * + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2020 Tobias Kaminsky + * Copyright (C) 2020 Nextcloud GmbH + * Copyright (C) 2020 Chris Narkiewicz + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package com.owncloud.android.ui.fragment + +import android.Manifest +import androidx.test.espresso.intent.rule.IntentsTestRule +import androidx.test.rule.GrantPermissionRule +import com.facebook.testing.screenshot.Screenshot +import com.nextcloud.client.TestActivity +import com.owncloud.android.AbstractIT +import com.owncloud.android.datamodel.OCFile +import com.owncloud.android.utils.ScreenshotTest +import org.junit.Rule +import org.junit.Test + +class OCFileListFragmentStaticServerIT : AbstractIT() { + @get:Rule + val testActivityRule = IntentsTestRule(TestActivity::class.java, true, false) + + @get:Rule + val permissionRule = GrantPermissionRule.grant(Manifest.permission.WRITE_EXTERNAL_STORAGE) + + @Test + @ScreenshotTest + fun showFiles() { + val sut = testActivityRule.launchActivity(null) + + val textFile = OCFile("/1.md", "00000001") + textFile.mimeType = "text/markdown" + textFile.fileLength = 1024000 + textFile.modificationTimestamp = 1188206955000 + textFile.parentId = sut.storageManager.getFileByEncryptedRemotePath("/").fileId + sut.storageManager.saveFile(textFile) + + val imageFile = OCFile("/image.png", "00000002") + imageFile.mimeType = "image/png" + imageFile.isPreviewAvailable = true + imageFile.fileLength = 3072000 + imageFile.modificationTimestamp = 746443755000 + imageFile.parentId = sut.storageManager.getFileByEncryptedRemotePath("/").fileId + sut.storageManager.saveFile(imageFile) + + sut.addFragment(OCFileListFragment()) + + val fragment = (sut.fragment as OCFileListFragment) + val root = sut.storageManager.getFileByEncryptedRemotePath("/") + + shortSleep() + + sut.runOnUiThread { fragment.listDirectory(root, false, false) } + + waitForIdleSync() + shortSleep() + shortSleep() + shortSleep() + + Screenshot.snapActivity(sut).record() + } +} diff --git a/src/debug/AndroidManifest.xml b/src/debug/AndroidManifest.xml index f921e3b3c0..fca5cd37f9 100644 --- a/src/debug/AndroidManifest.xml +++ b/src/debug/AndroidManifest.xml @@ -14,5 +14,8 @@ + tools:ignore="GoogleAppIndexingWarning"> + + + diff --git a/src/debug/java/com/nextcloud/client/di/BuildTypeComponentsModule.java b/src/debug/java/com/nextcloud/client/di/BuildTypeComponentsModule.java new file mode 100644 index 0000000000..fa36307174 --- /dev/null +++ b/src/debug/java/com/nextcloud/client/di/BuildTypeComponentsModule.java @@ -0,0 +1,37 @@ +/* + * + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2020 Tobias Kaminsky + * Copyright (C) 2020 Nextcloud GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.nextcloud.client.di; + +import com.nextcloud.client.TestActivity; + +import dagger.Module; +import dagger.android.ContributesAndroidInjector; + +/** + * Register classes that require dependency injection. This class is used by Dagger compiler only. + */ +@Module +abstract class BuildTypeComponentsModule { + @ContributesAndroidInjector + abstract TestActivity testActivity(); +} diff --git a/src/debug/kotlin/com/nextcloud/TestActivity.kt b/src/debug/kotlin/com/nextcloud/TestActivity.kt new file mode 100644 index 0000000000..60bb1534fa --- /dev/null +++ b/src/debug/kotlin/com/nextcloud/TestActivity.kt @@ -0,0 +1,128 @@ +/* + * + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2020 Tobias Kaminsky + * Copyright (C) 2020 Nextcloud GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.nextcloud.client + +import android.os.Bundle +import androidx.fragment.app.Fragment +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout +import com.nextcloud.client.network.Connectivity +import com.nextcloud.client.network.ConnectivityService +import com.owncloud.android.R +import com.owncloud.android.datamodel.FileDataStorageManager +import com.owncloud.android.datamodel.OCFile +import com.owncloud.android.files.services.FileDownloader +import com.owncloud.android.files.services.FileUploader +import com.owncloud.android.services.OperationsService +import com.owncloud.android.ui.activity.FileActivity +import com.owncloud.android.ui.activity.OnEnforceableRefreshListener +import com.owncloud.android.ui.fragment.FileFragment +import com.owncloud.android.ui.helpers.FileOperationsHelper + +class TestActivity : + FileActivity(), + FileFragment.ContainerActivity, + SwipeRefreshLayout.OnRefreshListener, + OnEnforceableRefreshListener { + lateinit var fragment: Fragment + private lateinit var storage: FileDataStorageManager + private lateinit var fileOperation: FileOperationsHelper + + private val connectivityServiceMock: ConnectivityService = object : ConnectivityService { + override fun isInternetWalled(): Boolean { + return false + } + + override fun getConnectivity(): Connectivity { + return Connectivity.CONNECTED_WIFI + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + setContentView(R.layout.test_layout) + } + + fun addFragment(fragment: Fragment) { + this.fragment = fragment + val transaction = supportFragmentManager.beginTransaction() + transaction.replace(R.id.root, fragment) + transaction.commit() + } + + override fun onBrowsedDownTo(folder: OCFile?) { + TODO("Not yet implemented") + } + + override fun getOperationsServiceBinder(): OperationsService.OperationsServiceBinder? { + return null + } + + override fun showSortListGroup(show: Boolean) { + TODO("Not yet implemented") + } + + override fun showDetails(file: OCFile?) { + TODO("Not yet implemented") + } + + override fun showDetails(file: OCFile?, activeTab: Int) { + TODO("Not yet implemented") + } + + override fun getFileUploaderBinder(): FileUploader.FileUploaderBinder? { + return null + } + + override fun getFileDownloaderBinder(): FileDownloader.FileDownloaderBinder? { + return null + } + + override fun getStorageManager(): FileDataStorageManager { + if (!this::storage.isInitialized) { + storage = FileDataStorageManager(account, contentResolver) + } + + return storage + } + + override fun getFileOperationsHelper(): FileOperationsHelper { + if (!this::fileOperation.isInitialized) { + fileOperation = FileOperationsHelper(this, userAccountManager, connectivityServiceMock) + } + + return fileOperation + } + + override fun onTransferStateChanged(file: OCFile?, downloading: Boolean, uploading: Boolean) { + TODO("Not yet implemented") + } + + override fun onRefresh(enforced: Boolean) { + TODO("Not yet implemented") + } + + override fun onRefresh() { + TODO("Not yet implemented") + } +} diff --git a/src/main/java/com/nextcloud/client/di/AppModule.java b/src/main/java/com/nextcloud/client/di/AppModule.java index 2280e890c5..5d81b6a940 100644 --- a/src/main/java/com/nextcloud/client/di/AppModule.java +++ b/src/main/java/com/nextcloud/client/di/AppModule.java @@ -71,7 +71,7 @@ import javax.inject.Singleton; import dagger.Module; import dagger.Provides; -@Module(includes = {ComponentsModule.class, VariantComponentsModule.class}) +@Module(includes = {ComponentsModule.class, VariantComponentsModule.class, BuildTypeComponentsModule.class}) class AppModule { @Provides diff --git a/src/main/java/com/nextcloud/client/di/ComponentsModule.java b/src/main/java/com/nextcloud/client/di/ComponentsModule.java index 969453ff95..ee9c77e389 100644 --- a/src/main/java/com/nextcloud/client/di/ComponentsModule.java +++ b/src/main/java/com/nextcloud/client/di/ComponentsModule.java @@ -21,8 +21,8 @@ package com.nextcloud.client.di; import com.nextcloud.client.etm.EtmActivity; -import com.nextcloud.client.jobs.NotificationWork; import com.nextcloud.client.files.downloader.DownloaderService; +import com.nextcloud.client.jobs.NotificationWork; import com.nextcloud.client.logger.ui.LogsActivity; import com.nextcloud.client.media.PlayerService; import com.nextcloud.client.onboarding.FirstRunActivity; @@ -169,5 +169,7 @@ abstract class ComponentsModule { @ContributesAndroidInjector abstract AccountManagerService accountManagerService(); @ContributesAndroidInjector abstract OperationsService operationsService(); @ContributesAndroidInjector abstract PlayerService playerService(); - @ContributesAndroidInjector abstract DownloaderService fileDownloaderService(); + + @ContributesAndroidInjector + abstract DownloaderService fileDownloaderService(); } diff --git a/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.java b/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.java index 128a047a45..5d73e2ebb2 100644 --- a/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.java +++ b/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.java @@ -242,6 +242,7 @@ public class FileDataStorageManager { cv.put(ProviderTableMeta.FILE_NOTE, ocFile.getNote()); cv.put(ProviderTableMeta.FILE_SHAREES, new Gson().toJson(ocFile.getSharees())); cv.put(ProviderTableMeta.FILE_RICH_WORKSPACE, ocFile.getRichWorkspace()); + cv.put(ProviderTableMeta.FILE_HAS_PREVIEW, ocFile.isPreviewAvailable() ? 1 : 0); boolean sameRemotePath = fileExists(ocFile.getRemotePath()); if (sameRemotePath || diff --git a/src/main/java/com/owncloud/android/datamodel/OCFile.java b/src/main/java/com/owncloud/android/datamodel/OCFile.java index 569f8d775c..4548282bbc 100644 --- a/src/main/java/com/owncloud/android/datamodel/OCFile.java +++ b/src/main/java/com/owncloud/android/datamodel/OCFile.java @@ -41,6 +41,7 @@ import java.io.File; import java.util.List; import androidx.annotation.NonNull; +import androidx.annotation.VisibleForTesting; import androidx.core.content.FileProvider; import third_parties.daveKoeller.AlphanumComparator; @@ -121,6 +122,12 @@ public class OCFile implements Parcelable, Comparable, ServerFileInterfa remotePath = path; } + @VisibleForTesting + public OCFile(String path, String remoteId) { + this(path); + setRemoteId(remoteId); + } + /** * Reconstruct from parcel * diff --git a/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java b/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java index 02641a98ba..f0bfc13bf7 100644 --- a/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java +++ b/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java @@ -83,6 +83,8 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; * Manager for concurrent access to thumbnails cache. */ public final class ThumbnailsCacheManager { + private static final int READ_TIMEOUT = 40000; + private static final int CONNECTION_TIMEOUT = 5000; public static final String PREFIX_RESIZED_IMAGE = "r"; public static final String PREFIX_THUMBNAIL = "t"; @@ -632,7 +634,7 @@ public final class ThumbnailsCacheManager { getMethod.setRequestHeader(RemoteOperation.OCS_API_HEADER, RemoteOperation.OCS_API_HEADER_VALUE); - int status = mClient.executeMethod(getMethod); + int status = mClient.executeMethod(getMethod, READ_TIMEOUT, CONNECTION_TIMEOUT); if (status == HttpStatus.SC_OK) { InputStream inputStream = getMethod.getResponseBodyAsStream(); Bitmap bitmap = BitmapFactory.decodeStream(inputStream); diff --git a/src/main/java/com/owncloud/android/ui/adapter/FileDetailTabAdapter.java b/src/main/java/com/owncloud/android/ui/adapter/FileDetailTabAdapter.java index a4d8bdc649..abb3887f8e 100644 --- a/src/main/java/com/owncloud/android/ui/adapter/FileDetailTabAdapter.java +++ b/src/main/java/com/owncloud/android/ui/adapter/FileDetailTabAdapter.java @@ -20,13 +20,12 @@ package com.owncloud.android.ui.adapter; -import android.accounts.Account; - import com.nextcloud.client.account.User; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.ui.fragment.FileDetailActivitiesFragment; import com.owncloud.android.ui.fragment.FileDetailSharingFragment; +import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentStatePagerAdapter; @@ -47,17 +46,17 @@ public class FileDetailTabAdapter extends FragmentStatePagerAdapter { this.user = user; } + @NonNull @Override public Fragment getItem(int position) { switch (position) { case 0: + default: fileDetailActivitiesFragment = FileDetailActivitiesFragment.newInstance(file, user); return fileDetailActivitiesFragment; case 1: fileDetailSharingFragment = FileDetailSharingFragment.newInstance(file, user); return fileDetailSharingFragment; - default: - return null; } } diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java index 0c2ce19e7c..fd9bf241d7 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java @@ -23,7 +23,6 @@ package com.owncloud.android.ui.fragment; -import android.accounts.Account; import android.content.ContentResolver; import android.graphics.PorterDuff; import android.os.AsyncTask; @@ -340,7 +339,8 @@ public class FileDetailActivitiesFragment extends Fragment implements } Log_OC.d(TAG, "BEFORE getRemoteActivitiesOperation.execute"); - final RemoteOperationResult result = nextcloudClient.execute(getRemoteNotificationOperation); + RemoteOperationResult result = nextcloudClient.execute(getRemoteNotificationOperation); + result = new RemoteOperationResult(RemoteOperationResult.ResultCode.UNHANDLED_HTTP_CODE); ArrayList versions = null; if (restoreFileVersionSupported) { diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java index 59dac7d25e..56219f41e9 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java @@ -25,8 +25,6 @@ */ package com.owncloud.android.ui.fragment; -import android.accounts.Account; -import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.os.Bundle; @@ -225,11 +223,6 @@ public class FileDetailFragment extends FileFragment implements OnClickListener, return ((FileDetailTabAdapter) viewPager.getAdapter()).getFileDetailActivitiesFragment(); } - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - } - @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); @@ -396,7 +389,7 @@ public class FileDetailFragment extends FileFragment implements OnClickListener, } @Override - public void onPrepareOptionsMenu(Menu menu) { + public void onPrepareOptionsMenu(@NonNull Menu menu) { super.onPrepareOptionsMenu(menu); FileMenuFilter.hideAll(menu); @@ -528,8 +521,8 @@ public class FileDetailFragment extends FileFragment implements OnClickListener, * TODO Remove parameter when the transferring state of files is kept in database. * * @param transferring Flag signaling if the file should be considered as downloading or uploading, - * although {@link FileDownloaderBinder#isDownloading(Account, OCFile)} and - * {@link FileUploaderBinder#isUploading(Account, OCFile)} return false. + * although {@link FileDownloaderBinder#isDownloading(User, OCFile)} and + * {@link FileUploaderBinder#isUploading(User, OCFile)} return false. * @param refresh If 'true', try to refresh the whole file from the database */ public void updateFileDetails(boolean transferring, boolean refresh) { diff --git a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index 77b98d530d..c916c2503b 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -130,7 +130,6 @@ import androidx.fragment.app.FragmentActivity; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import static com.owncloud.android.datamodel.OCFile.ROOT_PATH; import static com.owncloud.android.utils.DisplayUtils.openSortingOrderDialogFragment; @@ -261,7 +260,7 @@ public class OCFileListFragment extends ExtendedListFragment implements } catch (ClassCastException e) { throw new IllegalArgumentException(context.toString() + " must implement " + - SwipeRefreshLayout.OnRefreshListener.class.getSimpleName(), e); + OnEnforceableRefreshListener.class.getSimpleName(), e); } } @@ -368,17 +367,21 @@ public class OCFileListFragment extends ExtendedListFragment implements } prepareCurrentSearch(searchEvent); - mSortButton.setOnClickListener(v -> openSortingOrderDialogFragment(requireFragmentManager(), - preferences.getSortOrderByFolder(mFile))); + if (mSortButton != null) { + mSortButton.setOnClickListener(v -> openSortingOrderDialogFragment(requireFragmentManager(), + preferences.getSortOrderByFolder(mFile))); + } - mSwitchGridViewButton.setOnClickListener(v -> { - if (isGridEnabled()) { - setListAsPreferred(); - } else { - setGridAsPreferred(); - } - setGridSwitchButton(); - }); + if (mSwitchGridViewButton != null) { + mSwitchGridViewButton.setOnClickListener(v -> { + if (isGridEnabled()) { + setListAsPreferred(); + } else { + setGridAsPreferred(); + } + setGridSwitchButton(); + }); + } setTitle(); @@ -1305,8 +1308,12 @@ public class OCFileListFragment extends ExtendedListFragment implements switchToListView(); } - mSortButton.setText(DisplayUtils.getSortOrderStringId(preferences.getSortOrderByFolder(mFile))); - setGridSwitchButton(); + if (mSortButton != null) { + mSortButton.setText(DisplayUtils.getSortOrderStringId(preferences.getSortOrderByFolder(mFile))); + } + if (mSwitchGridViewButton != null) { + setGridSwitchButton(); + } if (mHideFab) { setFabVisible(false); diff --git a/src/main/res/layout/file_details_fragment.xml b/src/main/res/layout/file_details_fragment.xml index bf3da5a80e..c050b04fb4 100644 --- a/src/main/res/layout/file_details_fragment.xml +++ b/src/main/res/layout/file_details_fragment.xml @@ -18,7 +18,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . --> - - - @@ -192,12 +187,12 @@ app:tabTextColor="@color/text_color" app:tabTextAppearance="@style/AppTabTextAppearance" /> - - + + - + diff --git a/src/main/res/layout/test_layout.xml b/src/main/res/layout/test_layout.xml new file mode 100755 index 0000000000..7e36af6c59 --- /dev/null +++ b/src/main/res/layout/test_layout.xml @@ -0,0 +1,27 @@ + + + + diff --git a/src/release/java/com/nextcloud/client/di/BuildTypeComponentsModule.java b/src/release/java/com/nextcloud/client/di/BuildTypeComponentsModule.java new file mode 100644 index 0000000000..023d519160 --- /dev/null +++ b/src/release/java/com/nextcloud/client/di/BuildTypeComponentsModule.java @@ -0,0 +1,32 @@ +/* + * + * Nextcloud Android client application + * + * @author Tobias Kaminsky + * Copyright (C) 2020 Tobias Kaminsky + * Copyright (C) 2020 Nextcloud GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.nextcloud.client.di; + +import dagger.Module; + +/** + * Register classes that require dependency injection. This class is used by Dagger compiler only. + */ +@Module +abstract class BuildTypeComponentsModule { +}