From 7eb0f66079e2fc91d948dec4d84eca5b689b3521 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Thu, 5 Mar 2020 12:14:49 +0100 Subject: [PATCH] Add circle support for searching / displaying Signed-off-by: tobiasKaminsky --- .drone.yml | 11 ++ build.gradle | 2 +- drawable_resources/circles.svg | 27 ++++ ...tFragmentIT_createAndShowShareToCircle.png | Bin 0 -> 13128 bytes ...stFragmentIT_createAndShowShareToGroup.png | Bin 0 -> 13499 bytes ...istFragmentIT_createAndShowShareToUser.png | Bin 0 -> 12361 bytes ...stFragmentIT_createAndShowShareViaLink.png | Bin 0 -> 12442 bytes scripts/updateScreenshots.sh | 23 +++- scripts/wait_for_server.sh | 7 +- .../client/FileDisplayActivityIT.java | 30 +++-- .../java/com/owncloud/android/AbstractIT.java | 6 + .../ui/fragment/OCFileListFragmentIT.kt | 118 +++++++++++++++++- .../datamodel/FileDataStorageManager.java | 19 +-- .../CreateShareWithShareeOperation.java | 10 +- .../providers/FileContentProvider.java | 1 + .../UsersAndGroupsSearchProvider.java | 11 +- .../android/ui/adapter/OCFileListAdapter.java | 17 ++- .../android/ui/adapter/ShareeListAdapter.java | 3 + src/main/res/drawable/ic_circles.xml | 25 ++++ 19 files changed, 276 insertions(+), 34 deletions(-) create mode 100644 drawable_resources/circles.svg create mode 100644 screenshots/com.owncloud.android.ui.fragment.OCFileListFragmentIT_createAndShowShareToCircle.png create mode 100644 screenshots/com.owncloud.android.ui.fragment.OCFileListFragmentIT_createAndShowShareToGroup.png create mode 100644 screenshots/com.owncloud.android.ui.fragment.OCFileListFragmentIT_createAndShowShareToUser.png create mode 100644 screenshots/com.owncloud.android.ui.fragment.OCFileListFragmentIT_createAndShowShareViaLink.png create mode 100644 src/main/res/drawable/ic_circles.xml diff --git a/.drone.yml b/.drone.yml index 93487bc80a..92ff9ebf24 100644 --- a/.drone.yml +++ b/.drone.yml @@ -1,4 +1,5 @@ kind: pipeline +type: docker name: generic steps: @@ -48,6 +49,7 @@ trigger: --- kind: pipeline +type: docker name: gplay steps: @@ -116,6 +118,13 @@ services: - su www-data -c "php /var/www/html/occ app:enable activity" - su www-data -c "git clone -b master https://github.com/nextcloud/text.git /var/www/html/apps/text/" - su www-data -c "php /var/www/html/occ app:enable text" + - su www-data -c "git clone -b master https://github.com/nextcloud/circles.git /var/www/html/apps/circles/" + - apt-get update; apt-get -y install composer + - su www-data -c "cd /var/www/html/apps/circles; composer install" + - su www-data -c "php /var/www/html/occ app:enable -f circles" + - su www-data -c "occ config:app:set circles --value 1 allow_non_ssl_links" + - su www-data -c "occ config:app:set circles --value 1 local_is_non_ssl" + - su www-data -c "php /var/www/html/occ circles:manage:create test public publicCircle - /usr/local/bin/run.sh trigger: @@ -126,6 +135,7 @@ trigger: - pull_request --- kind: pipeline +type: docker name: analysis steps: @@ -175,6 +185,7 @@ trigger: - pull_request --- kind: pipeline +type: docker name: qa steps: diff --git a/build.gradle b/build.gradle index 0b3bd8dff8..a51c57b231 100644 --- a/build.gradle +++ b/build.gradle @@ -63,7 +63,7 @@ ext { daggerVersion = "2.27" markwonVersion = "4.2.2" prismVersion = "2.0.0" - androidLibraryVersion = "master-SNAPSHOT" + androidLibraryVersion = "circle-SNAPSHOT" travisBuild = System.getenv("TRAVIS") == "true" diff --git a/drawable_resources/circles.svg b/drawable_resources/circles.svg new file mode 100644 index 0000000000..f908e89543 --- /dev/null +++ b/drawable_resources/circles.svg @@ -0,0 +1,27 @@ + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/screenshots/com.owncloud.android.ui.fragment.OCFileListFragmentIT_createAndShowShareToCircle.png b/screenshots/com.owncloud.android.ui.fragment.OCFileListFragmentIT_createAndShowShareToCircle.png new file mode 100644 index 0000000000000000000000000000000000000000..d846734141bbb0e7fde556425d061d5bc7bef33e GIT binary patch literal 13128 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 literal 0 HcmV?d00001 diff --git a/screenshots/com.owncloud.android.ui.fragment.OCFileListFragmentIT_createAndShowShareToGroup.png b/screenshots/com.owncloud.android.ui.fragment.OCFileListFragmentIT_createAndShowShareToGroup.png new file mode 100644 index 0000000000000000000000000000000000000000..efa4f3f131465eb1a9e99456b4ab4ede441929c8 GIT binary patch literal 13499 zcmd^mX;f3$+9npISf!$rA|O*)REdg^i%dcwh$xg&fQSgl5G5ia1`GiLWO4=>l2R0u zDJTWVEHZ>KQ87e82*^x;lmrMb1_FeRB5M@3i0j zzR!7b|Fnnew(s|RucD%|?c}e=�(u5UQxCI&Izr+}Z8%Td0bP<*k#)ozBLOaVNgZ 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 literal 0 HcmV?d00001 diff --git a/scripts/updateScreenshots.sh b/scripts/updateScreenshots.sh index a7f2ff81a2..ec14f59be2 100755 --- a/scripts/updateScreenshots.sh +++ b/scripts/updateScreenshots.sh @@ -11,11 +11,15 @@ if ( [[ ! $(emulator -list-avds | grep uiComparison -c) -eq 0 ]] ); then (sleep 5; echo "no") | avdmanager create avd -n uiComparison -c 100M -k "system-images;android-27;google_apis;x86" --abi "google_apis/x86" fi -emulator -avd uiComparison -no-snapshot -gpu swiftshader_indirect -no-window -no-audio -skin 500x833 1>/dev/null & +if [ $1 == "debug" ]; then + emulator -avd uiComparison -no-snapshot -gpu swiftshader_indirect -no-audio -skin 500x833 1>/dev/null & +else + emulator -avd uiComparison -no-snapshot -gpu swiftshader_indirect -no-window -no-audio -skin 500x833 1>/dev/null & +fi PID=$(echo $!) ## server -docker run --name=uiComparison nextcloudci/server:server-17 1>/dev/null & +docker run --name=uiComparison nextcloudci/server --entrypoint '/usr/local/bin/initnc.sh' 1>/dev/null & sleep 5 IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' uiComparison) @@ -24,13 +28,15 @@ if [[ $IP = "" ]]; then exit 1 fi +## wait for server to finish +scripts/wait_for_server.sh $IP + ## run on server cp gradle.properties gradle.properties_ sed -i s"/server/$IP/" gradle.properties scripts/wait_for_emulator.sh # setup test server -docker exec uiComparison /bin/sh -c "/usr/local/bin/initnc.sh" docker exec uiComparison /bin/sh -c "su www-data -c \"OC_PASS=user1 php /var/www/html/occ user:add --password-from-env --display-name='User One' user1\"" docker exec uiComparison /bin/sh -c "su www-data -c \"OC_PASS=user2 php /var/www/html/occ user:add --password-from-env --display-name='User Two' user2\"" docker exec uiComparison /bin/sh -c "su www-data -c \"OC_PASS=user3 php /var/www/html/occ user:add --password-from-env --display-name='User Three' user3\"" @@ -40,6 +46,13 @@ docker exec uiComparison /bin/sh -c "su www-data -c \"php /var/www/html/occ grou docker exec uiComparison /bin/sh -c "su www-data -c \"php /var/www/html/occ group:adduser users user2\"" docker exec uiComparison /bin/sh -c "su www-data -c \"git clone -b master https://github.com/nextcloud/text.git /var/www/html/apps/text/\"" docker exec uiComparison /bin/sh -c "su www-data -c \"php /var/www/html/occ app:enable text\"" +docker exec uiComparison /bin/sh -c "su www-data -c \"git clone -b master https://github.com/nextcloud/circles.git /var/www/html/apps/circles/\"" +docker exec uiComparison /bin/sh -c "apt-get update; apt-get -y install composer" +docker exec uiComparison /bin/sh -c "su www-data -c \"cd /var/www/html/apps/circles; composer install\"" +docker exec uiComparison /bin/sh -c "su www-data -c \"php /var/www/html/occ app:enable -f circles\"" +docker exec uiComparison /bin/sh -c "su www-data -c \"php /var/www/html/occ config:app:set circles --value 1 allow_non_ssl_links\"" +docker exec uiComparison /bin/sh -c "su www-data -c \"php /var/www/html/occ config:app:set circles --value 1 local_is_non_ssl\"" +docker exec uiComparison /bin/sh -c "su www-data -c \"php /var/www/html/occ circles:manage:create test public publicCircle\"" docker exec uiComparison /bin/sh -c "/usr/local/bin/run.sh" ## update/create all screenshots @@ -59,6 +72,10 @@ docker exec uiComparison /bin/sh -c "/usr/local/bin/run.sh" mv gradle.properties_ gradle.properties +if [ $1 == "debug" ]; then + exit +fi + # tidy up kill $PID docker stop uiComparison diff --git a/scripts/wait_for_server.sh b/scripts/wait_for_server.sh index 66b150045c..0157dc65cd 100755 --- a/scripts/wait_for_server.sh +++ b/scripts/wait_for_server.sh @@ -1,10 +1,12 @@ #!/usr/bin/env bash -counter=0 status="" +counter=0 +checkcounter=0 until [[ $status = "false" ]]; do status=$(curl 2>/dev/null "http://$1/status.php" | jq .maintenance) + echo "($checkcounter) $status" if [[ "$status" =~ "false" || "$status" = "" ]]; then let "counter += 1" @@ -14,5 +16,8 @@ until [[ $status = "false" ]]; do fi fi + let "checkcounter += 1" sleep 10 done + +echo "($checkcounter) Done" diff --git a/src/androidTest/java/com/nextcloud/client/FileDisplayActivityIT.java b/src/androidTest/java/com/nextcloud/client/FileDisplayActivityIT.java index 71ed3b6708..0b32f30889 100644 --- a/src/androidTest/java/com/nextcloud/client/FileDisplayActivityIT.java +++ b/src/androidTest/java/com/nextcloud/client/FileDisplayActivityIT.java @@ -29,10 +29,12 @@ import com.facebook.testing.screenshot.Screenshot; import com.owncloud.android.AbstractIT; import com.owncloud.android.R; import com.owncloud.android.datamodel.OCFile; +import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.resources.files.CreateFolderRemoteOperation; import com.owncloud.android.lib.resources.files.ExistenceCheckRemoteOperation; import com.owncloud.android.lib.resources.files.SearchRemoteOperation; import com.owncloud.android.lib.resources.shares.CreateShareRemoteOperation; +import com.owncloud.android.lib.resources.shares.GetShareesRemoteOperation; import com.owncloud.android.lib.resources.shares.OCShare; import com.owncloud.android.lib.resources.shares.ShareType; import com.owncloud.android.operations.CreateFolderOperation; @@ -40,6 +42,8 @@ import com.owncloud.android.ui.activity.FileDisplayActivity; import com.owncloud.android.ui.events.SearchEvent; import org.greenrobot.eventbus.EventBus; +import org.json.JSONException; +import org.json.JSONObject; import org.junit.Assert; import org.junit.Rule; import org.junit.Test; @@ -85,12 +89,13 @@ public class FileDisplayActivityIT extends AbstractIT { } @Test - public void showShares() { + public void showShares() throws JSONException { assertTrue(new ExistenceCheckRemoteOperation("/shareToAdmin/", true).execute(client).isSuccess()); assertTrue(new CreateFolderRemoteOperation("/shareToAdmin/", true).execute(client).isSuccess()); assertTrue(new CreateFolderRemoteOperation("/shareToGroup/", true).execute(client).isSuccess()); assertTrue(new CreateFolderRemoteOperation("/shareViaLink/", true).execute(client).isSuccess()); assertTrue(new CreateFolderRemoteOperation("/noShare/", true).execute(client).isSuccess()); + assertTrue(new CreateFolderRemoteOperation("/shareToCircle/", true).execute(client).isSuccess()); // share folder to user "admin" assertTrue(new CreateShareRemoteOperation("/shareToAdmin/", @@ -119,12 +124,27 @@ public class FileDisplayActivityIT extends AbstractIT { OCShare.DEFAULT_PERMISSION) .execute(client).isSuccess()); + // share folder to circle + // get share + RemoteOperationResult searchResult = new GetShareesRemoteOperation("publicCircle", 1, 50).execute(client); + assertTrue(searchResult.getLogMessage(), searchResult.isSuccess()); + + JSONObject resultJson = (JSONObject) searchResult.getData().get(0); + String circleId = resultJson.getJSONObject("value").getString("shareWith"); + + assertTrue(new CreateShareRemoteOperation("/shareToCircle/", + ShareType.CIRCLE, + circleId, + false, + "", + OCShare.DEFAULT_PERMISSION) + .execute(client).isSuccess()); + Activity sut = activityRule.launchActivity(null); getInstrumentation().waitForIdleSync(); - EventBus.getDefault().post(new SearchEvent("", - SearchRemoteOperation.SearchType.SHARED_FILTER)); + EventBus.getDefault().post(new SearchEvent("", SearchRemoteOperation.SearchType.SHARED_FILTER)); getInstrumentation().waitForIdleSync(); @@ -150,8 +170,6 @@ public class FileDisplayActivityIT extends AbstractIT { assertTrue(new CreateFolderOperation("/test/", true).execute(client, getStorageManager()).isSuccess()); // navigate into it - // sut.onActivity(activity -> activity.onBrowsedDownTo(getStorageManager().getFileByPath("/test/"))); - //sut.onBrowsedDownTo(getStorageManager().getFileByPath("/test/")); OCFile test = getStorageManager().getFileByPath("/test/"); sut.setFile(test); sut.startSyncFolderOperation(test, false); @@ -168,7 +186,5 @@ public class FileDisplayActivityIT extends AbstractIT { // then should be in root again Thread.sleep(2000); assertEquals(getStorageManager().getFileByPath("/"), sut.getCurrentDir()); - - } } diff --git a/src/androidTest/java/com/owncloud/android/AbstractIT.java b/src/androidTest/java/com/owncloud/android/AbstractIT.java index 5ddc81a410..75fea91b5e 100644 --- a/src/androidTest/java/com/owncloud/android/AbstractIT.java +++ b/src/androidTest/java/com/owncloud/android/AbstractIT.java @@ -97,6 +97,8 @@ public abstract class AbstractIT { createDummyFiles(); waitForServer(client, baseUrl); + + deleteAllFiles(); // makes sure that no file/folder is in root } catch (OperationCanceledException e) { e.printStackTrace(); } catch (AuthenticatorException e) { @@ -110,6 +112,10 @@ public abstract class AbstractIT { @After public void after() { + deleteAllFiles(); + } + + public static void deleteAllFiles() { RemoteOperationResult result = new ReadFolderRemoteOperation("/").execute(client); assertTrue(result.getLogMessage(), result.isSuccess()); diff --git a/src/androidTest/java/com/owncloud/android/ui/fragment/OCFileListFragmentIT.kt b/src/androidTest/java/com/owncloud/android/ui/fragment/OCFileListFragmentIT.kt index d46694e471..c572f449e0 100644 --- a/src/androidTest/java/com/owncloud/android/ui/fragment/OCFileListFragmentIT.kt +++ b/src/androidTest/java/com/owncloud/android/ui/fragment/OCFileListFragmentIT.kt @@ -23,8 +23,11 @@ package com.owncloud.android.ui.fragment import android.Manifest import androidx.test.core.app.ActivityScenario +import androidx.test.espresso.intent.rule.IntentsTestRule +import androidx.test.platform.app.InstrumentationRegistry import androidx.test.rule.GrantPermissionRule import com.evernote.android.job.JobRequest +import com.facebook.testing.screenshot.Screenshot import com.nextcloud.client.account.UserAccountManagerImpl import com.nextcloud.client.device.PowerManagementService import com.nextcloud.client.network.ConnectivityService @@ -36,16 +39,25 @@ import com.owncloud.android.MainApp import com.owncloud.android.datamodel.UploadsStorageManager import com.owncloud.android.db.OCUpload import com.owncloud.android.files.services.FileUploader +import com.owncloud.android.lib.resources.shares.CreateShareRemoteOperation +import com.owncloud.android.lib.resources.shares.GetShareesRemoteOperation +import com.owncloud.android.lib.resources.shares.OCShare +import com.owncloud.android.lib.resources.shares.ShareType import com.owncloud.android.operations.CreateFolderOperation import com.owncloud.android.operations.RefreshFolderOperation import com.owncloud.android.operations.UploadFileOperation import com.owncloud.android.ui.activity.FileDisplayActivity import com.owncloud.android.utils.FileStorageUtils -import junit.framework.Assert.assertTrue +import junit.framework.TestCase +import org.json.JSONObject +import org.junit.Assert.assertTrue import org.junit.Rule import org.junit.Test class OCFileListFragmentIT : AbstractIT() { + @get:Rule + val activityRule = IntentsTestRule(FileDisplayActivity::class.java, true, false) + @get:Rule val permissionRule = GrantPermissionRule.grant(Manifest.permission.WRITE_EXTERNAL_STORAGE) @@ -92,10 +104,9 @@ class OCFileListFragmentIT : AbstractIT() { FileUploader.LOCAL_BEHAVIOUR_COPY, targetContext, false, - false - ) - newUpload.addRenameUploadListener {} + false) + newUpload.addRenameUploadListener {} newUpload.setRemoteFolderToBeCreated() assertTrue(newUpload.execute(client, storageManager).isSuccess) @@ -114,7 +125,7 @@ class OCFileListFragmentIT : AbstractIT() { Thread.sleep(2000) sut.onActivity { activity -> - com.facebook.testing.screenshot.Screenshot.snapActivity(activity).setName("richworkspaces_light").record() + Screenshot.snapActivity(activity).setName("richworkspaces_light").record() } val preferences: AppPreferences = AppPreferencesImpl.fromContext(targetContext) @@ -130,7 +141,7 @@ class OCFileListFragmentIT : AbstractIT() { Thread.sleep(2000) sut.onActivity { activity -> - com.facebook.testing.screenshot.Screenshot.snapActivity(activity).setName("richworkspaces_dark").record() + Screenshot.snapActivity(activity).setName("richworkspaces_dark").record() } // switch back to light mode @@ -141,4 +152,99 @@ class OCFileListFragmentIT : AbstractIT() { sut.recreate() } + + @Test + fun createAndShowShareToUser() { + val path = "/shareToAdmin/" + TestCase.assertTrue(CreateFolderOperation(path, true).execute(client, storageManager).isSuccess) + + // share folder to user "admin" + TestCase.assertTrue(CreateShareRemoteOperation(path, + ShareType.USER, + "admin", + false, + "", + OCShare.MAXIMUM_PERMISSIONS_FOR_FOLDER) + .execute(client).isSuccess) + + val sut: FileDisplayActivity = activityRule.launchActivity(null) + sut.startSyncFolderOperation(storageManager.getFileByPath("/"), true) + + Thread.sleep(2000) + InstrumentationRegistry.getInstrumentation().waitForIdleSync() + Screenshot.snapActivity(sut).record() + } + + @Test + fun createAndShowShareToGroup() { + val path = "/shareToGroup/" + TestCase.assertTrue(CreateFolderOperation(path, true).execute(client, storageManager).isSuccess) + + // share folder to group + assertTrue(CreateShareRemoteOperation("/shareToGroup/", + ShareType.GROUP, + "users", + false, + "", + OCShare.DEFAULT_PERMISSION) + .execute(client).isSuccess) + + val sut: FileDisplayActivity = activityRule.launchActivity(null) + sut.startSyncFolderOperation(storageManager.getFileByPath("/"), true) + + Thread.sleep(2000) + InstrumentationRegistry.getInstrumentation().waitForIdleSync() + Screenshot.snapActivity(sut).record() + } + + @Test + fun createAndShowShareToCircle() { + val path = "/shareToCircle/" + TestCase.assertTrue(CreateFolderOperation(path, true).execute(client, storageManager).isSuccess) + + // share folder to circle + // get circleId + val searchResult = GetShareesRemoteOperation("publicCircle", 1, 50).execute(client) + assertTrue(searchResult.logMessage, searchResult.isSuccess) + + val resultJson: JSONObject = searchResult.data[0] as JSONObject + val circleId: String = resultJson.getJSONObject("value").getString("shareWith") + + assertTrue(CreateShareRemoteOperation("/shareToCircle/", + ShareType.CIRCLE, + circleId, + false, + "", + OCShare.DEFAULT_PERMISSION) + .execute(client).isSuccess) + + val sut: FileDisplayActivity = activityRule.launchActivity(null) + sut.startSyncFolderOperation(storageManager.getFileByPath("/"), true) + + Thread.sleep(2000) + InstrumentationRegistry.getInstrumentation().waitForIdleSync() + Screenshot.snapActivity(sut).record() + } + + @Test + fun createAndShowShareViaLink() { + val path = "/shareViaLink/" + TestCase.assertTrue(CreateFolderOperation(path, true).execute(client, storageManager).isSuccess) + + // share folder via public link + TestCase.assertTrue(CreateShareRemoteOperation("/shareViaLink/", + ShareType.PUBLIC_LINK, + "", + true, + "", + OCShare.READ_PERMISSION_FLAG) + .execute(client).isSuccess) + + val sut: FileDisplayActivity = activityRule.launchActivity(null) + sut.startSyncFolderOperation(storageManager.getFileByPath("/"), true) + + Thread.sleep(2000) + InstrumentationRegistry.getInstrumentation().waitForIdleSync() + Screenshot.snapActivity(sut).record() + } } diff --git a/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.java b/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.java index 7591954786..5ded1d7117 100644 --- a/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.java +++ b/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.java @@ -1692,15 +1692,20 @@ public class FileDataStorageManager { + ProviderTableMeta.OCSHARES_SHARE_TYPE + "=? OR " + ProviderTableMeta.OCSHARES_SHARE_TYPE + "=? OR " + ProviderTableMeta.OCSHARES_SHARE_TYPE + "=? OR " + + ProviderTableMeta.OCSHARES_SHARE_TYPE + "=? OR " + ProviderTableMeta.OCSHARES_SHARE_TYPE + "=? ) "; - String[] whereArgs = new String[]{filePath, accountName, - Integer.toString(ShareType.USER.getValue()), - Integer.toString(ShareType.GROUP.getValue()), - Integer.toString(ShareType.EMAIL.getValue()), - Integer.toString(ShareType.FEDERATED.getValue()), - Integer.toString(ShareType.ROOM.getValue())}; + String[] whereArgs = new String[]{ + filePath, + accountName, + Integer.toString(ShareType.USER.getValue()), + Integer.toString(ShareType.GROUP.getValue()), + Integer.toString(ShareType.EMAIL.getValue()), + Integer.toString(ShareType.FEDERATED.getValue()), + Integer.toString(ShareType.ROOM.getValue()), + Integer.toString(ShareType.CIRCLE.getValue()) + }; - Cursor cursor = null; + Cursor cursor; if (getContentResolver() != null) { cursor = getContentResolver().query(ProviderTableMeta.CONTENT_URI_SHARE, null, where, whereArgs, null); } else { diff --git a/src/main/java/com/owncloud/android/operations/CreateShareWithShareeOperation.java b/src/main/java/com/owncloud/android/operations/CreateShareWithShareeOperation.java index d459f07a10..6d611b4c58 100644 --- a/src/main/java/com/owncloud/android/operations/CreateShareWithShareeOperation.java +++ b/src/main/java/com/owncloud/android/operations/CreateShareWithShareeOperation.java @@ -45,7 +45,11 @@ public class CreateShareWithShareeOperation extends SyncOperation { private int permissions; private static final List supportedShareTypes = new ArrayList<>(Arrays.asList(ShareType.USER, - ShareType.GROUP, ShareType.FEDERATED, ShareType.EMAIL, ShareType.ROOM)); + ShareType.GROUP, + ShareType.FEDERATED, + ShareType.EMAIL, + ShareType.ROOM, + ShareType.CIRCLE)); /** * Constructor. @@ -74,8 +78,8 @@ public class CreateShareWithShareeOperation extends SyncOperation { path, shareType, shareeName, - false, - "", + false, + "", permissions ); operation.setGetShareDetails(true); diff --git a/src/main/java/com/owncloud/android/providers/FileContentProvider.java b/src/main/java/com/owncloud/android/providers/FileContentProvider.java index 3fd9a3af48..95b95108e2 100644 --- a/src/main/java/com/owncloud/android/providers/FileContentProvider.java +++ b/src/main/java/com/owncloud/android/providers/FileContentProvider.java @@ -402,6 +402,7 @@ public class FileContentProvider extends ContentProvider { case EMAIL: case FEDERATED: case ROOM: + case CIRCLE: fileValues.put(ProviderTableMeta.FILE_SHARED_WITH_SHAREE, 1); break; diff --git a/src/main/java/com/owncloud/android/providers/UsersAndGroupsSearchProvider.java b/src/main/java/com/owncloud/android/providers/UsersAndGroupsSearchProvider.java index 0daa551ab9..f04bcde178 100644 --- a/src/main/java/com/owncloud/android/providers/UsersAndGroupsSearchProvider.java +++ b/src/main/java/com/owncloud/android/providers/UsersAndGroupsSearchProvider.java @@ -20,7 +20,6 @@ package com.owncloud.android.providers; -import android.accounts.Account; import android.app.SearchManager; import android.content.ContentProvider; import android.content.ContentValues; @@ -90,6 +89,7 @@ public class UsersAndGroupsSearchProvider extends ContentProvider { private String DATA_ROOM; private String DATA_REMOTE; private String DATA_EMAIL; + private String DATA_CIRCLE; private UriMatcher mUriMatcher; @@ -129,12 +129,14 @@ public class UsersAndGroupsSearchProvider extends ContentProvider { DATA_ROOM = AUTHORITY + ".data.room"; DATA_REMOTE = AUTHORITY + ".data.remote"; DATA_EMAIL = AUTHORITY + ".data.email"; + DATA_CIRCLE = AUTHORITY + ".data.circle"; sShareTypes.put(DATA_USER, ShareType.USER); sShareTypes.put(DATA_GROUP, ShareType.GROUP); sShareTypes.put(DATA_ROOM, ShareType.ROOM); sShareTypes.put(DATA_REMOTE, ShareType.FEDERATED); sShareTypes.put(DATA_EMAIL, ShareType.EMAIL); + sShareTypes.put(DATA_CIRCLE, ShareType.CIRCLE); mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); mUriMatcher.addURI(AUTHORITY, SearchManager.SUGGEST_URI_PATH_QUERY + "/*", SEARCH); @@ -213,6 +215,7 @@ public class UsersAndGroupsSearchProvider extends ContentProvider { Uri roomBaseUri = new Uri.Builder().scheme(CONTENT).authority(DATA_ROOM).build(); Uri remoteBaseUri = new Uri.Builder().scheme(CONTENT).authority(DATA_REMOTE).build(); Uri emailBaseUri = new Uri.Builder().scheme(CONTENT).authority(DATA_EMAIL).build(); + Uri circleBaseUri = new Uri.Builder().scheme(CONTENT).authority(DATA_CIRCLE).build(); FileDataStorageManager manager = new FileDataStorageManager(user.toPlatformAccount(), getContext().getContentResolver()); @@ -276,6 +279,12 @@ public class UsersAndGroupsSearchProvider extends ContentProvider { dataUri = Uri.withAppendedPath(roomBaseUri, shareWith); break; + case CIRCLE: + icon = R.drawable.ic_circles; + displayName = userName; + dataUri = Uri.withAppendedPath(circleBaseUri, shareWith); + break; + default: break; } diff --git a/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java b/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java index 9bb4bffdde..297239e8e7 100644 --- a/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java +++ b/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java @@ -30,7 +30,6 @@ import android.content.ContentValues; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; -import android.graphics.Color; import android.graphics.LinearGradient; import android.graphics.PorterDuff; import android.graphics.Shader; @@ -407,7 +406,9 @@ public class OCFileListAdapter extends RecyclerView.Adapter + + + + +