Skip to content

Commit 408d317

Browse files
wip
Signed-off-by: tobiasKaminsky <tobias@kaminsky.me>
1 parent 866f679 commit 408d317

10 files changed

Lines changed: 147 additions & 54 deletions

File tree

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ import com.owncloud.android.db.ProviderMeta
8282
AutoMigration(from = 90, to = 91),
8383
AutoMigration(from = 91, to = 92),
8484
AutoMigration(from = 92, to = 93, spec = DatabaseMigrationUtil.ResetCapabilitiesPostMigration::class),
85-
AutoMigration(from = 93, to = 94, spec = DatabaseMigrationUtil.ResetCapabilitiesPostMigration::class),
85+
AutoMigration(from = 93, to = 94, spec = DatabaseMigrationUtil.ResetCapabilitiesPostMigration::class)
8686
],
8787
exportSchema = true
8888
)

app/src/main/java/com/nextcloud/client/database/entity/CapabilityEntity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,5 +144,5 @@ data class CapabilityEntity(
144144
@ColumnInfo(name = ProviderTableMeta.CAPABILITIES_USER_STATUS_SUPPORTS_BUSY)
145145
val userStatusSupportsBusy: Int?,
146146
@ColumnInfo(name = ProviderTableMeta.CAPABILITIES_CLIENT_INTEGRATION_JSON)
147-
val clientIntegrationJson: String?,
147+
val clientIntegrationJson: String?
148148
)

app/src/main/java/com/nextcloud/ui/ClientIntegrationScreen.kt

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ import com.owncloud.android.utils.DisplayUtils
3131
fun ClientIntegrationScreen(clientIntegrationUI: ClientIntegrationUI, baseUrl: String) {
3232
val activity = LocalContext.current.getActivity()
3333

34-
3534
Column {
3635
Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.End) {
3736
TextButton({ close(activity) }) {
@@ -94,36 +93,44 @@ private fun close(activity: Activity?) {
9493
@Preview
9594
private fun ClientIntegrationScreenPreviewVertical() {
9695
val clientIntegrationUI = ClientIntegrationUI(
97-
0.1, Layout(
96+
0.1,
97+
Layout(
9898
Orientation.VERTICAL,
9999
mutableListOf(
100100
com.nextcloud.android.lib.resources.clientintegration.Row(
101101
listOf(Button("Click", "Primary"), Text("123"))
102-
), com.nextcloud.android.lib.resources.clientintegration.Row(
102+
),
103+
com.nextcloud.android.lib.resources.clientintegration.Row(
103104
listOf(Button("Click2", "Primary"))
104-
), com.nextcloud.android.lib.resources.clientintegration.Row(
105+
),
106+
com.nextcloud.android.lib.resources.clientintegration.Row(
105107
listOf(URL("Analytics report created", "https://nextcloud.com"))
106108
)
107109
)
108110
)
109111
)
110112

111113
ClientIntegrationScreen(
112-
clientIntegrationUI, "http://nextcloud.local"
114+
clientIntegrationUI,
115+
"http://nextcloud.local"
113116
)
114117
}
115118

116119
@Composable
117120
@Preview
118121
private fun ClientIntegrationScreenPreviewHorizontal() {
119122
val clientIntegrationUI = ClientIntegrationUI(
120-
0.1, Layout(
121-
Orientation.HORIZONTAL, mutableListOf(
123+
0.1,
124+
Layout(
125+
Orientation.HORIZONTAL,
126+
mutableListOf(
122127
com.nextcloud.android.lib.resources.clientintegration.Row(
123128
listOf(Button("Click", "Primary"), Text("123"))
124-
), com.nextcloud.android.lib.resources.clientintegration.Row(
129+
),
130+
com.nextcloud.android.lib.resources.clientintegration.Row(
125131
listOf(Button("Click2", "Primary"))
126-
), com.nextcloud.android.lib.resources.clientintegration.Row(
132+
),
133+
com.nextcloud.android.lib.resources.clientintegration.Row(
127134
listOf(URL("Analytics report created", "https://nextcloud.com"))
128135
)
129136
)
@@ -137,7 +144,8 @@ private fun ClientIntegrationScreenPreviewHorizontal() {
137144
@Preview
138145
private fun ClientIntegrationScreenPreviewEmpty() {
139146
val clientIntegrationUI = ClientIntegrationUI(
140-
0.1, Layout(
147+
0.1,
148+
Layout(
141149
Orientation.HORIZONTAL,
142150
emptyList()
143151
)

app/src/main/java/com/nextcloud/ui/fileactions/FileAction.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,9 @@ enum class FileAction(
6363

6464
// Retry for offline operation
6565
RETRY(R.id.action_retry, R.string.retry, R.drawable.ic_retry);
66-
67-
constructor(id: Int, title: Int) :this(id, title, null)
68-
66+
67+
constructor(id: Int, title: Int) : this(id, title, null)
68+
6969
companion object {
7070
/**
7171
* All file actions, in the order they should be displayed

app/src/main/java/com/nextcloud/ui/fileactions/FileActionsBottomSheet.kt

Lines changed: 61 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,23 @@ package com.nextcloud.ui.fileactions
1010
import android.content.Context
1111
import android.content.Intent
1212
import android.content.res.ColorStateList
13-
import android.graphics.Color
14-
import android.graphics.PorterDuff
13+
import android.graphics.Canvas
1514
import android.graphics.Typeface
1615
import android.graphics.drawable.Drawable
1716
import android.graphics.drawable.PictureDrawable
17+
import android.os.Build
1818
import android.os.Bundle
1919
import android.text.style.StyleSpan
2020
import android.view.LayoutInflater
2121
import android.view.View
2222
import android.view.ViewGroup
2323
import android.widget.Toast
2424
import androidx.annotation.IdRes
25+
import androidx.annotation.RequiresApi
2526
import androidx.appcompat.content.res.AppCompatResources
27+
import androidx.core.graphics.createBitmap
28+
import androidx.core.graphics.drawable.toDrawable
29+
import androidx.core.net.toUri
2630
import androidx.core.os.bundleOf
2731
import androidx.core.view.isEmpty
2832
import androidx.core.view.isVisible
@@ -36,6 +40,9 @@ import com.google.android.material.bottomsheet.BottomSheetDialog
3640
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
3741
import com.google.gson.Gson
3842
import com.google.gson.GsonBuilder
43+
import com.google.gson.JsonElement
44+
import com.google.gson.JsonParser
45+
import com.google.gson.reflect.TypeToken
3946
import com.nextcloud.android.common.ui.theme.utils.ColorRole
4047
import com.nextcloud.android.lib.resources.clientintegration.ClientIntegrationUI
4148
import com.nextcloud.android.lib.resources.clientintegration.Element
@@ -62,6 +69,7 @@ import com.owncloud.android.datamodel.OCFile
6269
import com.owncloud.android.datamodel.SyncedFolderProvider
6370
import com.owncloud.android.datamodel.ThumbnailsCacheManager
6471
import com.owncloud.android.lib.common.OwnCloudClientManagerFactory
72+
import com.owncloud.android.lib.ocs.ServerResponse
6573
import com.owncloud.android.lib.resources.files.model.FileLockType
6674
import com.owncloud.android.lib.resources.status.Method
6775
import com.owncloud.android.ui.activity.ComponentsGetter
@@ -341,6 +349,7 @@ class FileActionsBottomSheet :
341349
return itemBinding.root
342350
}
343351

352+
@RequiresApi(Build.VERSION_CODES.Q)
344353
private fun inflateClientIntegrationActionView(endpoint: Endpoint): View {
345354
val itemBinding = FileActionsBottomSheetItemBinding.inflate(layoutInflater, binding.fileActionsList, false)
346355
.apply {
@@ -366,16 +375,26 @@ class FileActionsBottomSheet :
366375
val drawable =
367376
GlideHelper.getDrawable(requireContext(), client, client.baseUri.toString() + endpoint.icon)
368377
?.mutate()
378+
379+
val px = DisplayUtils.convertDpToPixel(
380+
requireContext().resources.getDimension(R.dimen.iconized_single_line_item_icon_size),
381+
requireContext()
382+
)
383+
val returnedBitmap =
384+
createBitmap(drawable?.intrinsicWidth ?: px, drawable?.intrinsicHeight ?: px)
385+
386+
val canvas = Canvas(returnedBitmap)
387+
canvas.drawPicture((drawable as PictureDrawable).picture)
388+
389+
val d = returnedBitmap.toDrawable(requireContext().resources);
390+
369391
val tintedDrawable = viewThemeUtils.platform.tintDrawable(
370392
requireContext(),
371-
drawable ?: AppCompatResources.getDrawable(requireContext(), R.drawable.ic_activity)!!
393+
d
372394
)
373395

374396
withContext(Dispatchers.Main) {
375-
val pd = (tintedDrawable as PictureDrawable)
376-
pd.setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN)
377-
icon.setImageDrawable(pd)
378-
icon.setColorFilter(Color.RED, PorterDuff.Mode.DST_OVER)
397+
icon.setImageDrawable(tintedDrawable)
379398
}
380399
}
381400
} else {
@@ -396,19 +415,17 @@ class FileActionsBottomSheet :
396415
.getNextcloudClientFor(currentUserProvider.user.toOwnCloudAccount(), context)
397416

398417
// construct url
399-
var url = client.baseUri.toString() + endpoint.url
400-
418+
var url = (client.baseUri.toString() + endpoint.url).toUri()
419+
.buildUpon()
420+
.appendQueryParameter("format", "json")
421+
.build()
422+
.toString()
423+
424+
// Always replace known placeholder in url
425+
url = url.replace("{filePath}", filePath, false)
426+
url = url.replace("{fileId}", fileId, false)
427+
401428
val method = when (endpoint.method) {
402-
Method.GET -> {
403-
endpoint.params!!.forEach {
404-
when (it.value) {
405-
"{fileId}" -> url = url.replace(it.key, fileId, false)
406-
"{filePath}" -> url = url.replace(it.key, filePath, false)
407-
}
408-
}
409-
GetMethod(url, true)
410-
}
411-
412429
Method.POST -> {
413430
val requestBody = if (endpoint.params?.isNotEmpty() == true) {
414431
val jsonRequestBody = JSONRequestBody()
@@ -433,25 +450,28 @@ class FileActionsBottomSheet :
433450
val result = try {
434451
client.execute(method)
435452
} catch (exception: Exception) {
436-
val e = exception
437-
TODO("Add error handling here")
453+
activity?.showToast(getString(R.string.failed_to_start_action))
438454
}
439455
val response = method.getResponseBodyAsString()
440456

441-
var output: ClientIntegrationUI? = null
457+
var output: ClientIntegrationUI?
442458
try {
443459
output = parseClientIntegrationResult(response)
444-
startClientIntegration(endpoint, output)
445-
} catch (e: Exception) {
446-
try {
460+
if (output.root != null) {
461+
startClientIntegration(endpoint, output)
462+
} else {
447463
val tooltipResponse = parseTooltipResult(response)
448464

449465
activity?.showToast(tooltipResponse.tooltip)
450-
} catch (e: Exception) {
451-
activity?.showToast("Failed to start action!")
452466
}
453-
dismiss()
467+
} catch (e: Exception) {
468+
if (result == 200) {
469+
activity?.showToast(getString(R.string.action_triggered))
470+
} else {
471+
activity?.showToast(getString(R.string.failed_to_start_action))
472+
}
454473
}
474+
dismiss()
455475
}
456476
}
457477

@@ -473,11 +493,20 @@ class FileActionsBottomSheet :
473493
.registerTypeHierarchyAdapter(Element::class.java, ElementTypeAdapter())
474494
.create()
475495

476-
return gson.fromJson(response, ClientIntegrationUI::class.java)
496+
val element: JsonElement = JsonParser.parseString(response)
497+
return gson
498+
.fromJson(element, object : TypeToken<ServerResponse<ClientIntegrationUI>>() {})
499+
.ocs
500+
.data
477501
}
478502

479-
private fun parseTooltipResult(response: String?): TooltipResponse =
480-
Gson().fromJson(response, TooltipResponse::class.java)
503+
private fun parseTooltipResult(response: String?): TooltipResponse {
504+
val element: JsonElement = JsonParser.parseString(response)
505+
return Gson()
506+
.fromJson(element, object : TypeToken<ServerResponse<TooltipResponse>>() {})
507+
.ocs
508+
.data
509+
}
481510

482511
private fun dispatchActionClick(id: Int?) {
483512
if (id != null) {
@@ -491,6 +520,7 @@ class FileActionsBottomSheet :
491520
private const val REQUEST_KEY = "REQUEST_KEY_ACTION"
492521
private const val RESULT_KEY_ACTION_ID = "RESULT_KEY_ACTION_ID"
493522
private const val FILENAME_MAX_WIDTH_PERCENTAGE = 0.6
523+
private const val JSON_FORMAT = "?format=json"
494524

495525
@JvmStatic
496526
@JvmOverloads

app/src/main/res/layout/file_actions_bottom_sheet_item.xml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
~ SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only
88
-->
99
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
10-
xmlns:app="http://schemas.android.com/apk/res-auto"
1110
xmlns:tools="http://schemas.android.com/tools"
1211
android:id="@+id/menu_upload_files"
1312
android:layout_width="match_parent"
@@ -29,7 +28,6 @@
2928
android:layout_width="@dimen/iconized_single_line_item_icon_size"
3029
android:layout_height="@dimen/iconized_single_line_item_icon_size"
3130
android:contentDescription="@null"
32-
app:tint="@color/primary"
3331
tools:src="@drawable/ic_delete" />
3432

3533
<LinearLayout

app/src/main/res/values/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1380,4 +1380,6 @@
13801380
<string name="clear">Clear</string>
13811381
<string name="set_message">Set message</string>
13821382
<string name="error_setting_status_message">Error setting status message!</string>
1383+
<string name="failed_to_start_action">Failed to start action!</string>
1384+
<string name="action_triggered">Action triggered</string>
13831385
</resources>

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*/
1111
buildscript {
1212
ext {
13-
androidLibraryVersion = "b490d046bc26e3f5646bb04e77eedff0dfb524e0"
13+
androidLibraryVersion = "be1621e659afd0f2a768688e0259e3be3bf57013"
1414
androidCommonLibraryVersion = "0.28.0"
1515
androidPluginVersion = '8.13.0'
1616
androidxMediaVersion = "1.5.1"

0 commit comments

Comments
 (0)