Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ce32502eaa | ||
|
|
81812eba1b |
No files matched your search
+1
-5
@@ -7,7 +7,7 @@ android {
|
|||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "com.jens.automation2"
|
applicationId "com.jens.automation2"
|
||||||
minSdkVersion 24
|
minSdkVersion 19
|
||||||
compileSdkVersion 37
|
compileSdkVersion 37
|
||||||
buildToolsVersion '36.0.0'
|
buildToolsVersion '36.0.0'
|
||||||
useLibrary 'org.apache.http.legacy'
|
useLibrary 'org.apache.http.legacy'
|
||||||
@@ -84,8 +84,4 @@ dependencies {
|
|||||||
testImplementation 'junit:junit:4.13.2'
|
testImplementation 'junit:junit:4.13.2'
|
||||||
androidTestImplementation 'androidx.test.ext:junit:1.2.1'
|
androidTestImplementation 'androidx.test.ext:junit:1.2.1'
|
||||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
|
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
|
||||||
|
|
||||||
def shizuku_version = "13.1.5"
|
|
||||||
implementation "dev.rikka.shizuku:api:$shizuku_version"
|
|
||||||
implementation "dev.rikka.shizuku:provider:$shizuku_version"
|
|
||||||
}
|
}
|
||||||
@@ -82,8 +82,7 @@
|
|||||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
|
||||||
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
|
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
|
||||||
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
|
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
|
||||||
<uses-permission android:name="android.permission.TETHER_PRIVILEGED" />
|
|
||||||
dev.shadoe.delta.action.START_SOFT_AP
|
|
||||||
<uses-feature
|
<uses-feature
|
||||||
android:name="android.hardware.telephony"
|
android:name="android.hardware.telephony"
|
||||||
android:required="false" />
|
android:required="false" />
|
||||||
@@ -275,14 +274,6 @@
|
|||||||
android:exported="true"
|
android:exported="true"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<provider
|
|
||||||
android:name="rikka.shizuku.ShizukuProvider"
|
|
||||||
android:authorities="${applicationId}.shizuku"
|
|
||||||
android:enabled="true"
|
|
||||||
android:exported="true"
|
|
||||||
android:multiprocess="false"
|
|
||||||
android:permission="android.permission.INTERACT_ACROSS_USERS_FULL" />
|
|
||||||
|
|
||||||
<service android:name=".MyAccessibilityService"
|
<service android:name=".MyAccessibilityService"
|
||||||
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
|
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ import android.content.Intent;
|
|||||||
import android.media.AudioManager;
|
import android.media.AudioManager;
|
||||||
import android.media.MediaPlayer;
|
import android.media.MediaPlayer;
|
||||||
import android.net.ConnectivityManager;
|
import android.net.ConnectivityManager;
|
||||||
import android.net.TetheringManager;
|
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.net.wifi.WifiManager;
|
import android.net.wifi.WifiManager;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
@@ -74,8 +73,6 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.Executor;
|
|
||||||
import java.util.concurrent.Executors;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import javax.net.ssl.SSLContext;
|
import javax.net.ssl.SSLContext;
|
||||||
@@ -544,7 +541,7 @@ public class Actions
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(Build.VERSION.SDK_INT < 36)
|
else
|
||||||
{
|
{
|
||||||
MyOnStartTetheringCallback cb = new MyOnStartTetheringCallback()
|
MyOnStartTetheringCallback cb = new MyOnStartTetheringCallback()
|
||||||
{
|
{
|
||||||
@@ -567,13 +564,6 @@ public class Actions
|
|||||||
else
|
else
|
||||||
mowm.stopTethering();
|
mowm.stopTethering();
|
||||||
}
|
}
|
||||||
else // from Android 16 onwards
|
|
||||||
{
|
|
||||||
if(desiredState)
|
|
||||||
Actions.WifiTethering.enable(context);
|
|
||||||
else
|
|
||||||
Actions.WifiTethering.disable(context);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -1108,18 +1098,18 @@ public class Actions
|
|||||||
// {
|
// {
|
||||||
// ssf = new MySSLSocketFactory(ctx);
|
// ssf = new MySSLSocketFactory(ctx);
|
||||||
// ssf.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER);
|
// ssf.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER);
|
||||||
//
|
//
|
||||||
// char[] keystorePass="insecure".toCharArray(); //passphrase for keystore
|
// char[] keystorePass="insecure".toCharArray(); //passphrase for keystore
|
||||||
// KeyStore keyStore=KeyStore.getInstance("BKS");
|
// KeyStore keyStore=KeyStore.getInstance("BKS");
|
||||||
//
|
//
|
||||||
//// String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
|
//// String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
|
||||||
// TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
|
// TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
|
||||||
// tmf.init(keyStore);
|
// tmf.init(keyStore);
|
||||||
//
|
//
|
||||||
// Miscellaneous.logEvent("i", "SSL Keystore", context.getCacheDir().toString(), 4);
|
// Miscellaneous.logEvent("i", "SSL Keystore", context.getCacheDir().toString(), 4);
|
||||||
// InputStream is = context.getResources().openRawResource(R.raw.keystore);
|
// InputStream is = context.getResources().openRawResource(R.raw.keystore);
|
||||||
// keyStore.load(is,keystorePass);
|
// keyStore.load(is,keystorePass);
|
||||||
//
|
//
|
||||||
// ctx.init(null, tmf.getTrustManagers(), null);
|
// ctx.init(null, tmf.getTrustManagers(), null);
|
||||||
// }
|
// }
|
||||||
// else
|
// else
|
||||||
@@ -1232,10 +1222,7 @@ public class Actions
|
|||||||
else if (startupType.equals(ActivityManageActionStartActivity.startByForegroundServiceString) && Build.VERSION.SDK_INT >= 26)
|
else if (startupType.equals(ActivityManageActionStartActivity.startByForegroundServiceString) && Build.VERSION.SDK_INT >= 26)
|
||||||
automationServerRef.startForegroundService(externalApplicationIntent);
|
automationServerRef.startForegroundService(externalApplicationIntent);
|
||||||
else
|
else
|
||||||
{
|
|
||||||
externalApplicationIntent.addCategory("");
|
|
||||||
automationServerRef.sendBroadcast(externalApplicationIntent);
|
automationServerRef.sendBroadcast(externalApplicationIntent);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
@@ -2687,71 +2674,5 @@ public class Actions
|
|||||||
// }
|
// }
|
||||||
android.provider.Settings.Secure.putString(context.getContentResolver(), android.provider.Settings.Secure.LOCATION_MODE, String.valueOf(desiredState));
|
android.provider.Settings.Secure.putString(context.getContentResolver(), android.provider.Settings.Secure.LOCATION_MODE, String.valueOf(desiredState));
|
||||||
}
|
}
|
||||||
public static final class WifiTethering
|
|
||||||
{
|
|
||||||
private static final Executor EXECUTOR = Executors.newSingleThreadExecutor();
|
|
||||||
|
|
||||||
private WifiTethering()
|
|
||||||
{
|
|
||||||
// Utility class
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void enable(Context context)
|
|
||||||
{
|
|
||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.BAKLAVA)
|
|
||||||
{
|
|
||||||
throw new UnsupportedOperationException("TetheringManager requires Android 16 / API 36");
|
|
||||||
}
|
|
||||||
|
|
||||||
TetheringManager tetheringManager = context.getSystemService(TetheringManager.class);
|
|
||||||
|
|
||||||
TetheringManager.TetheringRequest request = new TetheringManager.TetheringRequest.Builder(TetheringManager.TETHERING_WIFI).build();
|
|
||||||
|
|
||||||
tetheringManager.startTethering(request, EXECUTOR, new TetheringManager.StartTetheringCallback() {
|
|
||||||
@Override
|
|
||||||
public void onTetheringStarted()
|
|
||||||
{
|
|
||||||
// Wi-Fi hotspot enabled
|
|
||||||
Miscellaneous.logEvent("i", "Tethering start", "Success", 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onTetheringFailed(int error)
|
|
||||||
{
|
|
||||||
// Hotspot could not be enabled
|
|
||||||
Miscellaneous.logEvent("i", "Tethering start", "Failure. Error code: " + String.valueOf(error), 3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void disable(Context context)
|
|
||||||
{
|
|
||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.BAKLAVA)
|
|
||||||
{
|
|
||||||
throw new UnsupportedOperationException("TetheringManager requires Android 16 / API 36");
|
|
||||||
}
|
|
||||||
|
|
||||||
TetheringManager tetheringManager = context.getSystemService(TetheringManager.class);
|
|
||||||
|
|
||||||
TetheringManager.TetheringRequest request = new TetheringManager.TetheringRequest.Builder(TetheringManager.TETHERING_WIFI).build();
|
|
||||||
// tetheringManager.stopTethering(TetheringManager.TETHERING_WIFI, EXECUTOR, new TetheringManager.StopTetheringCallback() {
|
|
||||||
tetheringManager.stopTethering(request, EXECUTOR, new TetheringManager.StopTetheringCallback() {
|
|
||||||
@Override
|
|
||||||
public void onStopTetheringSucceeded()
|
|
||||||
{
|
|
||||||
TetheringManager.StopTetheringCallback.super.onStopTetheringSucceeded();
|
|
||||||
Miscellaneous.logEvent("i", "Tethering stop", "Success", 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onStopTetheringFailed(int error)
|
|
||||||
{
|
|
||||||
// Hotspot could not be disabled
|
|
||||||
Miscellaneous.logEvent("i", "Tethering stop", "Failure. Error code: " + String.valueOf(error), 3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -6,6 +6,9 @@ import android.content.DialogInterface;
|
|||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.text.Editable;
|
||||||
|
import android.text.TextWatcher;
|
||||||
|
import android.view.KeyEvent;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.View.OnClickListener;
|
import android.view.View.OnClickListener;
|
||||||
import android.widget.AdapterView;
|
import android.widget.AdapterView;
|
||||||
@@ -27,9 +30,13 @@ import androidx.annotation.NonNull;
|
|||||||
import com.jens.automation2.Action.Action_Enum;
|
import com.jens.automation2.Action.Action_Enum;
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
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.ArrayList;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
public class ActivityManageActionTriggerUrl extends Activity
|
public class ActivityManageActionTriggerUrl extends Activity
|
||||||
{
|
{
|
||||||
@@ -39,7 +46,7 @@ public class ActivityManageActionTriggerUrl extends Activity
|
|||||||
CheckBox chkTriggerUrlUseAuthentication;
|
CheckBox chkTriggerUrlUseAuthentication;
|
||||||
RadioButton rbTriggerUrlMethodGet, rbTriggerUrlMethodPost;
|
RadioButton rbTriggerUrlMethodGet, rbTriggerUrlMethodPost;
|
||||||
TableLayout tlTriggerUrlAuthentication;
|
TableLayout tlTriggerUrlAuthentication;
|
||||||
TextView tvHttpParameterExplanation;
|
TextView tvHttpParameterExplanation, tvUrlValidator;
|
||||||
ArrayAdapter<String> httpParametersAdapter;
|
ArrayAdapter<String> httpParametersAdapter;
|
||||||
|
|
||||||
private ArrayList<String> httpParamsList = new ArrayList<>();
|
private ArrayList<String> httpParamsList = new ArrayList<>();
|
||||||
@@ -70,6 +77,7 @@ public class ActivityManageActionTriggerUrl extends Activity
|
|||||||
etParameterValue = (EditText)findViewById(R.id.etParameterValue);
|
etParameterValue = (EditText)findViewById(R.id.etParameterValue);
|
||||||
bAddHttpParam = (Button)findViewById(R.id.bAddHttpParam);
|
bAddHttpParam = (Button)findViewById(R.id.bAddHttpParam);
|
||||||
tvHttpParameterExplanation = (TextView)findViewById(R.id.tvHttpParameterExplanation);
|
tvHttpParameterExplanation = (TextView)findViewById(R.id.tvHttpParameterExplanation);
|
||||||
|
tvUrlValidator = (TextView)findViewById(R.id.tvUrlValidator);
|
||||||
|
|
||||||
etParameterName.setEnabled(false);
|
etParameterName.setEnabled(false);
|
||||||
etParameterValue.setEnabled(false);
|
etParameterValue.setEnabled(false);
|
||||||
@@ -173,6 +181,33 @@ public class ActivityManageActionTriggerUrl extends Activity
|
|||||||
});
|
});
|
||||||
updateListView();
|
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))
|
if(getIntent().hasExtra(ActivityManageRule.intentNameActionParameter2))
|
||||||
{
|
{
|
||||||
// username,password,URL,etc.
|
// username,password,URL,etc.
|
||||||
|
|||||||
@@ -105,6 +105,8 @@ import java.util.List;
|
|||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Scanner;
|
import java.util.Scanner;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
import java.util.zip.ZipEntry;
|
import java.util.zip.ZipEntry;
|
||||||
import java.util.zip.ZipInputStream;
|
import java.util.zip.ZipInputStream;
|
||||||
import java.util.zip.ZipOutputStream;
|
import java.util.zip.ZipOutputStream;
|
||||||
@@ -133,6 +135,9 @@ public class Miscellaneous extends Service
|
|||||||
protected final static String httpMainData = "httpMainData";
|
protected final static String httpMainData = "httpMainData";
|
||||||
protected final static String doNoEncodingString = "NoEncoding";
|
protected final static String doNoEncodingString = "NoEncoding";
|
||||||
protected final static String httpEncoding = "UTF-8";
|
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 Context startupContext;
|
||||||
|
|
||||||
public static final String lineSeparator = System.getProperty("line.separator");
|
public static final String lineSeparator = System.getProperty("line.separator");
|
||||||
@@ -2428,4 +2433,13 @@ public class Miscellaneous extends Service
|
|||||||
StackTraceElement callingFrame = Thread.currentThread().getStackTrace()[4];
|
StackTraceElement callingFrame = Thread.currentThread().getStackTrace()[4];
|
||||||
return callingFrame.getMethodName();
|
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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -35,6 +35,12 @@
|
|||||||
|
|
||||||
</EditText>
|
</EditText>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tvUrlValidator"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textColor="@color/red" />
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
|||||||
@@ -887,5 +887,5 @@
|
|||||||
<string name="enterAvalue">Geben Sie einen Wert ein.</string>
|
<string name="enterAvalue">Geben Sie einen Wert ein.</string>
|
||||||
<string name="setSystemSettingCapital">Systemeinstellung setzen</string>
|
<string name="setSystemSettingCapital">Systemeinstellung setzen</string>
|
||||||
<string name="examplesWriteSecureSettings">Ich führe keine Liste möglicher Einstellungen. Bitte finden Sie diese Einstellungen selbst. Siehe <a href="https://developer.android.com/reference/android/provider/Settings.Secure">hier</a> für einige (unvollständige) Beispiele.</string>
|
<string name="examplesWriteSecureSettings">Ich führe keine Liste möglicher Einstellungen. Bitte finden Sie diese Einstellungen selbst. Siehe <a href="https://developer.android.com/reference/android/provider/Settings.Secure">hier</a> für einige (unvollständige) Beispiele.</string>
|
||||||
<string name="httpParametersExplanation">Beginnt ein Parametername mit %1$s, während die Methode POST ist, wird er nicht wie die anderen Parameter (mit Schlüssel=Wert) übertragen, sondern als Hauptdaten übertragen. Wenn der Parameter mit 2 % endet, wird keine Codierung durchgeführt.</string>
|
<string name="httpParametersExplanation">Beginnt ein Parametername mit %1$s, während die Methode POST ist, wird er nicht wie die anderen Parameter (mit Schlüssel=Wert) übertragen, sondern als Hauptdaten übertragen. Wenn der Parameter mit %2$s endet, wird keine Codierung durchgeführt.</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -979,4 +979,5 @@
|
|||||||
<string name="examplesWriteSecureSettings">I do not keep a list of possible settings. Please find those settings on your own. See <a href="https://developer.android.com/reference/android/provider/Settings.Secure">here</a> for some (incomplete) examples.</string>
|
<string name="examplesWriteSecureSettings">I do not keep a list of possible settings. Please find those settings on your own. See <a href="https://developer.android.com/reference/android/provider/Settings.Secure">here</a> for some (incomplete) examples.</string>
|
||||||
<string name="httpParametersExplanation">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.</string>
|
<string name="httpParametersExplanation">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.</string>
|
||||||
<string name="target">Target</string>
|
<string name="target">Target</string>
|
||||||
|
<string name="enter_valid_url">Enter a valid URL.</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -1 +1,3 @@
|
|||||||
* Added: Triggers and actions can now be cloned
|
* 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
|
||||||
Reference in new issue
Block a user