Skip to content

Commit 8f42be4

Browse files
Merge pull request nextcloud#13408 from nextcloud/feature/offline-create-folder-operation
Feature - Create Folder When Device Don't Have Internet Connection
2 parents 3f2c517 + b02e46a commit 8f42be4

116 files changed

Lines changed: 3355 additions & 488 deletions

File tree

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/84.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: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import android.content.res.Resources;
1818
import android.os.Build;
1919
import android.os.Bundle;
20+
import android.os.NetworkOnMainThreadException;
2021
import android.text.TextUtils;
2122
import android.view.View;
2223

@@ -375,6 +376,11 @@ public void uploadFile(File file, String remotePath) {
375376

376377
public void uploadOCUpload(OCUpload ocUpload) {
377378
ConnectivityService connectivityServiceMock = new ConnectivityService() {
379+
@Override
380+
public boolean isNetworkAndServerAvailable() throws NetworkOnMainThreadException {
381+
return false;
382+
}
383+
378384
@Override
379385
public boolean isConnected() {
380386
return false;

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import android.content.ActivityNotFoundException;
1414
import android.net.Uri;
1515
import android.os.Bundle;
16+
import android.os.NetworkOnMainThreadException;
1617

1718
import com.nextcloud.client.account.User;
1819
import com.nextcloud.client.account.UserAccountManager;
@@ -187,6 +188,11 @@ public void uploadOCUpload(OCUpload ocUpload) {
187188

188189
public void uploadOCUpload(OCUpload ocUpload, int localBehaviour) {
189190
ConnectivityService connectivityServiceMock = new ConnectivityService() {
191+
@Override
192+
public boolean isNetworkAndServerAvailable() throws NetworkOnMainThreadException {
193+
return false;
194+
}
195+
190196
@Override
191197
public boolean isConnected() {
192198
return false;

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
*/
99
package com.owncloud.android;
1010

11+
import android.os.NetworkOnMainThreadException;
12+
1113
import com.nextcloud.client.account.UserAccountManagerImpl;
1214
import com.nextcloud.client.device.BatteryStatus;
1315
import com.nextcloud.client.device.PowerManagementService;
@@ -56,6 +58,11 @@ public class UploadIT extends AbstractOnServerIT {
5658
targetContext.getContentResolver());
5759

5860
private ConnectivityService connectivityServiceMock = new ConnectivityService() {
61+
@Override
62+
public boolean isNetworkAndServerAvailable() throws NetworkOnMainThreadException {
63+
return false;
64+
}
65+
5966
@Override
6067
public boolean isConnected() {
6168
return false;
@@ -274,6 +281,11 @@ public BatteryStatus getBattery() {
274281
@Test
275282
public void testUploadOnWifiOnlyButNoWifi() {
276283
ConnectivityService connectivityServiceMock = new ConnectivityService() {
284+
@Override
285+
public boolean isNetworkAndServerAvailable() throws NetworkOnMainThreadException {
286+
return false;
287+
}
288+
277289
@Override
278290
public boolean isConnected() {
279291
return false;
@@ -358,6 +370,11 @@ public void testUploadOnWifiOnlyAndWifi() {
358370
@Test
359371
public void testUploadOnWifiOnlyButMeteredWifi() {
360372
ConnectivityService connectivityServiceMock = new ConnectivityService() {
373+
@Override
374+
public boolean isNetworkAndServerAvailable() throws NetworkOnMainThreadException {
375+
return false;
376+
}
377+
361378
@Override
362379
public boolean isConnected() {
363380
return false;

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ 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+
}
40+
3741
override fun isConnected(): Boolean {
3842
return false
3943
}

app/src/androidTest/java/com/owncloud/android/ui/activity/ConflictsResolveActivityIT.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ public void screenshotTextFiles() {
6262

6363
ConflictsResolveActivity sut = activityRule.launchActivity(intent);
6464

65-
ConflictsResolveDialog dialog = ConflictsResolveDialog.newInstance(existingFile,
65+
ConflictsResolveDialog dialog = ConflictsResolveDialog.newInstance(targetContext,
66+
existingFile,
6667
newFile,
6768
UserAccountManagerImpl
6869
.fromContext(targetContext)
@@ -209,7 +210,7 @@ public void keepExisting() {
209210

210211
getInstrumentation().waitForIdleSync();
211212

212-
onView(withId(R.id.existing_checkbox)).perform(click());
213+
onView(withId(R.id.right_checkbox)).perform(click());
213214

214215
DialogFragment dialog = (DialogFragment) sut.getSupportFragmentManager().findFragmentByTag("conflictDialog");
215216
screenshot(Objects.requireNonNull(dialog.requireDialog().getWindow()).getDecorView());
@@ -255,7 +256,7 @@ public void keepNew() {
255256

256257
getInstrumentation().waitForIdleSync();
257258

258-
onView(withId(R.id.new_checkbox)).perform(click());
259+
onView(withId(R.id.left_checkbox)).perform(click());
259260

260261
DialogFragment dialog = (DialogFragment) sut.getSupportFragmentManager().findFragmentByTag("conflictDialog");
261262
screenshot(Objects.requireNonNull(dialog.requireDialog().getWindow()).getDecorView());
@@ -300,8 +301,8 @@ public void keepBoth() {
300301

301302
getInstrumentation().waitForIdleSync();
302303

303-
onView(withId(R.id.existing_checkbox)).perform(click());
304-
onView(withId(R.id.new_checkbox)).perform(click());
304+
onView(withId(R.id.right_checkbox)).perform(click());
305+
onView(withId(R.id.left_checkbox)).perform(click());
305306

306307
DialogFragment dialog = (DialogFragment) sut.getSupportFragmentManager().findFragmentByTag("conflictDialog");
307308
screenshot(Objects.requireNonNull(dialog.requireDialog().getWindow()).getDecorView());

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ class TestActivity :
5353
override fun getConnectivity(): Connectivity {
5454
return Connectivity.CONNECTED_WIFI
5555
}
56+
57+
override fun isNetworkAndServerAvailable(): Boolean {
58+
return false
59+
}
5660
}
5761

5862
override fun onCreate(savedInstanceState: Bundle?) {

app/src/main/AndroidManifest.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,9 @@
266266
</intent-filter>
267267
</activity>
268268

269+
<receiver
270+
android:name="com.nextcloud.receiver.OfflineOperationActionReceiver"
271+
android:exported="false" />
269272
<receiver
270273
android:name="com.nextcloud.client.jobs.MediaFoldersDetectionWork$NotificationReceiver"
271274
android:exported="false" />

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import android.content.Context
1111
import com.nextcloud.client.core.Clock
1212
import com.nextcloud.client.database.dao.ArbitraryDataDao
1313
import com.nextcloud.client.database.dao.FileDao
14+
import com.nextcloud.client.database.dao.OfflineOperationDao
1415
import dagger.Module
1516
import dagger.Provides
1617
import javax.inject.Singleton
@@ -33,4 +34,9 @@ class DatabaseModule {
3334
fun fileDao(nextcloudDatabase: NextcloudDatabase): FileDao {
3435
return nextcloudDatabase.fileDao()
3536
}
37+
38+
@Provides
39+
fun offlineOperationsDao(nextcloudDatabase: NextcloudDatabase): OfflineOperationDao {
40+
return nextcloudDatabase.offlineOperationDao()
41+
}
3642
}

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@ import com.nextcloud.client.core.Clock
1616
import com.nextcloud.client.core.ClockImpl
1717
import com.nextcloud.client.database.dao.ArbitraryDataDao
1818
import com.nextcloud.client.database.dao.FileDao
19+
import com.nextcloud.client.database.dao.OfflineOperationDao
1920
import com.nextcloud.client.database.entity.ArbitraryDataEntity
2021
import com.nextcloud.client.database.entity.CapabilityEntity
2122
import com.nextcloud.client.database.entity.ExternalLinkEntity
2223
import com.nextcloud.client.database.entity.FileEntity
2324
import com.nextcloud.client.database.entity.FilesystemEntity
25+
import com.nextcloud.client.database.entity.OfflineOperationEntity
2426
import com.nextcloud.client.database.entity.ShareEntity
2527
import com.nextcloud.client.database.entity.SyncedFolderEntity
2628
import com.nextcloud.client.database.entity.UploadEntity
@@ -41,7 +43,8 @@ import com.owncloud.android.db.ProviderMeta
4143
ShareEntity::class,
4244
SyncedFolderEntity::class,
4345
UploadEntity::class,
44-
VirtualEntity::class
46+
VirtualEntity::class,
47+
OfflineOperationEntity::class
4548
],
4649
version = ProviderMeta.DB_VERSION,
4750
autoMigrations = [
@@ -61,7 +64,8 @@ import com.owncloud.android.db.ProviderMeta
6164
AutoMigration(from = 79, to = 80),
6265
AutoMigration(from = 80, to = 81),
6366
AutoMigration(from = 81, to = 82),
64-
AutoMigration(from = 82, to = 83)
67+
AutoMigration(from = 82, to = 83),
68+
AutoMigration(from = 83, to = 84)
6569
],
6670
exportSchema = true
6771
)
@@ -70,6 +74,7 @@ abstract class NextcloudDatabase : RoomDatabase() {
7074

7175
abstract fun arbitraryDataDao(): ArbitraryDataDao
7276
abstract fun fileDao(): FileDao
77+
abstract fun offlineOperationDao(): OfflineOperationDao
7378

7479
companion object {
7580
const val FIRST_ROOM_DB_VERSION = 65

0 commit comments

Comments
 (0)