diff --git a/app/src/main/java/com/trianguloy/urlchecker/dialogs/MainDialog.java b/app/src/main/java/com/trianguloy/urlchecker/dialogs/MainDialog.java index c656abc..8d17167 100644 --- a/app/src/main/java/com/trianguloy/urlchecker/dialogs/MainDialog.java +++ b/app/src/main/java/com/trianguloy/urlchecker/dialogs/MainDialog.java @@ -76,11 +76,8 @@ public class MainDialog extends Activity { // fire updates loop main_loop: - while (updating < MAX_UPDATES) { - - // test and mark looping times - if (urlData.disableUpdates) updating = MAX_UPDATES; - else updating++; + while (true) { + updating++; // first notify modules for (var module : modules.keySet()) { @@ -99,11 +96,23 @@ public class MainDialog extends Activity { // skip own if required if (!urlData.triggerOwn && module == urlData.trigger) continue; try { - var modifiedUrlData = module.onModifyUrl(urlData); - if (modifiedUrlData != null) { + var modifiedUrlData = new UrlData[]{null}; + module.onModifyUrl(urlData, newUrl -> { + // callback to replace the url. Alternative to throwing an exception and catch it here. + // can't use a return value directly because the caller needs to know if it should continue or not. + if (!urlData.disableUpdates && updating < MAX_UPDATES) { + // new url accepted + modifiedUrlData[0] = newUrl; + return true; + } else { + // a new url is not accepted + return false; + } + }); + if (modifiedUrlData[0] != null) { // modified, restart - modifiedUrlData.mergeData(urlData); - urlData = modifiedUrlData; + modifiedUrlData[0].mergeData(urlData); + urlData = modifiedUrlData[0]; continue main_loop; } } catch (Exception e) { diff --git a/app/src/main/java/com/trianguloy/urlchecker/modules/AModuleDialog.java b/app/src/main/java/com/trianguloy/urlchecker/modules/AModuleDialog.java index 5175f54..079a80a 100644 --- a/app/src/main/java/com/trianguloy/urlchecker/modules/AModuleDialog.java +++ b/app/src/main/java/com/trianguloy/urlchecker/modules/AModuleDialog.java @@ -5,6 +5,7 @@ import android.app.Activity; import com.trianguloy.urlchecker.dialogs.MainDialog; import com.trianguloy.urlchecker.fragments.Fragment; import com.trianguloy.urlchecker.url.UrlData; +import com.trianguloy.urlchecker.utilities.JavaUtils; import java.util.Map; @@ -33,10 +34,10 @@ public abstract class AModuleDialog implements Fragment { /** * Analyze and optionally modify an url. This may not be called for new modules. - * Return the new url if needed, null for no changes. + * To modify the url call the setNewUrl callback. It will return true iff you can stop processing changes (false if you need to continue). + * > if(setNewUrl.apply(new UrlData(""))) return; */ - public UrlData onModifyUrl(UrlData urlData) { - return null; + public void onModifyUrl(UrlData urlData, JavaUtils.Function setNewUrl) { } /** diff --git a/app/src/main/java/com/trianguloy/urlchecker/modules/list/ClearUrlModule.java b/app/src/main/java/com/trianguloy/urlchecker/modules/list/ClearUrlModule.java index b9e5773..817b343 100644 --- a/app/src/main/java/com/trianguloy/urlchecker/modules/list/ClearUrlModule.java +++ b/app/src/main/java/com/trianguloy/urlchecker/modules/list/ClearUrlModule.java @@ -16,6 +16,7 @@ import com.trianguloy.urlchecker.modules.companions.ClearUrlCatalog; import com.trianguloy.urlchecker.url.UrlData; import com.trianguloy.urlchecker.utilities.AndroidUtils; import com.trianguloy.urlchecker.utilities.GenericPref; +import com.trianguloy.urlchecker.utilities.JavaUtils; import org.json.JSONArray; import org.json.JSONException; @@ -135,7 +136,7 @@ class ClearUrlDialog extends AModuleDialog { } @Override - public UrlData onModifyUrl(UrlData urlData) { + public void onModifyUrl(UrlData urlData, JavaUtils.Function setNewUrl) { cleared = urlData.url; data = new Data(); @@ -283,7 +284,8 @@ class ClearUrlDialog extends AModuleDialog { // url changed if (!cleared.equals(urlData.url)) { // apply automatically if required - if (auto.get()) return new UrlData(cleared).putData(CLEARED, CLEARED); + if (auto.get()) + if (setNewUrl.apply(new UrlData(cleared).putData(CLEARED, CLEARED))) return; // enable button data.enabled = true; @@ -291,7 +293,6 @@ class ClearUrlDialog extends AModuleDialog { data.info += "\n\n -> " + cleared; } } - return null; } @Override 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 f3decfe..a8898d0 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 @@ -103,7 +103,7 @@ class PatternDialog extends AModuleDialog { } @Override - public UrlData onModifyUrl(UrlData urlData) { + public void onModifyUrl(UrlData urlData, JavaUtils.Function setNewUrl) { // init messages.clear(); String url = urlData.url; @@ -148,7 +148,7 @@ class PatternDialog extends AModuleDialog { // automatic? apply if (data.optBoolean("automatic")) { - return new UrlData(message.newUrl).putData(APPLIED + pattern, APPLIED); + if (setNewUrl.apply(new UrlData(message.newUrl).putData(APPLIED + pattern, APPLIED))) return; } } } @@ -162,9 +162,6 @@ class PatternDialog extends AModuleDialog { e.printStackTrace(); } } - - // nothing to replace - return null; } @Override