From 5f70ea643ec9cd61436b873d863cb317b1f4172e Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 19 Dec 2019 14:54:06 +0100 Subject: [PATCH 1/5] Make hyperlinks clickable in markdown previews Resolves: #5030 Signed-off-by: Andy Scherzinger --- .../ui/preview/PreviewTextFragment.java | 26 ++++++++++++++++--- src/main/res/values/strings.xml | 1 + 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java b/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java index 7937e296d9af..6bc76c64524d 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java @@ -20,6 +20,7 @@ package com.owncloud.android.ui.preview; import android.content.Context; +import android.content.Intent; import android.graphics.Color; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; @@ -28,6 +29,7 @@ import android.text.Html; import android.text.Spanned; import android.text.TextPaint; +import android.text.method.LinkMovementMethod; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -35,6 +37,7 @@ import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.TextView; +import android.widget.Toast; import com.nextcloud.client.account.UserAccountManager; import com.nextcloud.client.di.Injectable; @@ -51,6 +54,7 @@ import androidx.appcompat.widget.SearchView; import io.noties.markwon.AbstractMarkwonPlugin; import io.noties.markwon.Markwon; +import io.noties.markwon.MarkwonConfiguration; import io.noties.markwon.core.MarkwonTheme; import io.noties.markwon.ext.strikethrough.StrikethroughPlugin; import io.noties.markwon.ext.tables.TablePlugin; @@ -189,6 +193,19 @@ public void configureTheme(@NonNull MarkwonTheme.Builder builder) { textPaint.setColorFilter(new PorterDuffColorFilter(ThemeUtils.primaryColor(context), PorterDuff.Mode.SRC_ATOP)); builder.linkColor(ThemeUtils.primaryColor(context, true)); } + + @Override + public void configureConfiguration(@NonNull MarkwonConfiguration.Builder builder) { + builder.linkResolver((view, link) -> { + try { + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(link)); + DisplayUtils.startIntentIfAppAvailable(intent, getActivity(), R.string.no_browser_available); + } catch (Throwable throwable) { + Toast.makeText(context, R.string.error_opening_link, Toast.LENGTH_SHORT).show(); + } + + }); + } }) .usePlugin(TablePlugin.create(context)) .usePlugin(TaskListPlugin.create(drawable)) @@ -207,9 +224,12 @@ protected void finish() { getActivity().runOnUiThread(() -> getActivity().onBackPressed()); } - public static void setText(TextView textView, String text, Context context) { - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN && context != null) { - textView.setText(getRenderedMarkdownText(context, text)); + private void setText(TextView textView, String text, OCFile file) { + if (MimeTypeUtil.MIMETYPE_TEXT_MARKDOWN.equals(file.getMimeType()) + android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN + && context != null) { + textView.setMovementMethod(LinkMovementMethod.getInstance()); + textView.setText(getRenderedMarkdownText(getContext(), text)); } else { textView.setText(text); } diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index ce9b735178a2..b5ea15b059e2 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -907,5 +907,6 @@ folder file Share internal link + Error opening link Edit From a15f7248ffd4ee6ed7ba18153b328a3f2ac2c029 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 19 Dec 2019 14:54:06 +0100 Subject: [PATCH 2/5] Make hyperlinks clickable in markdown previews Resolves: #5030 Signed-off-by: Andy Scherzinger --- .../com/owncloud/android/ui/preview/PreviewTextFragment.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java b/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java index 6bc76c64524d..77a255b380c1 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java @@ -53,9 +53,12 @@ import androidx.annotation.NonNull; import androidx.appcompat.widget.SearchView; import io.noties.markwon.AbstractMarkwonPlugin; +import io.noties.markwon.LinkResolver; +import io.noties.markwon.LinkResolverDef; import io.noties.markwon.Markwon; import io.noties.markwon.MarkwonConfiguration; import io.noties.markwon.core.MarkwonTheme; +import io.noties.markwon.core.spans.LinkSpan; import io.noties.markwon.ext.strikethrough.StrikethroughPlugin; import io.noties.markwon.ext.tables.TablePlugin; import io.noties.markwon.ext.tasklist.TaskListDrawable; From 154b9af5331dacdf2c0cccc470e1514da2b98dfb Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Mon, 6 Jan 2020 10:10:28 +0100 Subject: [PATCH 3/5] adjusted to master Signed-off-by: tobiasKaminsky --- .../nextcloud/client/di/ComponentsModule.java | 4 + .../ui/activity/FileDisplayActivity.java | 2 +- .../android/ui/adapter/OCFileListAdapter.java | 94 +++++++++---------- .../ui/preview/PreviewTextFileFragment.java | 4 +- .../ui/preview/PreviewTextFragment.java | 42 +++++---- .../ui/preview/PreviewTextStringFragment.java | 2 +- 6 files changed, 78 insertions(+), 70 deletions(-) diff --git a/src/main/java/com/nextcloud/client/di/ComponentsModule.java b/src/main/java/com/nextcloud/client/di/ComponentsModule.java index efcbe05ed1d9..d7be3d0b6926 100644 --- a/src/main/java/com/nextcloud/client/di/ComponentsModule.java +++ b/src/main/java/com/nextcloud/client/di/ComponentsModule.java @@ -76,6 +76,7 @@ import com.owncloud.android.ui.preview.PreviewImageActivity; import com.owncloud.android.ui.preview.PreviewImageFragment; import com.owncloud.android.ui.preview.PreviewMediaFragment; +import com.owncloud.android.ui.preview.PreviewTextFileFragment; import com.owncloud.android.ui.preview.PreviewTextFragment; import com.owncloud.android.ui.preview.PreviewTextStringFragment; import com.owncloud.android.ui.preview.PreviewVideoActivity; @@ -139,6 +140,9 @@ abstract class ComponentsModule { @ContributesAndroidInjector abstract ContactListFragment chooseContactListFragment(); @ContributesAndroidInjector abstract PreviewMediaFragment previewMediaFragment(); @ContributesAndroidInjector abstract PreviewTextFragment previewTextFragment(); + + @ContributesAndroidInjector + abstract PreviewTextFileFragment previewTextFileFragment(); @ContributesAndroidInjector abstract PreviewTextStringFragment previewTextStringFragment(); @ContributesAndroidInjector abstract PhotoFragment photoFragment(); diff --git a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java index 1362d567e5a3..1cb4a8c18513 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -2371,7 +2371,7 @@ public void startTextPreview(OCFile file, boolean showPreview) { args.putBoolean(EXTRA_SEARCH, searchOpen); args.putString(EXTRA_SEARCH_QUERY, searchQuery); Fragment textPreviewFragment = Fragment.instantiate(getApplicationContext(), - PreviewTextFragment.class.getName(), args); + PreviewTextFileFragment.class.getName(), args); setSecondFragment(textPreviewFragment); updateFragmentsVisibility(true); updateActionBarTitleAndHomeButton(file); diff --git a/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java b/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java index 293bbf17a570..2cca0809b191 100644 --- a/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java +++ b/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java @@ -25,8 +25,8 @@ package com.owncloud.android.ui.adapter; import android.accounts.AccountManager; +import android.app.Activity; import android.content.ContentValues; -import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.PorterDuff; @@ -106,12 +106,12 @@ public class OCFileListAdapter extends RecyclerView.Adapter mFiles = new ArrayList<>(); private List mFilesAll = new ArrayList<>(); - private boolean mHideItemOptions; + private boolean hideItemOptions; private long lastTimestamp; private boolean gridView; private boolean multiSelect; @@ -136,7 +136,7 @@ public class OCFileListAdapter extends RecyclerView.Adapter(); this.transferServiceGetter = transferServiceGetter; if (this.user != null) { - AccountManager platformAccountManager = AccountManager.get(mContext); + AccountManager platformAccountManager = AccountManager.get(this.activity); userId = platformAccountManager.getUserData(this.user.toPlatformAccount(), com.owncloud.android.lib.common.accounts.AccountUtils.Constants.KEY_USER_ID); } else { @@ -285,28 +285,28 @@ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int default: case VIEWTYPE_ITEM: if (gridView) { - View itemView = LayoutInflater.from(mContext).inflate(R.layout.grid_item, parent, false); + View itemView = LayoutInflater.from(activity).inflate(R.layout.grid_item, parent, false); return new OCFileListGridItemViewHolder(itemView); } else { - View itemView = LayoutInflater.from(mContext).inflate(R.layout.list_item, parent, false); + View itemView = LayoutInflater.from(activity).inflate(R.layout.list_item, parent, false); return new OCFileListItemViewHolder(itemView); } case VIEWTYPE_IMAGE: if (gridView) { - View itemView = LayoutInflater.from(mContext).inflate(R.layout.grid_image, parent, false); + View itemView = LayoutInflater.from(activity).inflate(R.layout.grid_image, parent, false); return new OCFileListGridImageViewHolder(itemView); } else { - View itemView = LayoutInflater.from(mContext).inflate(R.layout.list_item, parent, false); + View itemView = LayoutInflater.from(activity).inflate(R.layout.list_item, parent, false); return new OCFileListItemViewHolder(itemView); } case VIEWTYPE_FOOTER: - View itemView = LayoutInflater.from(mContext).inflate(R.layout.list_footer, parent, false); + View itemView = LayoutInflater.from(activity).inflate(R.layout.list_footer, parent, false); return new OCFileListFooterViewHolder(itemView); case VIEWTYPE_HEADER: - View headerView = LayoutInflater.from(mContext).inflate(R.layout.list_header, parent, false); + View headerView = LayoutInflater.from(activity).inflate(R.layout.list_header, parent, false); ViewGroup.LayoutParams layoutParams = headerView.getLayoutParams(); layoutParams.height = (int) (parent.getHeight() * 0.3); @@ -321,7 +321,7 @@ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int positi if (holder instanceof OCFileListFooterViewHolder) { OCFileListFooterViewHolder footerViewHolder = (OCFileListFooterViewHolder) holder; footerViewHolder.footerText.setText(getFooterText()); - footerViewHolder.progressBar.getIndeterminateDrawable().setColorFilter(ThemeUtils.primaryColor(mContext), + footerViewHolder.progressBar.getIndeterminateDrawable().setColorFilter(ThemeUtils.primaryColor(activity), PorterDuff.Mode.SRC_IN); footerViewHolder.progressBar.setVisibility( ocFileListFragmentInterface.isLoading() ? View.VISIBLE : View.GONE); @@ -329,7 +329,7 @@ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int positi OCFileListHeaderViewHolder headerViewHolder = (OCFileListHeaderViewHolder) holder; String text = currentDirectory.getRichWorkspace(); - PreviewTextFragment.setText(headerViewHolder.headerText, text, mContext); + PreviewTextFragment.setText(headerViewHolder.headerText, text, getItem(position), activity); headerViewHolder.headerView.setOnClickListener(v -> ocFileListFragmentInterface.onHeaderClicked()); } else { OCFileListGridImageViewHolder gridViewHolder = (OCFileListGridImageViewHolder) holder; @@ -342,21 +342,21 @@ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int positi setThumbnail(file, gridViewHolder.thumbnail); if (highlightedItem != null && file.getFileId() == highlightedItem.getFileId()) { - gridViewHolder.itemLayout.setBackgroundColor(mContext.getResources() + gridViewHolder.itemLayout.setBackgroundColor(activity.getResources() .getColor(R.color.selected_item_background)); } else if (isCheckedFile(file)) { - gridViewHolder.itemLayout.setBackgroundColor(mContext.getResources() + gridViewHolder.itemLayout.setBackgroundColor(activity.getResources() .getColor(R.color.selected_item_background)); gridViewHolder.checkbox.setImageDrawable(ThemeUtils.tintDrawable(R.drawable.ic_checkbox_marked, - ThemeUtils.primaryColor(mContext))); + ThemeUtils.primaryColor(activity))); } else { - gridViewHolder.itemLayout.setBackgroundColor(mContext.getResources().getColor(R.color.bg_default)); + gridViewHolder.itemLayout.setBackgroundColor(activity.getResources().getColor(R.color.bg_default)); gridViewHolder.checkbox.setImageResource(R.drawable.ic_checkbox_blank_outline); } gridViewHolder.itemLayout.setOnClickListener(v -> ocFileListFragmentInterface.onItemClicked(file)); - if (!mHideItemOptions) { + if (!hideItemOptions) { gridViewHolder.itemLayout.setLongClickable(true); gridViewHolder.itemLayout.setOnLongClickListener(v -> ocFileListFragmentInterface.onLongItemClicked(file)); @@ -374,11 +374,11 @@ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int positi if (holder instanceof OCFileListItemViewHolder) { OCFileListItemViewHolder itemViewHolder = (OCFileListItemViewHolder) holder; - Resources resources = mContext.getResources(); + Resources resources = activity.getResources(); float avatarRadius = resources.getDimension(R.dimen.list_item_avatar_icon_radius); if ((file.isSharedWithMe() || file.isSharedWithSharee()) && !multiSelect && !gridView && - !mHideItemOptions) { + !hideItemOptions) { itemViewHolder.sharedAvatars.setVisibility(View.VISIBLE); itemViewHolder.sharedAvatars.removeAllViews(); @@ -396,14 +396,14 @@ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int positi Log_OC.d(this, "sharees of " + file.getFileName() + ": " + sharees); int shareeSize = Math.min(sharees.size(), 3); - int w = DisplayUtils.convertDpToPixel(40, mContext); - int margin = DisplayUtils.convertDpToPixel(24, mContext); + int w = DisplayUtils.convertDpToPixel(40, activity); + int margin = DisplayUtils.convertDpToPixel(24, activity); int size = 60 * (shareeSize - 1) + w; for (int i = 0; i < shareeSize; i++) { ShareeUser sharee = file.getSharees().get(i); - ImageView avatar = new ImageView(mContext); + ImageView avatar = new ImageView(activity); if (i == 0 && sharees.size() > 3) { avatar.setImageResource(R.drawable.ic_people); @@ -427,7 +427,7 @@ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int positi avatarRadius, resources, avatar, - mContext); + activity); } } @@ -464,10 +464,10 @@ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int positi } else { itemViewHolder.fileSize.setText(DisplayUtils.bytesToHumanReadable(file.getFileLength())); } - itemViewHolder.lastModification.setText(DisplayUtils.getRelativeTimestamp(mContext, + itemViewHolder.lastModification.setText(DisplayUtils.getRelativeTimestamp(activity, file.getModificationTimestamp())); - if (multiSelect || gridView || mHideItemOptions) { + if (multiSelect || gridView || hideItemOptions) { itemViewHolder.overflowMenu.setVisibility(View.GONE); } else { itemViewHolder.overflowMenu.setVisibility(View.VISIBLE); @@ -530,7 +530,7 @@ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int positi } } - if (mHideItemOptions || (file.isFolder() && !file.canReshare())) { + if (hideItemOptions || (file.isFolder() && !file.canReshare())) { gridViewHolder.shared.setVisibility(View.GONE); } else { showShareIcon(gridViewHolder, file); @@ -545,7 +545,7 @@ private void showFederatedShareAvatar(String user, float avatarRadius, Resources String server = split[1]; String url = "https://" + server + "/index.php/avatar/" + userId + "/" + - DisplayUtils.convertDpToPixel(avatarRadius, mContext); + DisplayUtils.convertDpToPixel(avatarRadius, activity); Drawable placeholder; try { @@ -556,7 +556,7 @@ private void showFederatedShareAvatar(String user, float avatarRadius, Resources } avatar.setTag(null); - Glide.with(mContext).load(url) + Glide.with(activity).load(url) .asBitmap() .placeholder(placeholder) .error(placeholder) @@ -564,7 +564,7 @@ private void showFederatedShareAvatar(String user, float avatarRadius, Resources @Override protected void setResource(Bitmap resource) { RoundedBitmapDrawable circularBitmapDrawable = - RoundedBitmapDrawableFactory.create(mContext.getResources(), resource); + RoundedBitmapDrawableFactory.create(activity.getResources(), resource); circularBitmapDrawable.setCircular(true); avatar.setImageDrawable(circularBitmapDrawable); } @@ -576,7 +576,7 @@ private void setThumbnail(OCFile file, ImageView thumbnailView) { thumbnailView.setImageDrawable(MimeTypeUtil .getFolderTypeIcon(file.isSharedWithMe() || file.isSharedWithSharee(), file.isSharedViaLink(), file.isEncrypted(), - file.getMountType(), mContext)); + file.getMountType(), activity)); } else { if (file.getRemoteId() != null && file.isPreviewAvailable()) { // Thumbnail in cache? @@ -606,10 +606,10 @@ private void setThumbnail(OCFile file, ImageView thumbnailView) { MimeTypeUtil.getFileTypeIcon(file.getMimeType(), file.getFileName(), user.toPlatformAccount(), - mContext)); + activity)); } final ThumbnailsCacheManager.AsyncThumbnailDrawable asyncDrawable = - new ThumbnailsCacheManager.AsyncThumbnailDrawable(mContext.getResources(), + new ThumbnailsCacheManager.AsyncThumbnailDrawable(activity.getResources(), thumbnail, task); thumbnailView.setImageDrawable(asyncDrawable); asyncTasks.add(task); @@ -622,13 +622,13 @@ private void setThumbnail(OCFile file, ImageView thumbnailView) { } if ("image/png".equalsIgnoreCase(file.getMimeType())) { - thumbnailView.setBackgroundColor(mContext.getResources().getColor(R.color.bg_default)); + thumbnailView.setBackgroundColor(activity.getResources().getColor(R.color.bg_default)); } } else { thumbnailView.setImageDrawable(MimeTypeUtil.getFileTypeIcon(file.getMimeType(), file.getFileName(), user.toPlatformAccount(), - mContext)); + activity)); } } } @@ -656,7 +656,7 @@ private String getFooterText() { private String generateFooterText(int filesCount, int foldersCount) { String output; - Resources resources = mContext.getResources(); + Resources resources = activity.getResources(); if (filesCount + foldersCount <= 0) { output = ""; @@ -723,14 +723,14 @@ private void showShareIcon(OCFileListGridImageViewHolder gridViewHolder, OCFile } else { sharedIconView.setVisibility(View.VISIBLE); sharedIconView.setImageResource(R.drawable.shared_via_users); - sharedIconView.setContentDescription(mContext.getString(R.string.shared_icon_shared)); + sharedIconView.setContentDescription(activity.getString(R.string.shared_icon_shared)); } } else if (file.isSharedViaLink()) { sharedIconView.setImageResource(R.drawable.shared_via_link); - sharedIconView.setContentDescription(mContext.getString(R.string.shared_icon_shared_via_link)); + sharedIconView.setContentDescription(activity.getString(R.string.shared_icon_shared_via_link)); } else { sharedIconView.setImageResource(R.drawable.ic_unshared); - sharedIconView.setContentDescription(mContext.getString(R.string.shared_icon_share)); + sharedIconView.setContentDescription(activity.getString(R.string.shared_icon_share)); } if (accountManager.accountOwnsFile(file, user.toPlatformAccount())) { sharedIconView.setOnClickListener(view -> ocFileListFragmentInterface.onShareIconClick(file)); @@ -795,7 +795,7 @@ public void setData(List objects, ExtendedListFragment.SearchType search } if (mStorageManager == null) { - mStorageManager = new FileDataStorageManager(user.toPlatformAccount(), mContext.getContentResolver()); + mStorageManager = new FileDataStorageManager(user.toPlatformAccount(), activity.getContentResolver()); } if (clear) { @@ -856,12 +856,12 @@ private void parseShares(List objects) { // get ocFile from Server to have an up-to-date copy RemoteOperationResult result = new ReadFileRemoteOperation(ocShare.getPath()).execute(user.toPlatformAccount(), - mContext); + activity); if (result.isSuccess()) { OCFile file = FileStorageUtils.fillOCFile((RemoteFile) result.getData().get(0)); FileStorageUtils.searchForLocalFileInDefaultPath(file, user.toPlatformAccount()); - file = mStorageManager.saveFileWithParent(file, mContext); + file = mStorageManager.saveFileWithParent(file, activity); ShareType newShareType = ocShare.getShareType(); if (newShareType == ShareType.PUBLIC_LINK) { @@ -922,7 +922,7 @@ private void parseVirtuals(List objects, ExtendedListFragment.SearchType mStorageManager.saveFile(ocFile); } else { - ocFile = mStorageManager.saveFileWithParent(ocFile, mContext); + ocFile = mStorageManager.saveFileWithParent(ocFile, activity); // also sync folder content if (ocFile.isFolder()) { @@ -933,8 +933,8 @@ private void parseVirtuals(List objects, ExtendedListFragment.SearchType false, mStorageManager, user.toPlatformAccount(), - mContext); - refreshFolderOperation.execute(user.toPlatformAccount(), mContext); + activity); + refreshFolderOperation.execute(user.toPlatformAccount(), activity); } } diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewTextFileFragment.java b/src/main/java/com/owncloud/android/ui/preview/PreviewTextFileFragment.java index cbed5ebef449..959bd6857d2e 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewTextFileFragment.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewTextFileFragment.java @@ -215,7 +215,7 @@ protected void onPostExecute(final StringWriter stringWriter) { mOriginalText = stringWriter.toString(); mSearchView.setOnQueryTextListener(PreviewTextFileFragment.this); - setText(textView, mOriginalText, getContext()); + setText(textView, mOriginalText, getFile(), requireActivity()); if (mSearchOpen) { mSearchView.setQuery(mSearchQuery, true); @@ -226,9 +226,7 @@ protected void onPostExecute(final StringWriter stringWriter) { if (mMultiView != null) { mMultiView.setVisibility(View.GONE); } - } - } /** diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java b/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java index 77a255b380c1..3ee762de666f 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java @@ -19,11 +19,12 @@ package com.owncloud.android.ui.preview; -import android.content.Context; +import android.app.Activity; import android.content.Intent; import android.graphics.Color; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; +import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.text.Html; @@ -42,9 +43,12 @@ import com.nextcloud.client.account.UserAccountManager; import com.nextcloud.client.di.Injectable; import com.owncloud.android.R; +import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.ui.activity.FileDisplayActivity; import com.owncloud.android.ui.fragment.FileFragment; +import com.owncloud.android.utils.DisplayUtils; +import com.owncloud.android.utils.MimeTypeUtil; import com.owncloud.android.utils.StringUtils; import com.owncloud.android.utils.ThemeUtils; @@ -53,12 +57,9 @@ import androidx.annotation.NonNull; import androidx.appcompat.widget.SearchView; import io.noties.markwon.AbstractMarkwonPlugin; -import io.noties.markwon.LinkResolver; -import io.noties.markwon.LinkResolverDef; import io.noties.markwon.Markwon; import io.noties.markwon.MarkwonConfiguration; import io.noties.markwon.core.MarkwonTheme; -import io.noties.markwon.core.spans.LinkSpan; import io.noties.markwon.ext.strikethrough.StrikethroughPlugin; import io.noties.markwon.ext.tables.TablePlugin; import io.noties.markwon.ext.tasklist.TaskListDrawable; @@ -172,7 +173,7 @@ private void performSearch(final String query, int delay) { mTextPreview.setText(Html.fromHtml(coloredText.replace("\n", "
"))); } } else { - setText(mTextPreview, mOriginalText, getContext()); + setText(mTextPreview, mOriginalText, getFile(), requireActivity()); } }, delay); } @@ -182,19 +183,20 @@ private void performSearch(final String query, int delay) { } } - protected static Spanned getRenderedMarkdownText(Context context, String markdown) { + protected static Spanned getRenderedMarkdownText(Activity activity, String markdown) { Prism4j prism4j = new Prism4j(new MarkwonGrammarLocator()); Prism4jTheme prism4jTheme = Prism4jThemeDefault.create(); TaskListDrawable drawable = new TaskListDrawable(Color.GRAY, Color.GRAY, Color.WHITE); - drawable.setColorFilter(ThemeUtils.primaryColor(context, true), PorterDuff.Mode.SRC_ATOP); + drawable.setColorFilter(ThemeUtils.primaryColor(activity, true), PorterDuff.Mode.SRC_ATOP); - final Markwon markwon = Markwon.builder(context) + final Markwon markwon = Markwon.builder(activity) .usePlugin(new AbstractMarkwonPlugin() { @Override public void configureTheme(@NonNull MarkwonTheme.Builder builder) { TextPaint textPaint = new TextPaint(); - textPaint.setColorFilter(new PorterDuffColorFilter(ThemeUtils.primaryColor(context), PorterDuff.Mode.SRC_ATOP)); - builder.linkColor(ThemeUtils.primaryColor(context, true)); + textPaint.setColorFilter(new PorterDuffColorFilter(ThemeUtils.primaryColor(activity), + PorterDuff.Mode.SRC_ATOP)); + builder.linkColor(ThemeUtils.primaryColor(activity, true)); } @Override @@ -202,15 +204,15 @@ public void configureConfiguration(@NonNull MarkwonConfiguration.Builder builder builder.linkResolver((view, link) -> { try { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(link)); - DisplayUtils.startIntentIfAppAvailable(intent, getActivity(), R.string.no_browser_available); + DisplayUtils.startIntentIfAppAvailable(intent, activity, R.string.no_browser_available); } catch (Throwable throwable) { - Toast.makeText(context, R.string.error_opening_link, Toast.LENGTH_SHORT).show(); + Toast.makeText(activity, R.string.error_opening_link, Toast.LENGTH_SHORT).show(); } }); } }) - .usePlugin(TablePlugin.create(context)) + .usePlugin(TablePlugin.create(activity)) .usePlugin(TaskListPlugin.create(drawable)) .usePlugin(StrikethroughPlugin.create()) .usePlugin(HtmlPlugin.create()) @@ -227,12 +229,16 @@ protected void finish() { getActivity().runOnUiThread(() -> getActivity().onBackPressed()); } - private void setText(TextView textView, String text, OCFile file) { - if (MimeTypeUtil.MIMETYPE_TEXT_MARKDOWN.equals(file.getMimeType()) - android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN - && context != null) { + public static void setText(TextView textView, String text, OCFile file, Activity activity) { + setText(textView, text, file, activity, false); + } + + public static void setText(TextView textView, String text, OCFile file, Activity activity, boolean ignoreMimetype) { + if ((MimeTypeUtil.MIMETYPE_TEXT_MARKDOWN.equals(file.getMimeType()) || ignoreMimetype) && + android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN + && activity != null) { textView.setMovementMethod(LinkMovementMethod.getInstance()); - textView.setText(getRenderedMarkdownText(getContext(), text)); + textView.setText(getRenderedMarkdownText(activity, text)); } else { textView.setText(text); } diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewTextStringFragment.java b/src/main/java/com/owncloud/android/ui/preview/PreviewTextStringFragment.java index 4a4912f95413..044924b9d70c 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewTextStringFragment.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewTextStringFragment.java @@ -145,7 +145,7 @@ public void onPrepareOptionsMenu(@NonNull Menu menu) { void loadAndShowTextPreview() { if (mTextPreview != null) { mOriginalText = getFile().getRichWorkspace(); - setText(mTextPreview, mOriginalText, getContext()); + setText(mTextPreview, mOriginalText, getFile(), requireActivity(), true); mTextPreview.setVisibility(View.VISIBLE); } From a680697529530c39f7d86cddad0c7c2bdf85b82f Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Mon, 6 Jan 2020 12:00:30 +0100 Subject: [PATCH 4/5] Removed unneeded try/catch Signed-off-by: tobiasKaminsky --- .../android/ui/preview/PreviewTextFragment.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java b/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java index 3ee762de666f..c5ee6e743f1b 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.java @@ -38,7 +38,6 @@ import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.TextView; -import android.widget.Toast; import com.nextcloud.client.account.UserAccountManager; import com.nextcloud.client.di.Injectable; @@ -202,13 +201,8 @@ public void configureTheme(@NonNull MarkwonTheme.Builder builder) { @Override public void configureConfiguration(@NonNull MarkwonConfiguration.Builder builder) { builder.linkResolver((view, link) -> { - try { - Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(link)); - DisplayUtils.startIntentIfAppAvailable(intent, activity, R.string.no_browser_available); - } catch (Throwable throwable) { - Toast.makeText(activity, R.string.error_opening_link, Toast.LENGTH_SHORT).show(); - } - + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(link)); + DisplayUtils.startIntentIfAppAvailable(intent, activity, R.string.no_browser_available); }); } }) From 5fce6caea406ee36e6c9512152cffddb6edaeb2a Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Mon, 6 Jan 2020 12:00:47 +0100 Subject: [PATCH 5/5] Removed unneeded try/catch Signed-off-by: tobiasKaminsky --- src/main/java/com/nextcloud/client/di/ComponentsModule.java | 3 +-- src/main/res/values/strings.xml | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/com/nextcloud/client/di/ComponentsModule.java b/src/main/java/com/nextcloud/client/di/ComponentsModule.java index d7be3d0b6926..e5c44dbf5cc1 100644 --- a/src/main/java/com/nextcloud/client/di/ComponentsModule.java +++ b/src/main/java/com/nextcloud/client/di/ComponentsModule.java @@ -141,8 +141,7 @@ abstract class ComponentsModule { @ContributesAndroidInjector abstract PreviewMediaFragment previewMediaFragment(); @ContributesAndroidInjector abstract PreviewTextFragment previewTextFragment(); - @ContributesAndroidInjector - abstract PreviewTextFileFragment previewTextFileFragment(); + @ContributesAndroidInjector abstract PreviewTextFileFragment previewTextFileFragment(); @ContributesAndroidInjector abstract PreviewTextStringFragment previewTextStringFragment(); @ContributesAndroidInjector abstract PhotoFragment photoFragment(); diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index b5ea15b059e2..ce9b735178a2 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -907,6 +907,5 @@ folder file Share internal link - Error opening link Edit