Compare commits

..

13 Commits

Author SHA1 Message Date
jens 887e6de3e4 Distinction between settings 2026-05-14 20:22:58 +02:00
jens 5417b4e739 Small bugfixes 2026-04-12 12:47:59 +02:00
jens 7e72dfd19a Version 1.8.7 2026-03-06 22:22:34 +01:00
jens 23223480e5 Version 1.8.6 2026-03-06 22:05:01 +01:00
jens e3e2a87b5e Http request action streamlined to also cover the insecure setting in the same function. 2026-03-01 00:20:53 +01:00
jens 4cea4391eb Libraries updated 2026-02-28 22:52:42 +01:00
jens 63150ed8f6 Libraries updated 2026-02-27 23:56:04 +01:00
jens d986fcdf4d Upgraded to Gradle 8.13.2 2026-02-27 23:09:30 +01:00
jens ea57dd01e5 Upgraded to Gradle 8.4.2 2026-02-27 23:07:22 +01:00
jens 6f1f112d98 Further actions for trigger url action 2026-02-27 22:46:31 +01:00
jens 549c4f109e Merge remote-tracking branch 'origin/development' into development 2026-02-25 23:02:02 +01:00
jens d63841dd27 Further actions for trigger url action 2026-02-25 23:01:45 +01:00
jens 4913f9236b Version 1.8.5 2026-02-01 18:28:20 +01:00
43 changed files with 332 additions and 92 deletions
+15 -15
View File
@@ -3,16 +3,16 @@ plugins {
} }
android { android {
compileSdkVersion 34 compileSdkVersion 36
defaultConfig { defaultConfig {
applicationId "com.jens.automation2" applicationId "com.jens.automation2"
minSdkVersion 16 minSdkVersion 19
compileSdkVersion 34 compileSdkVersion 36
buildToolsVersion '34.0.0' buildToolsVersion '36.0.0'
useLibrary 'org.apache.http.legacy' useLibrary 'org.apache.http.legacy'
versionCode 145 versionCode 148
versionName "1.8.5" versionName "1.8.7"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
} }
@@ -36,7 +36,7 @@ android {
{ {
dimension "version" dimension "version"
versionNameSuffix "-googlePlay" versionNameSuffix "-googlePlay"
targetSdkVersion 35 targetSdkVersion 36
} }
/* /*
@@ -63,25 +63,25 @@ android {
checkReleaseBuilds false checkReleaseBuilds false
} }
namespace 'com.jens.automation2' namespace 'com.jens.automation2'
buildToolsVersion '34.0.0' buildToolsVersion '36.0.0'
} }
dependencies { dependencies {
implementation 'org.jetbrains:annotations:15.0' implementation 'org.jetbrains:annotations:26.1.0'
googlePlayFlavorImplementation 'com.google.firebase:firebase-appindexing:20.0.0' googlePlayFlavorImplementation 'com.google.firebase:firebase-appindexing:20.0.0'
googlePlayFlavorImplementation 'com.google.android.gms:play-services-location:18.0.0' googlePlayFlavorImplementation 'com.google.android.gms:play-services-location:20.0.0'
apkFlavorImplementation 'com.google.firebase:firebase-appindexing:20.0.0' apkFlavorImplementation 'com.google.firebase:firebase-appindexing:20.0.0'
apkFlavorImplementation 'com.google.android.gms:play-services-location:18.0.0' apkFlavorImplementation 'com.google.android.gms:play-services-location:20.0.0'
implementation 'com.linkedin.dexmaker:dexmaker:2.28.1' implementation 'com.linkedin.dexmaker:dexmaker:2.28.6'
implementation 'org.apache.commons:commons-lang3:3.0' implementation 'org.apache.commons:commons-lang3:3.20.0'
//implementation "androidx.security:security-crypto:1.0.0" //implementation "androidx.security:security-crypto:1.0.0"
//implementation "androidx.security:security-identity-credential:1.0.0-alpha02" //implementation "androidx.security:security-identity-credential:1.0.0-alpha02"
implementation 'androidx.appcompat:appcompat:1.4.2' implementation 'androidx.appcompat:appcompat:1.4.2'
implementation 'com.google.android.material:material:1.6.1' implementation 'com.google.android.material:material:1.6.1'
testImplementation 'junit:junit:4' testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3' 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'
} }
@@ -8,6 +8,7 @@ import android.widget.Toast;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import java.net.URLEncoder;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.Locale; import java.util.Locale;
@@ -523,7 +524,7 @@ public class Action
triggerUrl(context); triggerUrl(context);
break; break;
case setBluetooth: case setBluetooth:
Actions.setBluetooth(context, getParameter1(), toggleActionIfPossible); boolean result = Actions.setBluetooth(context, getParameter1(), toggleActionIfPossible);
break; break;
case setUsbTethering: case setUsbTethering:
Actions.setUsbTethering(context, getParameter1(), toggleActionIfPossible); Actions.setUsbTethering(context, getParameter1(), toggleActionIfPossible);
@@ -689,8 +690,8 @@ public class Action
try try
{ {
url = Miscellaneous.replaceVariablesInText(url, context); url = Miscellaneous.replaceVariablesInText(url, context);
if(!StringUtils.isEmpty(params)) // if(!StringUtils.isEmpty(params))
params = Miscellaneous.replaceVariablesInText(params, context); // params = URLEncoder.encode(Miscellaneous.replaceVariablesInText(params, context), "UTF-8");
Actions myAction = new Actions(); Actions myAction = new Actions();
@@ -729,7 +730,7 @@ public class Action
if(parameters.length >= 3) if(parameters.length >= 3)
{ {
urlUsername = parameters[1]; urlUsername = parameters[1];
urlPassword = parameters[2]; urlPassword = parameters[2];
if(parameters.length >= 4) if(parameters.length >= 4)
method = parameters[3]; method = parameters[3];
@@ -738,14 +739,24 @@ public class Action
{ {
// has params // has params
String[] paramPairs = parameters[4].split(Action.actionParameters2SeparatorOuter); String[] paramPairs = parameters[4].split(Action.actionParameters2SeparatorOuter);
String value = "";
for(String pair : paramPairs) for(String pair : paramPairs)
{ {
String[] pieces = pair.split(Action.actionParameters2SeparatorInner); String[] pieces = pair.split(Action.actionParameters2SeparatorInner);
if(pieces.length == 2)
httpParams.put(pieces[0], pieces[1]); try
{
value = Miscellaneous.replaceVariablesInText(pieces[1], Miscellaneous.getAnyContext());
}
catch (Exception e)
{
value = "error";
}
if(pieces.length == 2)
httpParams.put(pieces[0], value);
} }
} }
} }
String response = httpErrorDefaultText; String response = httpErrorDefaultText;
@@ -758,10 +769,10 @@ public class Action
Miscellaneous.logEvent("i", "HTTP Request", "Attempt " + String.valueOf(attempts++) + " of " + String.valueOf(Settings.httpAttempts), 3); Miscellaneous.logEvent("i", "HTTP Request", "Attempt " + String.valueOf(attempts++) + " of " + String.valueOf(Settings.httpAttempts), 3);
// Either thorough checking or no encryption // Either thorough checking or no encryption
if(!Settings.httpAcceptAllCertificates || !urlString.toLowerCase(Locale.getDefault()).contains("https")) // if(!Settings.httpAcceptAllCertificates || !urlString.toLowerCase(Locale.getDefault()).contains("https"))
response = Miscellaneous.downloadURL(urlString, urlUsername, urlPassword, method, httpParams); response = Miscellaneous.downloadURL(urlString, urlUsername, urlPassword, method, httpParams);
else // else
response = Miscellaneous.downloadUrlWithoutCertificateChecking(urlString, urlUsername, urlPassword, method, httpParams); // response = Miscellaneous.downloadUrlWithoutCertificateChecking(urlString, urlUsername, urlPassword, method, httpParams);
try try
{ {
@@ -260,17 +260,58 @@ public class Actions
ContentResolver cr = instance.getContentResolver(); ContentResolver cr = instance.getContentResolver();
//"String", "Long", "Int", "Float" }; // "String", "Long", "Int", "Float"
String[] parts = parameter2.split(Action.actionParameter2Split); String[] parts = parameter2.split(Action.actionParameter2Split, -1);
if (parts[0].equalsIgnoreCase("String")) if(parts.length == 3)
result = android.provider.Settings.Global.putString(cr, parts[1], parts[2]); {
else if (parts[0].equalsIgnoreCase("Long")) if (parts[0].equalsIgnoreCase("String"))
result = android.provider.Settings.Global.putLong(cr, parts[1], Long.parseLong(parts[2])); result = android.provider.Settings.Global.putString(cr, parts[1], parts[2]);
else if (parts[0].equalsIgnoreCase("Int")) else if (parts[0].equalsIgnoreCase("Long"))
result = android.provider.Settings.Global.putInt(cr, parts[1], Integer.parseInt(parts[2])); result = android.provider.Settings.Global.putLong(cr, parts[1], Long.parseLong(parts[2]));
else if (parts[0].equalsIgnoreCase("Float")) else if (parts[0].equalsIgnoreCase("Int"))
result = android.provider.Settings.Global.putFloat(cr, parts[1], Float.parseFloat(parts[2])); result = android.provider.Settings.Global.putInt(cr, parts[1], Integer.parseInt(parts[2]));
else if (parts[0].equalsIgnoreCase("Float"))
result = android.provider.Settings.Global.putFloat(cr, parts[1], Float.parseFloat(parts[2]));
}
else
{
if(parts[0].equals(ActivityManageActionSetSystemSetting.targets[0]))
{
if (parts[1].equalsIgnoreCase("String"))
result = android.provider.Settings.Global.putString(cr, parts[2], parts[3]);
else if (parts[1].equalsIgnoreCase("Long"))
result = android.provider.Settings.Global.putLong(cr, parts[2], Long.parseLong(parts[3]));
else if (parts[1].equalsIgnoreCase("Int"))
result = android.provider.Settings.Global.putInt(cr, parts[2], Integer.parseInt(parts[3]));
else if (parts[1].equalsIgnoreCase("Float"))
result = android.provider.Settings.Global.putFloat(cr, parts[2], Float.parseFloat(parts[3]));
}
else if(parts[0].equals(ActivityManageActionSetSystemSetting.targets[1]))
{
if (parts[1].equalsIgnoreCase("String"))
result = android.provider.Settings.System.putString(cr, parts[2], parts[3]);
else if (parts[1].equalsIgnoreCase("Long"))
result = android.provider.Settings.System.putLong(cr, parts[2], Long.parseLong(parts[3]));
else if (parts[1].equalsIgnoreCase("Int"))
result = android.provider.Settings.System.putInt(cr, parts[2], Integer.parseInt(parts[3]));
else if (parts[1].equalsIgnoreCase("Float"))
result = android.provider.Settings.System.putFloat(cr, parts[2], Float.parseFloat(parts[3]));
}
else if(parts[0].equals(ActivityManageActionSetSystemSetting.targets[2]))
{
if (parts[1].equalsIgnoreCase("String"))
result = android.provider.Settings.Secure.putString(cr, parts[2], parts[3]);
else if (parts[1].equalsIgnoreCase("Long"))
result = android.provider.Settings.Secure.putLong(cr, parts[2], Long.parseLong(parts[3]));
else if (parts[1].equalsIgnoreCase("Int"))
result = android.provider.Settings.Secure.putInt(cr, parts[2], Integer.parseInt(parts[3]));
else if (parts[1].equalsIgnoreCase("Float"))
result = android.provider.Settings.Secure.putFloat(cr, parts[2], Float.parseFloat(parts[3]));
}
else
result = false;
}
Miscellaneous.logEvent("i", "Variable", "Result of system setting change: " + String.valueOf(result), 4); Miscellaneous.logEvent("i", "Variable", "Result of system setting change: " + String.valueOf(result), 4);
@@ -825,7 +866,7 @@ public class Actions
public static Boolean setBluetooth(Context context, Boolean desiredState, boolean toggleActionIfPossible) public static Boolean setBluetooth(Context context, Boolean desiredState, boolean toggleActionIfPossible)
{ {
Miscellaneous.logEvent("i", "Bluetooth", "Changing bluetooth to " + String.valueOf(desiredState), 4); Miscellaneous.logEvent("i", "Bluetooth", "Changing bluetooth to " + String.valueOf(desiredState), 4);
// mPhone.setDataEnabled(enable);
try try
{ {
BluetoothAdapter myBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); BluetoothAdapter myBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
@@ -841,16 +882,16 @@ public class Actions
if (!myBluetoothAdapter.isEnabled() && desiredState) if (!myBluetoothAdapter.isEnabled() && desiredState)
{ {
Toast.makeText(context, context.getResources().getString(R.string.activating) + " Bluetooth.", Toast.LENGTH_LONG).show(); Toast.makeText(context, context.getResources().getString(R.string.activating) + " Bluetooth.", Toast.LENGTH_LONG).show();
myBluetoothAdapter.enable(); return myBluetoothAdapter.enable();
return true; //return true;
} }
// deactivate // deactivate
if (myBluetoothAdapter.isEnabled() && !desiredState) if (myBluetoothAdapter.isEnabled() && !desiredState)
{ {
Toast.makeText(context, context.getResources().getString(R.string.deactivating) + " Bluetooth.", Toast.LENGTH_LONG).show(); Toast.makeText(context, context.getResources().getString(R.string.deactivating) + " Bluetooth.", Toast.LENGTH_LONG).show();
myBluetoothAdapter.disable(); return myBluetoothAdapter.disable();
return true; //return true;
} }
} }
catch (NullPointerException e) catch (NullPointerException e)
@@ -5,6 +5,7 @@ import android.app.TabActivity;
import android.content.Intent; import android.content.Intent;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.content.res.Resources; import android.content.res.Resources;
import android.nfc.NfcAdapter;
import android.os.Bundle; import android.os.Bundle;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
import android.widget.TabHost; import android.widget.TabHost;
@@ -61,22 +62,24 @@ public class ActivityMainTabLayout extends TabActivity
tabHost.setCurrentTab(Settings.startScreen); tabHost.setCurrentTab(Settings.startScreen);
} }
@Override @Override
protected void onResume() protected void onResume()
{ {
super.onResume(); super.onResume();
Miscellaneous.setDisplayLanguage(this); Miscellaneous.setDisplayLanguage(this);
// Miscellaneous.logEvent("i", "NFC", "ActivityMainTabLayout.onResume().", 5); // Miscellaneous.logEvent("i", "NFC", "ActivityMainTabLayout.onResume().", 5);
NfcReceiver.checkIntentForNFC(this, getIntent()); if(!(getIntent().getAction() == null || getIntent().getAction().isEmpty()) && getIntent().getAction().equals(NfcAdapter.ACTION_NDEF_DISCOVERED))
// NfcReceiver.checkIntentForNFC(this, new Intent(this.getApplicationContext(), this.getClass())); {
NfcReceiver.checkIntentForNFC(this, getIntent());
moveTaskToBack(true);
}
} }
@Override @Override
protected void onNewIntent(Intent intent) protected void onNewIntent(Intent intent)
{ {
// Miscellaneous.logEvent("i", "NFC", "ActivityMainTabLayout.onNewIntent().", 5); // Miscellaneous.logEvent("i", "NFC", "ActivityMainTabLayout.onNewIntent().", 5);
// setIntent(intent);
NfcReceiver.checkIntentForNFC(this, intent); NfcReceiver.checkIntentForNFC(this, intent);
} }
} }
@@ -18,12 +18,13 @@ import android.widget.Toast;
public class ActivityManageActionSetSystemSetting extends Activity public class ActivityManageActionSetSystemSetting extends Activity
{ {
Spinner spinnerSettingDataType; Spinner spinnerSettingTarget, spinnerSettingDataType;
EditText etSettingName, etSettingValue; EditText etSettingName, etSettingValue;
Button bSaveSetSystemSetting; Button bSaveSetSystemSetting;
TextView tvSetSystemSettingExamples, tvSetSystemSettingNoticeWriteSecureSettings; TextView tvSetSystemSettingExamples, tvSetSystemSettingNoticeWriteSecureSettings;
ArrayAdapter<String> settingDataTypeSpinnerAdapter; ArrayAdapter<String> settingTargetSpinnerAdapter, settingDataTypeSpinnerAdapter;
protected final static String[] targets = { "Global", "System", "Secure" };
protected final static String[] dataTypes = { "String", "Long", "Int", "Float" }; protected final static String[] dataTypes = { "String", "Long", "Int", "Float" };
@Override @Override
@@ -34,6 +35,7 @@ public class ActivityManageActionSetSystemSetting extends Activity
Miscellaneous.setUiTheme(this); Miscellaneous.setUiTheme(this);
this.setContentView(R.layout.activity_manage_action_set_system_setting); this.setContentView(R.layout.activity_manage_action_set_system_setting);
spinnerSettingTarget = (Spinner) findViewById(R.id.spinnerSettingTarget);
spinnerSettingDataType = (Spinner) findViewById(R.id.spinnerSettingDataType); spinnerSettingDataType = (Spinner) findViewById(R.id.spinnerSettingDataType);
etSettingName = (EditText)findViewById(R.id.etSettingName); etSettingName = (EditText)findViewById(R.id.etSettingName);
etSettingValue = (EditText)findViewById(R.id.etSettingValue); etSettingValue = (EditText)findViewById(R.id.etSettingValue);
@@ -41,6 +43,10 @@ public class ActivityManageActionSetSystemSetting extends Activity
tvSetSystemSettingExamples = (TextView)findViewById(R.id.tvSetSystemSettingExamples); tvSetSystemSettingExamples = (TextView)findViewById(R.id.tvSetSystemSettingExamples);
tvSetSystemSettingNoticeWriteSecureSettings = (TextView)findViewById(R.id.tvSetSystemSettingNoticeWriteSecureSettings); tvSetSystemSettingNoticeWriteSecureSettings = (TextView)findViewById(R.id.tvSetSystemSettingNoticeWriteSecureSettings);
settingTargetSpinnerAdapter = new ArrayAdapter<String>(this, R.layout.text_view_for_poi_listview_mediumtextsize, targets);
spinnerSettingTarget.setAdapter(settingTargetSpinnerAdapter);
settingTargetSpinnerAdapter.notifyDataSetChanged();
settingDataTypeSpinnerAdapter = new ArrayAdapter<String>(this, R.layout.text_view_for_poi_listview_mediumtextsize, dataTypes); settingDataTypeSpinnerAdapter = new ArrayAdapter<String>(this, R.layout.text_view_for_poi_listview_mediumtextsize, dataTypes);
spinnerSettingDataType.setAdapter(settingDataTypeSpinnerAdapter); spinnerSettingDataType.setAdapter(settingDataTypeSpinnerAdapter);
settingDataTypeSpinnerAdapter.notifyDataSetChanged(); settingDataTypeSpinnerAdapter.notifyDataSetChanged();
@@ -52,6 +58,9 @@ public class ActivityManageActionSetSystemSetting extends Activity
else else
tvSetSystemSettingNoticeWriteSecureSettings.setVisibility(View.VISIBLE); tvSetSystemSettingNoticeWriteSecureSettings.setVisibility(View.VISIBLE);
// Make links clickable
tvSetSystemSettingNoticeWriteSecureSettings.setMovementMethod(LinkMovementMethod.getInstance());
spinnerSettingDataType.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() spinnerSettingDataType.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
{ {
@Override @Override
@@ -115,7 +124,7 @@ public class ActivityManageActionSetSystemSetting extends Activity
Intent returnIntent = new Intent(); Intent returnIntent = new Intent();
String param2Data = dataTypes[spinnerSettingDataType.getSelectedItemPosition()] + Action.actionParameter2Split + etSettingName.getText().toString() + Action.actionParameter2Split + etSettingValue.getText().toString(); String param2Data = targets[spinnerSettingTarget.getSelectedItemPosition()] + Action.actionParameter2Split + dataTypes[spinnerSettingDataType.getSelectedItemPosition()] + Action.actionParameter2Split + etSettingName.getText().toString() + Action.actionParameter2Split + etSettingValue.getText().toString();
returnIntent.putExtra(ActivityManageRule.intentNameActionParameter1, false); returnIntent.putExtra(ActivityManageRule.intentNameActionParameter1, false);
returnIntent.putExtra(ActivityManageRule.intentNameActionParameter2, param2Data); returnIntent.putExtra(ActivityManageRule.intentNameActionParameter2, param2Data);
@@ -125,18 +134,34 @@ public class ActivityManageActionSetSystemSetting extends Activity
} }
}); });
if(getIntent().hasExtra(ActivityManageRule.intentNameActionParameter2)) if(getIntent().hasExtra(ActivityManageRule.intentNameActionParameter2))
{ {
// dataType, setting name, setting value // dataType, setting name, setting value
String[] components = getIntent().getStringExtra(ActivityManageRule.intentNameActionParameter2).split(Action.actionParameter2Split); String[] components = getIntent().getStringExtra(ActivityManageRule.intentNameActionParameter2).split(Action.actionParameter2Split, -1);
int position = Miscellaneous.arraySearchIndexOf(dataTypes, components[0], false, true); if(components.length == 4)
if(position >= 0)
{ {
spinnerSettingDataType.setSelection(position); int positionTarget = Miscellaneous.arraySearchIndexOf(targets, components[0], false, true);
etSettingName.setText(components[1]); int positionDataType = Miscellaneous.arraySearchIndexOf(dataTypes, components[1], false, true);
etSettingValue.setText(components[2]);
if(positionDataType >= 0)
{
spinnerSettingTarget.setSelection(positionTarget);
spinnerSettingDataType.setSelection(positionDataType);
etSettingName.setText(components[2]);
etSettingValue.setText(components[3]);
}
}
else
{
int position = Miscellaneous.arraySearchIndexOf(dataTypes, components[0], false, true);
if (position >= 0)
{
spinnerSettingDataType.setSelection(position);
etSettingName.setText(components[1]);
etSettingValue.setText(components[2]);
}
} }
} }
} }
@@ -19,6 +19,7 @@ import android.widget.EditText;
import android.widget.ListView; import android.widget.ListView;
import android.widget.RadioButton; import android.widget.RadioButton;
import android.widget.TableLayout; import android.widget.TableLayout;
import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
@@ -38,6 +39,7 @@ public class ActivityManageActionTriggerUrl extends Activity
CheckBox chkTriggerUrlUseAuthentication; CheckBox chkTriggerUrlUseAuthentication;
RadioButton rbTriggerUrlMethodGet, rbTriggerUrlMethodPost; RadioButton rbTriggerUrlMethodGet, rbTriggerUrlMethodPost;
TableLayout tlTriggerUrlAuthentication; TableLayout tlTriggerUrlAuthentication;
TextView tvHttpParameterExplanation;
ArrayAdapter<String> httpParametersAdapter; ArrayAdapter<String> httpParametersAdapter;
private ArrayList<String> httpParamsList = new ArrayList<>(); private ArrayList<String> httpParamsList = new ArrayList<>();
@@ -67,6 +69,7 @@ public class ActivityManageActionTriggerUrl extends Activity
etParameterName = (EditText) findViewById(R.id.etParameterName); etParameterName = (EditText) findViewById(R.id.etParameterName);
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);
etParameterName.setEnabled(false); etParameterName.setEnabled(false);
etParameterValue.setEnabled(false); etParameterValue.setEnabled(false);
@@ -85,6 +88,8 @@ public class ActivityManageActionTriggerUrl extends Activity
} }
}); });
tvHttpParameterExplanation.setText(String.format(getResources().getString(R.string.httpParametersExplanation), Miscellaneous.httpMainData, Miscellaneous.doNoEncodingString));
httpParametersAdapter = new ArrayAdapter<String>(this, R.layout.text_view_for_poi_listview_mediumtextsize, httpParamsList); httpParametersAdapter = new ArrayAdapter<String>(this, R.layout.text_view_for_poi_listview_mediumtextsize, httpParamsList);
bSaveTriggerUrl.setOnClickListener(new OnClickListener() bSaveTriggerUrl.setOnClickListener(new OnClickListener()
@@ -677,6 +677,8 @@ public class ActivityPermissions extends Activity
addToArrayListUnique(Manifest.permission.BLUETOOTH, requiredPermissions); addToArrayListUnique(Manifest.permission.BLUETOOTH, requiredPermissions);
addToArrayListUnique(Manifest.permission.ACCESS_NETWORK_STATE, requiredPermissions); addToArrayListUnique(Manifest.permission.ACCESS_NETWORK_STATE, requiredPermissions);
addToArrayListUnique(Manifest.permission.WRITE_SETTINGS, requiredPermissions); addToArrayListUnique(Manifest.permission.WRITE_SETTINGS, requiredPermissions);
if(Build.VERSION.SDK_INT >= 31)
addToArrayListUnique(Manifest.permission.BLUETOOTH_CONNECT, requiredPermissions);
break; break;
case setDataConnection: case setDataConnection:
addToArrayListUnique(Manifest.permission.WRITE_SETTINGS, requiredPermissions); addToArrayListUnique(Manifest.permission.WRITE_SETTINGS, requiredPermissions);
@@ -796,7 +798,18 @@ public class ActivityPermissions extends Activity
break; break;
case setLocationService: case setLocationService:
case setSystemSetting: case setSystemSetting:
addToArrayListUnique(Manifest.permission.WRITE_SECURE_SETTINGS, requiredPermissions); String[] parts = action.getParameter2().split(Action.actionParameter2Split, -1);
if(parts.length < 4)
addToArrayListUnique(Manifest.permission.WRITE_SECURE_SETTINGS, requiredPermissions);
else
{
if(parts[0].equals(ActivityManageActionSetSystemSetting.targets[0]))
addToArrayListUnique(Manifest.permission.WRITE_SECURE_SETTINGS, requiredPermissions);
else if(parts[0].equals(ActivityManageActionSetSystemSetting.targets[1]))
addToArrayListUnique(Manifest.permission.WRITE_SETTINGS, requiredPermissions);
else if(parts[0].equals(ActivityManageActionSetSystemSetting.targets[2]))
addToArrayListUnique(Manifest.permission.WRITE_SECURE_SETTINGS, requiredPermissions);
}
break; break;
case setScreenBrightness: case setScreenBrightness:
addToArrayListUnique(Manifest.permission.WRITE_SETTINGS, requiredPermissions); addToArrayListUnique(Manifest.permission.WRITE_SETTINGS, requiredPermissions);
@@ -92,6 +92,7 @@ import java.security.KeyManagementException;
import java.security.KeyStore; import java.security.KeyStore;
import java.security.MessageDigest; import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException; import java.security.cert.CertificateException;
import java.security.cert.X509Certificate; import java.security.cert.X509Certificate;
import java.text.DateFormat; import java.text.DateFormat;
@@ -128,10 +129,34 @@ public class Miscellaneous extends Service
protected static String writeableFolderStringCache = null; protected static String writeableFolderStringCache = null;
protected final static String http_error_string = "HTTP_ERROR"; protected final static String http_error_string = "HTTP_ERROR";
protected final static String last_trigger_url_result_string = "last_trigger_url_result"; protected final static String last_trigger_url_result_string = "last_trigger_url_result";
protected final static String httpMainData = "httpMainData";
protected final static String doNoEncodingString = "NoEncoding";
protected final static String httpEncoding = "UTF-8";
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");
public static class TrustAllCertificates implements X509TrustManager
{
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType)
{
// Do nothing (trust all clients)
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType)
{
// Do nothing (trust all servers)
}
@Override
public X509Certificate[] getAcceptedIssuers()
{
return new X509Certificate[0]; // No accepted issuers
}
}
public static String downloadURL(String url, String username, String password, String method, Map<String, String> httpParams) public static String downloadURL(String url, String username, String password, String method, Map<String, String> httpParams)
{ {
HttpClient httpclient = new DefaultHttpClient(); HttpClient httpclient = new DefaultHttpClient();
@@ -146,12 +171,24 @@ public class Miscellaneous extends Service
HttpURLConnection connection; HttpURLConnection connection;
if(url.toLowerCase().contains("https")) if(url.toLowerCase().contains("https"))
{ {
connection = (HttpsURLConnection) urlObject.openConnection(); connection = (HttpsURLConnection) urlObject.openConnection();
} if(Settings.httpAcceptAllCertificates)
{
SSLContext sslContext = SSLContext.getInstance("TLS"); // Use "TLS" (not "SSL" which is outdated)
sslContext.init(
null, // No KeyManager (client authentication not needed)
new TrustManager[]{new TrustAllCertificates()}, // Use our trust manager
new SecureRandom() // Secure random number generator
);
((HttpsURLConnection)connection).setSSLSocketFactory(sslContext.getSocketFactory());
((HttpsURLConnection)connection).setHostnameVerifier((hostname, session) -> true); // Trust all hostnames
}
}
else else
connection = (HttpURLConnection) urlObject.openConnection(); connection = (HttpURLConnection) urlObject.openConnection();
// Add http simple authentication if specified // Add http simple authentication if specified
if(username != null && password != null) if(username != null && password != null)
{ {
@@ -166,6 +203,7 @@ public class Miscellaneous extends Service
if(httpParams.size() > 0) if(httpParams.size() > 0)
{ {
connection.setRequestMethod("POST"); connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setDoInput(true); connection.setDoInput(true);
connection.setDoOutput(true); connection.setDoOutput(true);
@@ -175,8 +213,8 @@ public class Miscellaneous extends Service
paramPairs.add(new BasicNameValuePair(key, httpParams.get(key))); paramPairs.add(new BasicNameValuePair(key, httpParams.get(key)));
OutputStream os = connection.getOutputStream(); OutputStream os = connection.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, httpEncoding));
writer.write(getQuery(paramPairs)); writer.write(getQuery(paramPairs, method));
writer.flush(); writer.flush();
writer.close(); writer.close();
} }
@@ -206,21 +244,52 @@ public class Miscellaneous extends Service
} }
} }
private static String getQuery(List<NameValuePair> params) throws UnsupportedEncodingException private static String getQuery(List<NameValuePair> params, String method) throws UnsupportedEncodingException
{ {
StringBuilder result = new StringBuilder(); StringBuilder result = new StringBuilder();
boolean first = true; boolean first = true;
for (NameValuePair pair : params) for (NameValuePair pair : params)
{ {
if (first) if (method.equals(ActivityManageActionTriggerUrl.methodGet))
first = false; {
else if (first)
result.append("&"); first = false;
else
result.append("&");
}
else if (pair.getName().startsWith(httpMainData))
continue; // if post and main data skip lookup run
result.append(pair.getName());
result.append(URLEncoder.encode(pair.getName(), "UTF-8"));
result.append("="); result.append("=");
result.append(URLEncoder.encode(pair.getValue(), "UTF-8"));
if (pair.getName().endsWith(doNoEncodingString))
result.append(URLEncoder.encode(pair.getValue(), httpEncoding));
else
result.append(pair.getValue());
}
/*
If method is POST and there's a httpMainData field, we transfer
this one at the end without parameter name and equals sign.
*/
if (method.equals(ActivityManageActionTriggerUrl.methodPost))
{
for (NameValuePair pair : params)
{
if (pair.getName().startsWith(httpMainData))
{
if (pair.getName().endsWith(doNoEncodingString))
result.append(pair.getValue());
else
result.append(URLEncoder.encode(pair.getValue(), httpEncoding));
return result.toString();
}
}
} }
return result.toString(); return result.toString();
@@ -275,7 +344,7 @@ public class Miscellaneous extends Service
} }
catch(Exception e) catch(Exception e)
{ {
Miscellaneous.logEvent("e", "HTTP error", Log.getStackTraceString(e), 3); Miscellaneous.logEvent("e", "HTTP error", Log.getStackTraceString(e), 3);
return http_error_string; return http_error_string;
} }
// finally // finally
@@ -819,7 +888,7 @@ public class Miscellaneous extends Service
String notificationTitle = NotificationListener.getLastNotification().getTitle(); String notificationTitle = NotificationListener.getLastNotification().getTitle();
if (notificationTitle != null && notificationTitle.length() > 0) if (notificationTitle != null && notificationTitle.length() > 0)
source = source.replace("[notificationTitle]", escapeStringForUrl(notificationTitle)); source = source.replace("[notificationTitle]", notificationTitle);
else else
{ {
source = source.replace("[notificationTitle]", "notificationTitle unknown"); source = source.replace("[notificationTitle]", "notificationTitle unknown");
@@ -1345,7 +1414,8 @@ public class Miscellaneous extends Service
builder.setOnlyAlertOnce(true); builder.setOnlyAlertOnce(true);
if(Settings.showIconWhenServiceIsRunning && notificationChannelId.equals(AutomationService.NOTIFICATION_CHANNEL_ID_SERVICE)) //if(Settings.showIconWhenServiceIsRunning && notificationChannelId.equals(AutomationService.NOTIFICATION_CHANNEL_ID_SERVICE))
if(notificationChannelId.equals(AutomationService.NOTIFICATION_CHANNEL_ID_SERVICE))
{ {
if(BuildConfig.FLAVOR.equals(AutomationService.flavor_name_googleplay)) if(BuildConfig.FLAVOR.equals(AutomationService.flavor_name_googleplay))
builder.setSmallIcon(R.drawable.crane); builder.setSmallIcon(R.drawable.crane);
@@ -711,7 +711,7 @@ public class XmlFileInterface
private static Rule readRule(XmlPullParser parser) throws XmlPullParserException, IOException private static Rule readRule(XmlPullParser parser) throws XmlPullParserException, IOException
{ {
/* FILE EXAMPE: /* FILE EXAMPLE:
* ***************** * *****************
* <Automation> * <Automation>
* <PointOfInterestCollection> * <PointOfInterestCollection>
@@ -1095,7 +1095,7 @@ public class XmlFileInterface
private static Action readAction(XmlPullParser parser) throws IOException, XmlPullParserException private static Action readAction(XmlPullParser parser) throws IOException, XmlPullParserException
{ {
/* FILE EXAMPE: /* FILE EXAMPLE:
* ***************** * *****************
* <Automation> * <Automation>
* <PointOfInterestCollection> * <PointOfInterestCollection>
@@ -72,6 +72,22 @@
</TableRow> </TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/target" />
<Spinner
android:id="@+id/spinnerSettingTarget"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</TableRow>
<TableRow <TableRow
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
@@ -140,6 +140,17 @@
</TableRow> </TableRow>
<TableRow>
<TextView
android:id="@+id/tvHttpParameterExplanation"
android:layout_span="2"
android:layout_marginBottom="@dimen/default_margin"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</TableRow>
<TableRow <TableRow
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
+2 -1
View File
@@ -812,7 +812,7 @@
<string name="noticeRestrictedPermissions">Wenn Sie eine der folgenden Berechtigungen nicht erteilen und eine Systemmeldung wie \"Eingeschränkte Berechtigung\" erhalten, müssen Sie zuerst zu den Android-Einstellungen und dann zu den Anwendungen gehen und Automatisierung auswählen. Nun sollten sich 3 Punkte in der oberen rechten Ecke befinden. Klicken Sie auf \"Eingeschränkte Einstellungen zulassen\". Danach sollte die erforderliche Erlaubnis erteilt werden können. Dies sollte nur für die APK-Version der App gelten, nicht für die von F-Droid oder dem Play Store.</string> <string name="noticeRestrictedPermissions">Wenn Sie eine der folgenden Berechtigungen nicht erteilen und eine Systemmeldung wie \"Eingeschränkte Berechtigung\" erhalten, müssen Sie zuerst zu den Android-Einstellungen und dann zu den Anwendungen gehen und Automatisierung auswählen. Nun sollten sich 3 Punkte in der oberen rechten Ecke befinden. Klicken Sie auf \"Eingeschränkte Einstellungen zulassen\". Danach sollte die erforderliche Erlaubnis erteilt werden können. Dies sollte nur für die APK-Version der App gelten, nicht für die von F-Droid oder dem Play Store.</string>
<string name="setLocationService">Ortungsdienst festlegen</string> <string name="setLocationService">Ortungsdienst festlegen</string>
<string name="setLocationServiceCapital">Ortungsdienst einstellen</string> <string name="setLocationServiceCapital">Ortungsdienst einstellen</string>
<string name="writeSecureSettingsNotice">Leider kann die Erlaubnis WRITE_SECURE_SETTINGS nicht direkt auf Ihrem Android-Gerät erteilt werden. Stattdessen müssen Sie Ihr Gerät an einen Computer anschließen und die Berechtigung über ADB erteilen. Klicken Sie hier, um zu erfahren, wie Sie es gewähren können: https://server47.de/automation/adb_hack.php</string> <string name="writeSecureSettingsNotice">Wenn Sie Global oder Secure als Ziel wählen, müssen Sie die Berechtigung WRITE_SECURE_SETTINGS erteilen. Leider kann diese Variante nicht direkt auf Ihrem Android-Gerät bereitgestellt werden. Stattdessen müssen Sie Ihr Gerät an einen Computer anschließen und die Berechtigung über ADB erteilen. Klicken Sie hier, um zu erfahren, wie Sie es gewähren können: <a href="https://server47.de/automation/adb_hack.php">https://server47.de/automation/adb_hack.php</a></string>
<string name="actionSetLocationService">Ortungsdienst</string> <string name="actionSetLocationService">Ortungsdienst</string>
<string name="triggerUrlVariableHint">Das Ergebnis dieser Anfrage wird in der Variablen last_trigger_url_result gespeichert, wenn Sie es von einer anderen Regel aus überprüfen möchten. Im Falle von HTTP-Fehlern wie 404 ist der Wert \"HTTP_ERROR\".</string> <string name="triggerUrlVariableHint">Das Ergebnis dieser Anfrage wird in der Variablen last_trigger_url_result gespeichert, wenn Sie es von einer anderen Regel aus überprüfen möchten. Im Falle von HTTP-Fehlern wie 404 ist der Wert \"HTTP_ERROR\".</string>
<string name="calendarEvent">Kalendertermin</string> <string name="calendarEvent">Kalendertermin</string>
@@ -887,4 +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>
</resources> </resources>
+2 -1
View File
@@ -811,7 +811,7 @@
<string name="noticeRestrictedPermissions">Si no le otorga a uno el siguiente permiso y un mensaje del sistema como \"Ajuste restringido\", primero debe ir a la configuración de Android, luego a las aplicaciones, elija Automatización. Ahora debería haber 3 puntos en la esquina superior derecha. Haga clic en \"Permitir configuraciones restringidas\". Después de eso, el permiso necesario debería poder otorgarse. Esto solo debería aplicarse a la versión APK de la aplicación, no a las de F-Droid o Play Store.</string> <string name="noticeRestrictedPermissions">Si no le otorga a uno el siguiente permiso y un mensaje del sistema como \"Ajuste restringido\", primero debe ir a la configuración de Android, luego a las aplicaciones, elija Automatización. Ahora debería haber 3 puntos en la esquina superior derecha. Haga clic en \"Permitir configuraciones restringidas\". Después de eso, el permiso necesario debería poder otorgarse. Esto solo debería aplicarse a la versión APK de la aplicación, no a las de F-Droid o Play Store.</string>
<string name="setLocationService">Encender/desactivar el servicio de ubicación</string> <string name="setLocationService">Encender/desactivar el servicio de ubicación</string>
<string name="setLocationServiceCapital">Establecer el servicio de ubicación</string> <string name="setLocationServiceCapital">Establecer el servicio de ubicación</string>
<string name="writeSecureSettingsNotice">Desafortunadamente, el permiso WRITE_SECURE_SETTINGS no se puede otorgar directamente en su dispositivo Android. En su lugar, debe conectar su dispositivo a una computadora y otorgar el permiso a través de ADB. Haga clic aquí para saber cómo otorgarlo: https://server47.de/automation/adb_hack.php</string> <string name="writeSecureSettingsNotice">Si eliges Global o Seguro como objetivo, tendrás que conceder el permiso WRITE_SECURE_SETTINGS. Desafortunadamente, este no se puede entregar directamente en tu dispositivo Android. En su lugar, debe conectar su dispositivo a una computadora y otorgar el permiso a través de ADB. Haga clic aquí para saber cómo otorgarlo: <a href="https://server47.de/automation/adb_hack.php">https://server47.de/automation/adb_hack.php</a></string>
<string name="actionSetLocationService">Servicio de localización</string> <string name="actionSetLocationService">Servicio de localización</string>
<string name="triggerUrlVariableHint">El resultado de esta solicitud se almacenará en la variable last_trigger_url_result si desea verificarlo desde otra regla. En caso de errores HTTP como 404, el valor será \"HTTP_ERROR\".</string> <string name="triggerUrlVariableHint">El resultado de esta solicitud se almacenará en la variable last_trigger_url_result si desea verificarlo desde otra regla. En caso de errores HTTP como 404, el valor será \"HTTP_ERROR\".</string>
<string name="calendarEvent">Evento de calendario</string> <string name="calendarEvent">Evento de calendario</string>
@@ -886,4 +886,5 @@
<string name="enterAvalue">Introduce un valor.</string> <string name="enterAvalue">Introduce un valor.</string>
<string name="setSystemSettingCapital">Establecer configuración del sistema</string> <string name="setSystemSettingCapital">Establecer configuración del sistema</string>
<string name="examplesWriteSecureSettings">No llevo una lista de posibles configuraciones. Por favor, busca <a href="https://developer.android.com/reference/android/provider/Settings.Secure">esas</a> configuraciones por tu cuenta. Véase aquí algunos ejemplos (incompletos).</string> <string name="examplesWriteSecureSettings">No llevo una lista de posibles configuraciones. Por favor, busca <a href="https://developer.android.com/reference/android/provider/Settings.Secure">esas</a> configuraciones por tu cuenta. Véase aquí algunos ejemplos (incompletos).</string>
<string name="httpParametersExplanation">Si el nombre de algún parámetro comienza por %1$s mientras el método es POST, no se transmitirá como los otros parámetros (con clave=valor), sino que se transferirá como datos principales. Si el parámetro termina en %2$s, no se realizará ninguna codificación.</string>
</resources> </resources>
+2 -1
View File
@@ -811,7 +811,7 @@
<string name="noticeRestrictedPermissions">Si vous ne parvenez pas à accorder à l\'un d\'entre eux l\'autorisation suivante et un message système tel que « Autorisation restreinte », vous devez d\'abord accéder aux paramètres Android, puis aux applications, puis choisir Automatisation. Maintenant, il devrait y avoir 3 points dans le coin supérieur droit. Cliquez sur « Autoriser les paramètres restreints ». Après cela, l\'autorisation nécessaire devrait pouvoir être accordée. Cela ne devrait s\'appliquer qu\'à la version APK de l\'application, pas à celles de F-Droid ou du Play Store.</string> <string name="noticeRestrictedPermissions">Si vous ne parvenez pas à accorder à l\'un d\'entre eux l\'autorisation suivante et un message système tel que « Autorisation restreinte », vous devez d\'abord accéder aux paramètres Android, puis aux applications, puis choisir Automatisation. Maintenant, il devrait y avoir 3 points dans le coin supérieur droit. Cliquez sur « Autoriser les paramètres restreints ». Après cela, l\'autorisation nécessaire devrait pouvoir être accordée. Cela ne devrait s\'appliquer qu\'à la version APK de l\'application, pas à celles de F-Droid ou du Play Store.</string>
<string name="setLocationService">Définir le service de localisation</string> <string name="setLocationService">Définir le service de localisation</string>
<string name="setLocationServiceCapital">Définir le service de localisation</string> <string name="setLocationServiceCapital">Définir le service de localisation</string>
<string name="writeSecureSettingsNotice">Malheureusement, l\'autorisation WRITE_SECURE_SETTINGS ne peut pas être donnée directement sur votre appareil Android. Au lieu de cela, vous devez connecter votre appareil à un ordinateur et accorder l\'autorisation via ADB. Cliquez ici pour savoir comment l\'accorder : https://server47.de/automation/adb_hack.php</string> <string name="writeSecureSettingsNotice">Si vous choisissez Global ou Sécurisé comme cible, vous devrez accorder la permission WRITE_SECURE_SETTINGS. Malheureusement, celle-ci ne peut pas être donnée directement sur votre appareil Android. Au lieu de cela, vous devez connecter votre appareil à un ordinateur et accorder l\'autorisation via ADB. Cliquez ici pour savoir comment l\'accorder: <a href="https://server47.de/automation/adb_hack.php">https://server47.de/automation/adb_hack.php</a></string>
<string name="actionSetLocationService">Service de localisation</string> <string name="actionSetLocationService">Service de localisation</string>
<string name="triggerUrlVariableHint">Le résultat de cette requête sera stocké dans la variable last_triggerurl_result si vous souhaitez le vérifier à partir d\'une autre règle. En cas d\'erreurs HTTP comme 404, la valeur sera « HTTP_ERROR ».</string> <string name="triggerUrlVariableHint">Le résultat de cette requête sera stocké dans la variable last_triggerurl_result si vous souhaitez le vérifier à partir d\'une autre règle. En cas d\'erreurs HTTP comme 404, la valeur sera « HTTP_ERROR ».</string>
<string name="calendarEvent">Événement de calendrier</string> <string name="calendarEvent">Événement de calendrier</string>
@@ -886,4 +886,5 @@
<string name="far">loin</string> <string name="far">loin</string>
<string name="proximityText">La proximité se situe entre \"%1$s\" et \"%2$s\"</string> <string name="proximityText">La proximité se situe entre \"%1$s\" et \"%2$s\"</string>
<string name="examplesWriteSecureSettings">Je ne tiens pas de liste des réglages possibles. Veuillez trouver ces réglages vous-même. Voir <a href="https://developer.android.com/reference/android/provider/Settings.Secure">ici</a> pour quelques exemples (incomplets).</string> <string name="examplesWriteSecureSettings">Je ne tiens pas de liste des réglages possibles. Veuillez trouver ces réglages vous-même. Voir <a href="https://developer.android.com/reference/android/provider/Settings.Secure">ici</a> pour quelques exemples (incomplets).</string>
<string name="httpParametersExplanation">Si un nom de paramètre commence par %1$s alors que la méthode est POST, il ne sera pas transmis comme les autres paramètres (avec clé=valeur), mais transféré comme données principales. Si le paramètre se termine par %2$s, aucun codage ne sera effectué.</string>
</resources> </resources>
+2 -1
View File
@@ -812,7 +812,7 @@
<string name="noticeRestrictedPermissions">Se non riesci a concedere una delle seguenti autorizzazioni e un messaggio di sistema come \"Autorizzazione limitata\", devi prima andare alle impostazioni di Android, quindi alle applicazioni, scegli Automazione. Ora dovrebbero esserci 3 punti nell\'angolo in alto a destra. Fai clic su \"Consenti impostazioni limitate\". Dopodiché dovrebbe essere concessa l\'autorizzazione necessaria. Questo dovrebbe valere solo per la versione APK dell\'app, non per quelle di F-Droid o Play Store.</string> <string name="noticeRestrictedPermissions">Se non riesci a concedere una delle seguenti autorizzazioni e un messaggio di sistema come \"Autorizzazione limitata\", devi prima andare alle impostazioni di Android, quindi alle applicazioni, scegli Automazione. Ora dovrebbero esserci 3 punti nell\'angolo in alto a destra. Fai clic su \"Consenti impostazioni limitate\". Dopodiché dovrebbe essere concessa l\'autorizzazione necessaria. Questo dovrebbe valere solo per la versione APK dell\'app, non per quelle di F-Droid o Play Store.</string>
<string name="setLocationService">Impostare il servizio di localizzazione</string> <string name="setLocationService">Impostare il servizio di localizzazione</string>
<string name="setLocationServiceCapital">Impostare il servizio di localizzazione</string> <string name="setLocationServiceCapital">Impostare il servizio di localizzazione</string>
<string name="writeSecureSettingsNotice">Purtroppo l\'autorizzazione WRITE_SECURE_SETTINGS non può essere data direttamente sul tuo dispositivo Android. Invece, devi collegare il tuo dispositivo a un computer e concedere l\'autorizzazione tramite ADB. Clicca qui per scoprire come concederlo: https://server47.de/automation/adb_hack.php</string> <string name="writeSecureSettingsNotice">Se scegli Global o Secure come bersaglio, dovrai concedere il permesso WRITE_SECURE_SETTINGS. Purtroppo questo non può essere fornito direttamente sul tuo dispositivo Android. Invece, devi collegare il tuo dispositivo a un computer e concedere l\'autorizzazione tramite ADB. Clicca qui per scoprire come concederlo: <a href="https://server47.de/automation/adb_hack.php">https://server47.de/automation/adb_hack.php</a></string>
<string name="actionSetLocationService">Servizio di localizzazione</string> <string name="actionSetLocationService">Servizio di localizzazione</string>
<string name="triggerUrlVariableHint">Il risultato di questa richiesta verrà memorizzato nella variabile last_trigger_url_result se si desidera controllarlo da un\'altra regola. In caso di errori HTTP come 404 il valore sarà \"HTTP_ERROR\".</string> <string name="triggerUrlVariableHint">Il risultato di questa richiesta verrà memorizzato nella variabile last_trigger_url_result se si desidera controllarlo da un\'altra regola. In caso di errori HTTP come 404 il valore sarà \"HTTP_ERROR\".</string>
<string name="calendarEvent">Evento del calendario</string> <string name="calendarEvent">Evento del calendario</string>
@@ -887,4 +887,5 @@
<string name="uiThemeSummary">Il tema dell\'interfaccia grafica utente. Domanda necessaria.</string> <string name="uiThemeSummary">Il tema dell\'interfaccia grafica utente. Domanda necessaria.</string>
<string name="proximity">Vicinanza</string> <string name="proximity">Vicinanza</string>
<string name="examplesWriteSecureSettings">Non tengo una lista di possibili impostazioni. Per favore, trova queste impostazioni da solo. Vedi <a href="https://developer.android.com/reference/android/provider/Settings.Secure">qui</a> per alcuni esempi (incompleti).</string> <string name="examplesWriteSecureSettings">Non tengo una lista di possibili impostazioni. Per favore, trova queste impostazioni da solo. Vedi <a href="https://developer.android.com/reference/android/provider/Settings.Secure">qui</a> per alcuni esempi (incompleti).</string>
<string name="httpParametersExplanation">Se un nome di parametro inizia con %1$s mentre il metodo è POST, non verrà trasmesso come gli altri parametri (con chiave=valore), ma trasferito come dato principale. Se il parametro termina con %2$s, non verrà eseguita alcuna codifica.</string>
</resources> </resources>
+3 -2
View File
@@ -685,7 +685,7 @@
<string name="unlocked">ontgrendeld</string> <string name="unlocked">ontgrendeld</string>
<string name="selectDesiredState">Selecteer de gewenste status</string> <string name="selectDesiredState">Selecteer de gewenste status</string>
<string name="screenState">Schermstatus</string> <string name="screenState">Schermstatus</string>
<string name="featureCeasedToWorkLastWorkingAndroidVersion">Vanwege de oneindige wijsheid van Google is de laatste Android-versie waarvan bekend is dat deze functie werkt% 1 $ s. U kunt het configureren, maar het zal waarschijnlijk geen effect hebben.</string> <string name="featureCeasedToWorkLastWorkingAndroidVersion">Vanwege de oneindige wijsheid van Google is de laatste Android-versie waarvan bekend is dat deze functie werkt %1$s. U kunt het configureren, maar het zal waarschijnlijk geen effect hebben.</string>
<string name="actionMediaControl">Het afspelen van media regelen</string> <string name="actionMediaControl">Het afspelen van media regelen</string>
<string name="selectCommand">Opdracht Selecteren</string> <string name="selectCommand">Opdracht Selecteren</string>
<string name="playPause">schakelaar afspelen/pauzeren</string> <string name="playPause">schakelaar afspelen/pauzeren</string>
@@ -810,7 +810,7 @@
<string name="noticeRestrictedPermissions">Als u er niet in slaagt om een van de volgende machtigingen en een systeembericht zoals \"Beperkte toestemming\" te verlenen, moet u eerst naar Android-instellingen gaan en vervolgens naar toepassingen en Automatisering kiezen. Nu zouden er 3 stippen in de rechterbovenhoek moeten zijn. Klik op \"Beperkte instellingen toestaan\". Daarna moet de benodigde toestemming aanvaardbaar zijn. Dit zou alleen van toepassing moeten zijn op de APK-versie van de app, niet die van F-Droid of Play Store.</string> <string name="noticeRestrictedPermissions">Als u er niet in slaagt om een van de volgende machtigingen en een systeembericht zoals \"Beperkte toestemming\" te verlenen, moet u eerst naar Android-instellingen gaan en vervolgens naar toepassingen en Automatisering kiezen. Nu zouden er 3 stippen in de rechterbovenhoek moeten zijn. Klik op \"Beperkte instellingen toestaan\". Daarna moet de benodigde toestemming aanvaardbaar zijn. Dit zou alleen van toepassing moeten zijn op de APK-versie van de app, niet die van F-Droid of Play Store.</string>
<string name="setLocationService">Locatieservice instellen</string> <string name="setLocationService">Locatieservice instellen</string>
<string name="setLocationServiceCapital">Locatieservice instellen</string> <string name="setLocationServiceCapital">Locatieservice instellen</string>
<string name="writeSecureSettingsNotice">Helaas kan de toestemming WRITE_SECURE_SETTINGS niet rechtstreeks op uw Android-apparaat worden gegeven. In plaats daarvan moet u uw apparaat op een computer aansluiten en de toestemming verlenen via ADB. Klik hier om te weten te komen hoe u het kunt toekennen: https://server47.de/automation/adb_hack.php</string> <string name="writeSecureSettingsNotice">Als je Global of Secure als doelwit kiest, moet je toestemming geven WRITE_SECURE_SETTINGS. Helaas kan deze niet direct op je Android-apparaat worden gegeven. In plaats daarvan moet u uw apparaat op een computer aansluiten en de toestemming verlenen via ADB. Klik hier om te weten te komen hoe u het kunt toekennen: <a href="https://server47.de/automation/adb_hack.php">https://server47.de/automation/adb_hack.php</a></string>
<string name="actionSetLocationService">Locatie service</string> <string name="actionSetLocationService">Locatie service</string>
<string name="triggerUrlVariableHint">Het resultaat van dit verzoek wordt opgeslagen in de variabele last_trigger_url_result als u het vanuit een andere regel wilt controleren. In het geval van HTTP-fouten zoals 404 is de waarde \"HTTP_ERROR\".</string> <string name="triggerUrlVariableHint">Het resultaat van dit verzoek wordt opgeslagen in de variabele last_trigger_url_result als u het vanuit een andere regel wilt controleren. In het geval van HTTP-fouten zoals 404 is de waarde \"HTTP_ERROR\".</string>
<string name="calendarEvent">Agenda-afspraak</string> <string name="calendarEvent">Agenda-afspraak</string>
@@ -885,4 +885,5 @@
<string name="enterAvalue">Voer een waarde in.</string> <string name="enterAvalue">Voer een waarde in.</string>
<string name="setSystemSettingCapital">Setsysteeminstelling</string> <string name="setSystemSettingCapital">Setsysteeminstelling</string>
<string name="examplesWriteSecureSettings">Ik houd geen lijst bij met mogelijke instellingen. Zoek die instellingen zelf op. Zie <a href="https://developer.android.com/reference/android/provider/Settings.Secure">hier</a> voor enkele (onvolledige) voorbeelden.</string> <string name="examplesWriteSecureSettings">Ik houd geen lijst bij met mogelijke instellingen. Zoek die instellingen zelf op. Zie <a href="https://developer.android.com/reference/android/provider/Settings.Secure">hier</a> voor enkele (onvolledige) voorbeelden.</string>
<string name="httpParametersExplanation">Als een parameternaam begint met %1$s terwijl de methode POST is, wordt deze niet verzonden zoals de andere parameters (met sleutel=waarde), maar als hoofddata overgedragen. Als de parameter eindigt op %2 s, wordt er geen codering uitgevoerd.</string>
</resources> </resources>
+2 -1
View File
@@ -909,7 +909,7 @@
<string name="noticeRestrictedPermissions">Jeśli nie uda Ci się przyznać następującego uprawnienia i komunikatu systemowego, takiego jak \"Ograniczone uprawnienia\", musisz najpierw przejść do ustawień Androida, a następnie aplikacji, wybrać Automatyzacja. Teraz w prawym górnym rogu powinny znajdować się 3 kropki. Kliknij \"Zezwól na ustawienia z ograniczeniami\". Następnie powinno być możliwe udzielenie niezbędnego pozwolenia. Powinno to dotyczyć tylko wersji APK aplikacji, a nie tych z F-Droid lub Sklepu Play.</string> <string name="noticeRestrictedPermissions">Jeśli nie uda Ci się przyznać następującego uprawnienia i komunikatu systemowego, takiego jak \"Ograniczone uprawnienia\", musisz najpierw przejść do ustawień Androida, a następnie aplikacji, wybrać Automatyzacja. Teraz w prawym górnym rogu powinny znajdować się 3 kropki. Kliknij \"Zezwól na ustawienia z ograniczeniami\". Następnie powinno być możliwe udzielenie niezbędnego pozwolenia. Powinno to dotyczyć tylko wersji APK aplikacji, a nie tych z F-Droid lub Sklepu Play.</string>
<string name="setLocationService">Ustawianie usługi lokalizacyjnej</string> <string name="setLocationService">Ustawianie usługi lokalizacyjnej</string>
<string name="setLocationServiceCapital">Ustawianie usługi lokalizacyjnej</string> <string name="setLocationServiceCapital">Ustawianie usługi lokalizacyjnej</string>
<string name="writeSecureSettingsNotice">Niestety WRITE_SECURE_SETTINGS uprawnień nie można nadać bezpośrednio na urządzeniu z Androidem. Zamiast tego musisz podłączyć urządzenie do komputera i przyznać uprawnienia przez ADB. Kliknij tutaj, aby dowiedzieć się, jak go przyznać: https://server47.de/automation/adb_hack.php</string> <string name="writeSecureSettingsNotice">Jeśli wybierzesz Globalne lub Bezpieczne jako cel, musisz przyzwolić WRITE_SECURE_SETTINGS. Niestety tego nie można podać bezpośrednio na urządzeniu z Androidem. Zamiast tego musisz podłączyć urządzenie do komputera i przyznać uprawnienia przez ADB. Kliknij tutaj, aby dowiedzieć się, jak go przyznać: <a href="https://server47.de/automation/adb_hack.php">https://server47.de/automation/adb_hack.php</a></string>
<string name="actionSetLocationService">Usługa lokalizacyjna</string> <string name="actionSetLocationService">Usługa lokalizacyjna</string>
<string name="triggerUrlVariableHint">Wynik tego żądania zostanie zapisany w zmiennej last_trigger_url_result, jeśli chcesz go sprawdzić z innej reguły. W przypadku błędów HTTP, takich jak 404, wartość będzie wynosić \"HTTP_ERROR\".</string> <string name="triggerUrlVariableHint">Wynik tego żądania zostanie zapisany w zmiennej last_trigger_url_result, jeśli chcesz go sprawdzić z innej reguły. W przypadku błędów HTTP, takich jak 404, wartość będzie wynosić \"HTTP_ERROR\".</string>
<string name="calendarEvent">Wydarzenie w kalendarzu</string> <string name="calendarEvent">Wydarzenie w kalendarzu</string>
@@ -984,4 +984,5 @@
<string name="enterAvalue">Wprowadź wartość.</string> <string name="enterAvalue">Wprowadź wartość.</string>
<string name="setSystemSettingCapital">Ustawienia systemu zbiorów</string> <string name="setSystemSettingCapital">Ustawienia systemu zbiorów</string>
<string name="examplesWriteSecureSettings">Nie prowadzę listy możliwych ustawień wyboru. Proszę, znajdź te ustawienia samodzielnie. Zobacz <a href="https://developer.android.com/reference/android/provider/Settings.Secure">tutaj</a> dla niektórych (niepełnych) przykładów.</string> <string name="examplesWriteSecureSettings">Nie prowadzę listy możliwych ustawień wyboru. Proszę, znajdź te ustawienia samodzielnie. Zobacz <a href="https://developer.android.com/reference/android/provider/Settings.Secure">tutaj</a> dla niektórych (niepełnych) przykładów.</string>
<string name="httpParametersExplanation">Jeśli nazwa parametru zaczyna się od %1$s, a metoda to POST, nie zostanie przesłana jak pozostałe parametry (z klucz=wartością), lecz przeniesiona jako dane główne. Jeśli parametr kończy się na %2$s, nie zostanie wykonane kodowanie.</string>
</resources> </resources>
+2 -1
View File
@@ -869,7 +869,7 @@
<string name="noticeRestrictedPermissions">Если вы не можете предоставить одно из следующих разрешений и системное сообщение типа «Ограниченное разрешение», вам нужно сначала перейти в настройки Android, затем в приложения, выбрать «Автоматизация». Теперь в правом верхнем углу должно быть 3 точки. Нажмите «Разрешить ограниченные настройки». После этого необходимо получить необходимое разрешение. Это должно относиться только к APK-версии приложения, а не к версии из F-Droid или Play Store.</string> <string name="noticeRestrictedPermissions">Если вы не можете предоставить одно из следующих разрешений и системное сообщение типа «Ограниченное разрешение», вам нужно сначала перейти в настройки Android, затем в приложения, выбрать «Автоматизация». Теперь в правом верхнем углу должно быть 3 точки. Нажмите «Разрешить ограниченные настройки». После этого необходимо получить необходимое разрешение. Это должно относиться только к APK-версии приложения, а не к версии из F-Droid или Play Store.</string>
<string name="setLocationService">Настройка службы определения местоположения</string> <string name="setLocationService">Настройка службы определения местоположения</string>
<string name="setLocationServiceCapital">Настройка службы определения местоположения</string> <string name="setLocationServiceCapital">Настройка службы определения местоположения</string>
<string name="writeSecureSettingsNotice">К сожалению, разрешение WRITE_SECURE_SETTINGS не может быть дано непосредственно на вашем Android-устройстве. Вместо этого вам нужно подключить устройство к компьютеру и предоставить разрешение через ADB. Нажмите здесь, чтобы узнать, как его получить: https://server47.de/automation/adb_hack.php</string> <string name="writeSecureSettingsNotice">Если вы выберете Global или Secure в качестве цели, вам потребуется предоставить разрешение WRITE_SECURE_SETTINGS. К сожалению, этот вариант нельзя налично использовать на вашем Android-устройстве. Вместо этого вам нужно подключить устройство к компьютеру и предоставить разрешение через ADB. Нажмите здесь, чтобы узнать, как его получить: <a href="https://server47.de/automation/adb_hack.php">https://server47.de/automation/adb_hack.php</a></string>
<string name="actionSetLocationService">Служба определения местоположения</string> <string name="actionSetLocationService">Служба определения местоположения</string>
<string name="triggerUrlVariableHint">Результат этого запроса будет сохранен в переменной last_trigger_url_result если вы захотите проверить его из другого правила. В случае ошибок HTTP, таких как 404, значение будет \"HTTP_ERROR\".</string> <string name="triggerUrlVariableHint">Результат этого запроса будет сохранен в переменной last_trigger_url_result если вы захотите проверить его из другого правила. В случае ошибок HTTP, таких как 404, значение будет \"HTTP_ERROR\".</string>
<string name="calendarEvent">Событие календаря</string> <string name="calendarEvent">Событие календаря</string>
@@ -944,4 +944,5 @@
<string name="enterAvalue">Введите значение.</string> <string name="enterAvalue">Введите значение.</string>
<string name="setSystemSettingCapital">Настройка системы множества</string> <string name="setSystemSettingCapital">Настройка системы множества</string>
<string name="examplesWriteSecureSettings">Я не веду список возможных настроек. Пожалуйста, найдите эти настройки сами. См. <a href="https://developer.android.com/reference/android/provider/Settings.Secure">здесь</a> некоторые (неполные) примеры.</string> <string name="examplesWriteSecureSettings">Я не веду список возможных настроек. Пожалуйста, найдите эти настройки сами. См. <a href="https://developer.android.com/reference/android/provider/Settings.Secure">здесь</a> некоторые (неполные) примеры.</string>
<string name="httpParametersExplanation">Если имя любого параметра начинается с %1$s, а метод — POST, оно не будет передаваться как другие параметры (с ключом =значением), а передаваться как основные данные. Если параметр заканчивается на %2$s, кодирование не выполняется.</string>
</resources> </resources>
+2 -1
View File
@@ -810,7 +810,7 @@
<string name="noticeRestrictedPermissions">如果您未能授予以下权限和\"受限权限\"之类的系统消息,则需要先转到 Android 设置,然后转到应用程序,选择自动化。现在右上角应该有 3 个点。单击\"允许受限设置\"。之后,应该可以授予必要的权限。这应该仅适用于应用的 APK 版本,而不适用于 F-Droid 或 Play 商店中的版本。</string> <string name="noticeRestrictedPermissions">如果您未能授予以下权限和\"受限权限\"之类的系统消息,则需要先转到 Android 设置,然后转到应用程序,选择自动化。现在右上角应该有 3 个点。单击\"允许受限设置\"。之后,应该可以授予必要的权限。这应该仅适用于应用的 APK 版本,而不适用于 F-Droid 或 Play 商店中的版本。</string>
<string name="setLocationService">设置位置服务</string> <string name="setLocationService">设置位置服务</string>
<string name="setLocationServiceCapital">设置位置服务</string> <string name="setLocationServiceCapital">设置位置服务</string>
<string name="writeSecureSettingsNotice">不幸的是,WRITE_SECURE_SETTINGS无法直接在您的 Android 设备上授予权限。相反,您需要将设备连接到计算机并通过 ADB 授予权限。单击此处了解如何授予它: https://server47.de/automation/adb_hack.php</string> <string name="writeSecureSettingsNotice">如果你选择全球或安全作为目标,你需要授予WRITE_SECURE_SETTINGS权限。遗憾的是,这个服务不能直接在你的安卓设备上提供。 相反,您需要将设备连接到计算机并通过 ADB 授予权限。单击此处了解如何授予它: <a href="https://server47.de/automation/adb_hack.php">https://server47.de/automation/adb_hack.php</a></string>
<string name="actionSetLocationService">定位服务</string> <string name="actionSetLocationService">定位服务</string>
<string name="triggerUrlVariableHint">此请求的结果将存储在变量 last_triggerurl_result 中,如果您希望从其他规则中检查它。如果出现像 404 这样的 HTTP 错误,则该值将为\"HTTP_ERROR\"。</string> <string name="triggerUrlVariableHint">此请求的结果将存储在变量 last_triggerurl_result 中,如果您希望从其他规则中检查它。如果出现像 404 这样的 HTTP 错误,则该值将为\"HTTP_ERROR\"。</string>
<string name="calendarEvent">日历事件</string> <string name="calendarEvent">日历事件</string>
@@ -885,4 +885,5 @@
<string name="enterAvalue">输入一个数值。</string> <string name="enterAvalue">输入一个数值。</string>
<string name="setSystemSettingCapital">集合系统设置</string> <string name="setSystemSettingCapital">集合系统设置</string>
<string name="examplesWriteSecureSettings">我没有列出可能的设置。请自己找到这些设置。请参见(此处)一些 <a href="https://developer.android.com/reference/android/provider/Settings.Secure">不完整的</a> 示例。</string> <string name="examplesWriteSecureSettings">我没有列出可能的设置。请自己找到这些设置。请参见(此处)一些 <a href="https://developer.android.com/reference/android/provider/Settings.Secure">不完整的</a> 示例。</string>
<string name="httpParametersExplanation">如果参数名以 %1$s 开头且方法为 POST,则不会像其他参数(key=value)那样传输,而是作为主数据传输。如果参数以 %2$s 结尾,则不会进行编码。</string>
</resources> </resources>
+3 -1
View File
@@ -903,7 +903,7 @@
<string name="noticeRestrictedPermissions">If you fail to grant one the following permission and a system message like \"Restricted permission\" you need to go to Android settings first, then applications, choose Automation. Now there should be 3 dots in the upper right corner. Click \"Allow restricted settings\". After that the necessary permission should be grant-able. This should only apply to the APK version of the app, not the ones from F-Droid or Play Store.</string> <string name="noticeRestrictedPermissions">If you fail to grant one the following permission and a system message like \"Restricted permission\" you need to go to Android settings first, then applications, choose Automation. Now there should be 3 dots in the upper right corner. Click \"Allow restricted settings\". After that the necessary permission should be grant-able. This should only apply to the APK version of the app, not the ones from F-Droid or Play Store.</string>
<string name="setLocationService">set location service</string> <string name="setLocationService">set location service</string>
<string name="setLocationServiceCapital">Set location service</string> <string name="setLocationServiceCapital">Set location service</string>
<string name="writeSecureSettingsNotice">Unfortunately the permission WRITE_SECURE_SETTINGS cannot be given directly on your Android device. Instead you need to connect your device to a computer and grant the permission via ADB. Click here to find out how to grant it: https://server47.de/automation/adb_hack.php</string> <string name="writeSecureSettingsNotice">If you choose Global or Secure as target you will need to grant the permission WRITE_SECURE_SETTINGS. Unfortunately this one cannot be given directly on your Android device. Instead, you need to connect your device to a computer and grant the permission via ADB. Click here to find out how to grant it: <a href="https://server47.de/automation/adb_hack.php">https://server47.de/automation/adb_hack.php</a></string>
<string name="actionSetLocationService">Location service</string> <string name="actionSetLocationService">Location service</string>
<string name="LOCATION_MODE_SENSOR_ONLY" translatable="false">SENSOR_ONLY</string> <string name="LOCATION_MODE_SENSOR_ONLY" translatable="false">SENSOR_ONLY</string>
<string name="LOCATION_MODE_BATTERY_SAVING" translatable="false">BATTERY_SAVING</string> <string name="LOCATION_MODE_BATTERY_SAVING" translatable="false">BATTERY_SAVING</string>
@@ -977,4 +977,6 @@
<string name="enterAvalue">Enter a value.</string> <string name="enterAvalue">Enter a value.</string>
<string name="setSystemSettingCapital">Set system setting</string> <string name="setSystemSettingCapital">Set system setting</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="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="target">Target</string>
</resources> </resources>
+3 -3
View File
@@ -2,10 +2,10 @@
buildscript { buildscript {
repositories { repositories {
google() google()
jcenter() mavenCentral()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:7.2.2' classpath 'com.android.tools.build:gradle:8.13.2'
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files // in the individual module build.gradle files
@@ -15,7 +15,7 @@ buildscript {
allprojects { allprojects {
repositories { repositories {
google() google()
jcenter() mavenCentral()
} }
} }
@@ -0,0 +1,2 @@
* Hinzugefügt: Weitere Optionen für die Trigger-URL-Aktion hinzugefügt.
* Hinzugefügt: Gradle und Bibliotheken aktualisiert.
@@ -0,0 +1 @@
* Geändert: MinSdk auf 19 erhöht, benötigt mindestens Android 4.4
@@ -0,0 +1,2 @@
* Added: Added further options to the trigger url action.
* Added: Gradle and libraries updated.
@@ -0,0 +1 @@
* Changed: Raised minSdk to 19, requiring at minimum Android 4.4
@@ -0,0 +1,5 @@
* Added option to choose between Global, System and Secure for set settings
* Fixed: Crash when opening the application through the running service's notification
* Fixed: Crash when starting service and show service icon was deactivated in app settings
* Fixed: "Bluetooth connect" permission was not requested for turning Bluetooth on or off.
* Fixed: Another app started/stopped couldn't be added when UI language was Dutch.
@@ -64,8 +64,8 @@ Supported actions:
* Change location setting * Change location setting
* Send text message * Send text message
It's quite hard to keep this app working across the many different hardwares as well as the many changes Android undergoes over the versions. I can test it in the emulator, but that cannot show all bugs. It's quite hard to keep this app working across the many different devices as well as the many changes Android undergoes over the versions. I can test it in the emulator, but that cannot show all bugs.
So if a certain feature is not working on your device - let me know. Over the years I have fixed almost all bugs that have been reasonably reported to me. But for that I'm dependend on your input. So if a certain feature is not working on your device - let me know. Over the years I have fixed almost all bugs that have been reasonably reported to me. But for that I'm dependent on your input.
If you have a problem and think about contacting me please If you have a problem and think about contacting me please
- update to the latest version first and see if your problem persists there, too. - update to the latest version first and see if your problem persists there, too.
@@ -0,0 +1,2 @@
* Añadido: Se añadieron más opciones a la acción de disparar URL.
* Añadido: Gradle y bibliotecas actualizadas.
@@ -0,0 +1 @@
* Cambiado: Subido minSdk a 19, requiriendo al mínimo Android 4.4
@@ -0,0 +1,2 @@
* Ajouté : Ajout d'options supplémentaires à l'action de déclenchement de l'URL.
* Ajouté : Gradle et bibliothèques mises à jour.
@@ -0,0 +1 @@
* Modifié : Portée du minSdk à 19, nécessitant au minimum Android 4.4
@@ -0,0 +1,2 @@
* Aggiunto: Aggiunte ulteriori opzioni all'azione di trigger URL.
* Aggiunto: Gradle e biblioteche aggiornate.
@@ -0,0 +1 @@
* Modificato: Aumentato il minSdk a 19, richiedendo almeno Android 4.4
@@ -0,0 +1,2 @@
* Toegevoegd: Extra opties toegevoegd aan de trigger-urlactie.
* Toegevoegd: Gradle en bibliotheken bijgewerkt.
@@ -0,0 +1 @@
* Gewijzigd: minSdk verhoogd naar 19, minimaal Android 4.4 vereist
@@ -0,0 +1,2 @@
* Dodano: Dodano dodatkowe opcje akcji trigger url.
* Dodano: Zaktualizowano Gradle i biblioteki.
@@ -0,0 +1 @@
* Zmieniono: Podniesiono minSdk do 19, wymagając co najmniej Androida 4.4
@@ -0,0 +1,2 @@
* Добавлено: добавлены дополнительные опции к действию триггера URL.
* Добавлено: обновлены Gradle и библиотеки.
@@ -0,0 +1 @@
* Изменено: minSdk повышен до 19, требуется минимум Android 4.4
@@ -0,0 +1,2 @@
* 新增:为触发URL动作增加了更多选项。
* 新增:Gradle及图书馆更新。
@@ -0,0 +1 @@
* 更改:将 minSDK 提升至 19,至少要求 Android 4.4
+4 -1
View File
@@ -16,4 +16,7 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
# https://developer.android.com/topic/libraries/support-library/androidx-rn # https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true android.useAndroidX=true
# Automatically convert third-party libraries to use AndroidX # Automatically convert third-party libraries to use AndroidX
android.enableJetifier=true android.enableJetifier=true
android.defaults.buildfeatures.buildconfig=true
android.nonTransitiveRClass=false
android.nonFinalResIds=false
+1 -1
View File
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip