Skip to content

Commit c530e22

Browse files
Merge pull request nextcloud#13501 from nextcloud/feature/offline-file-creation
Feature - Offline File Creation
2 parents 693314a + c5c7e9f commit c530e22

43 files changed

Lines changed: 2036 additions & 303 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

app/schemas/com.nextcloud.client.database.NextcloudDatabase/85.json

Lines changed: 1301 additions & 0 deletions
Large diffs are not rendered by default.

app/src/androidTest/java/com/owncloud/android/AbstractIT.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -377,8 +377,8 @@ public void uploadFile(File file, String remotePath) {
377377
public void uploadOCUpload(OCUpload ocUpload) {
378378
ConnectivityService connectivityServiceMock = new ConnectivityService() {
379379
@Override
380-
public boolean isNetworkAndServerAvailable() throws NetworkOnMainThreadException {
381-
return false;
380+
public void isNetworkAndServerAvailable(@NonNull GenericCallback<Boolean> callback) {
381+
382382
}
383383

384384
@Override

app/src/androidTest/java/com/owncloud/android/AbstractOnServerIT.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,8 +189,8 @@ public void uploadOCUpload(OCUpload ocUpload) {
189189
public void uploadOCUpload(OCUpload ocUpload, int localBehaviour) {
190190
ConnectivityService connectivityServiceMock = new ConnectivityService() {
191191
@Override
192-
public boolean isNetworkAndServerAvailable() throws NetworkOnMainThreadException {
193-
return false;
192+
public void isNetworkAndServerAvailable(@NonNull GenericCallback<Boolean> callback) {
193+
194194
}
195195

196196
@Override

app/src/androidTest/java/com/owncloud/android/UploadIT.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ public class UploadIT extends AbstractOnServerIT {
5959

6060
private ConnectivityService connectivityServiceMock = new ConnectivityService() {
6161
@Override
62-
public boolean isNetworkAndServerAvailable() throws NetworkOnMainThreadException {
63-
return false;
62+
public void isNetworkAndServerAvailable(@NonNull GenericCallback<Boolean> callback) {
63+
6464
}
6565

6666
@Override
@@ -282,8 +282,8 @@ public BatteryStatus getBattery() {
282282
public void testUploadOnWifiOnlyButNoWifi() {
283283
ConnectivityService connectivityServiceMock = new ConnectivityService() {
284284
@Override
285-
public boolean isNetworkAndServerAvailable() throws NetworkOnMainThreadException {
286-
return false;
285+
public void isNetworkAndServerAvailable(@NonNull GenericCallback<Boolean> callback) {
286+
287287
}
288288

289289
@Override
@@ -371,8 +371,8 @@ public void testUploadOnWifiOnlyAndWifi() {
371371
public void testUploadOnWifiOnlyButMeteredWifi() {
372372
ConnectivityService connectivityServiceMock = new ConnectivityService() {
373373
@Override
374-
public boolean isNetworkAndServerAvailable() throws NetworkOnMainThreadException {
375-
return false;
374+
public void isNetworkAndServerAvailable(@NonNull GenericCallback<Boolean> callback) {
375+
376376
}
377377

378378
@Override

app/src/androidTest/java/com/owncloud/android/files/services/FileUploaderIT.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,7 @@ abstract class FileUploaderIT : AbstractOnServerIT() {
3434
private var uploadsStorageManager: UploadsStorageManager? = null
3535

3636
private val connectivityServiceMock: ConnectivityService = object : ConnectivityService {
37-
override fun isNetworkAndServerAvailable(): Boolean {
38-
return false
39-
}
37+
override fun isNetworkAndServerAvailable(callback: ConnectivityService.GenericCallback<Boolean>) = Unit
4038

4139
override fun isConnected(): Boolean {
4240
return false

app/src/androidTest/java/com/owncloud/android/ui/dialog/SyncFileNotEnoughSpaceDialogFragmentTest.java

Lines changed: 0 additions & 59 deletions
This file was deleted.
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
/*
2+
* Nextcloud - Android Client
3+
*
4+
* SPDX-FileCopyrightText: 2024 Alper Ozturk <alper.ozturk@nextcloud.com>
5+
* SPDX-License-Identifier: AGPL-3.0-or-later
6+
*/
7+
package com.owncloud.android.ui.dialog
8+
9+
import androidx.annotation.UiThread
10+
import androidx.test.core.app.launchActivity
11+
import androidx.test.espresso.Espresso.onView
12+
import androidx.test.espresso.IdlingRegistry
13+
import androidx.test.espresso.assertion.ViewAssertions.matches
14+
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
15+
import androidx.test.espresso.matcher.ViewMatchers.isRoot
16+
import com.owncloud.android.AbstractIT
17+
import com.owncloud.android.datamodel.OCFile
18+
import com.owncloud.android.ui.activity.FileDisplayActivity
19+
import com.owncloud.android.ui.dialog.SyncFileNotEnoughSpaceDialogFragment.Companion.newInstance
20+
import com.owncloud.android.utils.EspressoIdlingResource
21+
import com.owncloud.android.utils.ScreenshotTest
22+
import org.junit.After
23+
import org.junit.Before
24+
import org.junit.Test
25+
26+
class SyncFileNotEnoughSpaceDialogFragmentTest : AbstractIT() {
27+
private val testClassName = "com.owncloud.android.ui.dialog.SyncFileNotEnoughSpaceDialogFragmentTest"
28+
29+
@Before
30+
fun registerIdlingResource() {
31+
IdlingRegistry.getInstance().register(EspressoIdlingResource.countingIdlingResource)
32+
}
33+
34+
@After
35+
fun unregisterIdlingResource() {
36+
IdlingRegistry.getInstance().unregister(EspressoIdlingResource.countingIdlingResource)
37+
}
38+
39+
@Test
40+
@ScreenshotTest
41+
@UiThread
42+
fun showNotEnoughSpaceDialogForFolder() {
43+
launchActivity<FileDisplayActivity>().use { scenario ->
44+
scenario.onActivity { sut ->
45+
val ocFile = OCFile("/Document/").apply {
46+
fileLength = 5000000
47+
setFolder()
48+
}
49+
50+
onIdleSync {
51+
EspressoIdlingResource.increment()
52+
newInstance(ocFile, 1000).apply {
53+
show(sut.supportFragmentManager, "1")
54+
}
55+
EspressoIdlingResource.decrement()
56+
57+
val screenShotName = createName(testClassName + "_" + "showNotEnoughSpaceDialogForFolder", "")
58+
onView(isRoot()).check(matches(isDisplayed()))
59+
screenshotViaName(sut, screenShotName)
60+
}
61+
}
62+
}
63+
}
64+
65+
@Test
66+
@ScreenshotTest
67+
@UiThread
68+
fun showNotEnoughSpaceDialogForFile() {
69+
launchActivity<FileDisplayActivity>().use { scenario ->
70+
scenario.onActivity { sut ->
71+
val ocFile = OCFile("/Video.mp4").apply {
72+
fileLength = 1000000
73+
}
74+
75+
onIdleSync {
76+
EspressoIdlingResource.increment()
77+
newInstance(ocFile, 2000).apply {
78+
show(sut.supportFragmentManager, "2")
79+
}
80+
EspressoIdlingResource.decrement()
81+
82+
val screenShotName = createName(testClassName + "_" + "showNotEnoughSpaceDialogForFile", "")
83+
onView(isRoot()).check(matches(isDisplayed()))
84+
screenshotViaName(sut, screenShotName)
85+
}
86+
}
87+
}
88+
}
89+
}

app/src/debug/java/com/nextcloud/test/TestActivity.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ class TestActivity :
4242
private lateinit var binding: TestLayoutBinding
4343

4444
val connectivityServiceMock: ConnectivityService = object : ConnectivityService {
45+
override fun isNetworkAndServerAvailable(callback: ConnectivityService.GenericCallback<Boolean>) = Unit
46+
4547
override fun isConnected(): Boolean {
4648
return false
4749
}
@@ -53,10 +55,6 @@ class TestActivity :
5355
override fun getConnectivity(): Connectivity {
5456
return Connectivity.CONNECTED_WIFI
5557
}
56-
57-
override fun isNetworkAndServerAvailable(): Boolean {
58-
return false
59-
}
6058
}
6159

6260
override fun onCreate(savedInstanceState: Bundle?) {

app/src/main/java/com/nextcloud/client/database/NextcloudDatabase.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import androidx.room.AutoMigration
1212
import androidx.room.Database
1313
import androidx.room.Room
1414
import androidx.room.RoomDatabase
15+
import androidx.room.TypeConverters
1516
import com.nextcloud.client.core.Clock
1617
import com.nextcloud.client.core.ClockImpl
1718
import com.nextcloud.client.database.dao.ArbitraryDataDao
@@ -31,6 +32,7 @@ import com.nextcloud.client.database.migrations.DatabaseMigrationUtil
3132
import com.nextcloud.client.database.migrations.Migration67to68
3233
import com.nextcloud.client.database.migrations.RoomMigration
3334
import com.nextcloud.client.database.migrations.addLegacyMigrations
35+
import com.nextcloud.client.database.typeConverter.OfflineOperationTypeConverter
3436
import com.owncloud.android.db.ProviderMeta
3537

3638
@Database(
@@ -65,11 +67,13 @@ import com.owncloud.android.db.ProviderMeta
6567
AutoMigration(from = 80, to = 81),
6668
AutoMigration(from = 81, to = 82),
6769
AutoMigration(from = 82, to = 83),
68-
AutoMigration(from = 83, to = 84)
70+
AutoMigration(from = 83, to = 84),
71+
AutoMigration(from = 84, to = 85, spec = DatabaseMigrationUtil.DeleteColumnSpec::class)
6972
],
7073
exportSchema = true
7174
)
7275
@Suppress("Detekt.UnnecessaryAbstractClass") // needed by Room
76+
@TypeConverters(OfflineOperationTypeConverter::class)
7377
abstract class NextcloudDatabase : RoomDatabase() {
7478

7579
abstract fun arbitraryDataDao(): ArbitraryDataDao
@@ -93,6 +97,7 @@ abstract class NextcloudDatabase : RoomDatabase() {
9397
instance = Room
9498
.databaseBuilder(context, NextcloudDatabase::class.java, ProviderMeta.DB_NAME)
9599
.allowMainThreadQueries()
100+
.addTypeConverter(OfflineOperationTypeConverter())
96101
.addLegacyMigrations(clock, context)
97102
.addMigrations(RoomMigration())
98103
.addMigrations(Migration67to68())

app/src/main/java/com/nextcloud/client/database/dao/OfflineOperationDao.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ package com.nextcloud.client.database.dao
1010
import androidx.room.Dao
1111
import androidx.room.Delete
1212
import androidx.room.Insert
13+
import androidx.room.OnConflictStrategy
1314
import androidx.room.Query
1415
import androidx.room.Update
1516
import com.nextcloud.client.database.entity.OfflineOperationEntity
@@ -19,7 +20,7 @@ interface OfflineOperationDao {
1920
@Query("SELECT * FROM offline_operations")
2021
fun getAll(): List<OfflineOperationEntity>
2122

22-
@Insert
23+
@Insert(onConflict = OnConflictStrategy.REPLACE)
2324
fun insert(vararg entity: OfflineOperationEntity)
2425

2526
@Update
@@ -35,5 +36,8 @@ interface OfflineOperationDao {
3536
fun getByPath(path: String): OfflineOperationEntity?
3637

3738
@Query("SELECT * FROM offline_operations WHERE offline_operations_parent_oc_file_id = :parentOCFileId")
38-
fun getSubDirectoriesByParentOCFileId(parentOCFileId: Long): List<OfflineOperationEntity>
39+
fun getSubEntitiesByParentOCFileId(parentOCFileId: Long): List<OfflineOperationEntity>
40+
41+
@Query("DELETE FROM offline_operations")
42+
fun clearTable()
3943
}

0 commit comments

Comments
 (0)