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 0000000000..d846734141 Binary files /dev/null and b/screenshots/com.owncloud.android.ui.fragment.OCFileListFragmentIT_createAndShowShareToCircle.png differ 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 0000000000..efa4f3f131 Binary files /dev/null and b/screenshots/com.owncloud.android.ui.fragment.OCFileListFragmentIT_createAndShowShareToGroup.png differ diff --git a/screenshots/com.owncloud.android.ui.fragment.OCFileListFragmentIT_createAndShowShareToUser.png b/screenshots/com.owncloud.android.ui.fragment.OCFileListFragmentIT_createAndShowShareToUser.png new file mode 100644 index 0000000000..8e720454be Binary files /dev/null and b/screenshots/com.owncloud.android.ui.fragment.OCFileListFragmentIT_createAndShowShareToUser.png differ diff --git a/screenshots/com.owncloud.android.ui.fragment.OCFileListFragmentIT_createAndShowShareViaLink.png b/screenshots/com.owncloud.android.ui.fragment.OCFileListFragmentIT_createAndShowShareViaLink.png new file mode 100644 index 0000000000..40d5d41853 Binary files /dev/null and b/screenshots/com.owncloud.android.ui.fragment.OCFileListFragmentIT_createAndShowShareViaLink.png differ 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 + + + + +