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.java deleted file mode 100644 index b9aa3f092a5f..000000000000 --- a/app/src/main/java/com/owncloud/android/ui/preview/PreviewTextStringFragment.java +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Nextcloud - Android Client - * - * 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); - } - searchOpen = args.getBoolean(FileDisplayActivity.EXTRA_SEARCH, false); - - handler = new Handler(); - } - - /** - * {@inheritDoc} - */ - @Override - public void onSaveInstanceState(@NonNull Bundle outState) { - FileExtensionsKt.logFileSize(getFile(), TAG); - outState.putParcelable(PreviewTextStringFragment.EXTRA_FILE, getFile()); - - super.onSaveInstanceState(outState); - } - - @Override - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = super.onCreateView(inflater, container, savedInstanceState); - - if (view == null) { - throw new RuntimeException("View may not be null"); - } - - 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; - } - - @Override - public void onStart() { - if (isEditorWebviewLaunched && containerActivity instanceof FileDisplayActivity fileDisplayActivity) { - fileDisplayActivity.getSupportFragmentManager().popBackStack(); - fileDisplayActivity.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(); - } - } - - 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); - } - - 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; - } else { - DisplayUtils.showSnackMessage(getView(), "Error"); - } - }).start(); - } - - // TODO on close clean search query -} 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 new file mode 100644 index 000000000000..a381647ae034 --- /dev/null +++ b/app/src/main/java/com/owncloud/android/ui/preview/PreviewTextStringFragment.kt @@ -0,0 +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 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) + } + handler = Handler() + } + + override fun onSaveInstanceState(outState: Bundle) { + outState.putParcelable(EXTRA_FILE, file) + super.onSaveInstanceState(outState) + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { + val view = super.onCreateView(inflater, container, savedInstanceState) + ?: throw RuntimeException("View can 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) + } + + addMenuProvider() + return view + } + + override fun onStart() { + super.onStart() + if (isEditorWebviewLaunched && containerActivity is FileDisplayActivity) { + (containerActivity as FileDisplayActivity).run { + supportFragmentManager.popBackStack() + onRefresh() + } + } + } + + 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 + ) + } + + 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 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 { + withContext(Dispatchers.Main) { + activity?.let { + DisplayUtils.showSnackMessage( + it, + R.string.preview_text_string_fragment_open_rich_text_editor_error_message + ) + } + } + } + } + } + + 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