From 0f2e881b907df1da7d1d781af71b8ea880eaaa81 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Tue, 21 Apr 2026 16:06:29 +0200 Subject: [PATCH 1/2] Rename .java to .kt Signed-off-by: alperozturk96 --- ...reviewTextStringFragment.java => PreviewTextStringFragment.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename app/src/main/java/com/owncloud/android/ui/preview/{PreviewTextStringFragment.java => PreviewTextStringFragment.kt} (100%) diff --git a/app/src/main/java/com/owncloud/android/ui/preview/PreviewTextStringFragment.java b/app/src/main/java/com/owncloud/android/ui/preview/PreviewTextStringFragment.kt similarity index 100% rename from app/src/main/java/com/owncloud/android/ui/preview/PreviewTextStringFragment.java rename to app/src/main/java/com/owncloud/android/ui/preview/PreviewTextStringFragment.kt From ce736692a5963c3c3abe6ea489062e872868758d Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Tue, 21 Apr 2026 16:06:30 +0200 Subject: [PATCH 2/2] fix(preview-text-string-fragment): edit Signed-off-by: alperozturk96 --- .../ui/preview/PreviewTextStringFragment.kt | 231 +++++++++--------- app/src/main/res/values/strings.xml | 1 + 2 files changed, 111 insertions(+), 121 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/preview/PreviewTextStringFragment.kt b/app/src/main/java/com/owncloud/android/ui/preview/PreviewTextStringFragment.kt index b9aa3f092a5f..a381647ae034 100644 --- a/app/src/main/java/com/owncloud/android/ui/preview/PreviewTextStringFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/preview/PreviewTextStringFragment.kt @@ -1,150 +1,139 @@ /* * Nextcloud - Android Client * + * SPDX-FileCopyrightText: 2026 Alper Ozturk * SPDX-FileCopyrightText: 2019 Tobias Kaminsky * SPDX-FileCopyrightText: 2019 Nextcloud GmbH * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only */ -package com.owncloud.android.ui.preview; - -import android.os.Bundle; -import android.os.Handler; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; - -import com.google.android.material.floatingactionbutton.FloatingActionButton; -import com.nextcloud.android.lib.richWorkspace.RichWorkspaceDirectEditingRemoteOperation; -import com.nextcloud.utils.extensions.FileExtensionsKt; -import com.owncloud.android.R; -import com.owncloud.android.lib.common.operations.RemoteOperationResult; -import com.owncloud.android.ui.activity.FileDisplayActivity; -import com.owncloud.android.utils.DisplayUtils; - -import androidx.annotation.NonNull; -import androidx.appcompat.widget.SearchView; -import androidx.core.view.MenuItemCompat; - -public class PreviewTextStringFragment extends PreviewTextFragment { - private static final String EXTRA_FILE = "FILE"; - - private final static String TAG = "PreviewTextStringFragment"; - private boolean isEditorWebviewLaunched = false; - - /** - * Creates an empty fragment for previews. - */ - public PreviewTextStringFragment() { - super(); - } - - /** - * {@inheritDoc} - */ - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - setHasOptionsMenu(true); - - Bundle args = getArguments(); - - if (args.containsKey(FileDisplayActivity.EXTRA_SEARCH_QUERY)) { - searchQuery = args.getString(FileDisplayActivity.EXTRA_SEARCH_QUERY); +package com.owncloud.android.ui.preview + +import android.os.Bundle +import android.os.Handler +import android.view.LayoutInflater +import android.view.Menu +import android.view.MenuInflater +import android.view.MenuItem +import android.view.View +import android.view.ViewGroup +import androidx.appcompat.widget.SearchView +import androidx.core.view.MenuHost +import androidx.core.view.MenuProvider +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import com.google.android.material.floatingactionbutton.FloatingActionButton +import com.nextcloud.android.lib.richWorkspace.RichWorkspaceDirectEditingRemoteOperation +import com.owncloud.android.R +import com.owncloud.android.ui.activity.FileActivity +import com.owncloud.android.ui.activity.FileDisplayActivity +import com.owncloud.android.utils.DisplayUtils +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +@Suppress("TooGenericExceptionThrown") +class PreviewTextStringFragment : PreviewTextFragment() { + private var isEditorWebviewLaunched = false + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.run { + searchQuery = getString(FileActivity.EXTRA_SEARCH_QUERY, "") + searchOpen = getBoolean(FileActivity.EXTRA_SEARCH, false) } - searchOpen = args.getBoolean(FileDisplayActivity.EXTRA_SEARCH, false); - - handler = new Handler(); + handler = Handler() } - /** - * {@inheritDoc} - */ - @Override - public void onSaveInstanceState(@NonNull Bundle outState) { - FileExtensionsKt.logFileSize(getFile(), TAG); - outState.putParcelable(PreviewTextStringFragment.EXTRA_FILE, getFile()); - - super.onSaveInstanceState(outState); + override fun onSaveInstanceState(outState: Bundle) { + outState.putParcelable(EXTRA_FILE, file) + super.onSaveInstanceState(outState) } - @Override - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = super.onCreateView(inflater, container, savedInstanceState); + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { + val view = super.onCreateView(inflater, container, savedInstanceState) + ?: throw RuntimeException("View can not be null") - if (view == null) { - throw new RuntimeException("View may not be null"); + requireActivity().findViewById(R.id.fab_main).apply { + visibility = View.VISIBLE + isEnabled = true + setOnClickListener { edit() } + setImageResource(R.drawable.ic_edit) + viewThemeUtils.material.themeFAB(this) } - FloatingActionButton fabMain = requireActivity().findViewById(R.id.fab_main); - fabMain.setVisibility(View.VISIBLE); - fabMain.setEnabled(true); - fabMain.setOnClickListener(v -> edit()); - - fabMain.setImageResource(R.drawable.ic_edit); - viewThemeUtils.material.themeFAB(fabMain); - - return view; + addMenuProvider() + return view } - @Override - public void onStart() { - if (isEditorWebviewLaunched && containerActivity instanceof FileDisplayActivity fileDisplayActivity) { - fileDisplayActivity.getSupportFragmentManager().popBackStack(); - fileDisplayActivity.onRefresh(); + override fun onStart() { + super.onStart() + if (isEditorWebviewLaunched && containerActivity is FileDisplayActivity) { + (containerActivity as FileDisplayActivity).run { + supportFragmentManager.popBackStack() + onRefresh() + } } - - super.onStart(); } - /** - * {@inheritDoc} - */ - @Override - public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { - super.onCreateOptionsMenu(menu, inflater); - - MenuItem menuItem = menu.findItem(R.id.action_search); - menuItem.setVisible(true); - searchView = (SearchView) MenuItemCompat.getActionView(menuItem); - searchView.setOnQueryTextListener(this); - searchView.setMaxWidth(Integer.MAX_VALUE); - viewThemeUtils.androidx.themeToolbarSearchView(searchView); - - if (searchOpen) { - searchView.setIconified(false); - searchView.setQuery(searchQuery, true); - searchView.clearFocus(); - } + private fun addMenuProvider() { + (requireActivity() as MenuHost).addMenuProvider( + object : MenuProvider { + override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) { + menu.findItem(R.id.action_search).apply { + isVisible = true + searchView = (actionView as? SearchView)?.also { sv -> + sv.setOnQueryTextListener(this@PreviewTextStringFragment) + sv.maxWidth = Int.MAX_VALUE + viewThemeUtils.androidx.themeToolbarSearchView(sv) + if (searchOpen) { + sv.isIconified = false + sv.setQuery(searchQuery, true) + sv.clearFocus() + } + } + } + } + + override fun onMenuItemSelected(menuItem: MenuItem) = false + }, + viewLifecycleOwner, + Lifecycle.State.RESUMED + ) } - public void loadAndShowTextPreview() { - originalText = getFile().getRichWorkspace(); - setText(binding.textPreview, originalText, getFile(), requireActivity(), true, false, viewThemeUtils); - - binding.textPreview.setVisibility(View.VISIBLE); - binding.emptyListProgress.setVisibility(View.GONE); + override fun loadAndShowTextPreview() { + originalText = file.richWorkspace + setText(binding.textPreview, originalText, file, requireActivity(), true, false, viewThemeUtils) + binding.textPreview.visibility = View.VISIBLE + binding.emptyListProgress.visibility = View.GONE } - private void edit() { - new Thread(() -> { - RemoteOperationResult result = new RichWorkspaceDirectEditingRemoteOperation(getFile().getRemotePath()) - .execute(accountManager.getUser(), getContext()); - - if (result.isSuccess()) { - String url = (String) result.getSingleData(); - containerActivity.getFileOperationsHelper().openRichWorkspaceWithTextEditor(getFile(), - url, - getContext()); - isEditorWebviewLaunched = true; + private fun edit() { + lifecycleScope.launch(Dispatchers.IO) { + val result = RichWorkspaceDirectEditingRemoteOperation(file.remotePath) + .execute(accountManager.user, context) + + if (result.isSuccess) { + containerActivity?.getFileOperationsHelper()?.openRichWorkspaceWithTextEditor( + file, + result.singleData as? String, + context + ) + isEditorWebviewLaunched = true } else { - DisplayUtils.showSnackMessage(getView(), "Error"); + withContext(Dispatchers.Main) { + activity?.let { + DisplayUtils.showSnackMessage( + it, + R.string.preview_text_string_fragment_open_rich_text_editor_error_message + ) + } + } } - }).start(); + } } - // TODO on close clean search query + companion object { + private const val EXTRA_FILE = "FILE" + } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1052b1ef70c6..217220d051d4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -6,6 +6,7 @@ ~ SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only --> + Failed to open text editor All files Favorites Assistant