From 230f04b45fa9fa6f883fd831c5a4bd70c08d0144 Mon Sep 17 00:00:00 2001 From: TrianguloY Date: Sat, 15 Apr 2023 20:44:31 +0200 Subject: [PATCH] new 'Uri parts' module. Deprecates 'Queries Remover' resolves #169 --- .../urlchecker/modules/ModuleManager.java | 2 + .../modules/list/RemoveQueriesModule.java | 5 + .../modules/list/UriPartsModule.java | 199 ++++++++++++++++++ app/src/main/res/layout/dialog_parts.xml | 13 ++ app/src/main/res/layout/uri_part.xml | 31 +++ app/src/main/res/values/strings.xml | 12 +- 6 files changed, 260 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/trianguloy/urlchecker/modules/list/UriPartsModule.java create mode 100644 app/src/main/res/layout/dialog_parts.xml create mode 100644 app/src/main/res/layout/uri_part.xml diff --git a/app/src/main/java/com/trianguloy/urlchecker/modules/ModuleManager.java b/app/src/main/java/com/trianguloy/urlchecker/modules/ModuleManager.java index f4d6609..b64a51c 100644 --- a/app/src/main/java/com/trianguloy/urlchecker/modules/ModuleManager.java +++ b/app/src/main/java/com/trianguloy/urlchecker/modules/ModuleManager.java @@ -14,6 +14,7 @@ import com.trianguloy.urlchecker.modules.list.RemoveQueriesModule; import com.trianguloy.urlchecker.modules.list.StatusModule; import com.trianguloy.urlchecker.modules.list.TextInputModule; import com.trianguloy.urlchecker.modules.list.UnshortenModule; +import com.trianguloy.urlchecker.modules.list.UriPartsModule; import com.trianguloy.urlchecker.modules.list.VirusTotalModule; import com.trianguloy.urlchecker.utilities.GenericPref; @@ -41,6 +42,7 @@ public class ModuleManager { modules.add(new VirusTotalModule()); modules.add(new ClearUrlModule()); modules.add(new RemoveQueriesModule()); + modules.add(new UriPartsModule()); modules.add(new PatternModule()); modules.add(new HostsModule()); // new modules should preferably be added directly above this line diff --git a/app/src/main/java/com/trianguloy/urlchecker/modules/list/RemoveQueriesModule.java b/app/src/main/java/com/trianguloy/urlchecker/modules/list/RemoveQueriesModule.java index 54f6b27..de34afe 100644 --- a/app/src/main/java/com/trianguloy/urlchecker/modules/list/RemoveQueriesModule.java +++ b/app/src/main/java/com/trianguloy/urlchecker/modules/list/RemoveQueriesModule.java @@ -37,6 +37,11 @@ public class RemoveQueriesModule extends AModuleData { return R.string.mRemove_name; } + @Override + public boolean isEnabledByDefault() { + return false; + } + @Override public AModuleDialog getDialog(MainDialog cntx) { return new RemoveQueriesDialog(cntx); diff --git a/app/src/main/java/com/trianguloy/urlchecker/modules/list/UriPartsModule.java b/app/src/main/java/com/trianguloy/urlchecker/modules/list/UriPartsModule.java new file mode 100644 index 0000000..f580f9b --- /dev/null +++ b/app/src/main/java/com/trianguloy/urlchecker/modules/list/UriPartsModule.java @@ -0,0 +1,199 @@ +package com.trianguloy.urlchecker.modules.list; + +import android.net.Uri; +import android.util.Pair; +import android.view.View; +import android.widget.Button; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.trianguloy.urlchecker.R; +import com.trianguloy.urlchecker.activities.ModulesActivity; +import com.trianguloy.urlchecker.dialogs.MainDialog; +import com.trianguloy.urlchecker.modules.AModuleConfig; +import com.trianguloy.urlchecker.modules.AModuleData; +import com.trianguloy.urlchecker.modules.AModuleDialog; +import com.trianguloy.urlchecker.modules.DescriptionConfig; +import com.trianguloy.urlchecker.url.UrlData; +import com.trianguloy.urlchecker.utilities.AndroidUtils; +import com.trianguloy.urlchecker.utilities.Inflater; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +/** + * This module shows all parts of the url decoded + */ +public class UriPartsModule extends AModuleData { + + @Override + public String getId() { + return "uriparts"; + } + + @Override + public int getName() { + return R.string.mParts_name; + } + + @Override + public AModuleDialog getDialog(MainDialog cntx) { + return new UriPartsDialog(cntx); + } + + @Override + public AModuleConfig getConfig(ModulesActivity cntx) { + return new DescriptionConfig(R.string.mParts_desc); + } +} + +class UriPartsDialog extends AModuleDialog { + + private LinearLayout box; + + public UriPartsDialog(MainDialog dialog) { + super(dialog); + } + + @Override + public int getLayoutId() { + return R.layout.dialog_parts; + } + + @Override + public void onInitialize(View views) { + box = views.findViewById(R.id.box); + } + + @Override + public void onDisplayUrl(UrlData urlData) { + // clear + box.removeAllViews(); + + // parse + var uri = Uri.parse(urlData.url); + + // domain elements + if (uri.getAuthority() != null || uri.getScheme() != null) { + var domain = addGroup("Domain", null); + addPart("scheme", uri.getScheme(), domain, null); + addPart("user info", uri.getUserInfo(), domain, null); + addPart("host", uri.getHost(), domain, null); + addPart("port", uri.getPort() != -1 ? String.valueOf(uri.getPort()) : null, domain, null); + } + + // paths + var pathSegments = uri.getPathSegments(); + if (pathSegments.size() > 0) { + var paths = addGroup("Paths (" + pathSegments.size() + ")", uri.buildUpon().path(null)); + for (var i = 0; i < pathSegments.size(); i++) { + var pathSegment = pathSegments.get(i); + + var builder = uri.buildUpon(); + builder.path(null); + for (int newI = 0; newI < pathSegments.size(); newI++) { + if (newI != i) builder.appendPath(pathSegments.get(newI)); + } + addPart("/", pathSegment, paths, builder); + } + } + + // queries + var queryParts = getQueryParts(uri); + if (queryParts.size() > 0) { + var queries = addGroup("Queries (" + queryParts.size() + ")", uri.buildUpon().query(null)); + for (var queryPart : queryParts) { + var builder = uri.buildUpon(); + builder.query(null); + for (var newQuerypart : queryParts) { + if (!Objects.equals(newQuerypart, queryPart)) + builder.appendQueryParameter(newQuerypart.first, newQuerypart.second); + + } + addPart(queryPart.first, queryPart.second, queries, builder); + } + } + + // fragment + if (uri.getFragment() != null) { + var fragment = addGroup("Fragment", uri.buildUpon().fragment(null)); + addPart("#", uri.getFragment(), fragment, null); + } + + setVisibility(box.getChildCount() > 0); + } + + /** + * Adds a collapsible group, removes it + */ + private LinearLayout addGroup(String name, Uri.Builder onDelete) { + var title = Inflater.inflate(R.layout.uri_part, box); + title.findViewById(R.id.key).setVisibility(View.GONE); + + var name_view = title.findViewById(R.id.value); + name_view.setText(name); + AndroidUtils.setAsClickable(name_view); + + var delete_view = title.