diff --git a/app/src/main/java/com/jens/automation2/ActivityManageActionTriggerUrl.java b/app/src/main/java/com/jens/automation2/ActivityManageActionTriggerUrl.java index 8922205..8c9dcf5 100644 --- a/app/src/main/java/com/jens/automation2/ActivityManageActionTriggerUrl.java +++ b/app/src/main/java/com/jens/automation2/ActivityManageActionTriggerUrl.java @@ -6,6 +6,9 @@ import android.content.DialogInterface; import android.content.Intent; import android.os.Build; import android.os.Bundle; +import android.text.Editable; +import android.text.TextWatcher; +import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; @@ -27,9 +30,13 @@ import androidx.annotation.NonNull; import com.jens.automation2.Action.Action_Enum; import org.apache.commons.lang3.StringUtils; +import org.w3c.dom.Text; +import java.net.MalformedURLException; +import java.net.URL; import java.util.ArrayList; import java.util.Map; +import java.util.regex.Pattern; public class ActivityManageActionTriggerUrl extends Activity { @@ -39,7 +46,7 @@ public class ActivityManageActionTriggerUrl extends Activity CheckBox chkTriggerUrlUseAuthentication; RadioButton rbTriggerUrlMethodGet, rbTriggerUrlMethodPost; TableLayout tlTriggerUrlAuthentication; - TextView tvHttpParameterExplanation; + TextView tvHttpParameterExplanation, tvUrlValidator; ArrayAdapter httpParametersAdapter; private ArrayList httpParamsList = new ArrayList<>(); @@ -70,6 +77,7 @@ public class ActivityManageActionTriggerUrl extends Activity etParameterValue = (EditText)findViewById(R.id.etParameterValue); bAddHttpParam = (Button)findViewById(R.id.bAddHttpParam); tvHttpParameterExplanation = (TextView)findViewById(R.id.tvHttpParameterExplanation); + tvUrlValidator = (TextView)findViewById(R.id.tvUrlValidator); etParameterName.setEnabled(false); etParameterValue.setEnabled(false); @@ -173,6 +181,33 @@ public class ActivityManageActionTriggerUrl extends Activity }); updateListView(); + etTriggerUrl.addTextChangedListener(new TextWatcher() + { + @Override + public void afterTextChanged(Editable editable) + { + if(etTriggerUrl.getText() != null && etTriggerUrl.getText().length() > 0) + { + if(Miscellaneous.isValidUrl(etTriggerUrl.getText().toString())) + tvUrlValidator.setText(""); + else + tvUrlValidator.setText(getResources().getString(R.string.enter_valid_url)); + } + } + + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) + { + + } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) + { + + } + }); + if(getIntent().hasExtra(ActivityManageRule.intentNameActionParameter2)) { // username,password,URL,etc. diff --git a/app/src/main/java/com/jens/automation2/Miscellaneous.java b/app/src/main/java/com/jens/automation2/Miscellaneous.java index 4bd38ef..d1d98ce 100644 --- a/app/src/main/java/com/jens/automation2/Miscellaneous.java +++ b/app/src/main/java/com/jens/automation2/Miscellaneous.java @@ -105,6 +105,8 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Scanner; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; @@ -133,6 +135,9 @@ public class Miscellaneous extends Service protected final static String httpMainData = "httpMainData"; protected final static String doNoEncodingString = "NoEncoding"; protected final static String httpEncoding = "UTF-8"; + protected final static String URL_REGEX = "^(https?):\\/\\/([a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*)(:[0-9]{1,5})?([\\/\\?#].*)?$"; +// protected final static String URL_REGEX = "^(https?|ftp):\\/\\/([a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*)(:[0-9]{1,5})?([\\/\\?#].*)?$"; + protected final static Pattern URL_PATTERN = Pattern.compile(URL_REGEX, Pattern.CASE_INSENSITIVE); public static Context startupContext; public static final String lineSeparator = System.getProperty("line.separator"); @@ -2428,4 +2433,13 @@ public class Miscellaneous extends Service StackTraceElement callingFrame = Thread.currentThread().getStackTrace()[4]; return callingFrame.getMethodName(); } + + public static boolean isValidUrl(String input) + { + if (input == null || input.length() == 0) + return false; + + Matcher matcher = URL_PATTERN.matcher(input); + return matcher.matches(); // Returns true if the entire string matches + } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_manage_action_trigger_url.xml b/app/src/main/res/layout/activity_manage_action_trigger_url.xml index 3280b32..e1dc667 100644 --- a/app/src/main/res/layout/activity_manage_action_trigger_url.xml +++ b/app/src/main/res/layout/activity_manage_action_trigger_url.xml @@ -35,6 +35,12 @@ + + I do not keep a list of possible settings. Please find those settings on your own. See here for some (incomplete) examples. If any parameter name starts with %1$s while method is POST, it will not be transmitted like the other parameters (with key=value), but transferred as main data. If the parameter ends with %2$s, no encoding will be performed. Target + Enter a valid URL. \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/150.txt b/fastlane/metadata/android/en-US/changelogs/150.txt index 2ff3310..0f5c7c1 100644 --- a/fastlane/metadata/android/en-US/changelogs/150.txt +++ b/fastlane/metadata/android/en-US/changelogs/150.txt @@ -1,2 +1,3 @@ * Added: Triggers and actions can now be cloned +* Added: URL checker for triggerUrl action * Fixed: Crash when starting to add/edit a triggerURL action while the app or the system are set to the German language \ No newline at end of file