12 Commits

Author SHA1 Message Date
fb64c46c95 Many fixes 2025-07-18 19:05:42 +02:00
c7557519e8 Many fixes 2025-07-16 18:08:58 +02:00
01c1ac3f5e Many fixes 2025-07-15 16:46:03 +02:00
b473034703 Many fixes 2025-07-12 18:51:37 +02:00
bf78ecc794 Many fixes 2025-07-10 18:39:07 +02:00
6d9a77a990 Screen brightness 2025-07-09 21:20:21 +02:00
ec68d375c7 Many fixes 2025-07-08 18:11:56 +02:00
e8524f719f Fixed warnings in logs for formatted notifications 2025-05-01 16:07:22 +02:00
f04c517c80 Toggle logcat on/off 2025-04-27 13:32:30 +02:00
b6d7958389 Invert variable check 2025-03-30 17:50:39 +02:00
04d2e4b432 Bugfix when checking for any battery charging type 2025-03-23 18:33:13 +01:00
abd346946a Bugfix when triggering URL 2025-03-22 20:27:59 +01:00
35 changed files with 678 additions and 219 deletions

View File

@ -11,8 +11,8 @@ android {
compileSdkVersion 33
buildToolsVersion '29.0.2'
useLibrary 'org.apache.http.legacy'
versionCode 143
versionName "1.8.2"
versionCode 144
versionName "1.8.3"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

View File

@ -734,7 +734,8 @@ public class Action
for(String pair : paramPairs)
{
String[] pieces = pair.split(Action.actionParameters2SeparatorInner);
httpParams.put(pieces[0], pieces[1]);
if(pieces.length == 2)
httpParams.put(pieces[0], pieces[1]);
}
}

View File

@ -67,6 +67,7 @@ import java.security.KeyStore;
import java.util.Calendar;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
@ -280,9 +281,8 @@ public class Actions
Miscellaneous.logEvent("i", "Wifi", "Changing wifi to " + String.valueOf(desiredState) + ", but with root permissions.", 4);
String command = null;
int state = 0;
String desiredStateString;
String desiredStateString;
if(desiredState)
desiredStateString = "enable";
else
@ -1053,7 +1053,7 @@ public class Actions
{
Miscellaneous.logEvent("i", "StartOtherActivity", "Starting other Activity...", 4);
String params[];
String[] params;
if(param.contains(Action.actionParameter2Split))
params = param.split(Action.actionParameter2Split, -1);
@ -1113,7 +1113,7 @@ public class Actions
externalApplicationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// Pack intents
if(params.length >= 4)
if(params.length >= 5)
{
if(Miscellaneous.isNumeric(startupType))
externalApplicationIntent = packParametersIntoIntent(externalApplicationIntent, params, 4);
@ -2053,10 +2053,208 @@ public class Actions
else
android.provider.Settings.System.putInt(context.getContentResolver(), android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE, android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
int actualBrightnessValue = (int) ((float) brightnessValue / 100.0 * 255.0);
// Old mathematical approach doesn't seem to be working anymore
// int actualBrightnessValue = (int) ((float) brightnessValue / 100.0 * 255.0);
// try
// {
// for (int i = 160; i < 255; i++)
// {
// android.provider.Settings.System.putInt(context.getContentResolver(), android.provider.Settings.System.SCREEN_BRIGHTNESS, i);
// Thread.sleep(1000);
// Log.i("Brightness", "Set: " + String.valueOf(i) + ", result: " + String.valueOf(android.provider.Settings.System.getInt(context.getContentResolver(), android.provider.Settings.System.SCREEN_BRIGHTNESS, -1)));
// }
// }
// catch (Exception e)
// {
//
// }
int actualBrightnessValue = getBrightnessSetting(brightnessValue);
Miscellaneous.logEvent("i", "Screen brightness", "Setting screen brightness to " + String.valueOf(brightnessValue) + " by using " + String.valueOf(actualBrightnessValue), 4);
android.provider.Settings.System.putInt(context.getContentResolver(), android.provider.Settings.System.SCREEN_BRIGHTNESS, actualBrightnessValue);
}
static int getBrightnessSetting(int percentage)
{
if(percentage == 0)
return 1; // seems to be the minimum, 0 isn't working
/*
By taking notes which value results in which brightness percentage I came up with this lookup list.
Somebody at Google must have been smoking something.
Not all percentages can be implemented. Hence the next possible value will be used.
*/
Map<Integer, Integer> percentageSettingValueMap = new HashMap<>();
if(Build.VERSION.SDK_INT < 34)
{
// Noted from Android 10
percentageSettingValueMap.put(11, 10);
percentageSettingValueMap.put(16, 11);
percentageSettingValueMap.put(19, 12);
percentageSettingValueMap.put(22, 13);
percentageSettingValueMap.put(25, 14);
percentageSettingValueMap.put(27, 15);
percentageSettingValueMap.put(29, 16);
percentageSettingValueMap.put(31, 17);
percentageSettingValueMap.put(33, 18);
percentageSettingValueMap.put(35, 19);
percentageSettingValueMap.put(37, 20);
percentageSettingValueMap.put(38, 21);
percentageSettingValueMap.put(40, 22);
percentageSettingValueMap.put(41, 23);
percentageSettingValueMap.put(43, 24);
percentageSettingValueMap.put(44, 25);
percentageSettingValueMap.put(46, 26);
percentageSettingValueMap.put(47, 27);
percentageSettingValueMap.put(48, 28);
percentageSettingValueMap.put(49, 29);
percentageSettingValueMap.put(51, 30);
percentageSettingValueMap.put(52, 31);
percentageSettingValueMap.put(53, 32);
percentageSettingValueMap.put(54, 33);
percentageSettingValueMap.put(55, 34);
percentageSettingValueMap.put(56, 35);
percentageSettingValueMap.put(57, 36);
percentageSettingValueMap.put(58, 38);
percentageSettingValueMap.put(59, 39);
percentageSettingValueMap.put(60, 40);
percentageSettingValueMap.put(61, 42);
percentageSettingValueMap.put(62, 43);
percentageSettingValueMap.put(63, 45);
percentageSettingValueMap.put(64, 46);
percentageSettingValueMap.put(65, 48);
percentageSettingValueMap.put(66, 50);
percentageSettingValueMap.put(67, 52);
percentageSettingValueMap.put(68, 54);
percentageSettingValueMap.put(69, 56);
percentageSettingValueMap.put(70, 59);
percentageSettingValueMap.put(71, 61);
percentageSettingValueMap.put(72, 64);
percentageSettingValueMap.put(73, 67);
percentageSettingValueMap.put(74, 70);
percentageSettingValueMap.put(75, 73);
percentageSettingValueMap.put(76, 76);
percentageSettingValueMap.put(77, 80);
percentageSettingValueMap.put(78, 84);
percentageSettingValueMap.put(79, 87);
percentageSettingValueMap.put(80, 91);
percentageSettingValueMap.put(81, 96);
percentageSettingValueMap.put(82, 100);
percentageSettingValueMap.put(83, 105);
percentageSettingValueMap.put(84, 111);
percentageSettingValueMap.put(85, 116);
percentageSettingValueMap.put(86, 122);
percentageSettingValueMap.put(87, 128);
percentageSettingValueMap.put(88, 134);
percentageSettingValueMap.put(89, 141);
percentageSettingValueMap.put(90, 148);
percentageSettingValueMap.put(91, 156);
percentageSettingValueMap.put(92, 164);
percentageSettingValueMap.put(93, 173);
percentageSettingValueMap.put(94, 182);
percentageSettingValueMap.put(95, 191);
percentageSettingValueMap.put(96, 201);
percentageSettingValueMap.put(97, 212);
percentageSettingValueMap.put(98, 223);
percentageSettingValueMap.put(99, 235);
percentageSettingValueMap.put(100, 247);
}
else
{
// Noted from Android 14
percentageSettingValueMap.put(11,1);
percentageSettingValueMap.put(15,2);
percentageSettingValueMap.put(19,3);
percentageSettingValueMap.put(22,4);
percentageSettingValueMap.put(24,5);
percentageSettingValueMap.put(27,6);
percentageSettingValueMap.put(29,7);
percentageSettingValueMap.put(31,8);
percentageSettingValueMap.put(33,9);
percentageSettingValueMap.put(34,10);
percentageSettingValueMap.put(36,11);
percentageSettingValueMap.put(38,12);
percentageSettingValueMap.put(39,13);
percentageSettingValueMap.put(41,14);
percentageSettingValueMap.put(42,15);
percentageSettingValueMap.put(43,16);
percentageSettingValueMap.put(45,17);
percentageSettingValueMap.put(46,18);
percentageSettingValueMap.put(47,47);
percentageSettingValueMap.put(48,49);
percentageSettingValueMap.put(50,21);
percentageSettingValueMap.put(51,22);
percentageSettingValueMap.put(52,23);
percentageSettingValueMap.put(53,24);
percentageSettingValueMap.put(54,25);
percentageSettingValueMap.put(55,26);
percentageSettingValueMap.put(56,27);
percentageSettingValueMap.put(57,28);
percentageSettingValueMap.put(58,30);
percentageSettingValueMap.put(59,31);
percentageSettingValueMap.put(60,32);
percentageSettingValueMap.put(61,34);
percentageSettingValueMap.put(62,35);
percentageSettingValueMap.put(63,37);
percentageSettingValueMap.put(64,39);
percentageSettingValueMap.put(65,41);
percentageSettingValueMap.put(66,43);
percentageSettingValueMap.put(67,45);
percentageSettingValueMap.put(68,47);
percentageSettingValueMap.put(69,49);
percentageSettingValueMap.put(70,52);
percentageSettingValueMap.put(71,54);
percentageSettingValueMap.put(72,57);
percentageSettingValueMap.put(73,60);
percentageSettingValueMap.put(74,63);
percentageSettingValueMap.put(75,66);
percentageSettingValueMap.put(76,70);
percentageSettingValueMap.put(77,73);
percentageSettingValueMap.put(78,77);
percentageSettingValueMap.put(79,81);
percentageSettingValueMap.put(80,85);
percentageSettingValueMap.put(81,90);
percentageSettingValueMap.put(82,95);
percentageSettingValueMap.put(83,100);
percentageSettingValueMap.put(84,105);
percentageSettingValueMap.put(85,111);
percentageSettingValueMap.put(86,117);
percentageSettingValueMap.put(87,124);
percentageSettingValueMap.put(88,130);
percentageSettingValueMap.put(89,137);
percentageSettingValueMap.put(90,144);
percentageSettingValueMap.put(91,152);
percentageSettingValueMap.put(92,161);
percentageSettingValueMap.put(93,170);
percentageSettingValueMap.put(94,179);
percentageSettingValueMap.put(95,189);
percentageSettingValueMap.put(96,199);
percentageSettingValueMap.put(97,210);
percentageSettingValueMap.put(98,223);
percentageSettingValueMap.put(99,235);
percentageSettingValueMap.put(100,248);
}
if(percentageSettingValueMap.containsKey(percentage))
return percentageSettingValueMap.get(percentage);
else
{
// Find next best value
for(int i = percentage; i <= 100; i++)
{
if(percentageSettingValueMap.containsKey(i))
return percentageSettingValueMap.get(i);
}
}
return 0;
}
public boolean isAirplaneModeOn(Context context)
{
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1)

View File

@ -196,7 +196,14 @@ public class ActivityMainRules extends ActivityGeneric
{
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
alertDialogBuilder.setTitle(getResources().getString(R.string.whatToDoWithRule));
alertDialogBuilder.setItems(new String[]{ getResources().getString(R.string.runManually), getResources().getString(R.string.edit), getResources().getString(R.string.deleteCapital), getResources().getString(R.string.clone) }, new DialogInterface.OnClickListener()
String toggleEnabled;
if(ruleThisIsAbout.isRuleActive())
toggleEnabled = getResources().getString(R.string.disable);
else
toggleEnabled = getResources().getString(R.string.enable);
alertDialogBuilder.setItems(new String[]{ getResources().getString(R.string.runManually), getResources().getString(R.string.edit), getResources().getString(R.string.deleteCapital), toggleEnabled, getResources().getString(R.string.clone) }, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
@ -248,6 +255,19 @@ public class ActivityMainRules extends ActivityGeneric
deleteDialog.show();
break;
case 3:
ruleToEdit = ruleThisIsAbout;
if(ruleToEdit.isRuleActive())
ruleToEdit.setRuleActive(false);
else
ruleToEdit.setRuleActive(true);
if(ruleToEdit.change(ActivityMainRules.this))
{
ruleToEdit = null; //clear cache
updateListView();
}
break;
case 4:
ruleToEdit = ruleThisIsAbout;
if(ruleToEdit.cloneRule(ActivityMainRules.this))
{

View File

@ -57,7 +57,7 @@ public class ActivityManageActionStartActivity extends Activity
ProgressDialog progressDialog = null;
RadioButton rbStartAppSelectByActivity, rbStartAppSelectByAction, rbStartAppByActivity, rbStartAppByBroadcast, rbStartAppByService, rbStartAppByForegroundService;
final String urlShowExamples = "https://server47.de/automation/examples_startProgram.html";
final String urlShowExamples = "https://server47.de/automation/examples.html";
public final static String startByActivityString = "0";
public final static String startByBroadcastString = "1";
public final static String startByServiceString = "2";

View File

@ -1,5 +1,6 @@
package com.jens.automation2;
import android.Manifest;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
@ -7,6 +8,7 @@ import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
@ -23,6 +25,9 @@ import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.core.content.PermissionChecker;
import com.jens.automation2.receivers.ConnectivityReceiver;
import java.util.Calendar;
@ -40,6 +45,7 @@ public class ActivityManagePoi extends Activity
EditText guiPoiName, guiPoiLatitude, guiPoiLongitude, guiPoiRadius;
Calendar locationSearchStart = null;
Timer timer = null;
int requestCodeGetLocationPermission = 1293;
final static int defaultRadius = 250;
final static int searchTimeout = 120;
@ -77,7 +83,15 @@ public class ActivityManagePoi extends Activity
public void onClick(View v)
{
hideKeyboard();
getNotificationDialog(getResources().getString(R.string.positioningWindowNotice)).show();
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
{
if (ActivityPermissions.havePermission(Manifest.permission.ACCESS_FINE_LOCATION, ActivityManagePoi.this))
getNotificationDialog(getResources().getString(R.string.positioningWindowNotice)).show();
else
requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, requestCodeGetLocationPermission);
}
else
getNotificationDialog(getResources().getString(R.string.positioningWindowNotice)).show();
}
});
@ -111,7 +125,20 @@ public class ActivityManagePoi extends Activity
//else
// new Poi to be created
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
{
if(requestCode == requestCodeGetLocationPermission)
{
if(permissions[0].equals(Manifest.permission.ACCESS_FINE_LOCATION) && grantResults[0] == PackageManager.PERMISSION_GRANTED)
getNotificationDialog(getResources().getString(R.string.positioningWindowNotice)).show();
else
Toast.makeText(ActivityManagePoi.this, getResources().getString(R.string.locationPermissionRequired), Toast.LENGTH_LONG).show();
}
// super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
private void createPoi()
{
myLocationManager.removeUpdates(myLocationListenerGps);
@ -314,20 +341,20 @@ public class ActivityManagePoi extends Activity
public void onClick(DialogInterface dialog, int which)
{
progressDialog = ProgressDialog.show(ActivityManagePoi.this, "", getResources().getString(R.string.gettingPosition), true, true);
if(Build.VERSION.SDK_INT >= 31)
{
AlertDialog dia = Miscellaneous.messageBox(getResources().getString(R.string.info), getResources().getString(R.string.locationNotWorkingOn12), ActivityManagePoi.this);
dia.setOnDismissListener(new DialogInterface.OnDismissListener()
{
@Override
public void onDismiss(DialogInterface dialogInterface)
{
getLocation();
}
});
dia.show();
}
else
// if(Build.VERSION.SDK_INT >= 31)
// {
// AlertDialog dia = Miscellaneous.messageBox(getResources().getString(R.string.info), getResources().getString(R.string.locationNotWorkingOn12), ActivityManagePoi.this);
// dia.setOnDismissListener(new DialogInterface.OnDismissListener()
// {
// @Override
// public void onDismiss(DialogInterface dialogInterface)
// {
// getLocation();
// }
// });
// dia.show();
// }
// else
getLocation();
}
};

View File

@ -10,12 +10,7 @@ import android.widget.RadioButton;
import androidx.annotation.Nullable;
import com.jens.automation2.ActivityManageRule;
import com.jens.automation2.Miscellaneous;
import com.jens.automation2.R;
import com.jens.automation2.Trigger;
import org.apache.commons.lang3.StringUtils;
import com.jens.automation2.receivers.BatteryReceiver;
public class ActivityManageTriggerCharging extends Activity
{
@ -69,13 +64,13 @@ public class ActivityManageTriggerCharging extends Activity
String param2 = "";
if(rbChargingTypeAny.isChecked())
param2 = "0";
param2 = String.valueOf(BatteryReceiver.batteryChargingTypeAny);
else if(rbChargingTypeAc.isChecked())
param2 = String.valueOf(BatteryManager.BATTERY_PLUGGED_AC);
param2 = String.valueOf(BatteryReceiver.batteryChargingTypeAc);
else if(rbChargingTypeUsb.isChecked())
param2 = String.valueOf(BatteryManager.BATTERY_PLUGGED_USB);
param2 = String.valueOf(BatteryReceiver.batteryChargingTypeUsb);
else if(rbChargingTypeWireless.isChecked())
param2 = String.valueOf(BatteryManager.BATTERY_PLUGGED_WIRELESS);
param2 = String.valueOf(BatteryReceiver.batteryChargingTypeWireless);
response.putExtra(ActivityManageRule.intentNameTriggerParameter2, param2);

View File

@ -5,6 +5,8 @@ import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import androidx.annotation.Nullable;
@ -14,6 +16,7 @@ import org.apache.commons.lang3.StringUtils;
public class ActivityManageTriggerCheckVariable extends Activity
{
EditText etVariableKeyTrigger, etVariableValueTrigger;
CheckBox chkTriggerVariableDirection;
Button bTriggerVariableSave;
@Override
@ -25,9 +28,14 @@ public class ActivityManageTriggerCheckVariable extends Activity
etVariableKeyTrigger = (EditText) findViewById(R.id.etVariableKeyTrigger);
etVariableValueTrigger = (EditText) findViewById(R.id.etVariableValueTrigger);
chkTriggerVariableDirection = (CheckBox)findViewById(R.id.chkTriggerVariableDirection);
bTriggerVariableSave = (Button) findViewById(R.id.bTriggerVariableSave);
Intent input = getIntent();
if(input.hasExtra(ActivityManageRule.intentNameTriggerParameter1))
chkTriggerVariableDirection.setChecked(input.getBooleanExtra(ActivityManageRule.intentNameTriggerParameter1, true));
if(input.hasExtra(ActivityManageRule.intentNameTriggerParameter2))
{
String[] conditions = input.getStringExtra(ActivityManageRule.intentNameTriggerParameter2).split(Trigger.triggerParameter2Split);
@ -36,13 +44,26 @@ public class ActivityManageTriggerCheckVariable extends Activity
etVariableValueTrigger.setText(conditions[1]);
}
chkTriggerVariableDirection.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean checked)
{
if(checked)
chkTriggerVariableDirection.setText(getResources().getString(R.string.matches));
else
chkTriggerVariableDirection.setText(getResources().getString(R.string.doesNotMatch));
}
});
bTriggerVariableSave.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
Intent response = new Intent();
// response.putExtra(ActivityManageRule.intentNameTriggerParameter1, rbTetheringOn.isChecked());
response.putExtra(ActivityManageRule.intentNameTriggerParameter1, chkTriggerVariableDirection.isChecked());
if(StringUtils.isEmpty(etVariableValueTrigger.getText().toString()))
response.putExtra(ActivityManageRule.intentNameTriggerParameter2, etVariableKeyTrigger.getText().toString());

View File

@ -150,7 +150,12 @@ public class ActivityManageTriggerNfc extends Activity
final Intent intent = new Intent(activity.getApplicationContext(), activity.getClass());
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
final PendingIntent pendingIntent = PendingIntent.getActivity(activity.getApplicationContext(), 0, intent, 0);
final PendingIntent pendingIntent;
if(Miscellaneous.getTargetSDK(activity) >= 31)
pendingIntent = PendingIntent.getActivity(activity.getApplicationContext(), 0, intent, PendingIntent.FLAG_IMMUTABLE);
else
pendingIntent = PendingIntent.getActivity(activity.getApplicationContext(), 0, intent, 0);
IntentFilter[] filters = new IntentFilter[1];
String[][] techList = new String[][]{};

View File

@ -2,6 +2,7 @@ package com.jens.automation2;
import android.app.Activity;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
@ -37,6 +38,9 @@ public class ActivityManageTriggerTimeFrame extends Activity
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_trigger_timeframe);
if(Build.VERSION.SDK_INT == 34)
Miscellaneous.messageBox(getResources().getString(R.string.info), getResources().getString(R.string.Android14TimePickerHint), ActivityManageTriggerTimeFrame.this).show();
startPicker = (TimePicker)findViewById(R.id.tpTimeFrameStart);
stopPicker = (TimePicker)findViewById(R.id.tpTimeFrameStop);

View File

@ -565,7 +565,10 @@ public class ActivityPermissions extends Activity
addToArrayListUnique(Manifest.permission.INTERNET, requiredPermissions);
break;
case timeFrame:
if(Build.VERSION.SDK_INT >= 31 && Miscellaneous.getTargetSDK(Miscellaneous.getAnyContext()) >= 31)
if(Build.VERSION.SDK_INT >= 31 && Miscellaneous.getTargetSDK(Miscellaneous.getAnyContext()) >= 31
// ||
// Build.VERSION.SDK_INT >= 33
)
addToArrayListUnique(Manifest.permission.SCHEDULE_EXACT_ALARM, requiredPermissions);
break;
case usb_host_connection:
@ -697,7 +700,7 @@ public class ActivityPermissions extends Activity
// addToArrayListUnique("net.kollnig.missioncontrol.permission.ADMIN", requiredPermissions);
if(Build.VERSION.SDK_INT >= 29)
{
String parts[];
String[] parts;
if(action.getParameter2().contains(Action.actionParameter2Split))
parts = action.getParameter2().split(Action.actionParameter2Split);
else
@ -705,7 +708,15 @@ public class ActivityPermissions extends Activity
// Permission only required for starts of activity, not broadcasts or services
if(parts[2].equals(ActivityManageActionStartActivity.startByActivityString))
if(
(
parts.length >= 4
&&
parts[3].equals(ActivityManageActionStartActivity.startByActivityString)
)
||
parts[2].equals(ActivityManageActionStartActivity.startByActivityString)
)
addToArrayListUnique(Manifest.permission.SYSTEM_ALERT_WINDOW, requiredPermissions);
}
break;
@ -746,6 +757,9 @@ public class ActivityPermissions extends Activity
case setLocationService:
addToArrayListUnique(Manifest.permission.WRITE_SECURE_SETTINGS, requiredPermissions);
break;
case setScreenBrightness:
addToArrayListUnique(Manifest.permission.WRITE_SETTINGS, requiredPermissions);
break;
default:
break;
}
@ -1073,14 +1087,14 @@ public class ActivityPermissions extends Activity
ArrayList<String> permissionList = new ArrayList<String>();
for(String permission : permissionNames)
{
if(permissionNames.equals(Manifest.permission.PROCESS_OUTGOING_CALLS))
if(permission.equals(Manifest.permission.PROCESS_OUTGOING_CALLS))
{
if(ActivityPermissions.isPermissionDeclaredInManifest(Miscellaneous.getAnyContext(), Manifest.permission.PROCESS_OUTGOING_CALLS) && !Miscellaneous.isGooglePlayInstalled(Miscellaneous.getAnyContext()))
{
permissionList.add(permission);
}
}
else if(permissionNames.equals(Manifest.permission.SEND_SMS))
else if(permission.equals(Manifest.permission.SEND_SMS))
{
if(ActivityPermissions.isPermissionDeclaredInManifest(Miscellaneous.getAnyContext(), Manifest.permission.SEND_SMS) && !Miscellaneous.isGooglePlayInstalled(Miscellaneous.getAnyContext()))
{

View File

@ -243,7 +243,7 @@ public class AutomationService extends Service implements OnInitListener
updateNotification();
if (isMainActivityRunning(this))
if(isMainActivityRunning(this))
ActivityMainScreen.updateMainScreen();
this.isRunning = true;
@ -543,42 +543,6 @@ public class AutomationService extends Service implements OnInitListener
centralInstance = null;
Settings.serviceStartDone = false;
}
protected static Builder createDefaultNotificationBuilderOld()
{
Builder builder = new Builder(AutomationService.getInstance());
builder.setContentTitle("Automation");
if(Settings.showIconWhenServiceIsRunning)
{
if(BuildConfig.FLAVOR.equalsIgnoreCase(AutomationService.flavor_name_googleplay))
builder.setSmallIcon(R.drawable.crane);
else
builder.setSmallIcon(R.drawable.ic_launcher);
}
builder.setCategory(Notification.CATEGORY_SERVICE);
builder.setWhen(System.currentTimeMillis());
builder.setContentIntent(myPendingIntent);
Notification defaultNotification = builder.build();
defaultNotification.icon = R.drawable.crane;
defaultNotification.when = System.currentTimeMillis();
// defaultNotification.defaults |= Notification.DEFAULT_VIBRATE;
// defaultNotification.defaults |= Notification.DEFAULT_LIGHTS;
defaultNotification.flags |= Notification.FLAG_AUTO_CANCEL;
// defaultNotification.flags |= Notification.FLAG_SHOW_LIGHTS;
defaultNotification.flags |= Notification.FLAG_ONLY_ALERT_ONCE;
// defaultNotification.ledARGB = Color.YELLOW;
// defaultNotification.ledOnMS = 1500;
// defaultNotification.ledOffMS = 1500;
return builder;
}
protected static NotificationCompat.Builder createServiceNotificationBuilder()
{
@ -628,6 +592,9 @@ public class AutomationService extends Service implements OnInitListener
@SuppressWarnings("deprecation")
public static void updateNotification()
{
if(!Settings.showIconWhenServiceIsRunning && Build.VERSION.SDK_INT < Build.VERSION_CODES.O)
return;
AutomationService instance = getInstance();
if(instance != null)

View File

@ -314,15 +314,18 @@ public class Miscellaneous extends Service
header = "Automation";
}
if(type.equals("e"))
Log.e(header, description);
if(Settings.logToConsole)
{
if (type.equals("e"))
Log.e(header, description);
if (type.equals("w"))
Log.w(header, description);
if (type.equals("i"))
Log.i(header, description);
}
if(type.equals("w"))
Log.w(header, description);
if(type.equals("i"))
Log.i(header, description);
if(Settings.writeLogFile && Settings.logLevel >= logLevel)
{
writeToLogFile(type, header, description);

View File

@ -30,6 +30,7 @@ public class Settings implements SharedPreferences
public static int gpsTimeout;
public static long minimumTimeBetweenUpdate;
public static boolean startServiceAtSystemBoot;
public static boolean logToConsole;
public static boolean writeLogFile;
public static long logLevel;
public static int logFileMaxSize;
@ -98,6 +99,7 @@ public class Settings implements SharedPreferences
public static final int default_gpsTimeout = 300; // seconds
public static final long default_minimumTimeBetweenUpdate = 30000; // in Milliseconds
public static final boolean default_startServiceAtSystemBoot = false;
public static final boolean default_logToConsole = false;
public static final boolean default_writeLogFile = false;
public static final long default_logLevel = 2;
public static final int default_logFileMaxSize = 10;
@ -199,6 +201,7 @@ public class Settings implements SharedPreferences
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
startServiceAtSystemBoot = prefs.getBoolean("startServiceAtSystemBoot", default_startServiceAtSystemBoot);
logToConsole = prefs.getBoolean("logToConsole", default_logToConsole);
writeLogFile = prefs.getBoolean("writeLogFile", default_writeLogFile);
boolean useTextToSpeech = false;
@ -339,6 +342,9 @@ public class Settings implements SharedPreferences
if(!prefs.contains("startServiceAtSystemBoot") || force)
editor.putBoolean("startServiceAtSystemBoot", default_startServiceAtSystemBoot);
if(!prefs.contains("logToConsole") || force)
editor.putBoolean("logToConsole", default_logToConsole);
if(!prefs.contains("writeLogFile") || force)
editor.putBoolean("writeLogFile", default_writeLogFile);
@ -515,6 +521,7 @@ public class Settings implements SharedPreferences
Editor editor = prefs.edit();
editor.putBoolean("startServiceAtSystemBoot", startServiceAtSystemBoot);
editor.putBoolean("logToConsole", logToConsole);
editor.putBoolean("writeLogFile", writeLogFile);
// editor.putBoolean("useTextToSpeech", useTextToSpeech);
editor.putBoolean("useTextToSpeechOnNormal", useTextToSpeechOnNormal);

View File

@ -592,16 +592,42 @@ public class Trigger
boolean checkHeadsetPlugged()
{
if(HeadphoneJackListener.isHeadsetConnected() != this.getTriggerParameter())
return false;
else
if(this.getHeadphoneType() != 2 && this.getHeadphoneType() != HeadphoneJackListener.getHeadphoneType())
/*
Wenn verbunden:
- either -> true
- headphone -> true
- mikro -> wenn tatsächlich mikro
Wenn nicht verbunden:
- either -> true
- headphone -> true
- mikro -> true
*/
if(HeadphoneJackListener.isHeadsetConnected()) // connection detected
{
Miscellaneous.logEvent("i", Miscellaneous.getAnyContext().getResources().getString(R.string.ruleCheckOf), String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.ruleDoesntApplyWrongHeadphoneType), this.getParentRule().getName()), 3);
return false;
if(this.getTriggerParameter()) // connection demanded
{
if (this.getHeadphoneType() == 1)
{
if (this.getHeadphoneType() == HeadphoneJackListener.getHeadphoneType()) // Microphone demanded
return true;
else
Miscellaneous.logEvent("i", Miscellaneous.getAnyContext().getResources().getString(R.string.ruleCheckOf), String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.ruleDoesntApplyWrongHeadphoneType), this.getParentRule().getName()), 3);
}
else
return true;
}
}
else // disconnection detected
{
// Type doesn't matter here
if(!this.getTriggerParameter()) // disconnection demanded
return true;
}
return true;
return false;
}
boolean checkSubSystemState()
@ -643,8 +669,16 @@ public class Trigger
{
if (map.containsKey(conditions[0]))
{
if (map.get(conditions[0]).equals(conditions[1]))
return true;
if(Miscellaneous.isRegularExpression(conditions[1]))
{
if (map.get(conditions[0]).matches(conditions[1]))
return this.getTriggerParameter();
}
else
{
if (map.get(conditions[0]).equals(conditions[1]))
return this.getTriggerParameter();
}
}
}
}
@ -1220,7 +1254,9 @@ public class Trigger
int desiredType;
String[] typeParams = getTriggerParameter2().split(triggerParameter2Split, -1);
desiredType = Integer.parseInt(typeParams[0]);
if(desiredType == BatteryReceiver.getCurrentChargingType())
if(desiredType == BatteryReceiver.batteryChargingTypeAny)
return true;
else if(desiredType == BatteryReceiver.getCurrentChargingType())
return true;
}
}
@ -1861,13 +1897,21 @@ public class Trigger
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.deactivated));
break;
case checkVariable:
if (triggerParameter2.contains(triggerParameter2Split))
if(triggerParameter)
{
String[] parts = triggerParameter2.split(triggerParameter2Split);
returnString.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.variableCheckString), parts[0], parts[1]));
if (triggerParameter2.contains(triggerParameter2Split))
{
String[] parts = triggerParameter2.split(triggerParameter2Split);
returnString.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.variableCheckString), parts[0], parts[1]));
}
else
returnString.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.variableCheckStringDeleted), triggerParameter2));
}
else
returnString.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.variableCheckStringDeleted), triggerParameter2));
{
String[] parts = triggerParameter2.split(triggerParameter2Split);
returnString.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.variableCheckStringNot), parts[0], parts[1]));
}
break;
case calendarEvent:
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.calendarEvent));

View File

@ -1,11 +1,13 @@
package com.jens.automation2.receivers;
import static android.os.BatteryManager.*;
import android.os.BatteryManager;
import android.Manifest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.BatteryManager;
import android.util.Log;
import com.jens.automation2.ActivityPermissions;
@ -18,6 +20,11 @@ import java.util.ArrayList;
public class BatteryReceiver extends BroadcastReceiver implements AutomationListenerInterface
{
public static final int batteryChargingTypeAny = 0;
public static final int batteryChargingTypeAc = BatteryManager.BATTERY_PLUGGED_AC;
public static final int batteryChargingTypeUsb = BatteryManager.BATTERY_PLUGGED_USB;
public static final int batteryChargingTypeWireless = BatteryManager.BATTERY_PLUGGED_WIRELESS;
public static AutomationService automationServiceRef = null;
static int batteryLevel = -1; // initialize with a better value than this
static boolean usbHostConnected = false;
@ -102,7 +109,7 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList
{
try
{
batteryLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
batteryLevel = intent.getIntExtra(EXTRA_LEVEL, -1);
// int scale = -1;
// int voltage = -1;
// int temp = -1;
@ -112,36 +119,36 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList
Log.i("Battery", "Level: " + String.valueOf(batteryLevel));
this.actionBatteryLevel(context);
int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
int statusPlugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
int status = intent.getIntExtra(EXTRA_STATUS, -1);
int statusPlugged = intent.getIntExtra(EXTRA_PLUGGED, -1);
Miscellaneous.logEvent("i", "BatteryReceiver", "Status: " + String.valueOf(statusPlugged), 5);
switch(statusPlugged)
{
case BatteryManager.BATTERY_PLUGGED_AC:
case BATTERY_PLUGGED_AC:
// Toast.makeText(context, "Regular charging", Toast.LENGTH_LONG).show();
Miscellaneous.logEvent("i", "BatteryReceiver", "Regular charging.", 5);
this.actionCharging(context, statusPlugged);
break;
case BatteryManager.BATTERY_PLUGGED_WIRELESS:
case BATTERY_PLUGGED_WIRELESS:
// Toast.makeText(context, "Regular charging", Toast.LENGTH_LONG).show();
Miscellaneous.logEvent("i", "BatteryReceiver", "Wireless charging.", 5);
this.actionCharging(context, statusPlugged);
break;
case BatteryManager.BATTERY_PLUGGED_USB:
case BATTERY_PLUGGED_USB:
this.actionUsbConnected(context);
break;
}
switch(status)
{
case BatteryManager.BATTERY_STATUS_CHARGING:
case BatteryManager.BATTERY_STATUS_FULL:
case BATTERY_STATUS_CHARGING:
case BATTERY_STATUS_FULL:
// Miscellaneous.logEvent("i", "BatteryReceiver", "Device has been fully charged.", 5);
this.actionCharging(context, statusPlugged);
break;
case BatteryManager.BATTERY_STATUS_DISCHARGING:
case BatteryManager.BATTERY_STATUS_NOT_CHARGING:
case BATTERY_STATUS_DISCHARGING:
case BATTERY_STATUS_NOT_CHARGING:
this.actionDischarging(context);
break;
}
@ -163,7 +170,7 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList
case 1:
Miscellaneous.logEvent("i", "ChargingInfo", "Device is discharging.", 3);
break;
case BatteryManager.BATTERY_STATUS_CHARGING:
case BATTERY_STATUS_CHARGING:
Miscellaneous.logEvent("i", "ChargingInfo", "Device is charging.", 3);
break;
}
@ -178,10 +185,10 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList
private void actionCharging(Context context, int statusPlugged)
{
if(currentChargingState != BatteryManager.BATTERY_STATUS_CHARGING) // Avoid flooding the log. This event will occur on a regular basis even though charging state wasn't changed.
if(currentChargingState != BATTERY_STATUS_CHARGING) // Avoid flooding the log. This event will occur on a regular basis even though charging state wasn't changed.
{
Miscellaneous.logEvent("i", "BatteryReceiver", "Battery is charging or full.", 3);
currentChargingState = BatteryManager.BATTERY_STATUS_CHARGING;
currentChargingState = BATTERY_STATUS_CHARGING;
currentChargingType = statusPlugged;
ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.charging);
@ -207,10 +214,10 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList
private void actionDischarging(Context context)
{
if(currentChargingState != BatteryManager.BATTERY_STATUS_UNKNOWN) // Avoid flooding the log. This event will occur on a regular basis even though charging state wasn't changed.
if(currentChargingState != BATTERY_STATUS_UNKNOWN) // Avoid flooding the log. This event will occur on a regular basis even though charging state wasn't changed.
{
Miscellaneous.logEvent("i", "BatteryReceiver", "Battery is discharging.", 3);
currentChargingState = BatteryManager.BATTERY_STATUS_UNKNOWN;
currentChargingState = BATTERY_STATUS_UNKNOWN;
//activate rule(s)
ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.charging);
// ArrayList<Rule> ruleCandidates = Rule.findRuleCandidatesByCharging(false);
@ -243,7 +250,7 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList
oneRule.activate(automationServiceRef, false);
}
this.actionCharging(context, BatteryManager.BATTERY_PLUGGED_USB);
this.actionCharging(context, BATTERY_PLUGGED_USB);
}
}

View File

@ -129,7 +129,10 @@ public class BroadcastListener extends android.content.BroadcastReceiver impleme
try
{
broadcastStatus = automationServiceRef.registerReceiver(broadcastReceiverInstance, broadcastIntentFilter);
if(Build.VERSION.SDK_INT >= 33)
broadcastStatus = automationServiceRef.registerReceiver(broadcastReceiverInstance, broadcastIntentFilter, Context.RECEIVER_EXPORTED);
else
broadcastStatus = automationServiceRef.registerReceiver(broadcastReceiverInstance, broadcastIntentFilter);
broadcastReceiverActive = true;
}
catch(Exception e)

View File

@ -14,6 +14,7 @@ import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import com.jens.automation2.AutomationService;
import com.jens.automation2.Miscellaneous;
@ -508,12 +509,20 @@ public class CalendarReceiver extends BroadcastReceiver implements AutomationLis
Calendar now = Calendar.getInstance();
List<CalendarEvent> events = readCalendarEvents(Miscellaneous.getAnyContext(), true, false);
if(events.size() == 0)
{
Miscellaneous.logEvent("i", "calculateNextWakeup()", "Supposedly no future events in calendar. Reading again...", 4);
events = readCalendarEvents(Miscellaneous.getAnyContext(), true, false);
}
if (events.size() == 0)
{
Miscellaneous.logEvent("i", "calculateNextWakeup()", "No future events, nothing to schedule.", 4);
}
else
{
Miscellaneous.logEvent("i", "calculateNextWakeup()", String.valueOf(events.size()) + " future events in calendar. Checking if one applies.", 4);
List<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger.Trigger_Enum.calendarEvent);
List<Long> wakeUpCandidatesList = new ArrayList<>();
@ -580,7 +589,10 @@ public class CalendarReceiver extends BroadcastReceiver implements AutomationLis
calendarIntentFilter.addDataAuthority("com.android.calendar", null);
}
calendarIntent = automationServiceRef.registerReceiver(calendarReceiverInstance, calendarIntentFilter);
if(Build.VERSION.SDK_INT >= 33)
calendarIntent = automationServiceRef.registerReceiver(calendarReceiverInstance, calendarIntentFilter, Context.RECEIVER_EXPORTED);
else
calendarIntent = automationServiceRef.registerReceiver(calendarReceiverInstance, calendarIntentFilter);
calendarReceiverActive = true;

View File

@ -218,7 +218,7 @@ public class DateTimeListener extends BroadcastReceiver implements AutomationLis
private static void scheduleNextAlarm()
{
Long currentTime = System.currentTimeMillis();
long currentTime = System.currentTimeMillis();
ScheduleElement scheduleCandidate = null;
if(alarmCandidates.size() == 0)

View File

@ -53,12 +53,14 @@ public class HeadphoneJackListener extends BroadcastReceiver implements Automati
{
try
{
/*Broadcast Action: Wired Headset plugged in or unplugged.
The intent will have the following extra values:
state - 0 for unplugged, 1 for plugged.
name - Headset type, human readable string
microphone - 1 if headset has a microphone, 0 otherwise*/
/*
Broadcast Action: Wired Headset plugged in or unplugged.
The intent will have the following extra values:
state - 0 for unplugged, 1 for plugged.
name - Headset type, human readable string
microphone - 1 if headset has a microphone, 0 otherwise
*/
int state = intent.getExtras().getInt("state");
String name = intent.getExtras().getString("name");

View File

@ -146,13 +146,13 @@ public class NotificationListener extends NotificationListenerService// implemen
try
{
if (extras.containsKey(EXTRA_TEXT))
text = extras.getString(EXTRA_TEXT).toString();
text = String.valueOf(extras.getCharSequence(EXTRA_TEXT));
}
catch (NullPointerException e)
{
// in stacked notifications the "surrounding" element has no text, only a title
if (extras.containsKey(EXTRA_TEXT) && extras.get(EXTRA_TEXT) != null)
text = extras.get(EXTRA_TEXT).toString();
text = String.valueOf(extras.getCharSequence(EXTRA_TEXT));
}
SimpleNotification returnNotification = new SimpleNotification();

View File

@ -31,6 +31,12 @@
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="@dimen/default_margin"
android:text="@string/screenBrightGoogleComment" />
<Button
android:layout_marginTop="@dimen/default_margin"
android:id="@+id/bApplyBrightness"

View File

@ -167,6 +167,23 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="40dp" />
<CheckBox
android:id="@+id/checkBoxChangeVolumeRingtone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/change" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/volumeRingtone"
android:textAppearance="?android:attr/textAppearanceSmall"
android:layout_marginLeft="40dp" />
<SeekBar
android:id="@+id/seekBarVolumeRingtone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="40dp" />
<CheckBox
android:id="@+id/checkBoxChangeVolumeAlarms"

View File

@ -31,7 +31,7 @@
<TextView
android:layout_gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/default_margin"
android:text="@string/VariableKey" />
@ -47,21 +47,42 @@
android:layout_marginTop="@dimen/default_margin">
<TextView
android:layout_gravity="center_vertical"
android:layout_gravity="top"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/default_margin"
android:text="@string/variableValue" />
android:text="@string/variableValue"
android:layout_marginRight="@dimen/default_margin" />
<EditText
android:id="@+id/etVariableValueTrigger"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<EditText
android:id="@+id/etVariableValueTrigger"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/default_margin"
android:text="@string/mayUseRegularExpressions" />
</LinearLayout>
</TableRow>
</TableLayout>
<CheckBox
android:id="@+id/chkTriggerVariableDirection"
android:layout_marginTop="@dimen/default_margin"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:checked="true"
android:text="@string/matches" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View File

@ -9,41 +9,41 @@
android:title="@string/generalSettings">
<CheckBoxPreference
android:key="startServiceAtSystemBoot"
android:summary="@string/onOff"
android:title="@string/startAtSystemBoot" />
android:key="startServiceAtSystemBoot"
android:summary="@string/onOff"
android:title="@string/startAtSystemBoot" />
<CheckBoxPreference
android:key="startServiceAfterAppUpdate"
android:summary="@string/startServiceAfterAppUpdate"
android:title="@string/startServiceAfterAppUpdateShort" />
<!--
<CheckBoxPreference
android:key="startNewThreadForRuleActivation"
android:summary="@string/startNewThreadForRuleExecution"
android:title="@string/newThreadRules" />
-->
<CheckBoxPreference
android:key="showIconWhenServiceIsRunning"
android:summary="@string/showIconWhenServiceIsRunning"
android:title="@string/showIcon" />
android:key="startServiceAfterAppUpdate"
android:summary="@string/startServiceAfterAppUpdate"
android:title="@string/startServiceAfterAppUpdateShort" />
<CheckBoxPreference
android:key="writeLogFile"
android:summary="@string/onOff"
android:title="@string/writeLogFile" />
android:key="showIconWhenServiceIsRunning"
android:summary="@string/showIconWhenServiceIsRunning"
android:title="@string/showIcon" />
<CheckBoxPreference
android:key="logToConsole"
android:summary="@string/onOff"
android:title="@string/logToConsole" />
<CheckBoxPreference
android:key="writeLogFile"
android:summary="@string/onOff"
android:title="@string/writeLogFile" />
<EditTextPreference
android:key="logLevel"
android:summary="@string/logLevelSummary"
android:title="@string/logLevelTitle"
android:inputType="number"></EditTextPreference>
android:inputType="number" />
<EditTextPreference
android:key="logFileMaxSize"
android:summary="@string/logFileMaxSizeSummary"
android:title="@string/logFileMaxSizeTitle"
android:inputType="number"></EditTextPreference>
android:inputType="number" />
<ListPreference
android:key="startScreen"
@ -114,21 +114,11 @@
</PreferenceCategory>
<PreferenceCategory
android:summary="@string/positioningSettings"
android:title="@string/positioningSettings">
<!-- android:id="@id/lstPositioningEngine"-->
<!--
<ListPreference
android:title="@string/positioningEngine"
android:key="positioningEngine"
android:defaultValue="0"
android:entries="@array/positioningEngineOptions"
android:entryValues="@array/positioningEngineOptionsValues" />
-->
<CheckBoxPreference
<CheckBoxPreference
android:key="useWifiForPositioning"
android:summary="@string/listenToWifiState"
android:title="@string/wifiState" />
@ -142,19 +132,19 @@
android:key="useAccelerometerAfterIdleTime"
android:summary="@string/accelerometerTimer"
android:title="@string/cellMastIdleTime"
android:inputType="number"></EditTextPreference>
android:inputType="number" />
<EditTextPreference
android:key="accelerometerMovementThreshold"
android:summary="@string/accelerometerThresholdDescription"
android:title="@string/accelerometerThreshold"
android:inputType="number"></EditTextPreference>
android:inputType="number" />
<EditTextPreference
android:key="speedMaximumTimeBetweenLocations"
android:summary="@string/speedMaximumTimeBetweenLocations"
android:title="@string/speedMaximumTime"
android:inputType="number"></EditTextPreference>
android:inputType="number" />
<CheckBoxPreference
android:key="rememberLastActivePoi"
@ -176,37 +166,31 @@
android:key="MINIMUM_DISTANCE_CHANGE_FOR_GPS_UPDATE"
android:summary="@string/minimumDistanceChangeForGpsLocationUpdates"
android:title="@string/distanceForGpsUpdate"
android:inputType="number"></EditTextPreference>
android:inputType="number" />
<EditTextPreference
android:key="MINIMUM_DISTANCE_CHANGE_FOR_NETWORK_UPDATE"
android:summary="@string/minimumDistanceChangeForNetworkLocationUpdates"
android:title="@string/distanceForNetworkUpdate"
android:inputType="number"></EditTextPreference>
<!-- We won't need this setting anymore, at least it won't be available for the user.
<EditTextPreference
android:key="SATISFACTORY_ACCURACY_GPS"
android:summary="@string/satisfactoryAccuracyGps"
android:title="@string/gpsAccuracy"
android:inputType="number"></EditTextPreference>
-->
android:inputType="number" />
<EditTextPreference
android:key="SATISFACTORY_ACCURACY_NETWORK"
android:summary="@string/satisfactoryAccuracyNetwork"
android:title="@string/networkAccuracy"
android:inputType="number"></EditTextPreference>
android:inputType="number" />
<EditTextPreference
android:key="MINIMUM_TIME_BETWEEN_UPDATE"
android:summary="@string/minimumTimeForLocationUpdates"
android:title="@string/timeForUpdate"
android:inputType="number"></EditTextPreference>
android:inputType="number" />
<EditTextPreference
android:key="gpsTimeout"
android:summary="@string/timeoutForGpsComparisonsSummary"
android:title="@string/timeoutForGpsComparisonsTitle"
android:inputType="number"></EditTextPreference>
android:inputType="number"/>
</PreferenceCategory>
@ -218,19 +202,19 @@
android:key="timeBetweenNoiseLevelMeasurements"
android:summary="@string/timeBetweenNoiseLevelMeasurementsSummary"
android:title="@string/timeBetweenNoiseLevelMeasurementsTitle"
android:inputType="number"></EditTextPreference>
android:inputType="number" />
<EditTextPreference
android:key="lengthOfNoiseLevelMeasurements"
android:summary="@string/lengthOfNoiseLevelMeasurementsSummary"
android:title="@string/lengthOfNoiseLevelMeasurementsTitle"
android:inputType="number"></EditTextPreference>
android:inputType="number" />
<EditTextPreference
android:key="referenceValueForNoiseLevelMeasurements"
android:summary="@string/referenceValueForNoiseLevelMeasurementsSummary"
android:title="@string/referenceValueForNoiseLevelMeasurementsTitle"
android:inputType="number"></EditTextPreference>
android:inputType="number" />
</PreferenceCategory>
@ -247,19 +231,19 @@
android:key="httpAttempts"
android:summary="@string/httpAttemptsSummary"
android:title="@string/httpAttemptsTitle"
android:inputType="number"></EditTextPreference>
android:inputType="number" />
<EditTextPreference
android:key="httpAttemptsTimeout"
android:summary="@string/httpAttemptsTimeoutSummary"
android:title="@string/httpAttemptsTimeoutTitle"
android:inputType="number"></EditTextPreference>
android:inputType="number" />
<EditTextPreference
android:key="httpAttemptGap"
android:summary="@string/httpAttemptGapSummary"
android:title="@string/httpAttemptGapTitle"
android:inputType="number"></EditTextPreference>
android:inputType="number" />
</PreferenceCategory>
@ -271,7 +255,7 @@
android:key="timeBetweenProcessMonitorings"
android:summary="@string/timeBetweenProcessMonitoringsSummary"
android:title="@string/timeBetweenProcessMonitoringsTitle"
android:inputType="number"></EditTextPreference>
android:inputType="number" />
</PreferenceCategory>
@ -283,7 +267,7 @@
android:key="acceptDevicePositionSignalEveryX_MilliSeconds"
android:summary="@string/deviceOrientationTimeAcceptIntervalSummary"
android:title="@string/deviceOrientationTimeAcceptIntervalTitle"
android:inputType="number"></EditTextPreference>
android:inputType="number" />
</PreferenceCategory>
@ -295,13 +279,13 @@
android:key="activityDetectionFrequency"
android:summary="@string/activityDetectionFrequencySummary"
android:title="@string/activityDetectionFrequencyTitle"
android:inputType="number"></EditTextPreference>
android:inputType="number" />
<EditTextPreference
android:key="activityDetectionRequiredProbability"
android:summary="@string/activityDetectionRequiredProbabilitySummary"
android:title="@string/activityDetectionRequiredProbabilityTitle"
android:inputType="number"></EditTextPreference>
android:inputType="number" />
</PreferenceCategory>
@ -313,9 +297,8 @@
android:key="musicCheckFrequency"
android:summary="@string/musicCheckFrequencySummary"
android:title="@string/musicCheckFrequencyTitle"
android:inputType="number"></EditTextPreference>
android:inputType="number" />
</PreferenceCategory>
</PreferenceScreen>

View File

@ -368,7 +368,7 @@
<string name="headsetConnected">Headset (Art: %1$s) verbunden</string>
<string name="headsetDisconnected">Headset (type: %1$s) getrennt</string>
<string name="headphoneSimple">Kopfhörer</string>
<string name="headphoneMicrophone">Mikrofon</string>
<string name="headphoneMicrophone">mit Mikrofon</string>
<string name="headphoneAny">Egal</string>
<string name="headphoneSelectType">Kopfhörer Typ auswählen</string>
<string name="whatsThis">Was ist das?</string>
@ -388,7 +388,8 @@
<string name="notificationRingtone">Ton für Benachrichtigungen</string>
<string name="hapticFeedback">Haptische Rückmeldung (vibrieren bei Bildschirmberührung)</string>
<string name="volumeMusicVideoGameMedia">Musik, Videos, Spiele und andere Medien</string>
<string name="volumeRingtoneNotifications">Klingeltöne und Benachrichtungen</string>
<string name="volumeRingtoneNotifications">Benachrichtungen</string>
<string name="volumeRingtone">Klingelton</string>
<string name="volumeAlarms">Wecker</string>
<string name="change">Ändern</string>
<string name="audibleSelection">Hörbare Auswahl (Ton bei Bildschirmauswahl)</string>
@ -778,6 +779,7 @@
<string name="checkVariable">Variable prüfen</string>
<string name="checkVariableExplanation">Wenn Sie den Wert der Variablen leer lassen, darf sie nicht gesetzt sein, damit die Bedingung als erfüllt gilt.</string>
<string name="variableCheckString">wenn Variable %1$s den Wert %2$s hat</string>
<string name="variableCheckStringNot">wenn die Variable %1$s nicht %2$s ist</string>
<string name="variableCheckStringDeleted">wenn Variable %1$s nicht gesetzt ist</string>
<string name="messageType">Nachrichtentyp</string>
<string name="sms">SMS</string>
@ -855,4 +857,12 @@
<string name="triggerChargingComment">Der Typ wird nur ausgewertet, wenn das Gerät aufgeladen wird. Wenn \"Nicht laden\" ausgewählt ist, wird es bei jedem vorherigen Ladetyp ausgelöst. Wenn Sie dies auswerten möchten, sollten Sie die Verwendung der Variablen trigger/action in Betracht ziehen.</string>
<string name="helpTextProfiles">Ein Profil ist eine Sammlung von Einstellungen für Klingeltöne, Lautstärke und andere audiobezogene Einstellungen, die Sie über Regeln oder manuell anwenden können.\\n\\nEs ist auch möglich, das zuletzt aktivierte Profil als Auslöser abzufragen. Im Normalfall wird nur abgefragt, ob das Profil das zuletzt aktivierte war (unabhängig davon, ob in der Zwischenzeit bestimmte Audioeinstellungen geändert wurden). Sie können aber auch die einzelnen Einstellungen vergleichen lassen.</string>
<string name="serviceWontStartNoActivatedRules">Es sind keine aktivierten Regeln definiert. Der Dienst wird nicht gestartet.</string>
<string name="importChooseFolderNotice">Versuchen Sie im folgenden Dialog nicht, bestimmte Dateien auszuwählen, sondern wählen Sie den Ordner aus, in dem sich die Automation-Sicherungsdateien befinden. Wenn die Schaltfläche \"Auswählen\" deaktiviert ist, haben Sie eine Android-Einschränkung gefunden. Versuchen Sie in diesem Fall zuerst, die Dateien in ein Unterverzeichnis zu verschieben.</string>
<string name="matches">stimmt überein</string>
<string name="doesNotMatch">stimmt nicht überein</string>
<string name="logToConsole">In Konsole protokollieren (logcat)</string>
<string name="locationPermissionRequired">Um fortzufahren, ist die Standortberechtigung erforderlich.</string>
<string name="Android14TimePickerHint">Anscheinend gibt es in Android 14 einen Fehler in Bezug auf einen Zeitauswahl-Dialog. Wenn der folgende Bildschirm abstürzt, wenn Sie versuchen, die Aufwärts- und Ab-Tasten neben einem Feld zu verwenden, versuchen Sie stattdessen, Zahlen über die Tastatur einzugeben. Ich habe nie eine Lösung dafür gefunden und meine App ist nicht die einzige, die betroffen ist. Es sieht so aus, als ob dies in Android 15 behoben wurde.</string>
<string name="screenBrightGoogleComment">Da jemand bei Google anscheinend was geraucht hat, verhält sich die Einstellung der Bildschirmhelligkeit in einigen Android-Versionen sehr seltsam. Dieses Verhalten hat nichts mit dem zu tun, was Sie laut ihrer eigenen Dokumentation erwarten würden. Ich habe versucht, mich so gut wie möglich daran anzupassen, erwarte aber keine sehr genauen Einstellungen. Das bedeutet, dass die resultierende Einstellung etwas von der hier konfigurierten abweichen kann.</string>
<string name="version143StartOtherActivityHint">In Version 1.8.2 war es notwendig, die Art und Weise, wie Aktionen zum Starten anderer Programme gespeichert werden, zu überarbeiten. Die Kompatibilität konnte nicht sichergestellt werden. Bitte überprüfen und bearbeiten Sie Ihre Aktionen zum Starten anderer Aktivitäten, um sicherzustellen, dass sie noch funktionieren.</string>
</resources>

View File

@ -32,7 +32,7 @@
<string name="thursday">Jueves</string>
<string name="friday">Viernes</string>
<string name="saturday">Sábado</string>
<string name="headphoneMicrophone">Micrófono</string>
<string name="headphoneMicrophone">con micrófono</string>
<string name="whatsThis">Qué es esto?</string>
<string name="privacyLocationingTitle">Solo usar localización privada</string>
<string name="volumeAlarms">Alarmas</string>
@ -249,7 +249,8 @@
<string name="useAuthentication">Usar verificación de la autenticidad</string>
<string name="radiusWithUnit">Radio [m]</string>
<string name="volumes">Volumenes</string>
<string name="volumeRingtoneNotifications">Sonido polifónico ý notificaciónes</string>
<string name="volumeRingtoneNotifications">notificaciónes</string>
<string name="volumeRingtone">Sonido polifónico</string>
<string name="notificationRingtone">Sonido polifónico para notificaciónes</string>
<string name="incomingCallsRingtone">Sonido de llamadas</string>
<string name="batteryLevel">Nivel de la bateria</string>
@ -768,6 +769,7 @@
<string name="endPhoneCall">Terminar llamada de teléfono</string>
<string name="android.permission.ANSWER_PHONE_CALLS">Terminar llamda de teléfono</string>
<string name="settingsReferringToRestrictedFeaturesInGoogle">La configuración y/o las reglas hacen referencia a funciones que no se pueden proporcionar en la versión de Google Play. Entre otras cosas que incluye todo lo relacionado con llamadas telefónicas y mensajes de texto.</string>
<string name="variableCheckStringNot">Si la variable %1$s no es %2$s</string>
<string name="variableCheckStringDeleted">Si la variable %1$s no está establecida</string>
<string name="variableCheckString">Si la variable %1$s es %2$s</string>
<string name="checkVariableExplanation">Si deja el valor vacío, no se debe establecer la variable para que la condición devuelva true.</string>
@ -800,7 +802,7 @@
<string name="languageChineseChina">Chino (China)</string>
<string name="wifiTriggerDisconnectionHint">Este activador será válido si acabas de desconectarte del wifi especificado anteriormente O mientras el servicio aún se está iniciando y si no estás conectado a ningún wifi. Si desea que el activador se active solo cuando se desconecte explícitamente de una determinada red WiFi, agregue otro activador \"el servicio no se está iniciando\".</string>
<string name="className">Nombre de la clase</string>
<string name="startAppByStartForegroundService">a través de startForegroundService((</string>
<string name="startAppByStartForegroundService">a través de startForegroundService()</string>
<string name="method">Método</string>
<string name="takeScreenshot">Tomar captura de pantalla</string>
<string name="android.permission.BIND_ACCESSIBILITY_SERVICE">Enlazar al servicio de accesibilidad</string>
@ -854,4 +856,12 @@
<string name="triggerChargingComment">El tipo solo se evaluará si el dispositivo se está cargando. Si se elige no cargar, se disparará en cualquier tipo de carga anterior. Si desea evaluar eso, considere la posibilidad de usar las variables trigger/action.</string>
<string name="helpTextProfiles">Un perfil es una colección de ajustes para tonos de llamada, volúmenes y otros ajustes relacionados con el audio que puede aplicar desde reglas o aplicarlo manualmente.\\n\\nTambién es posible consultar el último perfil activado como disparador. En el caso normal, solo consultará si el perfil fue el último activado (independientemente de si se han cambiado configuraciones de audio específicas mientras tanto). Pero también puede comparar los ajustes individuales.</string>
<string name="serviceWontStartNoActivatedRules">No se han definido reglas activadas. El servicio no se inicia.</string>
<string name="importChooseFolderNotice">В следующем диалоговом окне не пытайтесь выбрать конкретные файлы, а выберите папку, в которой находятся файлы резервных копий автоматизации. Если кнопка выбора отключена, вы обнаружили ограничение Android. В этом случае попробуйте сначала переместить файлы в подкаталог.</string>
<string name="matches">coincide</string>
<string name="doesNotMatch">no coincide</string>
<string name="logToConsole">Registrar en la consola (logcat)</string>
<string name="locationPermissionRequired">Se requiere permiso de ubicación para continuar.</string>
<string name="Android14TimePickerHint">Aparentemente, hay un error en Android 14 con respecto a un cuadro de diálogo del selector de tiempo. Si la siguiente pantalla se bloquea al intentar usar los botones arriba y abajo junto a un campo, intente ingresar números con el teclado. Nunca encontré una solución para esto y mi aplicación no es la única afectada. Parece que esto se solucionó en Android 15.</string>
<string name="screenBrightGoogleComment">Debido a que alguien en Google parece haber estado fumando algo, la configuración de brillo de la pantalla se ha comportado de manera muy extraña para algunas versiones de Android. Este comportamiento no tiene nada que ver con lo que se podría pensar que hace según su propia documentación. He intentado adaptarme a esto lo mejor que he podido, pero no espero ajustes muy precisos. Eso significa que la configuración resultante puede desviarse un poco de lo que configura aquí.</string>
<string name="version143StartOtherActivityHint">En la versión 1.8.2 fue necesario revisar la forma en que se guardaban las acciones para iniciar otros programas. No se pudo garantizar la compatibilidad. Compruebe y edite sus acciones de inicio de otras actividades para asegurarse de que siguen funcionando.</string>
</resources>

View File

@ -371,7 +371,7 @@
<string name="headsetConnected">Écouteurs (type : %1$s) est connecté</string>
<string name="headsetDisconnected">Écouteurs (type : %1$s) est déconnecté</string>
<string name="headphoneSimple">Écouteurs</string>
<string name="headphoneMicrophone">Microphone</string>
<string name="headphoneMicrophone">avec microphone</string>
<string name="headphoneAny">Tous</string>
<string name="headphoneSelectType">Choisissez le type découteurs</string>
<string name="whatsThis">Quest ce que cest ?</string>
@ -391,7 +391,8 @@
<string name="notificationRingtone">Sonnerie des notifications</string>
<string name="hapticFeedback">Vibration au toucher</string>
<string name="volumeMusicVideoGameMedia">Musiques, vidéos, jeux et autres médias</string>
<string name="volumeRingtoneNotifications">Sonnerie et notifications</string>
<string name="volumeRingtoneNotifications">Notifications</string>
<string name="volumeRingtone">Sonnerie</string>
<string name="volumeAlarms">Alarmes</string>
<string name="change">Changement</string>
<string name="audibleSelection">Son de sélection (son émis lors dune sélection à lécran)</string>
@ -768,6 +769,7 @@
<string name="endPhoneCall">Mettre fin à lappel téléphonique</string>
<string name="android.permission.ANSWER_PHONE_CALLS">Mettre fin à lappel téléphonique</string>
<string name="settingsReferringToRestrictedFeaturesInGoogle">Vos paramètres et/ou règles font actuellement référence à des fonctionnalités qui ne peuvent pas être fournies dans la version Google Play. Cela inclut, entre autres, tout ce qui concerne les appels téléphoniques et les messages textuels.</string>
<string name="variableCheckStringNot">si la variable %1$s n\'est pas %2$s</string>
<string name="variableCheckStringDeleted">si la variable %1$s nest pas définie</string>
<string name="variableCheckString">si la variable %1$s est %2$s</string>
<string name="checkVariableExplanation">Si vous laissez la valeur vide, la variable ne doit pas être définie pour que la condition renvoie la valeur true.</string>
@ -854,4 +856,11 @@
<string name="triggerChargingComment">Le type ne sera évalué que si l\'appareil est en charge. Si l\'option Ne pas charger est sélectionnée, elle se déclenchera à n\'importe quel type de charge précédent. Si vous souhaitez évaluer cela, envisagez d\'utiliser les variables déclencheur/action.</string>
<string name="helpTextProfiles">Un profil est un ensemble de paramètres pour les sonneries, les volumes et d\'autres paramètres liés à l\'audio que vous pouvez faire appliquer à partir de règles ou appliquer manuellement.\\n\\nIl est également possible d\'interroger le dernier profil activé en tant que déclencheur. Dans le cas normal, il ne demandera que si le profil était le dernier activé (indépendamment si des paramètres audio spécifiques ont été modifiés entre-temps). Mais vous pouvez également comparer les différents paramètres.</string>
<string name="serviceWontStartNoActivatedRules">Aucune règle activée n\'a été définie. Le service ne démarre pas.</string>
<string name="importChooseFolderNotice">Dans la boîte de dialogue suivante, n\'essayez pas de sélectionner des fichiers spécifiques, mais choisissez le dossier dans lequel résident les fichiers de sauvegarde Automation. Si le bouton de sélection est désactivé, vous avez trouvé une limitation Android. Dans ce cas, essayez d\'abord de déplacer les fichiers dans un sous-répertoire.</string>
<string name="matches">correspond</string>
<string name="doesNotMatch">ne correspond pas</string>
<string name="logToConsole">Log vers la console (logcat)</string>
<string name="locationPermissionRequired">Une autorisation de localisation est requise pour continuer.</string>
<string name="Android14TimePickerHint">Apparemment, il y a un bogue dans Android 14 concernant une boîte de dialogue de sélection de temps. Si l\'écran suivant se bloque lorsque vous essayez d\'utiliser les boutons haut et bas en regard d\'un champ, essayez plutôt de saisir des chiffres avec le clavier. Je n\'ai jamais trouvé de solution à cela et mon application n\'est pas la seule touchée. Il semble que cela ait été corrigé dans Android 15.</string>
<string name="screenBrightGoogleComment">Parce que quelqu\'un chez Google semble avoir fumé quelque chose, le réglage de la luminosité de l\'écran se comporte très bizarrement pour certaines versions d\'Android. Ce comportement n\'a rien à voir avec ce que vous pensez qu\'il fait selon leur propre documentation. J\'ai essayé de m\'y adapter du mieux que j\'ai pu, mais je ne m\'attends pas à des réglages très précis. Cela signifie que le paramètre résultant peut s\'écarter un peu de ce que vous configurez ici.</string>
</resources>

View File

@ -219,7 +219,7 @@
<string name="gpsComparison">Confronto del GPS</string>
<string name="hapticFeedback">Riscontro tattile (vibra al tocco)</string>
<string name="headphoneAny">Uno dei due</string>
<string name="headphoneMicrophone">Microfono</string>
<string name="headphoneMicrophone">con microfono</string>
<string name="headphoneSelectType">Seleziona il tipo di auricolare</string>
<string name="headphoneSimple">Auricolari</string>
<string name="headsetConnected">"Connessi auricolari (tipo: %1$s) "</string>
@ -560,7 +560,8 @@
<string name="vibrateWhenRinging">Vibra alla chiamata</string>
<string name="volumeAlarms">Allarmi sonori</string>
<string name="volumeMusicVideoGameMedia">Multimedia (musica, video …)</string>
<string name="volumeRingtoneNotifications">Toni e notifiche</string>
<string name="volumeRingtoneNotifications">Notifiche</string>
<string name="volumeRingtone">Toni</string>
<string name="volumeTest">Calibrazione audio</string>
<string name="volumeCalibrationExplanation">Per calcolare il valore del rumore di fondo in dB è necessario specificare un valore di riferimento fisico (si prega di leggere Wikipedia per ulteriori informazioni). Questo valore è probabilmente diverso per ogni telefono. Trascinare il cursore per modificare il valore di riferimento fisico definito. Più alto è il valore di riferimento e più basso sarà il valore misurato in dB. Misurazioni costanti saranno effettuate ogni %1$s secondi ed i risultati visualizzati sotto. Premere indietro quando hai trovato un valore adeguato.</string>
<string name="volumes">Volumi</string>
@ -778,6 +779,7 @@
<string name="checkVariable">Controlla variabile</string>
<string name="checkVariableExplanation">Se si lascia vuoto il valore, la variabile non deve essere impostata affinché la condizione restituisca true.</string>
<string name="variableCheckString">Se la variabile %1$s è %2$s</string>
<string name="variableCheckStringNot">se la variabile %1$s non è %2$s</string>
<string name="variableCheckStringDeleted">Se la variabile %1$s non è impostata</string>
<string name="messageType">Tipo di messaggio</string>
<string name="sms">SMS</string>
@ -855,4 +857,12 @@
<string name="triggerChargingComment">Il tipo verrà valutato solo se il dispositivo è in carica. Se si sceglie di non caricare, si attiverà a qualsiasi tipo di ricarica precedente. Se si desidera valutarlo, prendere in considerazione l\'utilizzo delle variabili trigger/action.</string>
<string name="helpTextProfiles">Un profilo è una raccolta di impostazioni per suonerie, volumi e altre impostazioni relative all\'audio che è possibile applicare dalle regole o applicare manualmente.\\n\\nÈ anche possibile eseguire una query per l\'ultimo profilo attivato come trigger. In caso normale, chiederà solo se il profilo è stato l\'ultimo attivato (indipendentemente dal fatto che nel frattempo siano state modificate impostazioni audio specifiche). Ma è anche possibile confrontare le singole impostazioni.</string>
<string name="serviceWontStartNoActivatedRules">Nessuna regola attivata definita. Il servizio non si avvia.</string>
<string name="importChooseFolderNotice">Nella finestra di dialogo seguente non tentare di selezionare file specifici, ma scegliere la cartella in cui risiedono i file di backup di Automazione. Se il pulsante di selezione è disabilitato, hai trovato una limitazione di Android. In tal caso, prova prima a spostare i file in una sottodirectory.</string>
<string name="matches">corrisponde</string>
<string name="doesNotMatch">non corrisponde</string>
<string name="logToConsole">Accesso alla console (logcat)</string>
<string name="locationPermissionRequired">Per continuare è necessaria l\'autorizzazione alla posizione.</string>
<string name="Android14TimePickerHint">A quanto pare c\'è un bug in Android 14 relativo a una finestra di dialogo di selezione del tempo. Se la schermata seguente si arresta in modo anomalo quando si tenta di utilizzare i pulsanti su e giù accanto a un campo, provare a inserire i numeri con la tastiera. Non ho mai trovato una soluzione per questo problema e la mia app non è l\'unica interessata. Sembra che questo problema sia stato risolto in Android 15.</string>
<string name="screenBrightGoogleComment">Poiché sembra che qualcuno in Google abbia fumato qualcosa, l\'impostazione della luminosità dello schermo si è comportata in modo molto strano per alcune versioni di Android. Questo comportamento non ha nulla a che fare con ciò che si potrebbe pensare che faccia secondo la loro documentazione. Ho cercato di adattarmi a questo nel miglior modo possibile, ma non aspettatevi impostazioni molto precise. Ciò significa che l\'impostazione risultante potrebbe discostarsi leggermente da ciò che si configura qui.</string>
<string name="version143StartOtherActivityHint">Nella versione 1.8.2 è stato necessario rivedere il modo in cui venivano salvate le azioni per avviare altri programmi. La compatibilità non poteva essere garantita. Controlla e modifica le azioni di avvio di altre attività per assicurarti che funzionino ancora.</string>
</resources>

View File

@ -365,8 +365,8 @@
<string name="actionPlayMusic">Muziekspeler openen</string>
<string name="headsetConnected">Headset (type: %1$s) aangesloten</string>
<string name="headsetDisconnected">Headset (type: %1$s) ontkoppeld</string>
<string name="headphoneSimple">Headphone</string>
<string name="headphoneMicrophone">Microphone</string>
<string name="headphoneSimple">hoofdtelefoon</string>
<string name="headphoneMicrophone">met microfoon</string>
<string name="headphoneAny">willekeurige</string>
<string name="headphoneSelectType">Selecteer type hoofdtelefoon</string>
<string name="whatsThis">Wat is dit?</string>
@ -386,7 +386,8 @@
<string name="notificationRingtone">Toon voor meldingen</string>
<string name="hapticFeedback">Haptische feedback (trillen bij aanraken scherm)</string>
<string name="volumeMusicVideoGameMedia">Muziek, video, spel en andere media</string>
<string name="volumeRingtoneNotifications">Ringtone en meldingen</string>
<string name="volumeRingtoneNotifications">Meldingen</string>
<string name="volumeRingtone">Ringtone</string>
<string name="volumeAlarms">Alarmen</string>
<string name="change">Wijzigen</string>
<string name="audibleSelection">Hoorbare selectie (geluid bij schermselectie)</string>
@ -776,6 +777,7 @@
<string name="checkVariable">Variabele controleren</string>
<string name="checkVariableExplanation">Als u de waarde leeg laat, mag de variabele niet worden ingesteld om de voorwaarde true te laten retourneren.</string>
<string name="variableCheckString">als variabele %1$s %2$s is</string>
<string name="variableCheckStringNot">als variabele %1$s niet %2$s is</string>
<string name="variableCheckStringDeleted">als variabele %1$s niet is ingesteld</string>
<string name="messageType">Type bericht</string>
<string name="sms">SMS</string>
@ -853,5 +855,12 @@
<string name="triggerChargingComment">Het type wordt alleen geëvalueerd als het apparaat wordt opgeladen. Als er niet wordt gekozen voor opladen, wordt het geactiveerd bij elk eerder oplaadtype. Als je dat wilt evalueren, overweeg dan om de variabelen trigger/actie te gebruiken.</string>
<string name="helpTextProfiles">Een profiel is een verzameling instellingen voor beltonen, volumes en andere audiogerelateerde instellingen die u kunt laten toepassen vanuit regels of handmatig kunt toepassen.\\n\\nHet is ook mogelijk om het laatst geactiveerde profiel als trigger op te vragen. In het normale geval zal het alleen opvragen of het profiel het laatst geactiveerde profiel was (ongeacht of specifieke audio-instellingen in de tussentijd zijn gewijzigd). Maar u kunt ook de individuele instellingen laten vergelijken.</string>
<string name="serviceWontStartNoActivatedRules">Er zijn geen geactiveerde regels gedefinieerd. De service wordt niet gestart.</string>
<string name="importChooseFolderNotice">Probeer in het volgende dialoogvenster geen specifieke bestanden te selecteren, maar kies de map waarin de back-upbestanden van Automation zich bevinden. Als de keuzeknop is uitgeschakeld, hebt u een Android-beperking gevonden. Probeer in dat geval de bestanden eerst naar een submap te verplaatsen.</string>
<string name="matches">komt overeen</string>
<string name="doesNotMatch">komt niet overeen</string>
<string name="logToConsole">Aanmelden bij console (logcat)</string>
<string name="locationPermissionRequired">Locatietoestemming is vereist om door te gaan.</string>
<string name="Android14TimePickerHint">Blijkbaar is er een bug in Android 14 met betrekking tot een tijdkiezerdialoogvenster. Als het volgende scherm vastloopt wanneer u de knoppen omhoog en omlaag naast een veld probeert te gebruiken, probeert u in plaats daarvan getallen in te voeren met het toetsenbord. Ik heb hier nooit een oplossing voor gevonden en mijn app is niet de enige die getroffen is. Het lijkt erop dat dit is opgelost in Android 15.</string>
<string name="screenBrightGoogleComment">Omdat iemand bij Google iets lijkt te hebben gerookt, gedraagt de helderheidsinstelling van het scherm zich bij sommige Android-versies erg raar. Dit gedrag heeft niets te maken met wat je zou denken dat het doet volgens hun eigen documentatie. Ik heb geprobeerd me hier zo goed mogelijk aan aan te passen, maar verwacht geen erg precieze instellingen. Dat betekent dat de resulterende instelling enigszins kan afwijken van wat u hier configureert.</string>
<string name="version143StartOtherActivityHint">In versie 1.8.2 was het nodig om de manier waarop acties om andere programma\'s te starten werden opgeslagen, te herzien. De compatibiliteit kon niet worden gegarandeerd. Controleer en bewerk je acties om andere activiteiten te starten om er zeker van te zijn dat ze nog steeds werken.</string>
</resources>

View File

@ -443,7 +443,7 @@
<string name="headsetConnected">Zestaw słuchawkowy (typ: %1$s) podłączony</string>
<string name="headsetDisconnected">Zestaw słuchawkowy (typ: %1$s) rozłączony</string>
<string name="headphoneSimple">Słuchawki</string>
<string name="headphoneMicrophone">Mikrofon</string>
<string name="headphoneMicrophone">z mikrofonem</string>
<string name="headphoneAny">Albo</string>
<string name="headphoneSelectType">Wybierz typ słuchawek</string>
<string name="ruleDoesntApplyWrongHeadphoneType" translatable="false">Rule \"%1$s\" doesn\'t apply. Wrong headphone type.</string>
@ -473,7 +473,8 @@
<string name="notificationRingtone">Ton dla powiadomień</string>
<string name="hapticFeedback">Haptyczne sprzężenie zwrotne (wibracje podczas dotykania ekranu)</string>
<string name="volumeMusicVideoGameMedia">Muzyka, wideo, gry i inne media</string>
<string name="volumeRingtoneNotifications">Dzwonek i powiadomienia</string>
<string name="volumeRingtoneNotifications">Powiadomienia</string>
<string name="volumeRingtone">Dzwonek</string>
<string name="volumeAlarms">Alarmy</string>
<string name="change">Zmiana</string>
<string name="audibleSelection">Wybór dźwiękowy (dźwięk podczas wybierania ekranu)</string>
@ -867,6 +868,7 @@
<string name="checkVariable">Sprawdź zmienną</string>
<string name="checkVariableExplanation">Jeśli pozostawisz wartość pustą, zmienna nie może być ustawiona, aby warunek zwrócił wartość true.</string>
<string name="variableCheckString">jeśli zmienna %1$s to %2$s</string>
<string name="variableCheckStringNot">Jeśli zmienna %1$s nie jest %2$s</string>
<string name="variableCheckStringDeleted">jeśli zmienna %1$s nie jest ustawiona</string>
<string name="messageType">Typ wiadomości</string>
<string name="sms">SMS</string>
@ -952,4 +954,12 @@
<string name="triggerChargingComment">Typ zostanie oceniony tylko wtedy, gdy urządzenie się ładuje. Jeśli nie zostanie wybrane ładowanie, zostanie uruchomione przy dowolnym poprzednim typie ładowania. Jeśli chcesz to ocenić, rozważ użycie zmiennych trigger/action.</string>
<string name="helpTextProfiles">Profil jest zbiorem ustawień dzwonków, głośności i innych ustawień związanych z dźwiękiem, które można zastosować z reguł lub zastosować ręcznie.\\n\\nMożliwe jest również zapytanie o ostatnio aktywowany profil jako wyzwalacz. W normalnym przypadku zapyta tylko, czy profil był ostatnio aktywowany (niezależnie od tego, czy określone ustawienia dźwięku zostały zmienione w międzyczasie). Ale możesz także porównać poszczególne ustawienia.</string>
<string name="serviceWontStartNoActivatedRules">Nie zdefiniowano aktywowanych reguł. Usługa nie uruchamia się.</string>
<string name="importChooseFolderNotice">W następnym oknie dialogowym nie próbuj wybierać określonych plików, ale wybierz folder, w którym znajdują się pliki kopii zapasowej usługi Automation. Jeśli przycisk wyboru jest wyłączony, oznacza to, że znalazłeś ograniczenie systemu Android. W takim przypadku spróbuj najpierw przenieść pliki do podkatalogu.</string>
<string name="matches">pasuje</string>
<string name="doesNotMatch">nie pasuje</string>
<string name="logToConsole">Logowanie do konsoli (logcat)</string>
<string name="locationPermissionRequired">Aby kontynuować, wymagane jest zezwolenie na lokalizację.</string>
<string name="Android14TimePickerHint">Najwyraźniej w Androidzie 14 jest błąd dotyczący okna dialogowego selektora czasu. Jeśli poniższy ekran ulega awarii podczas próby użycia przycisków w górę i w dół obok pola, spróbuj zamiast tego wprowadzić liczby za pomocą klawiatury. Nigdy nie znalazłem na to rozwiązania, a moja aplikacja nie jest jedyną, której dotyczy problem. Wygląda na to, że zostało to naprawione w Androidzie 15.</string>
<string name="screenBrightGoogleComment">Ponieważ wygląda na to, że ktoś w Google coś palił, ustawienie jasności ekranu zachowywało się bardzo dziwnie w przypadku niektórych wersji Androida. To zachowanie nie ma nic wspólnego z tym, co można by pomyśleć, że robi zgodnie z ich własną dokumentacją. Starałem się dostosować do tego najlepiej, jak tylko mogłem, ale nie oczekuj bardzo precyzyjnych ustawień. Oznacza to, że wynikowe ustawienie może nieco odbiegać od tego, co skonfigurujesz tutaj.</string>
<string name="version143StartOtherActivityHint">W wersji 1.8.2 konieczne było poprawienie sposobu zapisywania akcji uruchamiających inne programy. Nie można było zapewnić kompatybilności. Sprawdź i edytuj czynności związane z uruchamianiem innych aktywności, aby upewnić się, że nadal działają.</string>
</resources>

View File

@ -412,7 +412,7 @@
<string name="headsetConnected">Гарнитура (тип: %1$s) подключена</string>
<string name="headsetDisconnected">Гарнитура (тип: %1$s) отключена</string>
<string name="headphoneSimple">Наушники</string>
<string name="headphoneMicrophone">Микрофон</string>
<string name="headphoneMicrophone">с микрофоном</string>
<string name="headphoneAny">Любой</string>
<string name="headphoneSelectType">Выберите тип гарнитуры</string>
<string name="ruleDoesntApplyWrongHeadphoneType" translatable="false">Правило %1$s не применится. Неверный тип гарнитуры.</string>
@ -442,7 +442,8 @@
<string name="notificationRingtone">Звуковой сигнал для уведомлений</string>
<string name="hapticFeedback">Тактильная обратная связь (вибрация при прикосновении к экрану)</string>
<string name="volumeMusicVideoGameMedia">Музыка, видео, игры и другое медиаа</string>
<string name="volumeRingtoneNotifications">Рингтон и уведомления</string>
<string name="volumeRingtoneNotifications">уведомления</string>
<string name="volumeRingtone">Рингтон</string>
<string name="volumeAlarms">Будильники</string>
<string name="change">Изменить</string>
<string name="audibleSelection">Звуковое уведомление при выборе (звук при выборе экрана)</string>
@ -835,6 +836,7 @@
<string name="checkVariable">Проверить переменную</string>
<string name="checkVariableExplanation">Если оставить значение пустым, переменная не должна быть задана для того, чтобы условие возвращало значение true.</string>
<string name="variableCheckString">если переменная %1$s равно %2$s</string>
<string name="variableCheckStringNot">если переменная %1$s не %2$s</string>
<string name="variableCheckStringDeleted">Если переменная %1$s не задана</string>
<string name="messageType">Тип сообщения</string>
<string name="sms">SMS</string>
@ -912,4 +914,12 @@
<string name="triggerChargingComment">Тип будет оцениваться только в том случае, если устройство заряжается. Если зарядка не выбрана, он будет срабатывать при любом предыдущем типе зарядки. Если вы хотите это оценить, подумайте об использовании переменных trigger/action.</string>
<string name="helpTextProfiles">Профиль — это набор настроек рингтонов, громкости и других настроек, связанных со звуком, которые можно применить из правил или вручную.\\n\\nТакже в качестве триггера можно запросить последний активированный профиль. В обычном случае он будет запрашивать только то, был ли профиль последним активированным (независимо от того, были ли за это время изменены определенные настройки звука). Но вы также можете сравнить отдельные настройки.</string>
<string name="serviceWontStartNoActivatedRules">Активированные правила не определены. Служба не запускается.</string>
<string name="importChooseFolderNotice">В следующем диалоговом окне не пытайтесь выбрать конкретные файлы, а выберите папку, в которой находятся файлы резервных копий автоматизации. Если кнопка выбора отключена, вы обнаружили ограничение Android. В этом случае попробуйте сначала переместить файлы в подкаталог.</string>
<string name="matches">Шутки</string>
<string name="doesNotMatch">не совпадает</string>
<string name="logToConsole">Запись в консоль (logcat)</string>
<string name="locationPermissionRequired">Для продолжения требуется разрешение на определение местоположения.</string>
<string name="Android14TimePickerHint">По-видимому, в Android 14 есть ошибка, связанная с диалоговым окном выбора времени. Если при попытке использовать кнопки «Вверх» и «Вниз» рядом с полем происходит сбой следующего экрана, попробуйте ввести цифры с помощью клавиатуры. Я так и не нашел решение этой проблемы, и мое приложение не единственное, что это затронуло. Похоже, это было исправлено в Android 15.</string>
<string name="screenBrightGoogleComment">Из-за того, что кто-то в Google, похоже, что-то курил, настройка яркости экрана вела себя очень странно в некоторых версиях Android. Такое поведение не имеет ничего общего с тем, что вы думаете, согласно их собственной документации. Я постарался приспособиться к этому как можно лучше, но не ждите очень точных настроек. Это означает, что результирующая настройка может немного отличаться от того, что вы настроили здесь.</string>
<string name="version143StartOtherActivityHint">В версии 1.8.2 необходимо было пересмотреть способ сохранения действий для запуска других программ. Совместимость обеспечить не удалось. Пожалуйста, проверьте и отредактируйте действия запуска других действий, чтобы убедиться, что они все еще работают.</string>
</resources>

View File

@ -362,7 +362,7 @@
<string name="headsetConnected">耳机(类型:%1$s已连接</string>
<string name="headsetDisconnected">耳机(类型:%1$s已断开连接</string>
<string name="headphoneSimple">无麦克风</string>
<string name="headphoneMicrophone">麦克风</string>
<string name="headphoneMicrophone">麦克风</string>
<string name="headphoneAny">均可</string>
<string name="headphoneSelectType">选择耳机类型</string>
<string name="whatsThis">这是什么?</string>
@ -382,7 +382,8 @@
<string name="notificationRingtone">通知提示音</string>
<string name="hapticFeedback">触感反馈(触摸屏幕时振动)</string>
<string name="volumeMusicVideoGameMedia">音乐、视频、游戏等媒体</string>
<string name="volumeRingtoneNotifications">铃声和通知</string>
<string name="volumeRingtoneNotifications">通知</string>
<string name="volumeRingtone">铃声</string>
<string name="volumeAlarms">闹钟</string>
<string name="change">更改</string>
<string name="audibleSelection">触摸提示音(进行屏幕选择时的声音)</string>
@ -768,6 +769,7 @@
<string name="checkVariable">检查变量</string>
<string name="checkVariableExplanation">如果值留空,则变量必须未设置才能满足条件。</string>
<string name="variableCheckString">如果变量 %1$s 是 %2$s</string>
<string name="variableCheckStringNot">如果变量 %1$s 不是 %2$s</string>
<string name="variableCheckStringDeleted">如果变量 %1$s 未设置</string>
<string name="messageType">消息类型</string>
<string name="sms">短信</string>
@ -853,4 +855,12 @@
<string name="triggerChargingComment">仅当设备正在充电时,才会评估类型。如果未选择充电,它将以任何以前的充电类型点火。如果要对此进行评估,请考虑使用变量 trigger/action。</string>
<string name="helpTextProfiles">配置文件是铃声、音量和其他音频相关设置的集合,您可以从规则中应用这些设置,也可以手动应用。\\n\\n还可以查询上次激活的配置文件作为触发器。在正常情况下它只会查询配置文件是否是上次激活的配置文件无论在此期间是否更改了特定的音频设置。但您也可以比较各个设置。</string>
<string name="serviceWontStartNoActivatedRules">未定义已激活的规则。服务无法启动。</string>
<string name="importChooseFolderNotice">在下面的对话框中,不要尝试选择特定文件,而是选择 Automation 备份文件所在的文件夹。如果禁用了 choose 按钮,则表示您发现了 Android 限制。在这种情况下,请先尝试将文件移动到子目录。</string>
<string name="matches">吉贝斯</string>
<string name="doesNotMatch">不同意</string>
<string name="logToConsole">记录到控制台 logcat</string>
<string name="locationPermissionRequired">需要位置权限才能继续。</string>
<string name="Android14TimePickerHint">显然Android 14 中存在一个关于时间选择器对话框的错误。如果在您尝试使用字段旁边的向上和向下按钮时出现以下屏幕崩溃,请尝试使用键盘输入数字。我从未找到解决这个问题的解决方案,我的应用程序并不是唯一受影响的应用程序。看起来这已在 Android 15 中修复。</string>
<string name="screenBrightGoogleComment">因为 Google 的某个人似乎一直在抽烟,所以某些 Android 版本的屏幕亮度设置表现得非常奇怪。此行为与你根据他们自己的文档认为它执行的作无关。我已经尽我所能适应这一点,但不要指望设置非常精确。这意味着生成的设置可能与您在此处配置的设置略有不同。</string>
<string name="version143StartOtherActivityHint">在 1.8.2 版本中,有必要修改保存启动其他程序的作的方式。无法确保兼容性。请检查并编辑您的启动其他活动作,以确保它们仍在工作。</string>
</resources>

View File

@ -330,7 +330,7 @@
<string name="name">Name</string>
<string name="radiusWithUnit">Radius [m]</string>
<string name="status">Status</string>
<string name="actionDataConnection">Data connection</string>
<string name="actionDataConnection">Data connection (mobile data)</string>
<string name="actionSetDataConnectionOn">turn mobile data on</string>
<string name="actionSetDataConnectionOff">turn mobile data off</string>
<string name="roaming">Roaming</string>
@ -444,7 +444,7 @@
<string name="headsetConnected">Headset (type: %1$s) connected</string>
<string name="headsetDisconnected">Headset (type: %1$s) disconnected</string>
<string name="headphoneSimple">Headphone</string>
<string name="headphoneMicrophone">Microphone</string>
<string name="headphoneMicrophone">with microphone</string>
<string name="headphoneAny">Either</string>
<string name="headphoneSelectType">Select type of headphone</string>
<string name="ruleDoesntApplyWrongHeadphoneType" translatable="false">Rule \"%1$s\" doesn\'t apply. Wrong headphone type.</string>
@ -474,7 +474,8 @@
<string name="notificationRingtone">Tone for notifications</string>
<string name="hapticFeedback">Haptic feedback (vibrate when touching screen)</string>
<string name="volumeMusicVideoGameMedia">Music, video, game and other media</string>
<string name="volumeRingtoneNotifications">Ringtone and notifications</string>
<string name="volumeRingtoneNotifications">Notifications</string>
<string name="volumeRingtone">Ringtone (from Android 14)</string>
<string name="volumeAlarms">Alarms</string>
<string name="change">Change</string>
<string name="audibleSelection">Audible selection (sound when making screen selection)</string>
@ -868,6 +869,7 @@
<string name="checkVariable">Check variable</string>
<string name="checkVariableExplanation">If you leave the value empty the variable must not be set for the condition to return true.</string>
<string name="variableCheckString">if variable %1$s is %2$s</string>
<string name="variableCheckStringNot">if variable %1$s is not %2$s</string>
<string name="variableCheckStringDeleted">if variable %1$s is not set</string>
<string name="messageType">Message type</string>
<string name="sms">SMS</string>
@ -949,4 +951,12 @@
<string name="helpTextProfiles">A profile is a collection of settings for ringtones, volumes and other audio related settings that you can have applied from rules or apply it manually.\n\nIt is also possible to query for the last activated profile as a trigger. In the normal case it will only query if the profile was the last activated one (regardless if specific audio settings have been changed in the meantime). But you can also have the individual settings compared.</string>
<string name="version143StartOtherActivityHint">In version 1.8.2 it was necessary to revise the way actions to start other programs were saved. Compatibility could not be ensured. Please check and edit your start other activity actions to make sure they are still working.</string>
<string name="importChooseFolderNotice">In the following dialog do not try to select specific files, but choose the folder in which the Automation backup files reside. If the choose button is disabled, you have found an Android limitation. In that case try moving the files to a subdirectory first.</string>
<string name="matches">matches</string>
<string name="doesNotMatch">does not match</string>
<string name="logToConsole">Log to console (logcat)</string>
<string name="locationPermissionRequired">Location permission is required to continue.</string>
<string name="Android14TimePickerHint">Apparently there\'s a bug in Android 14 regarding a time picker dialog. If the following screen crashes when you try to use the up and down buttons next to a field, try inputting numbers with the keyboard instead. I did never find a solution for this and my app is not the only one affected. It looks like this was fixed in Android 15.</string>
<string name="screenBrightGoogleComment">Because someone at Google seems to have been smoking something the screen brightness setting has been behaving very weird for some Android versions. This behavior has nothing to do with what you\'d think it does according to their own documentation. I\'ve tried to adapt to this as best as I could, but do not expect very precise settings. That means the resulting setting may deviate a bit from what you configure here.</string>
<string name="disable">Disable</string>
<string name="enable">Enable</string>
</resources>

View File

@ -0,0 +1,14 @@
* Fixed: Crash when triggering a URL without parameter pairs
* Fixed: When checking for battery charging type "any" the trigger didn't fire.
* Fixed: Fixed warnings in logs for formatted notifications
* Fixed: Location permission requested now when creating a new location object.
* Fixed: Display-over-other-apps permission was not requested anymore for start another app actions.
* Fixed: Screen brightness value should work a bit better now
* Fixed: Calendar events were not regarded if created after Automation service start
* Fixed: Bug in NFC trigger that affected only the Google Play version
* Fixed: Examples URL fixed
* Fixed: Service icon could not be hidden in Android 7 and below
* Fixed: Headphone trigger was not correctly processed
* Added: Variable checks can now be inverted. Also regular expressions are now supported.
* Added: Setting to turn on/off console logging (logcat)
* Added: Rules can now be enabled/disabled from the context menu on the rules screen