Skip to content

Commit 3327832

Browse files
Merge pull request #16895 from nextcloud/backport/16893/stable-33.1.0
[stable-33.1.0] fix(preview-text-string-fragment): edit
2 parents c4fbcf8 + ce73669 commit 3327832

3 files changed

Lines changed: 140 additions & 150 deletions

File tree

app/src/main/java/com/owncloud/android/ui/preview/PreviewTextStringFragment.java

Lines changed: 0 additions & 150 deletions
This file was deleted.
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
/*
2+
* Nextcloud - Android Client
3+
*
4+
* SPDX-FileCopyrightText: 2026 Alper Ozturk <alper.ozturk@nextcloud.com>
5+
* SPDX-FileCopyrightText: 2019 Tobias Kaminsky <tobias@kaminsky.me>
6+
* SPDX-FileCopyrightText: 2019 Nextcloud GmbH
7+
* SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only
8+
*/
9+
package com.owncloud.android.ui.preview
10+
11+
import android.os.Bundle
12+
import android.os.Handler
13+
import android.view.LayoutInflater
14+
import android.view.Menu
15+
import android.view.MenuInflater
16+
import android.view.MenuItem
17+
import android.view.View
18+
import android.view.ViewGroup
19+
import androidx.appcompat.widget.SearchView
20+
import androidx.core.view.MenuHost
21+
import androidx.core.view.MenuProvider
22+
import androidx.lifecycle.Lifecycle
23+
import androidx.lifecycle.lifecycleScope
24+
import com.google.android.material.floatingactionbutton.FloatingActionButton
25+
import com.nextcloud.android.lib.richWorkspace.RichWorkspaceDirectEditingRemoteOperation
26+
import com.owncloud.android.R
27+
import com.owncloud.android.ui.activity.FileActivity
28+
import com.owncloud.android.ui.activity.FileDisplayActivity
29+
import com.owncloud.android.utils.DisplayUtils
30+
import kotlinx.coroutines.Dispatchers
31+
import kotlinx.coroutines.launch
32+
import kotlinx.coroutines.withContext
33+
34+
@Suppress("TooGenericExceptionThrown")
35+
class PreviewTextStringFragment : PreviewTextFragment() {
36+
private var isEditorWebviewLaunched = false
37+
38+
override fun onCreate(savedInstanceState: Bundle?) {
39+
super.onCreate(savedInstanceState)
40+
arguments?.run {
41+
searchQuery = getString(FileActivity.EXTRA_SEARCH_QUERY, "")
42+
searchOpen = getBoolean(FileActivity.EXTRA_SEARCH, false)
43+
}
44+
handler = Handler()
45+
}
46+
47+
override fun onSaveInstanceState(outState: Bundle) {
48+
outState.putParcelable(EXTRA_FILE, file)
49+
super.onSaveInstanceState(outState)
50+
}
51+
52+
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
53+
val view = super.onCreateView(inflater, container, savedInstanceState)
54+
?: throw RuntimeException("View can not be null")
55+
56+
requireActivity().findViewById<FloatingActionButton>(R.id.fab_main).apply {
57+
visibility = View.VISIBLE
58+
isEnabled = true
59+
setOnClickListener { edit() }
60+
setImageResource(R.drawable.ic_edit)
61+
viewThemeUtils.material.themeFAB(this)
62+
}
63+
64+
addMenuProvider()
65+
return view
66+
}
67+
68+
override fun onStart() {
69+
super.onStart()
70+
if (isEditorWebviewLaunched && containerActivity is FileDisplayActivity) {
71+
(containerActivity as FileDisplayActivity).run {
72+
supportFragmentManager.popBackStack()
73+
onRefresh()
74+
}
75+
}
76+
}
77+
78+
private fun addMenuProvider() {
79+
(requireActivity() as MenuHost).addMenuProvider(
80+
object : MenuProvider {
81+
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
82+
menu.findItem(R.id.action_search).apply {
83+
isVisible = true
84+
searchView = (actionView as? SearchView)?.also { sv ->
85+
sv.setOnQueryTextListener(this@PreviewTextStringFragment)
86+
sv.maxWidth = Int.MAX_VALUE
87+
viewThemeUtils.androidx.themeToolbarSearchView(sv)
88+
if (searchOpen) {
89+
sv.isIconified = false
90+
sv.setQuery(searchQuery, true)
91+
sv.clearFocus()
92+
}
93+
}
94+
}
95+
}
96+
97+
override fun onMenuItemSelected(menuItem: MenuItem) = false
98+
},
99+
viewLifecycleOwner,
100+
Lifecycle.State.RESUMED
101+
)
102+
}
103+
104+
override fun loadAndShowTextPreview() {
105+
originalText = file.richWorkspace
106+
setText(binding.textPreview, originalText, file, requireActivity(), true, false, viewThemeUtils)
107+
binding.textPreview.visibility = View.VISIBLE
108+
binding.emptyListProgress.visibility = View.GONE
109+
}
110+
111+
private fun edit() {
112+
lifecycleScope.launch(Dispatchers.IO) {
113+
val result = RichWorkspaceDirectEditingRemoteOperation(file.remotePath)
114+
.execute(accountManager.user, context)
115+
116+
if (result.isSuccess) {
117+
containerActivity?.getFileOperationsHelper()?.openRichWorkspaceWithTextEditor(
118+
file,
119+
result.singleData as? String,
120+
context
121+
)
122+
isEditorWebviewLaunched = true
123+
} else {
124+
withContext(Dispatchers.Main) {
125+
activity?.let {
126+
DisplayUtils.showSnackMessage(
127+
it,
128+
R.string.preview_text_string_fragment_open_rich_text_editor_error_message
129+
)
130+
}
131+
}
132+
}
133+
}
134+
}
135+
136+
companion object {
137+
private const val EXTRA_FILE = "FILE"
138+
}
139+
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
~ SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only
77
-->
88
<resources>
9+
<string name="preview_text_string_fragment_open_rich_text_editor_error_message">Failed to open text editor</string>
910
<string name="bottom_navigation_menu_files_label">All files</string>
1011
<string name="bottom_navigation_menu_favorites_label">Favorites</string>
1112
<string name="bottom_navigation_menu_assistant_label">Assistant</string>

0 commit comments

Comments
 (0)