Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions .idea/codeStyles/Project.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import com.owncloud.android.lib.resources.status.NextcloudVersion;
import com.owncloud.android.lib.resources.status.OCCapability;
import com.owncloud.android.lib.resources.status.OwnCloudVersion;
import com.owncloud.android.lib.resources.status.Type;

import org.junit.Test;

Expand Down Expand Up @@ -163,4 +164,17 @@ private void checkCapability(OCCapability capability, String userId) {
assertTrue(capability.isWCFEnabled().isFalse());
}
}

@Test
public void testClientIntegration() {
// get capabilities
RemoteOperationResult result = new GetCapabilitiesRemoteOperation().execute(nextcloudClient);
assertTrue(result.isSuccess());
assertNotNull(result.getSingleData());

OCCapability capability = (OCCapability) result.getSingleData();

assertEquals(5, capability.getClientIntegrationEndpoints(Type.CONTEXT_MENU, "").size());
assertEquals(2, capability.getClientIntegrationEndpoints(Type.CREATE_NEW, "").size());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/*
* Nextcloud Android Library
*
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-FileCopyrightText: 2025 Tobias Kaminsky <[email protected]>
* SPDX-License-Identifier: MIT
*/

package com.nextcloud.android.lib.resources.clientintegration

import com.google.gson.annotations.SerializedName

data class App(
val version: Double,
@SerializedName("context-menu")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why this is not using kotlinx.parcelize.Parcelize as well ?

val contextMenu: List<Endpoint>,
@SerializedName("create-new")
val createNew: List<Endpoint>
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/*
* Nextcloud Android Library
*
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-FileCopyrightText: 2025 Tobias Kaminsky <[email protected]>
* SPDX-License-Identifier: MIT
*/

package com.nextcloud.android.lib.resources.clientintegration

import android.os.Parcelable
import kotlinx.parcelize.Parcelize

@Parcelize
data class ClientIntegrationUI(
val version: Double,
val root: Layout?
) : Parcelable
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
/*
* Nextcloud Android Library
*
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-FileCopyrightText: 2025 Tobias Kaminsky <[email protected]>
* SPDX-License-Identifier: MIT
*/

package com.nextcloud.android.lib.resources.clientintegration

import android.os.Parcelable

interface Element : Parcelable
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
/*
* Nextcloud Android Library
*
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-FileCopyrightText: 2025 Tobias Kaminsky <[email protected]>
* SPDX-License-Identifier: MIT
*/

package com.nextcloud.android.lib.resources.clientintegration

import com.google.gson.Gson
import com.google.gson.JsonDeserializationContext
import com.google.gson.JsonDeserializer
import com.google.gson.JsonElement
import com.google.gson.JsonParseException
import com.google.gson.JsonSerializationContext
import com.google.gson.JsonSerializer
import java.lang.reflect.Type

class ElementTypeAdapter :
JsonSerializer<Element>,
JsonDeserializer<Element> {
override fun serialize(
src: Element,
type: Type,
context: JsonSerializationContext
): JsonElement {
// needs to be a new Gson instance, otherwise we end up in a loop
val element = Gson().toJsonTree(src)
element.asJsonObject.addProperty("element", src.javaClass.name)

return element
}

@Throws(JsonParseException::class, ClassNotFoundException::class, Throwable::class)
override fun deserialize(
json: JsonElement,
type: Type,
context: JsonDeserializationContext
): Element? {
val jsonObject = json.asJsonObject
val typeName = jsonObject.get("element").asString

try {
val prefix = "com.nextcloud.android.lib.resources.clientintegration"
val cls: Class<out Element> =
when (typeName) {
"Button" ->
Class.forName("$prefix.LayoutButton") as Class<out Element>

"Text" ->
Class.forName("$prefix.LayoutText") as Class<out Element>

"Image" ->
Class.forName("$prefix.LayoutImage") as Class<out Element>

"URL" ->
Class.forName("$prefix.LayoutURL") as Class<out Element>

else -> return null
}

return Gson().fromJson(json, cls)
} catch (e: ClassNotFoundException) {
throw JsonParseException(e)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/*
* Nextcloud Android Library
*
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-FileCopyrightText: 2025 Tobias Kaminsky <[email protected]>
* SPDX-License-Identifier: MIT
*/

package com.nextcloud.android.lib.resources.clientintegration

import android.os.Parcelable
import com.google.gson.annotations.SerializedName
import com.owncloud.android.lib.resources.status.Method
import kotlinx.parcelize.Parcelize

@Parcelize
data class Endpoint(
val name: String,
val url: String,
var method: Method?,
@SerializedName("mimetype_filters")
val mimetypeFilter: String?,
val params: Map<String, String>?,
val icon: String?,
val filter: String?
) : Parcelable
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/*
* Nextcloud Android Library
*
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-FileCopyrightText: 2025 Tobias Kaminsky <[email protected]>
* SPDX-License-Identifier: MIT
*/

package com.nextcloud.android.lib.resources.clientintegration

import android.os.Parcelable
import com.google.gson.annotations.SerializedName
import kotlinx.parcelize.Parcelize

@Parcelize
data class Layout(
@SerializedName("orientation")
var orientation: LayoutOrientation,
var rows: List<LayoutRow>
) : Parcelable
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/*
* Nextcloud Android Library
*
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-FileCopyrightText: 2025 Tobias Kaminsky <[email protected]>
* SPDX-License-Identifier: MIT
*/

package com.nextcloud.android.lib.resources.clientintegration

import android.os.Parcelable
import kotlinx.parcelize.Parcelize

@Parcelize
data class LayoutButton(
val label: String,
val type: String
) : Element,
Parcelable
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
/*
* Nextcloud Android Library
*
* SPDX-FileCopyrightText: 2025 Alper Ozturk <[email protected]>
* SPDX-License-Identifier: MIT
*/

package com.nextcloud.android.lib.resources.clientintegration

import android.os.Parcelable
import kotlinx.parcelize.Parcelize

@Parcelize
data class LayoutImage(
val url: String
) : Element,
Parcelable
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/*
* Nextcloud Android Library
*
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-FileCopyrightText: 2025 Tobias Kaminsky <[email protected]>
* SPDX-License-Identifier: MIT
*/

package com.nextcloud.android.lib.resources.clientintegration

import android.os.Parcelable
import com.google.gson.annotations.SerializedName
import kotlinx.parcelize.Parcelize

@Parcelize
enum class LayoutOrientation : Parcelable {
@SerializedName("horizontal")
HORIZONTAL,

@SerializedName("vertical")
VERTICAL
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
/*
* Nextcloud Android Library
*
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-FileCopyrightText: 2025 Tobias Kaminsky <[email protected]>
* SPDX-License-Identifier: MIT
*/

package com.nextcloud.android.lib.resources.clientintegration

import android.os.Parcelable
import kotlinx.parcelize.Parcelize

@Parcelize
data class LayoutRow(
val children: List<Element>
) : Parcelable
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/*
* Nextcloud Android Library
*
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-FileCopyrightText: 2025 Tobias Kaminsky <[email protected]>
* SPDX-License-Identifier: MIT
*/

package com.nextcloud.android.lib.resources.clientintegration

import android.os.Parcelable
import kotlinx.parcelize.Parcelize

@Parcelize
data class LayoutText(
val text: String
) : Element,
Parcelable
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/*
* Nextcloud Android Library
*
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-FileCopyrightText: 2025 Tobias Kaminsky <[email protected]>
* SPDX-License-Identifier: MIT
*/

package com.nextcloud.android.lib.resources.clientintegration

import android.os.Parcelable
import kotlinx.parcelize.Parcelize

@Parcelize
data class LayoutURL(
val text: String,
val url: String
) : Element,
Parcelable
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/*
* Nextcloud Android Library
*
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-FileCopyrightText: 2025 Tobias Kaminsky <[email protected]>
* SPDX-License-Identifier: MIT
*/

package com.nextcloud.android.lib.resources.clientintegration

data class TooltipResponse(
val version: Double,
val tooltip: String
)
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,9 @@ public class GetCapabilitiesRemoteOperation extends RemoteOperation {
// notes folder location
private static final String NODE_NOTES = "notes";
private static final String NOTES_PATH = "notes_path";

// client integration
private static final String NODE_CLIENT_INTEGRATION = "client_integration";

private static final String PROPERTY_DEFAULT_PERMISSIONS = "default_permissions";

Expand Down Expand Up @@ -816,6 +819,11 @@ private OCCapability parseResponse(String response) throws JSONException {
}
}

// client integration
if (respCapabilities.has(NODE_CLIENT_INTEGRATION)) {
capability.setClientIntegrationJson(respCapabilities.getString(NODE_CLIENT_INTEGRATION));
}

// support
if (respCapabilities.has(NODE_SUPPORT)) {
JSONObject supportCapability = respCapabilities.getJSONObject(NODE_SUPPORT);
Expand Down
Loading
Loading