From 9fb2eb2d2b3816e45a3d0a44d0b19bec9ec52af7 Mon Sep 17 00:00:00 2001 From: Damir Rakhimulin <46053683+dionep@users.noreply.github.com> Date: Thu, 7 Oct 2021 21:23:07 +0300 Subject: [PATCH] Add visual support for links after scanning --- .../binaryeye/fragment/DecodeFragment.kt | 9 ++++++ .../android/binaryeye/link_utils/getLinks.kt | 29 +++++++++++++++++++ app/src/main/res/layout/fragment_decode.xml | 25 ++++++++++++---- 3 files changed, 57 insertions(+), 6 deletions(-) create mode 100644 app/src/main/kotlin/de/markusfisch/android/binaryeye/link_utils/getLinks.kt diff --git a/app/src/main/kotlin/de/markusfisch/android/binaryeye/fragment/DecodeFragment.kt b/app/src/main/kotlin/de/markusfisch/android/binaryeye/fragment/DecodeFragment.kt index 50abb683..1f44db23 100644 --- a/app/src/main/kotlin/de/markusfisch/android/binaryeye/fragment/DecodeFragment.kt +++ b/app/src/main/kotlin/de/markusfisch/android/binaryeye/fragment/DecodeFragment.kt @@ -6,6 +6,7 @@ import android.support.design.widget.FloatingActionButton import android.support.v4.app.Fragment import android.text.Editable import android.text.TextWatcher +import android.text.method.LinkMovementMethod import android.view.* import android.widget.EditText import android.widget.TableLayout @@ -24,6 +25,7 @@ import de.markusfisch.android.binaryeye.database.Scan import de.markusfisch.android.binaryeye.io.askForFileName import de.markusfisch.android.binaryeye.io.toSaveResult import de.markusfisch.android.binaryeye.io.writeExternalFile +import de.markusfisch.android.binaryeye.link_utils.getLinks import de.markusfisch.android.binaryeye.view.setPaddingFromWindowInsets import de.markusfisch.android.binaryeye.widget.toast import kotlinx.coroutines.CoroutineScope @@ -32,11 +34,13 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.launch class DecodeFragment : Fragment() { + private lateinit var contentView: EditText private lateinit var formatView: TextView private lateinit var dataView: TableLayout private lateinit var metaView: TableLayout private lateinit var hexView: TextView + private lateinit var linksView: TextView private lateinit var format: String private lateinit var fab: FloatingActionButton @@ -84,6 +88,7 @@ class DecodeFragment : Fragment() { format = scan.format contentView = view.findViewById(R.id.content) + linksView = view.findViewById(R.id.links) fab = view.findViewById(R.id.open) if (!isBinary) { @@ -115,6 +120,10 @@ class DecodeFragment : Fragment() { if (prefs.openImmediately) { executeAction(content.toByteArray()) } + + linksView.text = getLinks(inputContent).joinToString("\n") + linksView.movementMethod = LinkMovementMethod.getInstance() + } else { contentView.setText(R.string.binary_data) contentView.isEnabled = false diff --git a/app/src/main/kotlin/de/markusfisch/android/binaryeye/link_utils/getLinks.kt b/app/src/main/kotlin/de/markusfisch/android/binaryeye/link_utils/getLinks.kt new file mode 100644 index 00000000..bcb058cf --- /dev/null +++ b/app/src/main/kotlin/de/markusfisch/android/binaryeye/link_utils/getLinks.kt @@ -0,0 +1,29 @@ +package de.markusfisch.android.binaryeye.link_utils + +import java.util.regex.Pattern + +private val urlPattern: Pattern = Pattern.compile( + "(?:^|[\\W])((ht|f)tp(s?):\\/\\/|www\\.)" + + "(([\\w\\-]+\\.){1,}?([\\w\\-.~]+\\/?)*" + + "[\\p{Alnum}.,%_=?&#\\-+()\\[\\]\\*$~@!:/{};']*)", + Pattern.CASE_INSENSITIVE or Pattern.MULTILINE or Pattern.DOTALL +) + +fun getLinks(text: String): List { + val matcher = urlPattern.matcher(text) + + val urls = mutableListOf() + + while (matcher.find()) { + val matchStart = matcher.start(1) + val matchEnd = matcher.end() + + var url = text.substring(matchStart, matchEnd) + if (!url.startsWith("http://") && !url.startsWith("https://")) + url = "https://$url" + + urls.add(url) + } + + return urls +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_decode.xml b/app/src/main/res/layout/fragment_decode.xml index 1e345b1a..d42373db 100644 --- a/app/src/main/res/layout/fragment_decode.xml +++ b/app/src/main/res/layout/fragment_decode.xml @@ -51,10 +51,10 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/data" - android:layout_marginEnd="16dp" android:layout_marginStart="16dp" android:layout_marginLeft="16dp" - android:layout_marginRight="16dp"/> + android:layout_marginEnd="16dp" + android:layout_marginRight="16dp" /> + android:typeface="monospace" + tools:text="54 65 73 74 20 51 52 20 Test QR\n43 6F 64 65 Code" /> + + + + android:src="@drawable/ic_action_open" />