diff --git a/app/src/main/java/com/trianguloy/urlchecker/modules/list/PatternModule.java b/app/src/main/java/com/trianguloy/urlchecker/modules/list/PatternModule.java index 8dc84c2..7f63aad 100644 --- a/app/src/main/java/com/trianguloy/urlchecker/modules/list/PatternModule.java +++ b/app/src/main/java/com/trianguloy/urlchecker/modules/list/PatternModule.java @@ -128,9 +128,6 @@ class PatternDialog extends AModuleDialog { // get regex (must exists) if (!data.has("regex")) continue; - // applied previously? - message.applied = urlData.getData(APPLIED + pattern) != null; - // encode if required if (data.optBoolean("encode")) { url = URLEncoder.encode(url); @@ -156,9 +153,8 @@ class PatternDialog extends AModuleDialog { var replacements = data.opt("replacement"); if (replacements != null) { // data exists - if (replacements instanceof JSONArray) { + if (replacements instanceof JSONArray replacementsArray) { // array, get random - var replacementsArray = (JSONArray) replacements; replacement = replacementsArray.getString(new Random().nextInt(replacementsArray.length())); } else { // single data, get that one @@ -177,14 +173,14 @@ class PatternDialog extends AModuleDialog { // automatic? apply if (data.optBoolean("automatic")) { - if (setNewUrl.apply(new UrlData(message.newUrl).putData(APPLIED + pattern, APPLIED))) return; + if (setNewUrl.apply(new UrlData(message.newUrl).putData(APPLIED + pattern, pattern))) return; } } } // add - if (message.applied || message.matches) messages.add(message); + if (message.matches) messages.add(message); } catch (Exception e) { // invalid pattern? ignore @@ -197,44 +193,51 @@ class PatternDialog extends AModuleDialog { public void onDisplayUrl(UrlData urlData) { // visualize box.removeAllViews(); - if (messages.isEmpty()) { - // no messages, all good + + // add applied + matching + for (var entry : urlData.getDataByPrefix(APPLIED)) { + addMessage(true, new Message(entry)); + } + for (var message : messages) { + addMessage(false, message); + } + + // set visibility + if (box.getChildCount() == 0) { txt_noPatterns.setVisibility(View.VISIBLE); setVisibility(false); } else { - // messages to show, set them txt_noPatterns.setVisibility(View.GONE); setVisibility(true); - - for (Message message : messages) { - // either matches and/or applied is true - View row = Inflater.inflate(R.layout.button_text, box); - - // text - TextView text = row.findViewById(R.id.text); - text.setText(message.applied - ? getActivity().getString(R.string.mPttrn_fixed, message.pattern) - : message.pattern - ); - AndroidUtils.setRoundedColor(message.matches ? R.color.warning : R.color.good, text); - - // button - Button fix = row.findViewById(R.id.button); - fix.setText(R.string.mPttrn_fix); - fix.setEnabled(message.newUrl != null); - if (message.newUrl != null) fix.setOnClickListener(v -> setUrl(new UrlData(message.newUrl).putData(APPLIED + message.pattern, APPLIED))); - } } } + /** Creates a new button for an applied/matching pattern */ + private void addMessage(boolean applied, Message message) { + View row = Inflater.inflate(R.layout.button_text, box); + + // text + TextView text = row.findViewById(R.id.text); + text.setText(applied + ? getActivity().getString(R.string.mPttrn_fixed, message.pattern) + : message.pattern + ); + AndroidUtils.setRoundedColor(message.matches ? R.color.warning : R.color.good, text); + + // button + Button fix = row.findViewById(R.id.button); + fix.setText(R.string.mPttrn_fix); + fix.setEnabled(message.newUrl != null); + if (message.newUrl != null) fix.setOnClickListener(v -> setUrl(new UrlData(message.newUrl).putData(APPLIED + message.pattern, message.pattern))); + } + /** * DataClass for pattern messages */ private static class Message { final String pattern; - boolean applied; - public boolean matches; - String newUrl; + public boolean matches = false; + String newUrl = null; public Message(String pattern) { this.pattern = pattern; diff --git a/app/src/main/java/com/trianguloy/urlchecker/url/UrlData.java b/app/src/main/java/com/trianguloy/urlchecker/url/UrlData.java index d2f6708..3ab172f 100644 --- a/app/src/main/java/com/trianguloy/urlchecker/url/UrlData.java +++ b/app/src/main/java/com/trianguloy/urlchecker/url/UrlData.java @@ -2,8 +2,9 @@ package com.trianguloy.urlchecker.url; import com.trianguloy.urlchecker.modules.AModuleDialog; -import java.util.HashMap; -import java.util.Map; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; /** * Manages an url and extra data associated with it @@ -58,7 +59,7 @@ public class UrlData { // ------------------- extra data ------------------- - private final Map extraData = new HashMap<>(); + private final LinkedHashMap extraData = new LinkedHashMap<>(); // keeps order /** * saves a key-value data, will be kept with automatic updates (but not with manual ones) @@ -75,11 +76,24 @@ public class UrlData { return extraData.get(key); } + /** Returns all entries with a given prefix, in insertion order */ + public List getDataByPrefix(String prefix) { + var entries = new ArrayList(); + for (var entry : extraData.entrySet()) { + if (entry.getKey().startsWith(prefix)) entries.add(entry.getValue()); + } + return entries; + } + /** - * adds all data from the parameter into this object + * adds all data from the parameter into this object. Keeps insertion order [...urlData.extraData,...this.extraData] */ public void mergeData(UrlData urlData) { + // there is no putAllFirst + var thisExtraData = new LinkedHashMap<>(extraData); + extraData.clear(); extraData.putAll(urlData.extraData); + extraData.putAll(thisExtraData); } @Override