22 Commits
v1.8 ... v1.8.3

Author SHA1 Message Date
e99203c7e4 Multiple bug fixes 2025-07-19 23:21:44 +02:00
ee311b0ba5 New version 1.8.3 RC 2025-07-19 18:03:37 +02:00
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
17edf90086 v1.8.2 2025-01-19 16:03:10 +01:00
879e1c6ef3 Additional variables 2024-12-27 15:10:29 +01:00
d7d806fb5c Added permission for Termux remote commands 2024-08-25 17:11:24 +02:00
910af92989 Multiple bug fixes 2024-08-11 14:58:13 +02:00
9f36411511 New version 2024-05-23 23:03:43 +02:00
eb893a7f21 Fixed crash when exiting settings while service is running 2024-05-23 16:02:58 +02:00
8788a89e48 Removed calendar trigger from Google version and fixed bug in startOtherActivity 2024-05-23 15:02:12 +02:00
bb10620883 Removed calendar trigger from Google version 2024-05-07 09:49:32 +02:00
84 changed files with 1365 additions and 699 deletions

View File

@@ -3,16 +3,16 @@ plugins {
}
android {
compileSdkVersion 29
compileSdkVersion 34
defaultConfig {
applicationId "com.jens.automation2"
minSdkVersion 16
compileSdkVersion 33
buildToolsVersion '29.0.2'
compileSdkVersion 34
buildToolsVersion '34.0.0'
useLibrary 'org.apache.http.legacy'
versionCode 139
versionName "1.8"
versionCode 144
versionName "1.8.3"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
@@ -36,7 +36,7 @@ android {
{
dimension "version"
versionNameSuffix "-googlePlay"
targetSdkVersion 33
targetSdkVersion 34
}
/*
@@ -63,6 +63,7 @@ android {
checkReleaseBuilds false
}
namespace 'com.jens.automation2'
buildToolsVersion '34.0.0'
}
dependencies {
@@ -73,7 +74,7 @@ dependencies {
apkFlavorImplementation 'com.google.firebase:firebase-appindexing:20.0.0'
apkFlavorImplementation 'com.google.android.gms:play-services-location:18.0.0'
implementation 'com.linkedin.dexmaker:dexmaker:2.25.0'
implementation 'com.linkedin.dexmaker:dexmaker:2.28.1'
implementation 'org.apache.commons:commons-lang3:3.0'
//implementation "androidx.security:security-crypto:1.0.0"

View File

@@ -78,7 +78,7 @@
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>
<!--android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.USE_EXACT_ALARM" />-->
<uses-permission android:name="com.termux.permission.RUN_COMMAND" />
<uses-feature
android:name="android.hardware.telephony"

View File

@@ -76,6 +76,7 @@
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>
<!--android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.USE_EXACT_ALARM" />-->
<uses-permission android:name="com.termux.permission.RUN_COMMAND" />
<uses-feature
android:name="android.hardware.telephony"

View File

@@ -66,7 +66,6 @@
<uses-permission android:name="com.wireguard.android.permission.CONTROL_TUNNELS"/>
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission
android:name="android.permission.WRITE_SECURE_SETTINGS"
tools:ignore="ProtectedPermissions" />
@@ -74,6 +73,7 @@
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<!--android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.USE_EXACT_ALARM" />-->
<uses-permission android:name="com.termux.permission.RUN_COMMAND" />
<application
android:allowBackup="true"

View File

@@ -33,13 +33,9 @@ public class Action
setWifiTethering,
setBluetoothTethering,
setDisplayRotation,
turnWifiOn,turnWifiOff,
turnBluetoothOn,turnBluetoothOff,
triggerUrl,
changeSoundProfile,
turnUsbTetheringOn,turnUsbTetheringOff,
turnWifiTetheringOn,turnWifiTetheringOff,
enableScreenRotation,disableScreenRotation,
startOtherActivity,
waitBeforeNextAction,
turnScreenOnOrOff,
@@ -60,9 +56,9 @@ public class Action
startPhoneCall,
stopPhoneCall,
copyToClipboard,
takeScreenshot,
setLocationService,
sendTextMessage;
sendTextMessage,
takeScreenshot;
public String getFullName(Context context)
{
@@ -80,14 +76,6 @@ public class Action
return context.getResources().getString(R.string.actionSetUsbTethering);
case setDisplayRotation:
return context.getResources().getString(R.string.actionSetDisplayRotation);
case turnWifiOn:
return context.getResources().getString(R.string.actionTurnWifiOn);
case turnWifiOff:
return context.getResources().getString(R.string.actionTurnWifiOff);
case turnBluetoothOn:
return context.getResources().getString(R.string.actionTurnBluetoothOn);
case turnBluetoothOff:
return context.getResources().getString(R.string.actionTurnBluetoothOff);
case triggerUrl:
return context.getResources().getString(R.string.actionTriggerUrl);
case changeSoundProfile:
@@ -96,14 +84,6 @@ public class Action
return context.getResources().getString(R.string.actionTurnUsbTetheringOn);
case turnUsbTetheringOff:
return context.getResources().getString(R.string.actionTurnUsbTetheringOff);
case turnWifiTetheringOn:
return context.getResources().getString(R.string.actionTurnWifiTetheringOn);
case turnWifiTetheringOff:
return context.getResources().getString(R.string.actionTurnWifiTetheringOff);
case enableScreenRotation:
return context.getResources().getString(R.string.actionEnableScreenRotation);
case disableScreenRotation:
return context.getResources().getString(R.string.actionDisableScreenRotation);
case startOtherActivity:
return context.getResources().getString(R.string.startOtherActivity);
case waitBeforeNextAction:
@@ -493,25 +473,9 @@ public class Action
for(Action_Enum action : Action_Enum.values())
{
if( // exclusion for deprecated types
!action.toString().equals("turnWifiOn")
&&
!action.toString().equals("turnWifiOff")
&&
!action.toString().equals("turnBluetoothOn")
&&
!action.toString().equals("turnBluetoothOff")
&&
!action.toString().equals("turnUsbTetheringOn")
&&
!action.toString().equals("turnUsbTetheringOff")
&&
!action.toString().equals("turnWifiTetheringOn")
&&
!action.toString().equals("turnWifiTetheringOff")
&&
!action.toString().equals("enableScreenRotation")
&&
!action.toString().equals("disableScreenRotation")
) // exclusion for deprecated types
actionTypesList.add(action.toString());
}
@@ -525,25 +489,9 @@ public class Action
for(Action_Enum action : Action_Enum.values())
{
if( // exclusion for deprecated types
!action.toString().equals("turnWifiOn")
&&
!action.toString().equals("turnWifiOff")
&&
!action.toString().equals("turnBluetoothOn")
&&
!action.toString().equals("turnBluetoothOff")
&&
!action.toString().equals("turnUsbTetheringOn")
&&
!action.toString().equals("turnUsbTetheringOff")
&&
!action.toString().equals("turnWifiTetheringOn")
&&
!action.toString().equals("turnWifiTetheringOff")
&&
!action.toString().equals("enableScreenRotation")
&&
!action.toString().equals("disableScreenRotation")
) // exclusion for deprecated types
actionTypesList.add(action.getFullName(context));
}
@@ -786,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;
@@ -208,8 +209,8 @@ public class Actions
String[] parts = action.split(Action.actionParameter2Split);
broadcastIntent.setAction(parts[0]);
String[] intentparts = parts[1].split(";");
broadcastIntent = packParametersIntoIntent(broadcastIntent, intentparts, 0);
String[] intentParts = parts[1].split(";");
broadcastIntent = packParametersIntoIntent(broadcastIntent, intentParts, 0);
}
else
broadcastIntent.setAction(action);
@@ -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,67 +1053,79 @@ 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);
params = param.split(Action.actionParameter2Split, -1);
else
params = param.split(";");
params = param.split(";", -1);
try
{
Intent externalApplicationIntent;
String packageName, className, activityOrAction, startupType;
packageName = params[0];
className = params[1];
activityOrAction = params[2];
startupType = params[3];
if (!startByAction)
{
// selected by activity
String packageName, className;
packageName = params[0];
className = params[1];
// start by activity
Miscellaneous.logEvent("i", "StartOtherApp", "Starting app by activity: " + packageName + " " + className, 3);
externalApplicationIntent = new Intent(Intent.ACTION_MAIN);
externalApplicationIntent.addCategory(Intent.CATEGORY_LAUNCHER);
if(packageName.equals("dummyPkg"))
if(packageName.equals("dummyPkg") || packageName.length() == 0)
externalApplicationIntent.setAction(className);
externalApplicationIntent.setClassName(packageName, className);
externalApplicationIntent.setPackage(packageName);
externalApplicationIntent.setClassName(packageName, activityOrAction);
if (!Miscellaneous.doesActivityExist(externalApplicationIntent, Miscellaneous.getAnyContext()))
Miscellaneous.logEvent("w", "StartOtherApp", "Activity not found: " + className, 2);
}
else
{
// selected by action
// start by action
Miscellaneous.logEvent("i", "StartOtherApp", "Starting app by action: " + param, 3);
externalApplicationIntent = new Intent();
if (!params[0].equals(dummyPackageString))
externalApplicationIntent.setPackage(params[0]);
externalApplicationIntent.setAction(params[1]);
if (params[2].equals(ActivityManageActionStartActivity.startByServiceString) || params[2].equals(ActivityManageActionStartActivity.startByForegroundServiceString))
if (!packageName.equals(dummyPackageString))
{
externalApplicationIntent.setComponent(new ComponentName(params[0], params[2]));
externalApplicationIntent.setPackage(packageName);
if(!StringUtils.isEmpty(className))
externalApplicationIntent.setClassName(packageName, className);
}
externalApplicationIntent.setAction(activityOrAction);
if (startupType.equals(ActivityManageActionStartActivity.startByServiceString) || startupType.equals(ActivityManageActionStartActivity.startByForegroundServiceString))
{
externalApplicationIntent.setComponent(new ComponentName(packageName, className));
}
}
externalApplicationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// Pack intents
externalApplicationIntent = packParametersIntoIntent(externalApplicationIntent, params, 3);
if(params.length >= 5)
{
if(Miscellaneous.isNumeric(startupType))
externalApplicationIntent = packParametersIntoIntent(externalApplicationIntent, params, 4);
else
externalApplicationIntent = packParametersIntoIntent(externalApplicationIntent, params, 3);
}
if (params[2].equals(ActivityManageActionStartActivity.startByActivityString))
if (startupType.equals(ActivityManageActionStartActivity.startByActivityString))
automationServerRef.startActivity(externalApplicationIntent);
else if (params[2].equals(ActivityManageActionStartActivity.startByServiceString))
else if (startupType.equals(ActivityManageActionStartActivity.startByServiceString))
automationServerRef.startService(externalApplicationIntent);
else if (params[2].equals(ActivityManageActionStartActivity.startByForegroundServiceString) && Build.VERSION.SDK_INT >= 26)
else if (startupType.equals(ActivityManageActionStartActivity.startByForegroundServiceString) && Build.VERSION.SDK_INT >= 26)
automationServerRef.startForegroundService(externalApplicationIntent);
else
automationServerRef.sendBroadcast(externalApplicationIntent);
@@ -1752,7 +1764,7 @@ public class Actions
{
try
{
if(Build.VERSION.SDK_INT > Build.VERSION_CODES.O_MR1)
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
{
if(MobileDataStuff.setMobileNetworkFromAndroid9(desiredState, automationServerRef))
{
@@ -1765,9 +1777,9 @@ public class Actions
return false;
}
}
else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP)
else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
{
if (MobileDataStuff.setMobileNetworkTillAndroid5(desiredState, automationServerRef))
if (MobileDataStuff.setMobileNetworkAndroid6Till8(desiredState, automationServerRef))
{
Miscellaneous.logEvent("i", "setDataConnectionWithRoot()", Miscellaneous.getAnyContext().getResources().getString(R.string.dataConWithRootSuccess), 2);
return true;
@@ -1780,7 +1792,7 @@ public class Actions
}
else
{
if (MobileDataStuff.setMobileNetworkAndroid6Till8(desiredState, automationServerRef))
if (MobileDataStuff.setMobileNetworkTillAndroid5(desiredState, automationServerRef))
{
Miscellaneous.logEvent("i", "setDataConnectionWithRoot()", Miscellaneous.getAnyContext().getResources().getString(R.string.dataConWithRootSuccess), 2);
return true;
@@ -1801,8 +1813,9 @@ public class Actions
rootString = Miscellaneous.getAnyContext().getResources().getString(R.string.phoneIsNotRooted);
Miscellaneous.logEvent("e", "setDataWithRoot()", "Error setting data setting with root. " + rootString + ": " + Log.getStackTraceString(e), 3);
return false;
}
return false;
}
@SuppressLint("NewApi")
@@ -2040,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

@@ -8,6 +8,7 @@ import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
@@ -98,8 +99,17 @@ public class ActivityControlCenter extends Activity
@Override
public void onClick(View v)
{
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, requestCodeImport);
AlertDialog dialog = Miscellaneous.messageBox(getResources().getString(R.string.info), getResources().getString(R.string.importChooseFolderNotice), ActivityControlCenter.this);
dialog.setOnDismissListener(new DialogInterface.OnDismissListener()
{
@Override
public void onDismiss(DialogInterface dialogInterface)
{
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, requestCodeImport);
}
});
dialog.show();
}
});

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

@@ -590,7 +590,7 @@ public class ActivityMainScreen extends ActivityGeneric
Miscellaneous.messageBox(getResources().getString(R.string.app_name), getResources().getString(R.string.android9RecordAudioNotice) + " " + getResources().getString(R.string.messageNotShownAgain), ActivityMainScreen.this).show();
}
if(Build.VERSION.SDK_INT >= 29 && !Settings.noticeAndroid10WifiShown && Rule.isAnyRuleUsing(Action.Action_Enum.setWifi))
if(Miscellaneous.getTargetSDK(ActivityMainScreen.this) >= 29 && !Settings.noticeAndroid10WifiShown && Rule.isAnyRuleUsing(Action.Action_Enum.setWifi))
{
Settings.noticeAndroid10WifiShown = true;
Settings.writeSettings(ActivityMainScreen.this);

View File

@@ -32,7 +32,7 @@ public class ActivityManageActionSpeakText extends Activity
@Override
public void onClick(View v)
{
if(etSpeakText.getText().toString().length()>0)
if(!etSpeakText.getText().toString().isEmpty())
{
if(resultingAction == null)
{

View File

@@ -53,11 +53,11 @@ public class ActivityManageActionStartActivity extends Activity
Button bSelectApp, bAddIntentPair, bSaveActionStartOtherActivity, showStartProgramExamples;
Spinner spinnerParameterType;
RadioGroup rgAppStartupType;
boolean edit = false;
// boolean edit = false;
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";
@@ -95,7 +95,7 @@ public class ActivityManageActionStartActivity extends Activity
spinnerParameterType.setAdapter(intentTypeSpinnerAdapter);
intentTypeSpinnerAdapter.notifyDataSetChanged();
etClassName.setEnabled(false);
// etClassName.setEnabled(false);
intentPairAdapter = new ArrayAdapter<String>(this, R.layout.text_view_for_poi_listview_mediumtextsize, intentPairList);
bSelectApp.setOnClickListener(new OnClickListener()
@@ -233,26 +233,29 @@ public class ActivityManageActionStartActivity extends Activity
String parameter2 = "";
if (rbStartAppSelectByActivity.isChecked())
parameter2 += etPackageName.getText().toString() + Action.actionParameter2Split + etActivityOrActionPath.getText().toString();
else
{
if (etPackageName.getText().toString() != null && etPackageName.getText().toString().length() > 0)
parameter2 += etPackageName.getText().toString() + Action.actionParameter2Split + etActivityOrActionPath.getText().toString();
else
parameter2 += Actions.dummyPackageString + Action.actionParameter2Split + etActivityOrActionPath.getText().toString();
/*
0 = packageName
1 = className
2 = activityName/actionName
3 = startType
4 = parameters
*/
parameter2 += Action.actionParameter2Split + etClassName.getText().toString();
}
parameter2 += etPackageName.getText().toString()
+ Action.actionParameter2Split
+ etClassName.getText().toString()
+ Action.actionParameter2Split
+ etActivityOrActionPath.getText().toString()
+ Action.actionParameter2Split;
if (rbStartAppByActivity.isChecked())
parameter2 += Action.actionParameter2Split + startByActivityString;
parameter2 += startByActivityString;
else if(rbStartAppByService.isChecked())
parameter2 += Action.actionParameter2Split + startByServiceString;
parameter2 += startByServiceString;
else if(rbStartAppByForegroundService.isChecked())
parameter2 += Action.actionParameter2Split + startByForegroundServiceString;
parameter2 += startByForegroundServiceString;
else
parameter2 += Action.actionParameter2Split + startByBroadcastString;
parameter2 += startByBroadcastString;
for (String s : intentPairList)
parameter2 += Action.actionParameter2Split + s;
@@ -316,23 +319,6 @@ public class ActivityManageActionStartActivity extends Activity
}
});
rgAppStartupType.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i)
{
if(rbStartAppByActivity.isChecked())
etClassName.setEnabled(false);
else if (rbStartAppByBroadcast.isChecked())
etClassName.setEnabled(false);
else if(rbStartAppByService.isChecked())
etClassName.setEnabled(true);
else if(rbStartAppByForegroundService.isChecked())
etClassName.setEnabled(true);
}
});
Intent i = getIntent();
if(i.hasExtra(ActivityManageRule.intentNameActionParameter1))
loadValuesIntoGui(i);
@@ -625,52 +611,36 @@ public class ActivityManageActionStartActivity extends Activity
rbStartAppSelectByActivity.setChecked(!selectionByAction);
rbStartAppSelectByAction.setChecked(selectionByAction);
String[] params;
String partsString = input.getStringExtra(ActivityManageRule.intentNameActionParameter2);
/*
0 = packageName
1 = className
2 = activityName/actionName
3 = startType
4 = parameters
*/
if(partsString.contains(Action.actionParameter2Split))
params = partsString.split(Action.actionParameter2Split);
else
params = partsString.split(";");
try
{
String[] params;
String partsString = input.getStringExtra(ActivityManageRule.intentNameActionParameter2);
if(partsString.contains(Action.actionParameter2Split))
params = partsString.split(Action.actionParameter2Split, -1);
else
params = partsString.split(";", -1);
etPackageName.setText(params[0]);
etClassName.setText(params[1]);
etActivityOrActionPath.setText(params[2]);
if(Miscellaneous.isNumeric(params[2])) // old configuration file
{
rbStartAppByActivity.setChecked(params[2].equals(startByActivityString));
rbStartAppByBroadcast.setChecked(params[2].equals(startByBroadcastString));
rbStartAppByService.setChecked(params[2].equals(startByServiceString));
}
else
{
rbStartAppByActivity.setChecked(params[3].equals(startByActivityString));
rbStartAppByBroadcast.setChecked(params[3].equals(startByBroadcastString));
rbStartAppByService.setChecked(params[3].equals(startByServiceString));
rbStartAppByForegroundService.setChecked(params[3].equals(startByForegroundServiceString));
}
int startIndex = -1;
if(!selectionByAction)
{
etPackageName.setText(params[0]);
etActivityOrActionPath.setText(params[1]);
}
else
{
if(!params[0].contains(Actions.dummyPackageString))
etPackageName.setText(params[0]);
etActivityOrActionPath.setText(params[1]);
etClassName.setText(params[2]);
}
if (params.length >= 4)
startIndex = 4;
if(startIndex > -1 && params.length > startIndex)
{
intentPairList.clear();
for(int i=startIndex; i<params.length; i++)
for(int i=4; i<params.length; i++)
{
if(lvIntentPairs.getVisibility() != View.VISIBLE)
lvIntentPairs.setVisibility(View.VISIBLE);
@@ -680,6 +650,10 @@ public class ActivityManageActionStartActivity extends Activity
updateIntentPairList();
}
catch(Exception e)
{
Toast.makeText(ActivityManageActionStartActivity.this, getResources().getString(R.string.errorLoadingValues), Toast.LENGTH_LONG).show();
}
}
private void updateIntentPairList()

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

@@ -1,7 +1,6 @@
package com.jens.automation2;
import android.app.Activity;
import android.app.NotificationManager;
import android.app.ProgressDialog;
import android.content.ActivityNotFoundException;
import android.content.Context;
@@ -28,8 +27,6 @@ import android.widget.Toast;
import androidx.annotation.RequiresApi;
import java.io.File;
public class ActivityManageProfile extends Activity
{
private static ProgressDialog progressDialog;
@@ -37,12 +34,13 @@ public class ActivityManageProfile extends Activity
final static int intentCodeRingtonePickerCallsRingtone = 9011;
final static int intentCodeRingtonePickerNotificationsFile = 9020;
final static int intentCodeRingtonePickerNotificationsRingtone = 9021;
final static String android14Hint = " (>= Android 14)";
CheckBox checkBoxChangeSoundMode, checkBoxChangeVolumeMusicVideoGameMedia, checkBoxChangeVolumeNotifications, checkBoxChangeVolumeAlarms, checkBoxChangeIncomingCallsRingtone, checkBoxChangeNotificationRingtone, checkBoxChangeAudibleSelection, checkBoxChangeScreenLockUnlockSound, checkBoxChangeHapticFeedback, checkBoxChangeVibrateWhenRinging, checkBoxVibrateWhenRinging, checkBoxAudibleSelection, checkBoxScreenLockUnlockSound, checkBoxHapticFeedback, checkBoxChangeDnd;
CheckBox checkBoxChangeSoundMode, checkBoxChangeVolumeMusicVideoGameMedia, checkBoxChangeVolumeNotifications, checkBoxChangeVolumeRingtone, checkBoxChangeVolumeAlarms, checkBoxChangeIncomingCallsRingtone, checkBoxChangeNotificationRingtone, checkBoxChangeAudibleSelection, checkBoxChangeScreenLockUnlockSound, checkBoxChangeHapticFeedback, checkBoxChangeVibrateWhenRinging, checkBoxVibrateWhenRinging, checkBoxAudibleSelection, checkBoxScreenLockUnlockSound, checkBoxHapticFeedback, checkBoxChangeDnd;
Spinner spinnerSoundMode, spinnerDndMode;
SeekBar seekBarVolumeMusic, seekBarVolumeNotifications, seekBarVolumeAlarms;
SeekBar seekBarVolumeMusic, seekBarVolumeNotifications, seekBarVolumeAlarms, seekBarVolumeRingtones;
Button bChangeSoundIncomingCalls, bChangeSoundNotifications, bSaveProfile;
TextView tvIncomingCallsRingtone, tvNotificationsRingtone;
TextView tvIncomingCallsRingtone, tvNotificationsRingtone, tvRingtoneVolume, tvNotificationsVolume;
EditText etName;
boolean guiUpdate = false;
@@ -93,6 +91,7 @@ public class ActivityManageProfile extends Activity
checkBoxChangeDnd = (CheckBox)findViewById(R.id.checkBoxChangeDnd);
checkBoxChangeVolumeMusicVideoGameMedia = (CheckBox)findViewById(R.id.checkBoxChangeVolumeMusicVideoGameMedia);
checkBoxChangeVolumeNotifications = (CheckBox)findViewById(R.id.checkBoxChangeVolumeNotifications);
checkBoxChangeVolumeRingtone = (CheckBox)findViewById(R.id.checkBoxChangeVolumeRingtones);
checkBoxChangeVolumeAlarms = (CheckBox)findViewById(R.id.checkBoxChangeVolumeAlarms);
checkBoxChangeIncomingCallsRingtone = (CheckBox)findViewById(R.id.checkBoxChangeIncomingCallsRingtone);
checkBoxChangeNotificationRingtone = (CheckBox)findViewById(R.id.checkBoxChangeNotificationRingtone);
@@ -108,11 +107,14 @@ public class ActivityManageProfile extends Activity
spinnerDndMode = (Spinner)findViewById(R.id.spinnerDndMode);
seekBarVolumeMusic = (SeekBar)findViewById(R.id.seekBarVolumeMusic);
seekBarVolumeNotifications = (SeekBar)findViewById(R.id.seekBarVolumeNotifications);
seekBarVolumeRingtones = (SeekBar)findViewById(R.id.seekBarVolumeRingtones);
seekBarVolumeAlarms = (SeekBar)findViewById(R.id.seekBarVolumeAlarms);
bChangeSoundIncomingCalls = (Button)findViewById(R.id.bChangeSoundIncomingCalls);
bChangeSoundNotifications = (Button)findViewById(R.id.bChangeSoundNotifications);
tvIncomingCallsRingtone = (TextView)findViewById(R.id.tvIncomingCallsRingtone);
tvNotificationsRingtone = (TextView)findViewById(R.id.tvNotificationsRingtone);
tvRingtoneVolume = (TextView)findViewById(R.id.tvRingtoneVolume);
tvNotificationsVolume = (TextView)findViewById(R.id.tvNotificationsVolume);
bSaveProfile = (Button)findViewById(R.id.bSaveProfile);
etName = (EditText)findViewById(R.id.etName);
@@ -124,6 +126,7 @@ public class ActivityManageProfile extends Activity
spinnerDndMode.setEnabled(false);
seekBarVolumeMusic.setEnabled(false);
seekBarVolumeNotifications.setEnabled(false);
seekBarVolumeRingtones.setEnabled(false);
seekBarVolumeAlarms.setEnabled(false);
bChangeSoundIncomingCalls.setEnabled(false);
bChangeSoundNotifications.setEnabled(false);
@@ -137,11 +140,36 @@ public class ActivityManageProfile extends Activity
checkBoxChangeDnd.setEnabled(false);
spinnerDndMode.setEnabled(false);
}
if(Build.VERSION.SDK_INT >= 34)
{
checkBoxChangeVolumeRingtone.setEnabled(true);
checkBoxChangeVolumeRingtone.setVisibility(View.VISIBLE);
tvRingtoneVolume.setVisibility(View.VISIBLE);
seekBarVolumeRingtones.setVisibility(View.VISIBLE);
tvNotificationsVolume.setText(getResources().getString(R.string.volumeNotifications));
tvRingtoneVolume.setText(getResources().getString(R.string.volumeRingtone));
}
else
{
checkBoxChangeVolumeRingtone.setEnabled(false);
tvRingtoneVolume.setEnabled(false);
seekBarVolumeRingtones.setEnabled(false);
checkBoxChangeVolumeRingtone.setVisibility(View.GONE);
tvRingtoneVolume.setVisibility(View.GONE);
seekBarVolumeRingtones.setVisibility(View.GONE);
tvNotificationsVolume.setText(getResources().getString(R.string.volumeRingtone) + " + " + getResources().getString(R.string.volumeNotifications));
}
// Scale SeekBars to the system's maximum volume values
AudioManager am = (AudioManager) Miscellaneous.getAnyContext().getSystemService(Context.AUDIO_SERVICE);
seekBarVolumeMusic.setMax(am.getStreamMaxVolume(AudioManager.STREAM_MUSIC));
seekBarVolumeNotifications.setMax(am.getStreamMaxVolume(AudioManager.STREAM_NOTIFICATION));
seekBarVolumeRingtones.setMax(am.getStreamMaxVolume(AudioManager.STREAM_RING));
seekBarVolumeAlarms.setMax(am.getStreamMaxVolume(AudioManager.STREAM_ALARM));
soundModeAdapter = new ArrayAdapter<String>(this, R.layout.text_view_for_poi_listview_mediumtextsize, new String[]
@@ -201,6 +229,14 @@ public class ActivityManageProfile extends Activity
seekBarVolumeNotifications.setEnabled(isChecked);
}
});
checkBoxChangeVolumeRingtone.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
seekBarVolumeRingtones.setEnabled(isChecked);
}
});
checkBoxChangeVolumeAlarms.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
@Override
@@ -336,7 +372,7 @@ public class ActivityManageProfile extends Activity
});
if(ActivityMainProfiles.profileToEdit != null)
editProfile(ActivityMainProfiles.profileToEdit);
loadValuesIntoGui(ActivityMainProfiles.profileToEdit);
//else
// new Profile to be created
@@ -369,7 +405,7 @@ public class ActivityManageProfile extends Activity
}
}
public void editProfile(Profile profileToEdit)
public void loadValuesIntoGui(Profile profileToEdit)
{
guiUpdate = true;
@@ -378,6 +414,7 @@ public class ActivityManageProfile extends Activity
checkBoxChangeDnd.setChecked(ActivityMainProfiles.profileToEdit.getChangeDndMode());
checkBoxChangeVolumeMusicVideoGameMedia.setChecked(ActivityMainProfiles.profileToEdit.getChangeVolumeMusicVideoGameMedia());
checkBoxChangeVolumeNotifications.setChecked(ActivityMainProfiles.profileToEdit.getChangeVolumeNotifications());
checkBoxChangeVolumeRingtone.setChecked(ActivityMainProfiles.profileToEdit.getChangeVolumeRingtones());
checkBoxChangeVolumeAlarms.setChecked(ActivityMainProfiles.profileToEdit.getChangeVolumeAlarms());
checkBoxChangeIncomingCallsRingtone.setChecked(ActivityMainProfiles.profileToEdit.getChangeIncomingCallsRingtone());
checkBoxChangeNotificationRingtone.setChecked(ActivityMainProfiles.profileToEdit.getChangeNotificationRingtone());
@@ -390,6 +427,7 @@ public class ActivityManageProfile extends Activity
spinnerDndMode.setSelection(ActivityMainProfiles.profileToEdit.getDndMode()-1);
seekBarVolumeMusic.setProgress(ActivityMainProfiles.profileToEdit.getVolumeMusic());
seekBarVolumeNotifications.setProgress(ActivityMainProfiles.profileToEdit.getVolumeNotifications());
seekBarVolumeRingtones.setProgress(ActivityMainProfiles.profileToEdit.getVolumeRingtones());
seekBarVolumeAlarms.setProgress(ActivityMainProfiles.profileToEdit.getVolumeAlarms());
checkBoxAudibleSelection.setChecked(ActivityMainProfiles.profileToEdit.audibleSelection);
checkBoxScreenLockUnlockSound.setChecked(ActivityMainProfiles.profileToEdit.screenLockUnlockSound);
@@ -414,6 +452,7 @@ public class ActivityManageProfile extends Activity
ActivityMainProfiles.profileToEdit.setChangeDndMode(checkBoxChangeDnd.isChecked());
ActivityMainProfiles.profileToEdit.setChangeVolumeMusicVideoGameMedia(checkBoxChangeVolumeMusicVideoGameMedia.isChecked());
ActivityMainProfiles.profileToEdit.setChangeVolumeNotifications(checkBoxChangeVolumeNotifications.isChecked());
ActivityMainProfiles.profileToEdit.setChangeVolumeRingtones(checkBoxChangeVolumeRingtone.isChecked());
ActivityMainProfiles.profileToEdit.setChangeVolumeAlarms(checkBoxChangeVolumeAlarms.isChecked());
ActivityMainProfiles.profileToEdit.setChangeIncomingCallsRingtone(checkBoxChangeIncomingCallsRingtone.isChecked());
ActivityMainProfiles.profileToEdit.setChangeNotificationRingtone(checkBoxChangeNotificationRingtone.isChecked());
@@ -430,6 +469,7 @@ public class ActivityManageProfile extends Activity
ActivityMainProfiles.profileToEdit.setDndMode(spinnerDndMode.getSelectedItemPosition()+1);
ActivityMainProfiles.profileToEdit.setVolumeMusic(seekBarVolumeMusic.getProgress());
ActivityMainProfiles.profileToEdit.setVolumeNotifications(seekBarVolumeNotifications.getProgress());
ActivityMainProfiles.profileToEdit.setVolumeRingtones(seekBarVolumeRingtones.getProgress());
ActivityMainProfiles.profileToEdit.setVolumeAlarms(seekBarVolumeAlarms.getProgress());
ActivityMainProfiles.profileToEdit.setIncomingCallsRingtone(incomingCallsRingtone);
ActivityMainProfiles.profileToEdit.setNotificationRingtone(notificationsRingtone);

View File

@@ -622,7 +622,7 @@ public class ActivityManageRule extends Activity
items.add(new Item(typesLong[i].toString(), R.drawable.megaphone));
else if(types[i].toString().equals(Trigger_Enum.phoneCall.toString()))
{
if(ActivityPermissions.isPermissionDeclaratedInManifest(ActivityManageRule.this, Manifest.permission.SEND_SMS))
if(ActivityPermissions.isPermissionDeclaredInManifest(ActivityManageRule.this, Manifest.permission.SEND_SMS))
items.add(new Item(typesLong[i].toString(), R.drawable.phone));
}
else if(types[i].toString().equals(Trigger_Enum.nfcTag.toString()))
@@ -654,7 +654,10 @@ public class ActivityManageRule extends Activity
else if(types[i].toString().equals(Trigger_Enum.checkVariable.toString()))
items.add(new Item(typesLong[i].toString(), R.drawable.variable));
else if(types[i].toString().equals(Trigger_Enum.calendarEvent.toString()))
items.add(new Item(typesLong[i].toString(), R.drawable.calendar));
{
if(ActivityPermissions.isPermissionDeclaredInManifest(ActivityManageRule.this, Manifest.permission.READ_CALENDAR))
items.add(new Item(typesLong[i].toString(), R.drawable.calendar));
}
else
items.add(new Item(typesLong[i].toString(), R.drawable.placeholder));
}
@@ -2235,17 +2238,17 @@ public class ActivityManageRule extends Activity
items.add(new Item(typesLong[i].toString(), R.drawable.script));
else if(types[i].toString().equals(Action_Enum.startPhoneCall.toString()))
{
if(ActivityPermissions.isPermissionDeclaratedInManifest(ActivityManageRule.this, Manifest.permission.CALL_PHONE))
if(ActivityPermissions.isPermissionDeclaredInManifest(ActivityManageRule.this, Manifest.permission.CALL_PHONE))
items.add(new Item(typesLong[i].toString(), R.drawable.phone));
}
else if(types[i].toString().equals(Action_Enum.stopPhoneCall.toString()))
{
if(ActivityPermissions.isPermissionDeclaratedInManifest(ActivityManageRule.this, Manifest.permission.ANSWER_PHONE_CALLS))
if(ActivityPermissions.isPermissionDeclaredInManifest(ActivityManageRule.this, Manifest.permission.ANSWER_PHONE_CALLS))
items.add(new Item(typesLong[i].toString(), R.drawable.phone));
}
else if(types[i].toString().equals(Action_Enum.sendTextMessage.toString()))
{
if(ActivityPermissions.isPermissionDeclaratedInManifest(ActivityManageRule.this, Manifest.permission.SEND_SMS))
if(ActivityPermissions.isPermissionDeclaredInManifest(ActivityManageRule.this, Manifest.permission.SEND_SMS))
items.add(new Item(typesLong[i].toString(), R.drawable.message));
}
else if(types[i].toString().equals(Action_Enum.copyToClipboard.toString()))
@@ -2256,7 +2259,7 @@ public class ActivityManageRule extends Activity
items.add(new Item(typesLong[i].toString(), R.drawable.compass_small));
else if(types[i].toString().equals(Action_Enum.takeScreenshot.toString()))
{
if(ActivityPermissions.isPermissionDeclaratedInManifest(ActivityManageRule.this, Manifest.permission.BIND_ACCESSIBILITY_SERVICE))
if(ActivityPermissions.isServiceAvailable(Miscellaneous.getAnyContext(), "MyAccessibilityService"))
items.add(new Item(typesLong[i].toString(), R.drawable.copier));
}
else
@@ -2291,28 +2294,28 @@ public class ActivityManageRule extends Activity
{
newAction = new Action();
if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.triggerUrl.toString()))
CharSequence[] actionTypes = Action.getActionTypesAsArray();
if(actionTypes[which].toString().equals(Action_Enum.triggerUrl.toString()))
{
//launch other activity to enter a url and parameters;
newAction.setAction(Action_Enum.triggerUrl);
// ActivityManageActionTriggerUrl.resultingAction = null;
Intent editTriggerIntent = new Intent(context, ActivityManageActionTriggerUrl.class);
startActivityForResult(editTriggerIntent, requestCodeActionTriggerUrlAdd);
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.setWifi.toString()))
else if(actionTypes[which].toString().equals(Action_Enum.setWifi.toString()))
{
newAction.setAction(Action_Enum.setWifi);
Intent editSetWifiIntent = new Intent(context, ActivityManageActionWifi.class);
startActivityForResult(editSetWifiIntent, requestCodeActionSetWifiAdd);
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.setBluetooth.toString()))
else if(actionTypes[which].toString().equals(Action_Enum.setBluetooth.toString()))
{
if(!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH))
Miscellaneous.messageBox("Bluetooth", getResources().getString(R.string.deviceDoesNotHaveBluetooth), ActivityManageRule.this).show();;
newAction.setAction(Action_Enum.setBluetooth);
getActionParameter1Dialog(ActivityManageRule.this).show();
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.setUsbTethering.toString()))
else if(actionTypes[which].toString().equals(Action_Enum.setUsbTethering.toString()))
{
newAction.setAction(Action_Enum.setUsbTethering);
getActionParameter1Dialog(ActivityManageRule.this).show();
@@ -2320,12 +2323,12 @@ public class ActivityManageRule extends Activity
if(Build.VERSION.SDK_INT > Build.VERSION_CODES.GINGERBREAD_MR1)
Miscellaneous.messageBox(context.getResources().getString(R.string.warning), context.getResources().getString(R.string.usbTetheringFailForAboveGingerbread), context).show();
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.setWifiTethering.toString()))
else if(actionTypes[which].toString().equals(Action_Enum.setWifiTethering.toString()))
{
newAction.setAction(Action_Enum.setWifiTethering);
getActionParameter1Dialog(ActivityManageRule.this).show();
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.setBluetoothTethering.toString()))
else if(actionTypes[which].toString().equals(Action_Enum.setBluetoothTethering.toString()))
{
newAction.setAction(Action_Enum.setBluetoothTethering);
getActionParameter1Dialog(ActivityManageRule.this).show();
@@ -2336,12 +2339,12 @@ public class ActivityManageRule extends Activity
if(Build.VERSION.SDK_INT > Build.VERSION_CODES.O)
Miscellaneous.messageBox(context.getResources().getString(R.string.notice), context.getResources().getString(R.string.btTetheringNotice), context).show();
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.setDisplayRotation.toString()))
else if(actionTypes[which].toString().equals(Action_Enum.setDisplayRotation.toString()))
{
newAction.setAction(Action_Enum.setDisplayRotation);
getActionParameter1Dialog(ActivityManageRule.this).show();
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.changeSoundProfile.toString()))
else if(actionTypes[which].toString().equals(Action_Enum.changeSoundProfile.toString()))
{
if(Profile.getProfileCollection().size() > 0)
{
@@ -2351,23 +2354,23 @@ public class ActivityManageRule extends Activity
else
Toast.makeText(context, getResources().getString(R.string.noProfilesCreateOneFirst), Toast.LENGTH_LONG).show();
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.startOtherActivity.toString()))
else if(actionTypes[which].toString().equals(Action_Enum.startOtherActivity.toString()))
{
newAction.setAction(Action_Enum.startOtherActivity);
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionStartActivity.class);
startActivityForResult(intent, requestCodeActionStartActivityAdd);
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.waitBeforeNextAction.toString()))
else if(actionTypes[which].toString().equals(Action_Enum.waitBeforeNextAction.toString()))
{
newAction.setAction(Action_Enum.waitBeforeNextAction);
getActionWaitBeforeNextActionDialog(ActivityManageRule.this).show();
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.turnScreenOnOrOff.toString()))
else if(actionTypes[which].toString().equals(Action_Enum.turnScreenOnOrOff.toString()))
{
newAction.setAction(Action_Enum.turnScreenOnOrOff);
getActionParameter1Dialog(ActivityManageRule.this).show();
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.setAirplaneMode.toString()))
else if(actionTypes[which].toString().equals(Action_Enum.setAirplaneMode.toString()))
{
newAction.setAction(Action_Enum.setAirplaneMode);
getActionParameter1Dialog(ActivityManageRule.this).show();
@@ -2376,13 +2379,13 @@ public class ActivityManageRule extends Activity
Miscellaneous.messageBox(getResources().getString(R.string.airplaneMode), getResources().getString(R.string.rootExplanation), ActivityManageRule.this).show();
}
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.setDataConnection.toString()))
else if(actionTypes[which].toString().equals(Action_Enum.setDataConnection.toString()))
{
newAction.setAction(Action_Enum.setDataConnection);
getActionParameter1Dialog(ActivityManageRule.this).show();
Miscellaneous.messageBox(getResources().getString(R.string.actionDataConnection), getResources().getString(R.string.rootExplanation), ActivityManageRule.this).show();
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.speakText.toString()))
else if(actionTypes[which].toString().equals(Action_Enum.speakText.toString()))
{
//launch other activity to enter a url and parameters;
newAction.setAction(Action_Enum.speakText);
@@ -2390,9 +2393,9 @@ public class ActivityManageRule extends Activity
Intent editTriggerIntent = new Intent(context, ActivityManageActionSpeakText.class);
startActivityForResult(editTriggerIntent, requestCodeActionSpeakTextAdd);
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.sendTextMessage.toString()))
else if(actionTypes[which].toString().equals(Action_Enum.sendTextMessage.toString()))
{
if(ActivityPermissions.isPermissionDeclaratedInManifest(ActivityManageRule.this, Manifest.permission.SEND_SMS))
if(ActivityPermissions.isPermissionDeclaredInManifest(ActivityManageRule.this, Manifest.permission.SEND_SMS))
{
//launch other activity to enter parameters;
newAction.setAction(Action_Enum.sendTextMessage);
@@ -2401,97 +2404,97 @@ public class ActivityManageRule extends Activity
startActivityForResult(editTriggerIntent, requestCodeActionSendTextMessageAdd);
}
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.playMusic.toString()))
else if(actionTypes[which].toString().equals(Action_Enum.playMusic.toString()))
{
newAction.setAction(Action_Enum.playMusic);
ruleToEdit.getActionSet().add(newAction);
refreshActionList();
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.vibrate.toString()))
else if(actionTypes[which].toString().equals(Action_Enum.vibrate.toString()))
{
newAction.setAction(Action_Enum.vibrate);
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionVibrate.class);
startActivityForResult(intent, requestCodeActionVibrateAdd);
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.sendBroadcast.toString()))
else if(actionTypes[which].toString().equals(Action_Enum.sendBroadcast.toString()))
{
newAction.setAction(Action_Enum.sendBroadcast);
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionSendBroadcast.class);
startActivityForResult(intent, requestCodeActionSendBroadcastAdd);
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.runExecutable.toString()))
else if(actionTypes[which].toString().equals(Action_Enum.runExecutable.toString()))
{
newAction.setAction(Action_Enum.runExecutable);
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionRunExecutable.class);
startActivityForResult(intent, requestCodeActionRunExecutableAdd);
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.startPhoneCall.toString()))
else if(actionTypes[which].toString().equals(Action_Enum.startPhoneCall.toString()))
{
newAction.setAction(Action_Enum.startPhoneCall);
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionMakePhoneCall.class);
startActivityForResult(intent, requestCodeActionMakePhoneCallAdd);
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.setVariable.toString()))
else if(actionTypes[which].toString().equals(Action_Enum.setVariable.toString()))
{
newAction.setAction(Action_Enum.setVariable);
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionSetVariable.class);
startActivityForResult(intent, requestCodeActionSetVariableAdd);
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.stopPhoneCall.toString()))
else if(actionTypes[which].toString().equals(Action_Enum.stopPhoneCall.toString()))
{
newAction.setAction(Action_Enum.stopPhoneCall);
ruleToEdit.getActionSet().add(newAction);
refreshActionList();
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.wakelock.toString()))
else if(actionTypes[which].toString().equals(Action_Enum.wakelock.toString()))
{
newAction.setAction(Action_Enum.wakelock);
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionWakeLock.class);
startActivityForResult(intent, requestCodeActionWakeLockAdd);
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.controlMediaPlayback.toString()))
else if(actionTypes[which].toString().equals(Action_Enum.controlMediaPlayback.toString()))
{
newAction.setAction(Action_Enum.controlMediaPlayback);
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionControlMedia.class);
startActivityForResult(intent, requestCodeActionControlMediaAdd);
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.createNotification.toString()))
else if(actionTypes[which].toString().equals(Action_Enum.createNotification.toString()))
{
newAction.setAction(Action_Enum.createNotification);
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionCreateNotification.class);
startActivityForResult(intent, requestCodeActionCreateNotificationAdd);
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.closeNotification.toString()))
else if(actionTypes[which].toString().equals(Action_Enum.closeNotification.toString()))
{
newAction.setAction(Action_Enum.closeNotification);
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionCloseNotification.class);
startActivityForResult(intent, requestCodeActionCloseNotificationAdd);
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.setScreenBrightness.toString()))
else if(actionTypes[which].toString().equals(Action_Enum.setScreenBrightness.toString()))
{
newAction.setAction(Action_Enum.setScreenBrightness);
Intent actionScreenBrightnessIntent = new Intent(context, ActivityManageActionBrightnessSetting.class);
startActivityForResult(actionScreenBrightnessIntent, requestCodeActionScreenBrightnessAdd);
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.playSound.toString()))
else if(actionTypes[which].toString().equals(Action_Enum.playSound.toString()))
{
newAction.setAction(Action_Enum.playSound);
Intent actionPlaySoundIntent = new Intent(context, ActivityManageActionPlaySound.class);
startActivityForResult(actionPlaySoundIntent, requestCodeActionPlaySoundAdd);
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.copyToClipboard.toString()))
else if(actionTypes[which].toString().equals(Action_Enum.copyToClipboard.toString()))
{
newAction.setAction(Action_Enum.copyToClipboard);
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionCopyToClipboard.class);
startActivityForResult(intent, requestCodeActionCopyTextToClipboardAdd);
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.takeScreenshot.toString()))
else if(actionTypes[which].toString().equals(Action_Enum.takeScreenshot.toString()))
{
newAction.setAction(Action_Enum.takeScreenshot);
ruleToEdit.getActionSet().add(newAction);
refreshActionList();
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.setLocationService.toString()))
else if(actionTypes[which].toString().equals(Action_Enum.setLocationService.toString()))
{
newAction.setAction(Action_Enum.setLocationService);
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionLocationService.class);

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,11 +38,14 @@ 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);
startPicker.setIs24HourView(true);
stopPicker.setIs24HourView(true);
stopPicker.setIs24HourView(true);
bSaveTimeFrame = (Button)findViewById(R.id.bSaveTimeFrame);
checkMonday = (CheckBox)findViewById(R.id.checkMonday);

View File

@@ -15,7 +15,6 @@ import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
@@ -74,7 +73,7 @@ public class ActivityManageTriggerWifi extends Activity
if(
Miscellaneous.getTargetSDK(Miscellaneous.getAnyContext()) >= 29
&&
!ActivityPermissions.isPermissionDeclaratedInManifest(Miscellaneous.getAnyContext(), Manifest.permission.ACCESS_BACKGROUND_LOCATION)
!ActivityPermissions.isPermissionDeclaredInManifest(Miscellaneous.getAnyContext(), Manifest.permission.ACCESS_BACKGROUND_LOCATION)
)
tvWifiTriggerNameLocationNotice.setVisibility(View.VISIBLE);

View File

@@ -11,6 +11,8 @@ import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PermissionInfo;
import android.content.pm.ServiceInfo;
import android.content.res.Resources;
import android.net.Uri;
import android.os.Build;
@@ -27,8 +29,6 @@ import android.widget.TextView;
import com.jens.automation2.receivers.NotificationListener;
import org.w3c.dom.DOMImplementationSource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
@@ -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:
@@ -579,7 +582,7 @@ public class ActivityPermissions extends Activity
(
Miscellaneous.getTargetSDK(Miscellaneous.getAnyContext()) >= 29
&&
isPermissionDeclaratedInManifest(Miscellaneous.getAnyContext(), Manifest.permission.ACCESS_BACKGROUND_LOCATION)
isPermissionDeclaredInManifest(Miscellaneous.getAnyContext(), Manifest.permission.ACCESS_BACKGROUND_LOCATION)
)
||
Build.VERSION.SDK_INT >= 33
@@ -611,12 +614,6 @@ public class ActivityPermissions extends Activity
if(targetProfile.changeIncomingCallsRingtone || targetProfile.changeNotificationRingtone)
addToArrayListUnique(Manifest.permission.READ_EXTERNAL_STORAGE, requiredPermissions);
break;
case disableScreenRotation:
addToArrayListUnique(Manifest.permission.WRITE_SETTINGS, requiredPermissions);
break;
case enableScreenRotation:
addToArrayListUnique(Manifest.permission.WRITE_SETTINGS, requiredPermissions);
break;
case playMusic:
break;
case controlMediaPlayback:
@@ -703,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
@@ -711,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;
@@ -719,40 +724,12 @@ public class ActivityPermissions extends Activity
addToArrayListUnique(Manifest.permission.INTERNET, requiredPermissions);
getPermissionsForVariablesInUse(action.getParameter2(), requiredPermissions);
break;
case turnBluetoothOff:
addToArrayListUnique(Manifest.permission.BLUETOOTH_ADMIN, requiredPermissions);
addToArrayListUnique(Manifest.permission.WRITE_SETTINGS, requiredPermissions);
addToArrayListUnique(Manifest.permission.BLUETOOTH, requiredPermissions);
addToArrayListUnique(Manifest.permission.ACCESS_NETWORK_STATE, requiredPermissions);
break;
case turnBluetoothOn:
addToArrayListUnique(Manifest.permission.BLUETOOTH_ADMIN, requiredPermissions);
addToArrayListUnique(Manifest.permission.WRITE_SETTINGS, requiredPermissions);
addToArrayListUnique(Manifest.permission.BLUETOOTH, requiredPermissions);
addToArrayListUnique(Manifest.permission.ACCESS_NETWORK_STATE, requiredPermissions);
break;
case turnUsbTetheringOff:
addToArrayListUnique(Manifest.permission.WRITE_SETTINGS, requiredPermissions);
break;
case turnUsbTetheringOn:
addToArrayListUnique(Manifest.permission.WRITE_SETTINGS, requiredPermissions);
break;
case turnWifiOff:
addToArrayListUnique(Manifest.permission.WRITE_SETTINGS, requiredPermissions);
addToArrayListUnique(Manifest.permission.ACCESS_NETWORK_STATE, requiredPermissions);
break;
case turnWifiOn:
addToArrayListUnique(Manifest.permission.WRITE_SETTINGS, requiredPermissions);
addToArrayListUnique(Manifest.permission.ACCESS_NETWORK_STATE, requiredPermissions);
break;
case turnWifiTetheringOff:
addToArrayListUnique(Manifest.permission.WRITE_SETTINGS, requiredPermissions);
addToArrayListUnique(Manifest.permission.ACCESS_NETWORK_STATE, requiredPermissions);
break;
case turnWifiTetheringOn:
addToArrayListUnique(Manifest.permission.WRITE_SETTINGS, requiredPermissions);
addToArrayListUnique(Manifest.permission.ACCESS_NETWORK_STATE, requiredPermissions);
break;
case waitBeforeNextAction:
break;
case playSound:
@@ -780,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;
}
@@ -898,18 +878,6 @@ public class ActivityPermissions extends Activity
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesUsing(Action.Action_Enum.setWifiTethering))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesUsing(Action.Action_Enum.turnBluetoothOff))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesUsing(Action.Action_Enum.turnBluetoothOn))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesUsing(Action.Action_Enum.turnWifiOff))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesUsing(Action.Action_Enum.turnWifiOn))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesUsing(Action.Action_Enum.turnWifiTetheringOff))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesUsing(Action.Action_Enum.turnWifiTetheringOn))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break;
case Manifest.permission.ACCESS_WIFI_STATE:
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.pointOfInterest))
@@ -922,20 +890,12 @@ public class ActivityPermissions extends Activity
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesUsing(Action.Action_Enum.setBluetooth))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesUsing(Action.Action_Enum.turnBluetoothOff))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesUsing(Action.Action_Enum.turnBluetoothOn))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break;
case Manifest.permission.BLUETOOTH:
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.bluetoothConnection))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesUsing(Action.Action_Enum.setBluetooth))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesUsing(Action.Action_Enum.turnBluetoothOff))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesUsing(Action.Action_Enum.turnBluetoothOn))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break;
case Manifest.permission.GET_TASKS:
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.process_started_stopped))
@@ -1127,16 +1087,16 @@ 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.isPermissionDeclaratedInManifest(Miscellaneous.getAnyContext(), Manifest.permission.PROCESS_OUTGOING_CALLS) && !Miscellaneous.isGooglePlayInstalled(Miscellaneous.getAnyContext()))
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.isPermissionDeclaratedInManifest(Miscellaneous.getAnyContext(), Manifest.permission.SEND_SMS) && !Miscellaneous.isGooglePlayInstalled(Miscellaneous.getAnyContext()))
if(ActivityPermissions.isPermissionDeclaredInManifest(Miscellaneous.getAnyContext(), Manifest.permission.SEND_SMS) && !Miscellaneous.isGooglePlayInstalled(Miscellaneous.getAnyContext()))
{
permissionList.add(permission);
}
@@ -1305,7 +1265,7 @@ public class ActivityPermissions extends Activity
{
if(requiredPermissions.contains(Manifest.permission.PROCESS_OUTGOING_CALLS))
{
if(!ActivityPermissions.isPermissionDeclaratedInManifest(Miscellaneous.getAnyContext(), Manifest.permission.SEND_SMS)
if(!ActivityPermissions.isPermissionDeclaredInManifest(Miscellaneous.getAnyContext(), Manifest.permission.SEND_SMS)
&&
Miscellaneous.isGooglePlayInstalled(Miscellaneous.getAnyContext())
)
@@ -1316,7 +1276,7 @@ public class ActivityPermissions extends Activity
}
if(requiredPermissions.contains(Manifest.permission.SEND_SMS))
{
if(!ActivityPermissions.isPermissionDeclaratedInManifest(Miscellaneous.getAnyContext(), Manifest.permission.SEND_SMS)
if(!ActivityPermissions.isPermissionDeclaredInManifest(Miscellaneous.getAnyContext(), Manifest.permission.SEND_SMS)
)
{
requiredPermissions.remove(Manifest.permission.SEND_SMS);
@@ -1686,12 +1646,53 @@ public class ActivityPermissions extends Activity
mapActionPermissions.put("wakeupDevice", Manifest.permission.WAKE_LOCK);
}
public static boolean isPermissionDeclaratedInManifest(Context context, String permission)
public static boolean isServiceAvailable(Context context, String serviceName)
{
/*int flags = PackageManager.GET_ACTIVITIES
| PackageManager.GET_CONFIGURATIONS
| PackageManager.GET_DISABLED_COMPONENTS
| PackageManager.GET_GIDS | PackageManager.GET_INSTRUMENTATION
| PackageManager.GET_INTENT_FILTERS
| PackageManager.GET_PERMISSIONS | PackageManager.GET_PROVIDERS
| PackageManager.GET_RECEIVERS | PackageManager.GET_SERVICES
| PackageManager.GET_SIGNATURES;
PackageManager packageManager = getPackageManager();
List<PackageInfo> installedPackages = packageManager.getInstalledPackages(flags);
for (PackageInfo packageInfo : installedPackages)
{
ServiceInfo[] services = packageInfo.services;
PermissionInfo[] permissions = packageInfo.permissions;
}*/
StringBuffer buffer = new StringBuffer();
try
{
PackageManager packageManager = context.getPackageManager();
PackageInfo packageInfo = packageManager.getPackageInfo("com.jens.automation2", PackageManager.GET_SERVICES);
ServiceInfo[] services = packageInfo.services;
for (ServiceInfo serviceInfo : services)
{
if(serviceInfo.name.endsWith(serviceName))
return true;
}
PermissionInfo[] permissions = packageInfo.permissions;
}
catch (PackageManager.NameNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
public static boolean isPermissionDeclaredInManifest(Context context, String permission)
{
PackageManager pm = context.getPackageManager();
try
{
PackageInfo packageInfo = pm.getPackageInfo(context.getPackageName(), PackageManager.GET_PERMISSIONS);
String[] requestedPermissions = null;
if (packageInfo != null)
{

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;
@@ -321,7 +321,9 @@ public class AutomationService extends Service implements OnInitListener
ReceiverCoordinator.applySettingsAndRules();
DateTimeListener.setOrResetAlarms();
CalendarReceiver.armOrRearmTimer();
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.calendarEvent) && ActivityPermissions.isPermissionDeclaredInManifest(AutomationService.getInstance(), Manifest.permission.READ_CALENDAR) && ActivityPermissions.havePermission(Manifest.permission.READ_CALENDAR, AutomationService.getInstance()))
CalendarReceiver.armOrRearmTimer();
}
@Override
@@ -390,6 +392,20 @@ public class AutomationService extends Service implements OnInitListener
r.activate(AutomationService.this, false);
}
if(!Settings.hasBeenDone(Settings.constVersion143StartOtherProgramConfigEditHint))
{
if(Rule.isAnyRuleUsing(Action.Action_Enum.startOtherActivity))
{
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1)
Miscellaneous.createDismissibleNotificationWithDelay(1010, null, getResources().getString(R.string.version143StartOtherActivityHint), 9123, AutomationService.NOTIFICATION_CHANNEL_ID_SERVICE, null);
else
Miscellaneous.createDismissibleNotification(null, getResources().getString(R.string.version143StartOtherActivityHint), 9123, false, AutomationService.NOTIFICATION_CHANNEL_ID_SERVICE, null);
}
Settings.considerDone(Settings.constVersion143StartOtherProgramConfigEditHint);
Settings.writeSettings(Miscellaneous.getAnyContext());
}
Settings.serviceStartDone = true;
Settings.deviceStartDone = true;
}
@@ -527,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()
{
@@ -612,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

@@ -96,6 +96,7 @@ import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
@@ -313,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);
@@ -717,7 +721,9 @@ public class Miscellaneous extends Service
source.contains("[H]") ||
source.contains("[i]") ||
source.contains("[s]") ||
source.contains("[ms]")
source.contains("[ms]") ||
source.contains("[w]") ||
source.contains("[F]")
)
{
Calendar cal = Calendar.getInstance();
@@ -785,6 +791,24 @@ public class Miscellaneous extends Service
{
source = source.replace("[ms]", String.valueOf(cal.get(Calendar.MILLISECOND)));
}
if(source.contains("[w]"))
{
SimpleDateFormat sdf = new SimpleDateFormat("EEEE");
Date d = new Date();
String dayOfTheWeek = sdf.format(d);
// source = source.replace("[w]", LocalDate.now().getDayOfWeek().name());
source = source.replace("[w]", dayOfTheWeek);
}
if(source.contains("[F]"))
{
SimpleDateFormat sdf = new SimpleDateFormat("MMMM");
Date d = new Date();
String month = sdf.format(d);
// source = source.replace("[F]", LocalDate.now().getMonth().name());
source = source.replace("[F]", month);
}
}
if(source.contains("[notificationTitle]"))

View File

@@ -38,6 +38,9 @@ public class Profile implements Comparable<Profile>
protected boolean changeVolumeNotifications;
protected int volumeNotifications;
protected boolean changeVolumeRingtones;
protected int volumeRingtones;
protected boolean changeVolumeAlarms;
protected int volumeAlarms;
@@ -145,6 +148,26 @@ public class Profile implements Comparable<Profile>
return volumeNotifications;
}
public boolean getChangeVolumeRingtones()
{
return changeVolumeRingtones;
}
public void setChangeVolumeRingtones(boolean changeVolumeRingtones)
{
this.changeVolumeRingtones = changeVolumeRingtones;
}
public int getVolumeRingtones()
{
return volumeRingtones;
}
public void setVolumeRingtones(int volumeRingtones)
{
this.volumeRingtones = volumeRingtones;
}
public void setChangeVolumeAlarms(boolean changeVolumeAlarms)
{
this.changeVolumeAlarms = changeVolumeAlarms;
@@ -531,7 +554,13 @@ public class Profile implements Comparable<Profile>
if(changeVolumeNotifications)
am.setStreamVolume(AudioManager.STREAM_NOTIFICATION, volumeNotifications, AudioManager.FLAG_PLAY_SOUND);
if(Build.VERSION.SDK_INT >= 34)
{
if (changeVolumeRingtones)
am.setStreamVolume(AudioManager.STREAM_RING, volumeRingtones, AudioManager.FLAG_PLAY_SOUND);
}
if(changeVolumeAlarms)
am.setStreamVolume(AudioManager.STREAM_ALARM, volumeAlarms, AudioManager.FLAG_PLAY_SOUND);
@@ -637,6 +666,15 @@ public class Profile implements Comparable<Profile>
return false;
}
if(Build.VERSION.SDK_INT >= 34)
{
if (changeVolumeRingtones)
{
if (am.getStreamVolume(AudioManager.STREAM_RING) != volumeRingtones)
return false;
}
}
if (changeVolumeAlarms)
{
if (am.getStreamVolume(AudioManager.STREAM_ALARM) != volumeAlarms)

View File

@@ -1,5 +1,6 @@
package com.jens.automation2;
import android.Manifest;
import android.os.Build;
import android.util.Log;
@@ -212,7 +213,7 @@ public class ReceiverCoordinator
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.screenState))
ScreenStateReceiver.startScreenStateReceiver(AutomationService.getInstance());
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.calendarEvent))
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.calendarEvent) && ActivityPermissions.isPermissionDeclaredInManifest(AutomationService.getInstance(), Manifest.permission.READ_CALENDAR) && ActivityPermissions.havePermission(Manifest.permission.READ_CALENDAR, AutomationService.getInstance()))
CalendarReceiver.startCalendarReceiver(AutomationService.getInstance());
}
@@ -469,7 +470,7 @@ public class ReceiverCoordinator
}
}
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.calendarEvent))
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.calendarEvent) && ActivityPermissions.isPermissionDeclaredInManifest(AutomationService.getInstance(), Manifest.permission.READ_CALENDAR) && ActivityPermissions.havePermission(Manifest.permission.READ_CALENDAR, AutomationService.getInstance()))
{
if(!CalendarReceiver.getInstance().isListenerRunning())
CalendarReceiver.getInstance().startListener(AutomationService.getInstance());

View File

@@ -19,8 +19,9 @@ public class Settings implements SharedPreferences
public static final String folderName = "Automation";
public static final String zipFileName = "automation.zip";
public static final String constNewsOptInDone ="newsOptInDone";
public static final String constNotificationChannelCleanupApk118 ="notificationChannelCleanupApk118";
public static final String constNewsOptInDone = "newsOptInDone";
public static final String constNotificationChannelCleanupApk118 = "notificationChannelCleanupApk118";
public static final String constVersion143StartOtherProgramConfigEditHint = "constVersion143StartOtherProgramConfigEditHint";
public static long minimumDistanceChangeForGpsUpdate;
public static long minimumDistanceChangeForNetworkUpdate;
@@ -29,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;
@@ -97,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;
@@ -198,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;
@@ -338,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);
@@ -514,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;
}
}
@@ -1665,7 +1701,7 @@ public class Trigger
try
{
Class testClass = Class.forName(ActivityManageRule.activityDetectionClassPath);
if (ActivityPermissions.isPermissionDeclaratedInManifest(Miscellaneous.getAnyContext(), "com.google.android.gms.permission.ACTIVITY_RECOGNITION"))
if (ActivityPermissions.isPermissionDeclaredInManifest(Miscellaneous.getAnyContext(), "com.google.android.gms.permission.ACTIVITY_RECOGNITION"))
{
// This type doesn't have an activate/deactivate equivalent, at least not yet.
returnString.append(Miscellaneous.runMethodReflective(ActivityManageRule.activityDetectionClassPath, "getDescription", new Object[]{getActivityDetectionType()}));
@@ -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

@@ -148,6 +148,13 @@ public class XmlFileInterface
serializer.startTag(null, "volumeNotifications");
serializer.text(String.valueOf(Profile.getProfileCollection().get(i).getVolumeNotifications()));
serializer.endTag(null, "volumeNotifications");
serializer.startTag(null, "changeVolumeRingtones");
serializer.text(String.valueOf(Profile.getProfileCollection().get(i).getChangeVolumeRingtones()));
serializer.endTag(null, "changeVolumeRingtones");//
serializer.startTag(null, "volumeRingtones");
serializer.text(String.valueOf(Profile.getProfileCollection().get(i).getVolumeRingtones()));
serializer.endTag(null, "volumeRingtones");
serializer.startTag(null, "changeVolumeAlarms");
serializer.text(String.valueOf(Profile.getProfileCollection().get(i).getChangeVolumeAlarms()));
@@ -619,8 +626,12 @@ public class XmlFileInterface
newProfile.setVolumeMusic(Integer.parseInt(readTag(parser, "volumeMusic")));
else if (name.equals("changeVolumeNotifications"))
newProfile.setChangeVolumeNotifications(Boolean.parseBoolean(readTag(parser, "changeVolumeNotifications")));
else if (name.equals("changeVolumeRingtones"))
newProfile.setChangeVolumeRingtones(Boolean.parseBoolean(readTag(parser, "changeVolumeRingtones")));
else if (name.equals("volumeNotifications"))
newProfile.setVolumeNotifications(Integer.parseInt(readTag(parser, "volumeNotifications")));
else if (name.equals("volumeRingtones"))
newProfile.setVolumeRingtones(Integer.parseInt(readTag(parser, "volumeRingtones")));
else if (name.equals("changeVolumeAlarms"))
newProfile.setChangeVolumeAlarms(Boolean.parseBoolean(readTag(parser, "changeVolumeAlarms")));
else if (name.equals("volumeAlarms"))
@@ -1135,28 +1146,10 @@ public class XmlFileInterface
// *** deprecated
//else
if(actionNameString.equals("turnWifiOn"))
newAction.setAction(Action_Enum.turnWifiOn);
else if(actionNameString.equals("turnWifiOff"))
newAction.setAction(Action_Enum.turnWifiOff);
else if(actionNameString.equals("turnBluetoothOn"))
newAction.setAction(Action_Enum.turnBluetoothOn);
else if(actionNameString.equals("turnBluetoothOff"))
newAction.setAction(Action_Enum.turnBluetoothOff);
else if(actionNameString.equals("turnUsbTetheringOn"))
if(actionNameString.equals("turnUsbTetheringOn"))
newAction.setAction(Action_Enum.turnUsbTetheringOn);
else if(actionNameString.equals("turnUsbTetheringOff"))
newAction.setAction(Action_Enum.turnUsbTetheringOff);
else if(actionNameString.equals("turnWifiTetheringOn"))
newAction.setAction(Action_Enum.turnWifiTetheringOn);
else if(actionNameString.equals("turnWifiTetheringOff"))
newAction.setAction(Action_Enum.turnWifiTetheringOff);
else if(actionNameString.equals("enableScreenRotation"))
newAction.setAction(Action_Enum.enableScreenRotation);
else if(actionNameString.equals("disableScreenRotation"))
newAction.setAction(Action_Enum.disableScreenRotation);
else if(actionNameString.equals("disableScreenRotation"))
newAction.setAction(Action_Enum.disableScreenRotation);
else if(actionNameString.equals("playMusic"))
{
newAction.setAction(Action_Enum.controlMediaPlayback);
@@ -1175,31 +1168,7 @@ public class XmlFileInterface
else if (name.equals("ActionParameter1"))
{
// exclusion for deprecated types
if(newAction.getAction().equals(Action_Enum.turnWifiOn))
{
newAction.setAction(Action_Enum.setWifi);
newAction.setParameter1(true);
readTag(parser, "ActionParameter1"); //read the tag for the parser to head on
}
else if(newAction.getAction().equals(Action_Enum.turnWifiOff))
{
newAction.setAction(Action_Enum.setWifi);
newAction.setParameter1(false);
readTag(parser, "ActionParameter1"); //read the tag for the parser to head on
}
else if(newAction.getAction().equals(Action_Enum.turnBluetoothOn))
{
newAction.setAction(Action_Enum.setBluetooth);
newAction.setParameter1(true);
readTag(parser, "ActionParameter1"); //read the tag for the parser to head on
}
else if(newAction.getAction().equals(Action_Enum.turnBluetoothOff))
{
newAction.setAction(Action_Enum.setBluetooth);
newAction.setParameter1(false);
readTag(parser, "ActionParameter1"); //read the tag for the parser to head on
}
else if(newAction.getAction().equals(Action_Enum.turnUsbTetheringOn))
if(newAction.getAction().equals(Action_Enum.turnUsbTetheringOn))
{
newAction.setAction(Action_Enum.setUsbTethering);
newAction.setParameter1(true);
@@ -1211,36 +1180,6 @@ public class XmlFileInterface
newAction.setParameter1(false);
readTag(parser, "ActionParameter1"); //read the tag for the parser to head on
}
else if(newAction.getAction().equals(Action_Enum.turnWifiTetheringOn))
{
newAction.setAction(Action_Enum.setWifiTethering);
newAction.setParameter1(true);
readTag(parser, "ActionParameter1"); //read the tag for the parser to head on
}
else if(newAction.getAction().equals(Action_Enum.turnWifiTetheringOff))
{
newAction.setAction(Action_Enum.setWifiTethering);
newAction.setParameter1(false);
readTag(parser, "ActionParameter1"); //read the tag for the parser to head on
}
else if(newAction.getAction().equals(Action_Enum.enableScreenRotation))
{
newAction.setAction(Action_Enum.setDisplayRotation);
newAction.setParameter1(true);
readTag(parser, "ActionParameter1"); //read the tag for the parser to head on
}
else if(newAction.getAction().equals(Action_Enum.disableScreenRotation))
{
newAction.setAction(Action_Enum.setDisplayRotation);
newAction.setParameter1(false);
readTag(parser, "ActionParameter1"); //read the tag for the parser to head on
}
else if(newAction.getAction().equals(Action_Enum.disableScreenRotation))
{
newAction.setAction(Action_Enum.setDisplayRotation);
newAction.setParameter1(false);
readTag(parser, "ActionParameter1"); //read the tag for the parser to head on
}
else if(newAction.getAction().equals(Action_Enum.turnScreenOnOrOff) && newAction.getParameter1())
{
/*

View File

@@ -78,7 +78,7 @@ public class CellLocationChangedReceiver extends PhoneStateListener
{
for(Action action : Rule.getLastActivatedRule().getActionSet())
{
if(action.getAction() == Action.Action_Enum.turnWifiOn)
if(action.getAction() == Action.Action_Enum.setWifi && action.getParameter1())
{
// we will be using wifiReceiver, deactivate AccelerometerTimer if applicable
SensorActivity.stopAccelerometerTimer();
@@ -88,7 +88,7 @@ public class CellLocationChangedReceiver extends PhoneStateListener
catch(NullPointerException ne)
{
// Nothing to do, there is no last activated rule. Wifi hasn't been activated so we don't
// deactive accelerometer receiver.
// deactivate accelerometer receiver.
}
}
else

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

@@ -157,9 +157,10 @@
android:layout_height="wrap_content"
android:text="@string/change" />
<TextView
android:id="@+id/tvNotificationsVolume"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/volumeRingtoneNotifications"
android:text="@string/volumeNotifications"
android:textAppearance="?android:attr/textAppearanceSmall"
android:layout_marginLeft="40dp" />
<SeekBar
@@ -167,6 +168,24 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="40dp" />
<CheckBox
android:id="@+id/checkBoxChangeVolumeRingtones"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/change" />
<TextView
android:id="@+id/tvRingtoneVolume"
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/seekBarVolumeRingtones"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="40dp" />
<CheckBox
android:id="@+id/checkBoxChangeVolumeAlarms"
@@ -337,6 +356,5 @@
</LinearLayout>
</LinearLayout>
</ScrollView>
</ScrollView>

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

@@ -1,44 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_weight="30"
android:layout_margin="@dimen/default_margin" >
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_margin="@dimen/default_margin"
android:layout_weight="30">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/tvRuleTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/start"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TimePicker
android:id="@+id/tpTimeFrameStart"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tvLastRule"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/end"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TimePicker
android:id="@+id/tpTimeFrameStop"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/tvRuleTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/start"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TimePicker
android:id="@+id/tpTimeFrameStart"
android:descendantFocusability="blocksDescendants"
android:saveEnabled="false"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tvLastRule"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/end"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TimePicker
android:id="@+id/tpTimeFrameStop"
android:descendantFocusability="blocksDescendants"
android:saveEnabled="false"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ImageView
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_margin="10dp"
android:background="#aa000000" />
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_margin="10dp"
android:background="#aa000000" />
<TextView
android:id="@+id/textView2"
@@ -47,24 +51,24 @@
android:text="@string/insideOrOutsideTimeFrames"
android:textAppearance="?android:attr/textAppearanceLarge" />
<RadioGroup
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RadioGroup
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RadioButton
android:id="@+id/radioTimeFrameEntering"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="@string/entering" />
<RadioButton
android:id="@+id/radioTimeFrameLeaving"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/leaving" />
<RadioButton
android:id="@+id/radioTimeFrameEntering"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="@string/entering" />
<RadioButton
android:id="@+id/radioTimeFrameLeaving"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/leaving" />
</RadioGroup>
<ImageView
android:layout_width="match_parent"
android:layout_height="1dp"
@@ -80,52 +84,52 @@
<TextView
android:id="@+id/tvDaysHint"
android:layout_marginVertical="@dimen/default_margin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="@dimen/default_margin"
android:textColor="@color/red" />
<CheckBox
android:id="@+id/checkMonday"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/monday" />
<CheckBox
android:id="@+id/checkTuesday"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tuesday" />
<CheckBox
android:id="@+id/checkWednesday"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/wednesday" />
<CheckBox
android:id="@+id/checkThursday"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/thursday" />
<CheckBox
android:id="@+id/checkFriday"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/friday" />
<CheckBox
android:id="@+id/checkSaturday"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/saturday" />
<CheckBox
android:id="@+id/checkSunday"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/sunday" />
<CheckBox
android:id="@+id/checkMonday"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/monday" />
<CheckBox
android:id="@+id/checkTuesday"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tuesday" />
<CheckBox
android:id="@+id/checkWednesday"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/wednesday" />
<CheckBox
android:id="@+id/checkThursday"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/thursday" />
<CheckBox
android:id="@+id/checkFriday"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/friday" />
<CheckBox
android:id="@+id/checkSaturday"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/saturday" />
<CheckBox
android:id="@+id/checkSunday"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/sunday" />
<ImageView
android:layout_width="match_parent"
@@ -136,7 +140,7 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
android:orientation="horizontal">
<CheckBox
android:id="@+id/chkRepeat"
@@ -146,22 +150,22 @@
<EditText
android:id="@+id/etRepeatEvery"
android:layout_marginLeft="@dimen/default_margin"
android:minWidth="75dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/default_margin"
android:enabled="false"
android:inputType="numberSigned" />
android:inputType="numberSigned"
android:minWidth="75dp" />
</LinearLayout>
<Button
android:id="@+id/bSaveTimeFrame"
<Button
android:id="@+id/bSaveTimeFrame"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/default_margin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/save" />
android:text="@string/save" />
</LinearLayout>
</ScrollView>

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

@@ -65,7 +65,7 @@
<string name="end">Ende</string>
<string name="save">Speichern</string>
<string name="urlToTrigger">URL, die ausgelöst werden soll:</string>
<string name="urlLegend">Variablen:\nSie können die folgenden Variablen verwenden. Vor dem Auslösen werden sie mit dem entsprechenden Wert Ihres Geräts ersetzt. Die Klammern müssen in den Text mit aufgenommen werden.\n\n[uniqueid] - Die Unique ID Ihres Geräts\n[serialnr] - Die Seriennummer Ihres Geräts (&lt; Android 9)\n[latitude] - Ihr gegenwärtiger Breitengrad\n[longitude] - Ihr gegenwärtiger Längengrad\n[phonenr] - Nummer des letzten ein- oder ausgehenden Anrufs\n[d] - Tag des Monats, 2-stellig mit führender Null\n[m] - Monat als Zahl, mit führenden Nullen\n[Y] - Vierstellige Jahreszahl\n[h] - Stunde im 12-Stunden-Format, mit führenden Nullen\n[H] - Stunde im 24-Stunden-Format, mit führenden Nullen\n[i] - Minuten, mit führenden Nullen\n[s] - Sekunden, mit führenden Nullen\n[ms] - milliseconds\n[notificationTitle] - Titel der letzten Benachrichtigung\n[notificationText] - Text der letzten Benachrichtigung\n[last_triggerurl_result] - Das Ergebnis der letzten Ausführung der triggerUrl-Aktion\n[last_run_executable_exit_code] - Der exit code der letzten starte-Programm Aktion\n[last_run_executable_output] - Die Ausgabe der letzten starte-Programm Aktion (nur für nicht-root)\n[last_calendar_title] - Titel des letzten Regel-auslösenden Kalendertermins\n[last_calendar_description] - Beschreibung des letzten Regel-auslösenden Kalendertermins\n[last_calendar_location] - Ort des letzten Regel-auslösenden Kalendertermins\n[variable-VARIABLENAME] - Der Wert Ihrer selbst definitierten Variable</string>
<string name="urlLegend">Variablen:\nSie können die folgenden Variablen verwenden. Vor dem Auslösen werden sie mit dem entsprechenden Wert Ihres Geräts ersetzt. Die Klammern müssen in den Text mit aufgenommen werden.\n\n[uniqueid] - Die Unique ID Ihres Geräts\n[serialnr] - Die Seriennummer Ihres Geräts (&lt; Android 9)\n[latitude] - Ihr gegenwärtiger Breitengrad\n[longitude] - Ihr gegenwärtiger Längengrad\n[phonenr] - Nummer des letzten ein- oder ausgehenden Anrufs\n[d] - Tag des Monats, 2-stellig mit führender Null\n[m] - Monat als Zahl, mit führenden Nullen\n[Y] - Vierstellige Jahreszahl\n[h] - Stunde im 12-Stunden-Format, mit führenden Nullen\n[H] - Stunde im 24-Stunden-Format, mit führenden Nullen\n[i] - Minuten, mit führenden Nullen\n[s] - Sekunden, mit führenden Nullen\n[ms] - milliseconds\n[w] - Wochentag in Textform\n[F] - Monat in Textform\n[notificationTitle] - Titel der letzten Benachrichtigung\n[notificationText] - Text der letzten Benachrichtigung\n[last_triggerurl_result] - Das Ergebnis der letzten Ausführung der triggerUrl-Aktion\n[last_run_executable_exit_code] - Der exit code der letzten starte-Programm Aktion\n[last_run_executable_output] - Die Ausgabe der letzten starte-Programm Aktion (nur für nicht-root)\n[last_calendar_title] - Titel des letzten Regel-auslösenden Kalendertermins\n[last_calendar_description] - Beschreibung des letzten Regel-auslösenden Kalendertermins\n[last_calendar_location] - Ort des letzten Regel-auslösenden Kalendertermins\n[variable-VARIABLENAME] - Der Wert Ihrer selbst definitierten Variable</string>
<string name="wifi">WLAN</string>
<string name="activating">Aktiviere</string>
<string name="deactivating">Deaktiviere</string>
@@ -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="volumeNotifications">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,14 @@
<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>
<string name="disable">Deaktivieren</string>
<string name="enable">Aktivieren</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="volumeNotifications">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>
@@ -367,7 +368,7 @@
<string name="networkAccuracy">Red exactitud [m]</string>
<string name="minimumTimeForLocationUpdates">Tiempo mínimo para cambio en milisegundos para actualizar posición</string>
<string name="timeForUpdate">Tiempo para actualizar [milisegundos]</string>
<string name="urlLegend">Variables: Puede usar esas variables. Mientras ejecuta van a sustituir con los valores correspondientes en su dispositivo. Incluya las paréntecis en su texto.\n\n[uniqueid] - el número único de su dispositivo\n[serialnr] - el número de serie de su dispositivo (&lt; Android 9)\n[latitude] - su latitud\n[longitude] - su longitud\n[phonenr] - Ùltimo número de llamada realizada tanto de salida como entrante\n[d] - Dia del mes, 2 digitos con cero al comienzo\n[m] - número del mes, 2 digitos con cero al comienzo\n[Y] - Número del año, 4 digitos\n[h] - Hora, formato 12 horas con cero al comienzo\n[H] - Hora, formato 24 horas con cero al comienzo\n[i] - Minutos con cero al comienzo\n[s] - Segundos con cero al comienzo\n[ms] - milisegundos\n[notificationTitle] - Título de la última notificación\n[notificationText] - Texto de la última notificación\n[last_triggerurl_result] - El resultado de la última ejecución de la acción triggerUrl\n[last_run_executable_exit_code] - El código de salida de la última acción ejecutable ejecutada\n[last_run_executable_output] - El resultado de la última acción ejecutable ejecutada (solo para no root)Titel des letzten Regel-auslösenden Kalendertermins\n[last_calendar_title] - Título de la ultima cita en el calendar que ejecutó una regla\n[last_calendar_description] - Descriptión de la ultima cita en el calendar que ejecutó una regla\n[last_calendar_location] - Ubicación de la ultima cita en el calendar que ejecutó una regla\n[variable-VARIABLENAME] - El valor de la variable definida personalizada</string>
<string name="urlLegend">Variables: Puede usar esas variables. Mientras ejecuta van a sustituir con los valores correspondientes en su dispositivo. Incluya las paréntecis en su texto.\n\n[uniqueid] - el número único de su dispositivo\n[serialnr] - el número de serie de su dispositivo (&lt; Android 9)\n[latitude] - su latitud\n[longitude] - su longitud\n[phonenr] - Ùltimo número de llamada realizada tanto de salida como entrante\n[d] - Dia del mes, 2 digitos con cero al comienzo\n[m] - número del mes, 2 digitos con cero al comienzo\n[Y] - Número del año, 4 digitos\n[h] - Hora, formato 12 horas con cero al comienzo\n[H] - Hora, formato 24 horas con cero al comienzo\n[i] - Minutos con cero al comienzo\n[s] - Segundos con cero al comienzo\n[ms] - milisegundos\n[w] - Día de la semana en forma de texto\n[F] - Mes en forma de texto\n[notificationTitle] - Título de la última notificación\n[notificationText] - Texto de la última notificación\n[last_triggerurl_result] - El resultado de la última ejecución de la acción triggerUrl\n[last_run_executable_exit_code] - El código de salida de la última acción ejecutable ejecutada\n[last_run_executable_output] - El resultado de la última acción ejecutable ejecutada (solo para no root)Titel des letzten Regel-auslösenden Kalendertermins\n[last_calendar_title] - Título de la ultima cita en el calendar que ejecutó una regla\n[last_calendar_description] - Descriptión de la ultima cita en el calendar que ejecutó una regla\n[last_calendar_location] - Ubicación de la ultima cita en el calendar que ejecutó una regla\n[variable-VARIABLENAME] - El valor de la variable definida personalizada</string>
<string name="screenRotationAlreadyEnabled">Rotación del monitor todavia esta activado.</string>
<string name="screenRotationAlreadyDisabled">Rotación del monitor todavia esta desactivado.</string>
<string name="needLocationPermForWifiList">Se puede usar la lista de wifis conocidos para determinar los sitios en los cuales estuvo. Por eso el permiso de localización es necesario para cargar la lista de wifis. Si quiere elegir uno de la lista tiene que conceder el permiso. En caso contrario todavia puede introducir un nombre wifi manualmente.</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,14 @@
<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>
<string name="disable">Desactivar</string>
<string name="enable">Activar</string>
</resources>

View File

@@ -65,7 +65,7 @@
<string name="end">Arrêt</string>
<string name="save">Enregistrer</string>
<string name="urlToTrigger">URL à déclencher :</string>
<string name="urlLegend">Variables :\nVous pouvez utiliser les variables suivantes. Lors du déclenchement, elles seront remplacées par les variables correspondantes sur votre appareil. Insérez les parenthèses dans votre texte.\n\n[uniqueid] - Identifiant unique de votre appareil\n[serialnr] - Numéro de série de votre appareil (&lt; Android 9)\n[latitude] - Latitude de votre appraeil\n[longitude] - Longitude de votre appraeil\n[phonenr] - Numéro des derniers appels entrants ou sortants\n[d] - Jour du mois, @chiffres commençant par 0\n[m] - Valeur numérique du mois, avec @ chiffres\n[Y] - Valeur numérique de lannée, $ chiffres\n[h] - Format horaire 12heures, 2chiffres\n[H] - Format horaire 24heures, 2chiffres\n[i] - Nombre de minutes, 2chiffres\n[s] - Nombre de secondes, 2chiffres\n[ms] - Nombre de millisecondes\n[notificationTitle] - titre de la dernière notification\n[notificationText] - texte de la dernière notification\n[last_triggerurl_result] - Résultat de l\'exécution de la dernière action triggerUrl\n[last_run_executable_exit_code] - Le code de sortie de la dernière action exécutable exécutée\n[last_run_executable_output] - La sortie de la dernière action exécutable exécutée (uniquement pour les non-roots)\n[last_calendar_title] - Titre du dernier événement de calendrier déclenchant une règle\n[last_calendar_description] - Description du dernier événement de calendrier déclenchant une règle\n[last_calendar_location] - Emplacement du dernier événement de calendrier déclenchant la règle\n[variable-VARIABLENAME] - Valeur de votre variable définie personnalisée</string>
<string name="urlLegend">Variables :\nVous pouvez utiliser les variables suivantes. Lors du déclenchement, elles seront remplacées par les variables correspondantes sur votre appareil. Insérez les parenthèses dans votre texte.\n\n[uniqueid] - Identifiant unique de votre appareil\n[serialnr] - Numéro de série de votre appareil (&lt; Android 9)\n[latitude] - Latitude de votre appraeil\n[longitude] - Longitude de votre appraeil\n[phonenr] - Numéro des derniers appels entrants ou sortants\n[d] - Jour du mois, @chiffres commençant par 0\n[m] - Valeur numérique du mois, avec @ chiffres\n[Y] - Valeur numérique de lannée, $ chiffres\n[h] - Format horaire 12heures, 2chiffres\n[H] - Format horaire 24heures, 2chiffres\n[i] - Nombre de minutes, 2chiffres\n[s] - Nombre de secondes, 2chiffres\n[ms] - Nombre de millisecondes\n[w] - Jour de la semaine sous forme de texte\n[F] - Mois sous forme de texte\n[notificationTitle] - titre de la dernière notification\n[notificationText] - texte de la dernière notification\n[last_triggerurl_result] - Résultat de l\'exécution de la dernière action triggerUrl\n[last_run_executable_exit_code] - Le code de sortie de la dernière action exécutable exécutée\n[last_run_executable_output] - La sortie de la dernière action exécutable exécutée (uniquement pour les non-roots)\n[last_calendar_title] - Titre du dernier événement de calendrier déclenchant une règle\n[last_calendar_description] - Description du dernier événement de calendrier déclenchant une règle\n[last_calendar_location] - Emplacement du dernier événement de calendrier déclenchant la règle\n[variable-VARIABLENAME] - Valeur de votre variable définie personnalisée</string>
<string name="wifi">wifi</string>
<string name="activating">Allumer</string>
<string name="deactivating">Éteindre</string>
@@ -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="volumeNotifications">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,14 @@
<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="version143StartOtherActivityHint">Dans la version 1.8.2, il était nécessaire de revoir la façon dont les actions pour démarrer d\'autres programmes étaient enregistrées. La compatibilité n\'a pas pu être assurée. Veuillez vérifier et modifier vos actions de démarrage d\'autres activités pour vous assurer qu\'elles fonctionnent toujours.</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>
<string name="disable">Désactiver</string>
<string name="enable">Activer</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>
@@ -542,7 +542,7 @@
<string name="tuesday">Martedì</string>
<string name="unknownError">Errore indeterminato.</string>
<string name="until">finchè</string>
<string name="urlLegend">Variabili:\n È possibile utilizzare le seguenti variabili. Quando attivate, saranno sostituite con il valore corrispondente sul tuo dispositivo. Includi le parentesi nel tuo testo.\n\n[uniqueid] - L\'ID unico del tuo dispositivo\n[serialnr] - Il numero di serie del tuo dispositivio (&lt; Android 9)\n[latitude] - La latitudine del tuo dispositivo\n[longitude] - La longitudine del tuo dispositivo\n[phonenr] - Numero dell\'ultima chiamata (entrante o uscente)\n[d] - Il giorno del mese, sempre 2 cifre con zero iniziale \n[m] - Mese in formato numerico, sempre 2 cifre con zero iniziale \n[Y] - L\anno, sempre con 4 cifre\n[h] - Ore in formato 12 ore, sempre 2 cifre con due punti\n[H] - Ore in formato 24 ore, sempre 2 cifre con due punti\n[i] - Minuti, sempre 2 cifre\n[s] - Secondi, sempre 2 cifre\n[ms] - millisecondi, sempre 3 cifre\n[notificationTitle] - titolo dell\'ultima notifica\n[notificationText] - testo dell\'ultima notifica\n[last_triggerurl_result] - Risultato dell\'esecuzione dell\'ultima azione triggerUrl\n[last_run_executable_exit_code] - Codice di uscita dell\'ultima azione eseguibile di esecuzione\n[last_run_executable_output] - L\'output dell\'ultima azione eseguibile eseguita (solo per i non root)\n[last_calendar_title] - Titolo dell\'ultimo evento di calendario che ha attivato la regola\n[last_calendar_description] - Descrizione dell\'ultimo evento del calendario che ha attivato la regola\n[last_calendar_location] - Posizione dell\'ultimo evento del calendario che ha attivato la regola\n[variable-VARIABLENAME] - Il valore della variabile definita in modo personalizzato</string>
<string name="urlLegend">Variabili:\n È possibile utilizzare le seguenti variabili. Quando attivate, saranno sostituite con il valore corrispondente sul tuo dispositivo. Includi le parentesi nel tuo testo.\n\n[uniqueid] - L\'ID unico del tuo dispositivo\n[serialnr] - Il numero di serie del tuo dispositivio (&lt; Android 9)\n[latitude] - La latitudine del tuo dispositivo\n[longitude] - La longitudine del tuo dispositivo\n[phonenr] - Numero dell\'ultima chiamata (entrante o uscente)\n[d] - Il giorno del mese, sempre 2 cifre con zero iniziale \n[m] - Mese in formato numerico, sempre 2 cifre con zero iniziale \n[Y] - L\anno, sempre con 4 cifre\n[h] - Ore in formato 12 ore, sempre 2 cifre con due punti\n[H] - Ore in formato 24 ore, sempre 2 cifre con due punti\n[i] - Minuti, sempre 2 cifre\n[s] - Secondi, sempre 2 cifre\n[ms] - millisecondi, sempre 3 cifre\n[w] - Giorno della settimana in forma di testo\n[F] - Mese in forma di testo\n[notificationTitle] - titolo dell\'ultima notifica\n[notificationText] - testo dell\'ultima notifica\n[last_triggerurl_result] - Risultato dell\'esecuzione dell\'ultima azione triggerUrl\n[last_run_executable_exit_code] - Codice di uscita dell\'ultima azione eseguibile di esecuzione\n[last_run_executable_output] - L\'output dell\'ultima azione eseguibile eseguita (solo per i non root)\n[last_calendar_title] - Titolo dell\'ultimo evento di calendario che ha attivato la regola\n[last_calendar_description] - Descrizione dell\'ultimo evento del calendario che ha attivato la regola\n[last_calendar_location] - Posizione dell\'ultimo evento del calendario che ha attivato la regola\n[variable-VARIABLENAME] - Il valore della variabile definita in modo personalizzato</string>
<string name="urlToTrigger">URL da caricare:</string>
<string name="urlTooShort">L\'url deve avere almeno 10 caratteri.</string>
<string name="usbTetheringFailForAboveGingerbread">Questo molto probabilmente non funzionerà dato che sei su una versione superiore ad Android 2.3. Tuttavia è possibile utilizzare la connessione wifi tethering per attivare la regola.</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="volumeNotifications">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,14 @@
<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>
<string name="disable">Disabilitare</string>
<string name="enable">Abilitare</string>
</resources>

View File

@@ -64,7 +64,7 @@
<string name="end">Einde</string>
<string name="save">Opslaan</string>
<string name="urlToTrigger">URL om te activeren:</string>
<string name="urlLegend">Variabelen:U kunt de volgende variabelen gebruiken. Bij het triggeren zullen ze worden vervangen door de corresponderende waarde op je apparaat. Zet de haakjes in uw tekst. \n[uniqueid] - Het unieke id van uw apparaat[serialnr] - Het serienummer van uw apparaat (&lt; Android 9)[latitude] - De breedtegraad van uw apparaat[longitude] - De lengtegraad van uw apparaat[phonenr] - Nummer van het laatste inkomende of uitgaande gesprek[d] - Dag van de maand, 2 cijfers met voorloopnullen[m] - Numerieke weergave van een maand, met voorloopnullen[Y] - een volledige numerieke weergave van een jaar, 4 cijfers[h] - 12-uurs indeling van een uur, met voorloopnullen[H] - 24-uurs indeling van een uur, met voorloopnullen[i] - minuten, met voorloopnullen[s] - seconden, met voorloopnullen[ms] - milliseconden[notificationTitle] - titel van de laatste melding[notificationText] - tekst van de laatste melding\n[last_triggerurl_result] - Het resultaat van de laatste uitvoering van de triggerUrl-actie\n[last_run_executable_exit_code] - De afsluitcode van de uitvoerbare actie van de laatste uitvoering\n[last_run_executable_output] - De uitvoer van de uitvoerbare actie van de laatste uitvoering (alleen voor niet-root)\n[last_calendar_title] - Titel van de laatste agenda-afspraak die regels activeert\n[last_calendar_description] - Beschrijving van de laatste agenda-gebeurtenis die regels activeert\n[last_calendar_location] - Locatie van de laatste agenda-gebeurtenis die de regel activeert\n[variable-VARIABLENAME] - De waarde van uw aangepaste gedefinieerde variabele</string>
<string name="urlLegend">Variabelen:U kunt de volgende variabelen gebruiken. Bij het triggeren zullen ze worden vervangen door de corresponderende waarde op je apparaat. Zet de haakjes in uw tekst. \n[uniqueid] - Het unieke id van uw apparaat\n[serialnr] - Het serienummer van uw apparaat (&lt; Android 9)\n[latitude] - De breedtegraad van uw apparaat\n[longitude] - De lengtegraad van uw apparaat\n[phonenr] - Nummer van het laatste inkomende of uitgaande gesprek\n[d] - Dag van de maand, 2 cijfers met voorloopnullen\n[m] - Numerieke weergave van een maand, met voorloopnullen\n[Y] - een volledige numerieke weergave van een jaar, 4 cijfers\n[h] - 12-uurs indeling van een uur, met voorloopnullen\n[H] - 24-uurs indeling van een uur, met voorloopnullen\n[i] - minuten, met voorloopnullen\n[s] - seconden, met voorloopnullen\n[ms] - milliseconden\n[w] - Dag van de week in tekstvorm\n[F] - Maand in tekstvorm\n[notificationTitle] - titel van de laatste melding\n[notificationText] - tekst van de laatste melding\n[last_triggerurl_result] - Het resultaat van de laatste uitvoering van de triggerUrl-actie\n[last_run_executable_exit_code] - De afsluitcode van de uitvoerbare actie van de laatste uitvoering\n[last_run_executable_output] - De uitvoer van de uitvoerbare actie van de laatste uitvoering (alleen voor niet-root)\n[last_calendar_title] - Titel van de laatste agenda-afspraak die regels activeert\n[last_calendar_description] - Beschrijving van de laatste agenda-gebeurtenis die regels activeert\n[last_calendar_location] - Locatie van de laatste agenda-gebeurtenis die de regel activeert\n[variable-VARIABLENAME] - De waarde van uw aangepaste gedefinieerde variabele</string>
<string name="wifi">wifi</string>
<string name="activating">Activeren</string>
<string name="deactivating">Deactiveren</string>
@@ -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="volumeNotifications">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,14 @@
<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>
<string name="disable">Uitschakelen</string>
<string name="enable">Inschakelen</string>
</resources>

View File

@@ -70,7 +70,7 @@
<string name="end">Koniec</string>
<string name="save">Zapisz</string>
<string name="urlToTrigger">Adres URL do uruchomienia:</string>
<string name="urlLegend">Zmienne:\nMożesz użyć następujących zmiennych. Po uruchomieniu zostaną one zastąpione odpowiednią wartością na Twoim urządzeniu. Umieść nawiasy w tekście.\n\n[uniqueid] unikalny identyfikator Twojego urządzenia\n[serialnr] numer seryjny Twojego urządzenia (&lt; Android 9)\n[latitude] Twoje urządzenie\ szerokość geograficzna użytkownika\n[longitude] długość geograficzna Twojego urządzenia\n[phonenr] numer ostatniego połączenia przychodzącego lub wychodzącego\n[d] dzień miesiąca, 2 cyfry z zerami na początku\n[m] Numeryczna reprezentacja miesiąca z zerami na początku\n[Y] — pełna cyfrowa reprezentacja roku, 4 cyfry\n[h] — godzina w formacie 12-godzinnym z zerami na początku\n[H] — format 24-godzinny format godziny z wiodącymi zerami\n[i] - minuty z wiodącymi zerami\n[s] - sekundy z wiodącymi zerami\n[ms] - milisekundy\n[notificationTitle] - tytuł ostatniego powiadomienia\n[notificationText] - tekst ostatniego powiadomienia\n[last_triggerurl_result] - Wynik ostatniego wykonania akcji triggerUrl\n[last_run_executable_exit_code] - Kod zakończenia ostatniej uruchomionej akcji wykonywalnej\n[last_run_executable_output] - Dane wyjściowe ostatniej akcji wykonywalnej uruchomienia (tylko dla użytkowników innych niż root)\n[last_calendar_title] - Tytuł ostatniego wydarzenia w kalendarzu wyzwalającego regułę\n[last_calendar_description] - opis ostatniego wydarzenia w kalendarzu wyzwalającego regułę\n[last_calendar_location] - Lokalizacja ostatniego zdarzenia w kalendarzu wyzwalającego regułę\n[variable-VARIABLENAME] - Wartość niestandardowej zmiennej zdefiniowanej przez Ciebie</string>
<string name="urlLegend">Zmienne:\nMożesz użyć następujących zmiennych. Po uruchomieniu zostaną one zastąpione odpowiednią wartością na Twoim urządzeniu. Umieść nawiasy w tekście.\n\n[uniqueid] unikalny identyfikator Twojego urządzenia\n[serialnr] numer seryjny Twojego urządzenia (&lt; Android 9)\n[latitude] Twoje urządzenie\ szerokość geograficzna użytkownika\n[longitude] długość geograficzna Twojego urządzenia\n[phonenr] numer ostatniego połączenia przychodzącego lub wychodzącego\n[d] dzień miesiąca, 2 cyfry z zerami na początku\n[m] Numeryczna reprezentacja miesiąca z zerami na początku\n[Y] — pełna cyfrowa reprezentacja roku, 4 cyfry\n[h] — godzina w formacie 12-godzinnym z zerami na początku\n[H] — format 24-godzinny format godziny z wiodącymi zerami\n[i] - minuty z wiodącymi zerami\n[s] - sekundy z wiodącymi zerami\n[ms] - milisekundy\n[w] - Dzień tygodnia w formie tekstowej\n[F] - Miesiąc w formie tekstowej\n[notificationTitle] - tytuł ostatniego powiadomienia\n[notificationText] - tekst ostatniego powiadomienia\n[last_triggerurl_result] - Wynik ostatniego wykonania akcji triggerUrl\n[last_run_executable_exit_code] - Kod zakończenia ostatniej uruchomionej akcji wykonywalnej\n[last_run_executable_output] - Dane wyjściowe ostatniej akcji wykonywalnej uruchomienia (tylko dla użytkowników innych niż root)\n[last_calendar_title] - Tytuł ostatniego wydarzenia w kalendarzu wyzwalającego regułę\n[last_calendar_description] - opis ostatniego wydarzenia w kalendarzu wyzwalającego regułę\n[last_calendar_location] - Lokalizacja ostatniego zdarzenia w kalendarzu wyzwalającego regułę\n[variable-VARIABLENAME] - Wartość niestandardowej zmiennej zdefiniowanej przez Ciebie</string>
<string name="wifi">wifi</string>
<string name="activating">Aktywowanie</string>
<string name="deactivating">Dezaktywowanie</string>
@@ -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="volumeNotifications">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,14 @@
<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>
<string name="disable">Wyłączać</string>
<string name="enable">Umożliwiać</string>
</resources>

View File

@@ -65,7 +65,7 @@
<string name="end">Конец</string>
<string name="save">Сохранить</string>
<string name="urlToTrigger">URL для вызова:</string>
<string name="urlLegend">Переменные:\nВы можете использовать следующие переменные. При срабатывании они будут заменены соответствующим значением на вашем устройстве. Скобки- часть переменной.\n\n[uniqueid] - уникальный идентификатор\n[serialnr] - серийный номер(&lt; Android 9)\n[latitude] - широта\n[longitude] - долгота\n[phonenr] - Номер последнего входящего или исходящего вызова\n[d] - День месяца, 2 цифры с начальными нулями\n[m] Месяц, 2 цифры с начальными нулями\n[Y] - Год, 4 цифры\n[h] - 12-часовой формат часа с начальными нулями\n[H] - 24-часовой формат часа с начальными нулями\n[i] - Минуты с начальными нулями\n[s] - Секунды с начальными нулями\n[ms] - миллисекунды\n[notificationTitle] - заголовок последнего уведомления\n[notificationText] - текст последнего уведомления\n[last_triggerurl_result] - Результат последнего выполнения действия triggerUrl\n[last_run_executable_exit_code] - Код выхода последнего выполняемого действия\n[last_run_executable_output] - Выходные данные последнего выполняемого действия (только для некорневых пользователей)\n[last_calendar_title] - Заголовок последнего календарного события, запускающего правило\n[last_calendar_description] - Описание последнего события календаря, активировавшего правило\n[last_calendar_location] - Местоположение последнего календарного события, запускающего правило\n[variable-VARIABLENAME] - Значение переменной, определенной пользователем</string>
<string name="urlLegend">Переменные:\nВы можете использовать следующие переменные. При срабатывании они будут заменены соответствующим значением на вашем устройстве. Скобки- часть переменной.\n\n[uniqueid] - уникальный идентификатор\n[serialnr] - серийный номер(&lt; Android 9)\n[latitude] - широта\n[longitude] - долгота\n[phonenr] - Номер последнего входящего или исходящего вызова\n[d] - День месяца, 2 цифры с начальными нулями\n[m] Месяц, 2 цифры с начальными нулями\n[Y] - Год, 4 цифры\n[h] - 12-часовой формат часа с начальными нулями\n[H] - 24-часовой формат часа с начальными нулями\n[i] - Минуты с начальными нулями\n[s] - Секунды с начальными нулями\n[ms] - миллисекунды\n[w] - День недели в текстовом виде\n[F] - Месяц в текстовом виде\n[notificationTitle] - заголовок последнего уведомления\n[notificationText] - текст последнего уведомления\n[last_triggerurl_result] - Результат последнего выполнения действия triggerUrl\n[last_run_executable_exit_code] - Код выхода последнего выполняемого действия\n[last_run_executable_output] - Выходные данные последнего выполняемого действия (только для некорневых пользователей)\n[last_calendar_title] - Заголовок последнего календарного события, запускающего правило\n[last_calendar_description] - Описание последнего события календаря, активировавшего правило\n[last_calendar_location] - Местоположение последнего календарного события, запускающего правило\n[variable-VARIABLENAME] - Значение переменной, определенной пользователем</string>
<string name="wifi">Wi-Fi</string>
<string name="activating">Активация</string>
<string name="deactivating">Деактивация</string>
@@ -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="volumeNotifications">уведомления</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,14 @@
<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>
<string name="disable">Отключить</string>
<string name="enable">Давать возможность</string>
</resources>

View File

@@ -56,7 +56,7 @@
<string name="end">结束</string>
<string name="save">保存</string>
<string name="urlToTrigger">触发网址:</string>
<string name="urlLegend">变量:\n您可以使用以下变量。触发后它们将替换为您设备上的对应值。文本中要包含方括号。\n\n[uniqueid] - 您设备的唯一 ID\n[serialnr] - 您设备的序列号(&lt; Android 9\n[latitude] - 您设备的纬度\n[longitude] - 您设备的经度\n[phonenr] - 最后来电或去电的号码\n[d] - 日2 位数字,带前导零\n[m] - 月,数字表示,带前导零\n[Y] - 年完整数字表示4 位数字\n[h] - 时12 小时制,带前导零\n[H] - 时24 小时制,带前导零\n[i] - 分,带前导零\n[s] - 秒,带前导零\n[ms] - 毫秒\n[notificationTitle] - 最后通知的标题\n[notificationText] - 最后通知的文本\n[last_triggerurl_result] - 上次 triggerUrl 操作执行的结果\n[last_run_executable_exit_code] - 上次运行可执行操作的退出代码\n[last_run_executable_output] - 上次运行可执行操作的输出(仅适用于非 root\n[variable-变量名] - 自定义变量的值</string>
<string name="urlLegend">变量:\n您可以使用以下变量。触发后它们将替换为您设备上的对应值。文本中要包含方括号。\n\n[uniqueid] - 您设备的唯一 ID\n[serialnr] - 您设备的序列号(&lt; Android 9\n[latitude] - 您设备的纬度\n[longitude] - 您设备的经度\n[phonenr] - 最后来电或去电的号码\n[d] - 日2 位数字,带前导零\n[m] - 月,数字表示,带前导零\n[Y] - 年完整数字表示4 位数字\n[h] - 时12 小时制,带前导零\n[H] - 时24 小时制,带前导零\n[i] - 分,带前导零\n[s] - 秒,带前导零\n[ms] - 毫秒\n[w] - 文本形式的星期几\n[F] - 文本形式的月份\n[notificationTitle] - 最后通知的标题\n[notificationText] - 最后通知的文本\n[last_triggerurl_result] - 上次 triggerUrl 操作执行的结果\n[last_run_executable_exit_code] - 上次运行可执行操作的退出代码\n[last_run_executable_output] - 上次运行可执行操作的输出(仅适用于非 root\n[variable-变量名] - 自定义变量的值</string>
<string name="wifi">WLAN</string>
<string name="activating">启用</string>
<string name="deactivating">停用</string>
@@ -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="volumeNotifications">通知</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,14 @@
<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>
<string name="disable">禁用</string>
<string name="enable">使</string>
</resources>

View File

@@ -71,7 +71,7 @@
<string name="end">End</string>
<string name="save">Save</string>
<string name="urlToTrigger">URL to trigger:</string>
<string name="urlLegend">Variables:\nYou can use the following variables. Upon triggering they will be replaced with the corresponding value on your device. Include the brackets in your text.\n\n[uniqueid] - Your device\'s unique id\n[serialnr] - Your device\'s serial number (&lt; Android 9)\n[latitude] - Your device\'s latitude\n[longitude] - Your device\'s longitude\n[phonenr] - Number of last incoming or outgoing call\n[d] - Day of the month, 2 digits with leading zeros\n[m] - Numeric representation of a month, with leading zeros\n[Y] - A full numeric representation of a year, 4 digits\n[h] - 12-hour format of an hour with leading zeros\n[H] - 24-hour format of an hour with leading zeros\n[i] - Minutes with leading zeros\n[s] - Seconds, with leading zeros\n[ms] - milliseconds\n[notificationTitle] - title of last notification\n[notificationText] - text of last notification\n[last_triggerurl_result] - The result of the last triggerUrl action execution\n[last_run_executable_exit_code] - The exit code of the last run executable action\n[last_run_executable_output] - The output of the last run executable action (only for non-root)\n[last_calendar_title] - Title of the last rule-triggering calendar event\n[last_calendar_description] - Description of the last rule-triggering calendar event\n[last_calendar_location] - Location of the last rule-triggering calendar event\n[variable-VARIABLENAME] - The value of your custom defined variable</string>
<string name="urlLegend">Variables:\nYou can use the following variables. Upon triggering they will be replaced with the corresponding value on your device. Include the brackets in your text.\n\n[uniqueid] - Your device\'s unique id\n[serialnr] - Your device\'s serial number (&lt; Android 9)\n[latitude] - Your device\'s latitude\n[longitude] - Your device\'s longitude\n[phonenr] - Number of last incoming or outgoing call\n[d] - Day of the month, 2 digits with leading zeros\n[m] - Numeric representation of a month, with leading zeros\n[Y] - A full numeric representation of a year, 4 digits\n[h] - 12-hour format of an hour with leading zeros\n[H] - 24-hour format of an hour with leading zeros\n[i] - Minutes with leading zeros\n[s] - Seconds, with leading zeros\n[ms] - milliseconds\n[w] - Day of the week in text form\n[F] - Month in text form\n[notificationTitle] - title of last notification\n[notificationText] - text of last notification\n[last_triggerurl_result] - The result of the last triggerUrl action execution\n[last_run_executable_exit_code] - The exit code of the last run executable action\n[last_run_executable_output] - The output of the last run executable action (only for non-root)\n[last_calendar_title] - Title of the last rule-triggering calendar event\n[last_calendar_description] - Description of the last rule-triggering calendar event\n[last_calendar_location] - Location of the last rule-triggering calendar event\n[variable-VARIABLENAME] - The value of your custom defined variable</string>
<string name="wifi">wifi</string>
<string name="activating">Activating</string>
<string name="deactivating">Deactivating</string>
@@ -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="volumeNotifications">Notifications</string>
<string name="volumeRingtone">Ringtones</string>
<string name="volumeAlarms">Alarms</string>
<string name="change">Change</string>
<string name="audibleSelection">Audible selection (sound when making screen selection)</string>
@@ -592,7 +593,7 @@
<string name="brightnessAuto">automatic brightness</string>
<string name="brightnessManual">manual brightness</string>
<string name="autoBrightnessNotice">If you use auto brightness the brightness value you use below will probably not be used long.</string>
<string name="screenLockSoundNotice">Screenlock sounds cannot automatically be changed anymore on devices running Android version 6.0 or higher. Whatever you set here, it will not work in either direction.</string>
<string name="screenLockSoundNotice">Screen lock sounds cannot automatically be changed anymore on devices running Android version 6.0 or higher. Whatever you set here, it will not work in either direction.</string>
<string name="startScreen">Start screen</string>
<string name="startScreenSummary">Select the screen the applications opens with at start.</string>
<string name="executeRulesAndProfilesWithSingleClickTitle">Run rules/profiles with single click.</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>
@@ -947,4 +949,14 @@
<string name="notCharging">not charging</string>
<string name="triggerChargingComment">The type will only be evaluated if the device is charging. If not charging is chosen, it will fire at any previous charging type. If you want to evaluate that, consider using the variables trigger/action.</string>
<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 @@
* Kalendar Funktion aus Google Version entfernt

View File

@@ -0,0 +1,3 @@
* Behoben: Kalender Auslöser wird jetzt in Play Version verborgen
* Behoben: Parameter wurde beim Starten anderer Apps nicht korrekt übergeben
* Behoben: Absturz beim Verlassen der Einstellungen

View File

@@ -0,0 +1,4 @@
* Behoben: AndereProgramme-Starten-Aktion wurde überarbeitet, eine Bearbeitung Ihrer Aktionen kann erforderlich sein, um weiterarbeiten zu können
* Behoben: Die Aktionsauswahl öffnetein einigen Fällen eine andere Aktion als die Ausgewählte
* Behoben: Aktivieren/deaktivieren der Datenverbindung mit root auf älteren Geräten
* Hinzugefügt: Wochentag und Monat als Textvariablen hinzugefügt

View File

@@ -0,0 +1,15 @@
* Behoben: Absturz beim Auslösen einer URL ohne Parameterpaare
* Behoben: Bei der Überprüfung des Akkuladetyps "beliebig" löste der Auslöser nicht aus.
* Behoben: Warnungen in Protokollen für formatierte Benachrichtigungen behoben
* Behoben: Die Ortsberechtigung wird nun beim Anlegen eines neuen Ortsobjekts abgefragt.
* Behoben: Die Berechtigung "Über andere Apps anzeigen" wurde für Aktionen zum Starten einer anderen App nicht mehr angefordert.
* Behoben: Der Wert der Bildschirmhelligkeit sollte jetzt etwas besser funktionieren
* Behoben: Kalenderereignisse wurden nicht berücksichtigt, wenn sie nach dem Start des Automatisierungsdienstes erstellt wurden
* Behoben: Fehler im NFC-Trigger, der nur die Google Play-Version betraf
* Behoben: Beispiele-URL korrigiert
* Behoben: Das Service-Symbol konnte in Android 7 und darunter nicht ausgeblendet werden
* Behoben: Kopfhörerauslöser wurde nicht korrekt verarbeitet
* Hinzugefügt: Variablenprüfungen können nun invertiert werden. Auch reguläre Ausdrücke werden nun unterstützt.
* Hinzugefügt: Einstellung zum Ein-/Ausschalten der Konsolenprotokollierung (Logcat)
* Hinzugefügt: Regeln können jetzt über das Kontextmenü auf dem Regelbildschirm aktiviert/deaktiviert werden
* Hinzugefügt: Ab Android 14 können die Lautstärken für Klingeltöne und Benachrichtigungen separat gesteuert werden (entsprechend dem Betriebssystemwechsel).

View File

@@ -0,0 +1 @@
* Calendar trigger removed from Google version

View File

@@ -0,0 +1,3 @@
* Fixed: Calendar trigger hidden from Play version
* Fixed: Parameters not correctly supplied when starting other apps
* Fixed: Crash when exiting settings while service is running

View File

@@ -0,0 +1,4 @@
* Fixed: Start other program action revised, editing of your actions may be necessary to continue working
* Fixed: Action type menu would in some cases pick up another action than selected
* Fixed: Fix while toggling data connection with root on older devices
* Added: Day of week and month added as text variables

View File

@@ -0,0 +1,15 @@
* 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
* Added: From Android 14 on volumes for ringtones and notifications can be controlled separately (according to the operating system change).

View File

@@ -0,0 +1 @@
* Eliminado el activador de calendario de la versión de Google

View File

@@ -0,0 +1,3 @@
* Corregido: Condición de calendario ahora es oculto en la versión Play
* Corregido: Los parámetros no se suministran correctamente al iniciar otras aplicaciones
* Corregido: Bloqueo al salir de la configuración mientras el servicio se está ejecutando

View File

@@ -0,0 +1,4 @@
* Corregido: Iniciar otra acción del programa revisada, puede ser necesario editar sus acciones para continuar trabajando
* Corregido: El menú de tipo de acción en algunos casos recogía otra acción que la seleccionada
* Solucionado: Solucionado al alternar la conexión de datos con root en dispositivos más antiguos
* Añadido: Día de la semana y mes añadidos como variables de texto

View File

@@ -0,0 +1,14 @@
* Corregido: Bloqueo al activar una URL sin pares de parámetros
* Corregido: Al verificar el tipo de carga de la batería "cualquiera", el gatillo no se disparó.
* Corregido: Se han corregido las advertencias en los registros para las notificaciones formateadas
* Corregido: Permiso de ubicación solicitado ahora al crear un nuevo objeto de ubicación.
* Corregido: Ya no se solicitaba el permiso de visualización sobre otras aplicaciones para iniciar otras acciones de aplicación.
* Corregido: el valor de brillo de la pantalla debería funcionar un poco mejor ahora
* Corregido: Los eventos del calendario no se consideraban si se creaban después del inicio del servicio de automatización
* Corregido: Error en el disparador NFC que afectaba solo a la versión de Google Play
* Corregido: Ejemplos URL corregidos * Corregido: el icono de servicio no se podía ocultar en Android 7 y versiones anteriores
* Corregido: el disparador de los auriculares no se procesaba correctamente
* Añadido: Las comprobaciones de variables ahora se pueden invertir. También se admiten expresiones regulares.
* Añadido: Configuración para activar/desactivar el registro de la consola (logcat)
* Añadido: Las reglas ahora se pueden activar/desactivar desde el menú contextual de la pantalla de reglas
* Añadido: A partir de Android 14 los volúmenes de los tonos de llamada y las notificaciones se pueden controlar por separado (según el cambio del sistema operativo).

View File

@@ -0,0 +1 @@
* Déclencheur d'agenda supprimé de la version Google

View File

@@ -0,0 +1,3 @@
* Correction : Déclencheur de calendrier caché dans la version Play
* Correction : Les paramètres n'étaient pas correctement fournis lors du démarrage d'autres applications
* Correction : Plantage lors de la fermeture des paramètres pendant l'exécution du service

View File

@@ -0,0 +1,4 @@
* Corrigé : Démarrer d'autres actions du programme révisées, l'édition de vos actions peut être nécessaire pour continuer à travailler
* Correction : Dans certains cas, le menu de type d'action récupérait une autre action que celle sélectionnée
* Correction : Correction lors du basculement de la connexion de données avec root sur les appareils plus anciens
* Ajouté : le jour de la semaine et le mois ajoutés en tant que variables de texte

View File

@@ -0,0 +1,15 @@
* Correction : Crash lors du déclenchement d'une URL sans paires de paramètres
* Correction : Lors de la vérification de la charge de la batterie de type « any », la gâchette ne se déclenchait pas.
* Correction : Correction des avertissements dans les journaux pour les notifications formatées
* Correction : L'autorisation de localisation est désormais demandée lors de la création d'un nouvel objet de localisation.
* Correction : L'autorisation d'affichage sur d'autres applications n'était plus demandée pour démarrer d'autres actions d'application.
* Correction : La valeur de luminosité de l'écran devrait fonctionner un peu mieux maintenant
* Correction : Les événements de calendrier n'étaient pas pris en compte s'ils étaient créés après le démarrage du service d'automatisation
* Correction : Bug dans le déclencheur NFC qui n'affectait que la version Google Play
* Corrigé : Exemples d'URL corrigés
* Correction : L'icône du service ne pouvait pas être masquée dans Android 7 et versions antérieures
* Correction : La gâchette du casque n'était pas correctement traitée
* Ajouté : Les vérifications des variables peuvent désormais être inversées. De plus, les expressions régulières sont désormais prises en charge.
* Ajouté : Paramètre pour activer/désactiver la journalisation de la console (logcat)
* Ajouté : Les règles peuvent désormais être activées/désactivées à partir du menu contextuel de l'écran des règles
* Ajouté : À partir d'Android 14, les volumes pour les sonneries et les notifications peuvent être contrôlés séparément (en fonction du changement de système d'exploitation).

View File

@@ -0,0 +1 @@
* Il trigger del calendario è stato rimosso dalla versione Google

View File

@@ -0,0 +1,3 @@
* Risolto: trigger del calendario nascosto dalla versione Play
* Risolto: parametri non forniti correttamente all'avvio di altre app
* Risolto: arresto anomalo quando si esce dalle impostazioni mentre il servizio è in esecuzione

View File

@@ -0,0 +1,4 @@
* Risolto: Avvia altre azioni del programma riviste, potrebbe essere necessaria la modifica delle tue azioni per continuare a lavorare
* Risolto: il menu del tipo di azione in alcuni casi riprendeva un'azione diversa da quella selezionata
* Risolto: risolto il problema durante l'attivazione della connessione dati con root su dispositivi meno recenti
* Aggiunto: giorno della settimana e mese aggiunti come variabili di testo

View File

@@ -0,0 +1,14 @@
* Risolto: arresto anomalo durante l'attivazione di un URL senza coppie di parametri
* Risolto: durante il controllo del tipo di carica della batteria "qualsiasi", il grilletto non si è attivato.
* Risolto: corretti gli avvisi nei registri per le notifiche formattate
* Risolto: l'autorizzazione alla posizione richiesta ora durante la creazione di un nuovo oggetto posizione.
* Risolto: l'autorizzazione Display-over-other-apps non veniva più richiesta per avviare un'altra azione dell'app.
* Risolto: il valore della luminosità dello schermo dovrebbe funzionare un po' meglio ora
* Risolto: gli eventi del calendario non venivano considerati se creati dopo l'avvio del servizio di automazione
* Risolto: bug nel trigger NFC che interessava solo la versione di Google Play
* Risolto: URL di esempi corretto * Risolto: l'icona del servizio non poteva essere nascosta in Android 7 e versioni precedenti
* Risolto: il trigger delle cuffie non veniva elaborato correttamente
* Aggiunto: i controlli delle variabili ora possono essere invertiti. Anche le espressioni regolari sono ora supportate.
* Aggiunto: impostazione per attivare/disattivare la registrazione della console (logcat)
* Aggiunto: le regole possono ora essere abilitate/disabilitate dal menu contestuale nella schermata delle regole
* Aggiunto: Da Android 14 in poi i volumi per suonerie e notifiche possono essere controllati separatamente (in base al cambio di sistema operativo).

View File

@@ -0,0 +1 @@
* Agendatrigger verwijderd uit Google-versie

View File

@@ -0,0 +1,3 @@
* Opgelost: kalendertrigger verborgen voor Play-versie
* Opgelost: parameters worden niet correct opgegeven bij het starten van andere apps
* Opgelost: crash bij het afsluiten van instellingen terwijl de service actief is

View File

@@ -0,0 +1,4 @@
* Opgelost: start andere programma-actie herzien, het bewerken van uw acties kan nodig zijn om door te gaan met werken
* Opgelost: het menu van het actietype zou in sommige gevallen een andere actie oppikken dan geselecteerd
* Opgelost: oplossing tijdens het schakelen tussen gegevensverbinding met root op oudere apparaten
* Toegevoegd: Dag van de week en maand toegevoegd als tekstvariabelen

View File

@@ -0,0 +1,15 @@
* Opgelost: crash bij het activeren van een URL zonder parameterparen
* Opgelost: bij het controleren op het opladen van de batterij type "any" ging de trekker niet af.
* Opgelost: waarschuwingen in logboeken voor opgemaakte meldingen opgelost
* Opgelost: Locatietoestemming die nu wordt gevraagd bij het maken van een nieuw locatieobject.
* Opgelost: Display-over-other-apps toestemming werd niet meer gevraagd voor het starten van een andere app-actie.
* Opgelost: de helderheidswaarde van het scherm zou nu iets beter moeten werken
* Opgelost: Agenda-afspraken werden niet in aanmerking genomen als ze werden gemaakt na het opstarten van de Automation-service
* Opgelost: bug in NFC-trigger die alleen de Google Play-versie beïnvloedde
* Opgelost: Voorbeelden URL opgelost
* Opgelost: servicepictogram kon niet worden verborgen in Android 7 en lager
* Opgelost: hoofdtelefoontrigger is niet correct verwerkt
* Toegevoegd: Variabele controles kunnen nu worden omgekeerd. Ook reguliere expressies worden nu ondersteund.
* Toegevoegd: instelling om console-logboekregistratie in of uit te schakelen (logcat)
* Toegevoegd: Regels kunnen nu worden in-/uitgeschakeld via het contextmenu op het regelscherm
* Toegevoegd: Vanaf Android 14 kunnen volumes voor beltonen en meldingen afzonderlijk worden geregeld (afhankelijk van de wijziging van het besturingssysteem).

View File

@@ -0,0 +1 @@
* Wyzwalacz kalendarza usunięty z wersji Google

View File

@@ -0,0 +1,3 @@
* Naprawiono: Wyzwalacz kalendarza ukryty w wersji Play
* Naprawiono: Parametry nie są poprawnie dostarczane podczas uruchamiania innych aplikacji
* Naprawiono: Awaria podczas wychodzenia z ustawień, gdy usługa jest uruchomiona

View File

@@ -0,0 +1,4 @@
* Naprawiono: Poprawiono uruchamianie innych akcji programu, może być konieczna edycja twoich działań do kontynuowania pracy
* Poprawka: Menu typu akcji w niektórych przypadkach wybierało inną akcję niż wybrana
* Naprawiono: Napraw podczas przełączania połączenia danych z rootem na starszych urządzeniach
* Dodano: Dzień tygodnia i miesiąc dodane jako zmienne tekstowe

View File

@@ -0,0 +1,15 @@
* Naprawiono: Awaria podczas wyzwalania adresu URL bez par parametrów
* Naprawiono: Podczas sprawdzania naładowania baterii wpisz "any" spust nie został uruchomiony.
* Naprawiono: Naprawiono ostrzeżenia w dziennikach dla sformatowanych powiadomień
* Naprawiono: Wymagane jest teraz uprawnienie do lokalizacji podczas tworzenia nowego obiektu lokalizacji.
* Naprawiono: Uprawnienie do wyświetlania nad innymi aplikacjami nie było już wymagane do uruchamiania innych działań aplikacji.
* Naprawiono: Wartość jasności ekranu powinna teraz działać nieco lepiej
* Naprawiono: Wydarzenia w kalendarzu nie były brane pod uwagę, jeśli zostały utworzone po uruchomieniu usługi automatyzacji
* Naprawiono: Błąd w wyzwalaczu NFC, który dotyczył tylko wersji Google Play
* Naprawiono: Naprawiono przykładowy adres URL
* Naprawiono: ikona usługi nie mogła być ukryta w systemie Android 7 i starszych
* Naprawiono: Wyzwalacz słuchawek nie był poprawnie przetwarzany
* Dodano: Sprawdzanie zmiennych można teraz odwrócić. Obsługiwane są również wyrażenia regularne.
* Dodano: Ustawienie włączania/wyłączania logowania konsoli (logcat)
* Dodano: Reguły można teraz włączać/wyłączać z menu kontekstowego na ekranie zasad
* Dodano: Od Androida 14 głośności dzwonków i powiadomień można sterować osobno (zgodnie ze zmianą systemu operacyjnego).

View File

@@ -0,0 +1 @@
* Триггер календаря удален из версии Google

View File

@@ -0,0 +1,3 @@
* Исправлено: Триггер календаря скрыт в игровой версии
* Исправлено: Параметры неправильно указываются при запуске других приложений.
* Исправлено: Сбой при выходе из настроек во время работы сервиса

View File

@@ -0,0 +1,4 @@
* Исправлено: Запуск другого действия программы пересмотрен, редактирование ваших действий может потребоваться для продолжения работы
* Исправлено: Меню типа действия в некоторых случаях подхватывало действие, отличное от выбранного
* Исправлено: Исправление при переключении подключения к данным с root на старых устройствах
* Добавлено: День недели и месяц добавлены в качестве текстовых переменных

View File

@@ -0,0 +1,15 @@
* Исправлено: Сбой при срабатывании URL без пар параметров
* Исправлено: При проверке типа зарядки батареи "любой" спусковой крючок не срабатывал.
* Исправлено: Исправлены предупреждения в логах для форматированных уведомлений
* Исправлено: Разрешение на местоположение теперь запрашивается при создании нового объекта локации.
* Исправлено: разрешение на отображение поверх других приложений больше не запрашивалось для запуска других действий приложения.
* Исправлено: Значение яркости экрана теперь должно работать немного лучше
* Исправлено: События календаря не учитывались, если они были созданы после запуска службы автоматизации
* Исправлено: Ошибка в триггере NFC, которая затрагивала только версию Google Play
* Исправлено: Исправлены примеры URL
* Исправлено: Иконка службы не могла быть скрыта в Android 7 и ниже
* Исправлено: Триггер наушников не обрабатывался корректно
* Добавлено: Проверка переменных теперь может быть инвертирована. Также теперь поддерживаются регулярные выражения.
* Добавлено: Настройка включения/выключения ведения журнала консоли (logcat)
* Добавлено: Правила теперь можно включить/выключить из контекстного меню на экране правил
* Добавлено: С Android 14 по громкости для рингтонов и уведомлений можно управлять отдельно (согласно смене операционной системы).

View File

@@ -0,0 +1 @@
* 日历触发器已从 Google 版本中删除

View File

@@ -0,0 +1,3 @@
* 修复:播放版本中隐藏的日历触发器
* 修复:启动其他应用程序时未正确提供参数的问题
* 修复:服务运行时退出设置时崩溃

View File

@@ -0,0 +1,4 @@
* 已修复:启动其他程序操作已修改,可能需要编辑您的操作才能继续工作
* 已修复:在某些情况下,操作类型菜单会选择所选操作以外的其他操作
* 已修复:在旧设备上使用 root 切换数据连接时修复
* 添加:作为文本变量添加的星期几和月份

View File

@@ -0,0 +1,15 @@
* 修复:触发没有参数对的 URL 时崩溃
* 修复:在检查电池充电类型"任何"时,扳机没有触发。
* 修复:修复了格式化通知的日志中的警告
* 修复:现在在创建新位置对象时请求位置权限。
* 已修复:不再请求启动另一个应用程序作的显示其他应用程序权限。
* 修复:屏幕亮度值现在应该工作得更好一些
* 已修复:如果在自动化服务启动后创建日历事件,则不考虑日历事件
* 修复NFC 触发器中仅影响 Google Play 版本的错误
* 已修复:示例 URL 已修复
* 修复:服务图标无法在 Android 7 及更低版本中隐藏
* 修复:耳机触发未正确处理
* 添加:变量检查现在可以反转。现在还支持正则表达式。
* 新增:打开/关闭控制台日志记录的设置 logcat
* 添加:现在可以从规则屏幕上的上下文菜单中启用/禁用规则
* 添加:从 Android 14 开始,铃声和通知的音量可以单独控制(根据作系统的变化)。