From bbfdb5dfab9b13ca9dded12929d084a7510d8e6c Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Wed, 2 Jul 2025 10:40:57 +0200 Subject: [PATCH 01/13] wip Signed-off-by: tobiasKaminsky --- .../lib/resources/declarativeui/Endpoint.kt | 14 ++++++++++++ .../GetCapabilitiesRemoteOperation.java | 21 ++++++++++++++++++ .../lib/resources/status/OCCapability.kt | 22 +++++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 library/src/main/java/com/owncloud/android/lib/resources/declarativeui/Endpoint.kt diff --git a/library/src/main/java/com/owncloud/android/lib/resources/declarativeui/Endpoint.kt b/library/src/main/java/com/owncloud/android/lib/resources/declarativeui/Endpoint.kt new file mode 100644 index 000000000..d69f7e3fe --- /dev/null +++ b/library/src/main/java/com/owncloud/android/lib/resources/declarativeui/Endpoint.kt @@ -0,0 +1,14 @@ +/* + * Nextcloud Android Library + * + * SPDX-FileCopyrightText: 2025 Your Name + * SPDX-License-Identifier: MIT + */ + +package com.owncloud.android.lib.resources.declarativeui + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +@Parcelize +data class Endpoint(val name: String, val relativeURL: String) : Parcelable diff --git a/library/src/main/java/com/owncloud/android/lib/resources/status/GetCapabilitiesRemoteOperation.java b/library/src/main/java/com/owncloud/android/lib/resources/status/GetCapabilitiesRemoteOperation.java index 431ac4acb..fce228dd9 100644 --- a/library/src/main/java/com/owncloud/android/lib/resources/status/GetCapabilitiesRemoteOperation.java +++ b/library/src/main/java/com/owncloud/android/lib/resources/status/GetCapabilitiesRemoteOperation.java @@ -177,6 +177,10 @@ public class GetCapabilitiesRemoteOperation extends RemoteOperation { // notes folder location private static final String NODE_NOTES = "notes"; private static final String NOTES_PATH = "notes_path"; + + // declarative ui + private static final String NODE_DECLARATIVE_UI = "declarativeui"; + private static final String NODE_CONTEXT_MENU = "context-menu"; private static final String PROPERTY_DEFAULT_PERMISSIONS = "default_permissions"; @@ -804,6 +808,23 @@ private OCCapability parseResponse(String response) throws JSONException { capability.setNotesFolderPath(notesFolderPath); } } + + // declarative ui + if (respCapabilities.has(NODE_DECLARATIVE_UI)) { + JSONObject declarativeUiCapability = respCapabilities.getJSONObject(NODE_DECLARATIVE_UI); + + if (declarativeUiCapability.has(NODE_CONTEXT_MENU)) { + String array = declarativeUiCapability.getString(NODE_CONTEXT_MENU); + +// ArrayList endpoints = new ArrayList<>(); +// +// for (int i = 0; i < array.length(); i++) { +// endpoints.add(new Endpoint(array.getJSONArray(i).getString(0), +// array.getJSONArray(i).getString(1))); +// } + capability.setDeclarativeUiContextMenuJson(array); + } + } } diff --git a/library/src/main/java/com/owncloud/android/lib/resources/status/OCCapability.kt b/library/src/main/java/com/owncloud/android/lib/resources/status/OCCapability.kt index dc435ff38..06d106708 100644 --- a/library/src/main/java/com/owncloud/android/lib/resources/status/OCCapability.kt +++ b/library/src/main/java/com/owncloud/android/lib/resources/status/OCCapability.kt @@ -9,6 +9,10 @@ */ package com.owncloud.android.lib.resources.status +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.owncloud.android.lib.resources.declarativeui.Endpoint + /** * Contains data of the Capabilities for an account, from the Capabilities API */ @@ -120,6 +124,24 @@ class OCCapability { // notes folder location var notesFolderPath: String? = null + + // declarative ui + var declarativeUiContextMenuJson: String? = null + val declarativeUiContextMenu: List + + get() { + val listType = object : TypeToken>>() {}.type + val arrayList : Array> = Gson().fromJson(declarativeUiContextMenuJson, listType) + + var returnList = mutableListOf(); + + for (a in arrayList) { + returnList.add(Endpoint(a[0], a[1])) + } + + return returnList + } + // Etag for capabilities var etag: String? = "" From 758c07401fd4a8528065ea48e3ad0c5cff715462 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Wed, 2 Jul 2025 12:33:55 +0200 Subject: [PATCH 02/13] wip Signed-off-by: tobiasKaminsky --- .../GetDeclarativeUiJsonOperation.kt | 67 +++++++++++++++++++ .../lib/resources/status/OCCapability.kt | 6 +- 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 library/src/main/java/com/nextcloud/android/lib/resources/declarativeui/GetDeclarativeUiJsonOperation.kt diff --git a/library/src/main/java/com/nextcloud/android/lib/resources/declarativeui/GetDeclarativeUiJsonOperation.kt b/library/src/main/java/com/nextcloud/android/lib/resources/declarativeui/GetDeclarativeUiJsonOperation.kt new file mode 100644 index 000000000..33cc4dcb4 --- /dev/null +++ b/library/src/main/java/com/nextcloud/android/lib/resources/declarativeui/GetDeclarativeUiJsonOperation.kt @@ -0,0 +1,67 @@ +/* + * Nextcloud Android Library + * + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2024 Tobias Kaminsky + * SPDX-License-Identifier: MIT + */ +package com.nextcloud.android.lib.resources.declarativeui + +import com.google.gson.JsonArray +import com.google.gson.reflect.TypeToken +import com.nextcloud.common.NextcloudClient +import com.nextcloud.operations.GetMethod +import com.owncloud.android.lib.common.operations.RemoteOperationResult +import com.owncloud.android.lib.common.utils.Log_OC +import com.owncloud.android.lib.ocs.ServerResponse +import com.owncloud.android.lib.resources.OCSRemoteOperation +import org.apache.commons.httpclient.HttpStatus + +/** + * Get terms of service of an user + */ +class GetDeclarativeUiJsonOperation(val url: String) : OCSRemoteOperation() { + @Suppress("TooGenericExceptionCaught") + override fun run(client: NextcloudClient): RemoteOperationResult { + var result: RemoteOperationResult + var getMethod: GetMethod? = null + try { + getMethod = + GetMethod( + client.baseUri.toString() + url + JSON_FORMAT, + true + ) + val status = client.execute(getMethod) + if (status == HttpStatus.SC_OK) { + val terms = + getServerResponse( + getMethod, + object : TypeToken>() {} + )?.ocs?.data + + if (terms != null) { + result = RemoteOperationResult(true, getMethod) + result.resultData = terms + } else { + result = RemoteOperationResult(false, getMethod) + } + } else { + result = RemoteOperationResult(false, getMethod) + } + } catch (e: Exception) { + result = RemoteOperationResult(e) + Log_OC.e( + TAG, + "Get terms failed: " + result.logMessage, + result.exception + ) + } finally { + getMethod?.releaseConnection() + } + return result + } + + companion object { + private val TAG = GetDeclarativeUiJsonOperation::class.java.simpleName + } +} diff --git a/library/src/main/java/com/owncloud/android/lib/resources/status/OCCapability.kt b/library/src/main/java/com/owncloud/android/lib/resources/status/OCCapability.kt index 06d106708..fe85d3590 100644 --- a/library/src/main/java/com/owncloud/android/lib/resources/status/OCCapability.kt +++ b/library/src/main/java/com/owncloud/android/lib/resources/status/OCCapability.kt @@ -130,10 +130,14 @@ class OCCapability { val declarativeUiContextMenu: List get() { + if (declarativeUiContextMenuJson == null) { + return emptyList() + } + val listType = object : TypeToken>>() {}.type val arrayList : Array> = Gson().fromJson(declarativeUiContextMenuJson, listType) - var returnList = mutableListOf(); + val returnList = mutableListOf(); for (a in arrayList) { returnList.add(Endpoint(a[0], a[1])) From e1bc9ec8b96b16c44e72bfab457282d127586b2e Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Thu, 10 Jul 2025 13:55:54 +0200 Subject: [PATCH 03/13] wip Signed-off-by: tobiasKaminsky --- .idea/codeStyles/Project.xml | 35 +++++++++++++++ .../GetDeclarativeUiJsonOperation.kt | 17 ++++++++ .../lib/resources/declarativeui/Button.kt | 10 +++++ .../resources/declarativeui/DeclarativeUI.kt | 10 +++++ .../lib/resources/declarativeui/Element.kt | 10 +++++ .../lib/resources/declarativeui/Layout.kt | 14 ++++++ .../lib/resources/declarativeui/Row.kt | 12 ++++++ .../GetDeclarativeUiJsonOperationTest.kt | 43 +++++++++++++++++++ 8 files changed, 151 insertions(+) create mode 100644 library/src/main/java/com/owncloud/android/lib/resources/declarativeui/Button.kt create mode 100644 library/src/main/java/com/owncloud/android/lib/resources/declarativeui/DeclarativeUI.kt create mode 100644 library/src/main/java/com/owncloud/android/lib/resources/declarativeui/Element.kt create mode 100644 library/src/main/java/com/owncloud/android/lib/resources/declarativeui/Layout.kt create mode 100644 library/src/main/java/com/owncloud/android/lib/resources/declarativeui/Row.kt create mode 100644 library/src/test/java/com/owncloud/android/lib/resources/declarativeui/GetDeclarativeUiJsonOperationTest.kt diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index f9fc0166c..59e7e7d1e 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -1,5 +1,40 @@ + + +