14 Commits

Author SHA1 Message Date
11f0ee25bf bugfixes 2023-05-06 23:32:43 +02:00
a76cafc6e2 Enabled variables as intent parameters 2023-05-05 23:26:32 +02:00
bd2920e6d9 Russian translation updated 2023-05-05 22:54:16 +02:00
eba02ade08 Fixed: Crash when managing phone call action in the F-Droid version 2023-04-29 01:14:52 +02:00
394effea36 New version 2023-04-24 23:43:08 +02:00
4d51f1890a Merge branch 'development-stable' into development 2023-04-24 23:09:43 +02:00
a8b2c3bf7d New version 2023-04-24 23:08:21 +02:00
d1c6abaa91 - 2023-04-17 23:26:48 +02:00
587ed5803e - 2023-04-17 23:26:22 +02:00
49d272be1e PhoneStatusListener 2023-04-16 22:31:01 +02:00
d9e54c7780 PhoneStatusListener 2023-04-14 23:16:47 +02:00
170dbbc7e8 PhoneStatusListener 2023-04-13 00:10:21 +02:00
3fc1dd1a26 Telephony receiver 2023-04-12 18:05:00 +02:00
0acb52099c Added overlay permission 2023-03-31 23:58:11 +02:00
32 changed files with 312 additions and 124 deletions

View File

@ -11,8 +11,8 @@ android {
compileSdkVersion 31
buildToolsVersion '29.0.2'
useLibrary 'org.apache.http.legacy'
versionCode 127
versionName "1.7.12"
versionCode 132
versionName "1.7.16"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

View File

@ -68,6 +68,8 @@
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-feature
android:name="android.hardware.telephony"

View File

@ -66,6 +66,8 @@
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-feature
android:name="android.hardware.telephony"
@ -171,7 +173,7 @@
<activity android:name=".ActivityManageTriggerTethering" />
<activity android:name=".ActivityManageActionWakeLock" />
<activity android:name=".ActivityManageTriggerSubSystemState" />
<activity android:name=".ActivityManageMakePhoneCall" />
<activity android:name=".ActivityManageActionMakePhoneCall" />
<activity android:name=".ActivityManageActionSetVariable" />
<activity android:name=".ActivityManageTriggerCheckVariable" />
<activity android:name=".ActivityManageActionCopyToClipboard" />

View File

@ -64,6 +64,8 @@
<uses-permission android:name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"/>
<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_CALL_LOG" />
<application
android:allowBackup="true"

View File

@ -10,8 +10,6 @@ import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothProfile;
import android.content.ActivityNotFoundException;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
@ -1166,21 +1164,36 @@ public class Actions
}
else if (singleParam[0].equals("Uri"))
{
if (singleParam[1].equalsIgnoreCase("IntentData"))
try
{
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with value " + singleParam[2] + " as standard data parameter.", 3);
intent.setData(Uri.parse(singleParam[2]));
if (singleParam[1].equalsIgnoreCase("IntentData"))
{
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with value " + singleParam[2] + " as standard data parameter.", 3);
intent.setData(Uri.parse(Miscellaneous.replaceVariablesInText(singleParam[2], context)));
}
else
{
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3);
intent.putExtra(singleParam[1], Uri.parse(Miscellaneous.replaceVariablesInText(singleParam[2], context)));
}
}
else
catch (Exception e)
{
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3);
intent.putExtra(singleParam[1], Uri.parse(singleParam[2]));
throw new RuntimeException(e);
}
}
else if (singleParam[0].equals("String"))
{
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3);
intent.putExtra(singleParam[1], singleParam[2]);
try
{
intent.putExtra(singleParam[1], Miscellaneous.replaceVariablesInText(singleParam[2], context));
}
catch (Exception e)
{
intent.putExtra(singleParam[1], singleParam[2]);
}
}
else
Miscellaneous.logEvent("w", "StartOtherApp", "Unknown type of parameter " + singleParam[0] + " found. Name " + singleParam[1] + " and value " + singleParam[2], 3);

View File

@ -57,6 +57,15 @@ public class ActivityManageActionRunExecutable extends Activity
saveExecSettings();
}
});
if(getIntent().hasExtra(ActivityManageRule.intentNameActionParameter2))
{
String[] parts = getIntent().getStringExtra(ActivityManageRule.intentNameActionParameter2).split(Action.actionParameter2Split);
etRunExecutablePath.setText(parts[0]);
if(parts.length > 1)
etRunExecutableParameters.setText(parts[1]);
}
}
void saveExecSettings()

View File

@ -25,6 +25,8 @@ 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;
@ -48,6 +50,7 @@ public class ActivityPermissions extends Activity
private static final int requestCodeForPermissionsDeviceAdmin = 12047;
private static final int requestCodeForPermissionsBatteryOptimization = 12048;
private static final int requestCodeForPermissionNotificationAccessAndroid13 = 12049;
private static final int requestCodeForPermissionsManageOverlay = 12050;
protected String[] specificPermissionsToRequest = null;
public static String intentExtraName = "permissionsToBeRequested";
@ -297,6 +300,10 @@ public class ActivityPermissions extends Activity
String packageName = context.getApplicationContext().getPackageName();
return pm.isIgnoringBatteryOptimizations(packageName);
}
else if (s.equals(Manifest.permission.SYSTEM_ALERT_WINDOW))
{
return android.provider.Settings.canDrawOverlays(Miscellaneous.getAnyContext());
}
else
{
int res = context.checkCallingOrSelfPermission(s);
@ -315,6 +322,11 @@ public class ActivityPermissions extends Activity
return active;
}
public static void requestOverlay()
{
Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
ActivityPermissions.getInstance().startActivityForResult(intent, requestCodeForPermissionsManageOverlay);
}
public static void requestDeviceAdmin()
{
if(!haveDeviceAdmin())
@ -473,6 +485,7 @@ public class ActivityPermissions extends Activity
case phoneCall:
addToArrayListUnique(Manifest.permission.READ_PHONE_STATE, requiredPermissions);
addToArrayListUnique(Manifest.permission.PROCESS_OUTGOING_CALLS, requiredPermissions);
addToArrayListUnique(Manifest.permission.READ_CALL_LOG, requiredPermissions);
break;
case pointOfInterest:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
@ -634,6 +647,8 @@ public class ActivityPermissions extends Activity
// action.getParameter2().contains("eu.faircode.netguard.STOP_PORT_FORWARD")
// )
// addToArrayListUnique("net.kollnig.missioncontrol.permission.ADMIN", requiredPermissions);
if(Build.VERSION.SDK_INT >= 29)
addToArrayListUnique(Manifest.permission.SYSTEM_ALERT_WINDOW, requiredPermissions);
break;
case triggerUrl:
addToArrayListUnique(Manifest.permission.INTERNET, requiredPermissions);
@ -863,6 +878,7 @@ public class ActivityPermissions extends Activity
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break;
case Manifest.permission.PROCESS_OUTGOING_CALLS:
case Manifest.permission.READ_CALL_LOG:
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.phoneCall))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break;
@ -890,6 +906,10 @@ public class ActivityPermissions extends Activity
for(String ruleName : getRulesUsing(Action.Action_Enum.startPhoneCall))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break;
case Manifest.permission.SYSTEM_ALERT_WINDOW:
for(String ruleName : getRulesUsing(Action.Action_Enum.startOtherActivity))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break;
case Manifest.permission.ANSWER_PHONE_CALLS:
for(String ruleName : getRulesUsing(Action.Action_Enum.stopPhoneCall))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
@ -988,6 +1008,10 @@ public class ActivityPermissions extends Activity
if (requestCode == requestCodeForPermissionsBatteryOptimization)
if(havePermission(Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS, ActivityPermissions.this))
requestPermissions(cachedPermissionsToRequest, true);
if (requestCode == requestCodeForPermissionsManageOverlay)
if(havePermission(Manifest.permission.SYSTEM_ALERT_WINDOW, ActivityPermissions.this))
requestPermissions(cachedPermissionsToRequest, true);
}
}
@ -1051,7 +1075,22 @@ public class ActivityPermissions extends Activity
cachedPermissionsToRequest = requiredPermissions;
Intent intent = new Intent(android.provider.Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
startActivityForResult(intent, requestCodeForPermissionsNotificationPolicy);
return;
}
else if (s.equalsIgnoreCase(Manifest.permission.SYSTEM_ALERT_WINDOW))
{
AlertDialog diag = Miscellaneous.messageBox(getResources().getString(R.string.info), getResources().getString(R.string.overlayPermissionHint), ActivityPermissions.this);
diag.setOnDismissListener(new DialogInterface.OnDismissListener()
{
@Override
public void onDismiss(DialogInterface dialogInterface)
{
requiredPermissions.remove(s);
cachedPermissionsToRequest = requiredPermissions;
requestOverlay();
}
});
diag.show();
return;
}
else if (s.equalsIgnoreCase(Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE))

View File

@ -3,11 +3,9 @@ package com.jens.automation2.receivers;
import android.annotation.SuppressLint;
import android.app.Notification;
import android.app.PendingIntent;
import android.bluetooth.BluetoothDevice;
import android.content.IntentFilter;
import android.os.Build;
import android.os.Bundle;
import android.os.Parcelable;
import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
import android.util.Log;

View File

@ -6,10 +6,15 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.os.Build;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyCallback;
import android.telephony.TelephonyManager;
import android.util.Log;
import androidx.annotation.RequiresApi;
import com.jens.automation2.ActivityPermissions;
import com.jens.automation2.AutomationService;
import com.jens.automation2.Miscellaneous;
@ -22,6 +27,7 @@ import java.util.ArrayList;
public class PhoneStatusListener implements AutomationListenerInterface
{
static int problematicAndroidLevel = 29;
protected static String lastPhoneNumber="";
protected static int lastPhoneDirection = -1; //0=incoming, 1=outgoing
protected static int currentState = -1;
@ -70,7 +76,76 @@ public class PhoneStatusListener implements AutomationListenerInterface
return currentState;
}
public static class IncomingCallsReceiver extends PhoneStateListener
public static interface IncomingCallsReceiver
{
}
protected static void workWithIncomingCallData(int state, String incomingNumber)
{
if(lastPhoneDirection == 2 && currentState != TelephonyManager.CALL_STATE_IDLE)
{
// This status update is actually for an outgoing call
setCurrentState(state);
if(incomingNumber != null && incomingNumber.length() > 0) // check for null in case call comes in with suppressed number.
setLastPhoneNumber(incomingNumber);
switch(state)
{
case TelephonyManager.CALL_STATE_IDLE:
Miscellaneous.logEvent("i", "Call state", "New call state: CALL_STATE_IDLE", 4);
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Miscellaneous.logEvent("i", "Call state", "New call state: CALL_STATE_OFFHOOK", 4);
break;
case TelephonyManager.CALL_STATE_RINGING:
Miscellaneous.logEvent("i", "Call state", String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.outgoingCallTo), incomingNumber), 4);
break;
}
ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.phoneCall);
for(int i=0; i<ruleCandidates.size(); i++)
{
AutomationService asInstance = AutomationService.getInstance();
if(asInstance != null)
if(ruleCandidates.get(i).getsGreenLight(asInstance))
ruleCandidates.get(i).activate(asInstance, false);
}
}
else
{
setCurrentState(state);
setLastPhoneDirection(1);
if (incomingNumber != null && incomingNumber.length() > 0) // check for null in case call comes in with suppressed number.
setLastPhoneNumber(incomingNumber);
switch (state)
{
case TelephonyManager.CALL_STATE_IDLE:
Miscellaneous.logEvent("i", "Call state", "New call state: CALL_STATE_IDLE", 4);
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Miscellaneous.logEvent("i", "Call state", "New call state: CALL_STATE_OFFHOOK", 4);
break;
case TelephonyManager.CALL_STATE_RINGING:
Miscellaneous.logEvent("i", "Call state", String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.incomingCallFrom), incomingNumber), 4);
break;
}
ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.phoneCall);
for (int i = 0; i < ruleCandidates.size(); i++)
{
AutomationService asInstance = AutomationService.getInstance();
if (asInstance != null)
if (ruleCandidates.get(i).getsGreenLight(asInstance))
ruleCandidates.get(i).activate(asInstance, false);
}
}
}
public static class IncomingCallsReceiverOld extends PhoneStateListener implements IncomingCallsReceiver
{
@Override
public void onCallStateChanged(int state, String incomingNumber)
@ -86,65 +161,42 @@ public class PhoneStatusListener implements AutomationListenerInterface
If the last call was outgoing the state has not changed to idle this is kind of a fake alert.
*/
if(lastPhoneDirection == 2 && currentState != TelephonyManager.CALL_STATE_IDLE)
workWithIncomingCallData(state, incomingNumber);
}
}
@RequiresApi(api = Build.VERSION_CODES.S)
public static class IncomingCallsReceiverNew extends BroadcastReceiver implements IncomingCallsReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
/*
this code detects both incoming and outgoing,
if the state changes idle => ringing you know it's an incoming call,
if the state changes idle => offhook, you know it's an outgoing call
*/
if (!intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL))
{
// This status update is actually for an outgoing call
setCurrentState(state);
String stateStr = intent.getExtras().getString(TelephonyManager.EXTRA_STATE);
int state = 99;
if(incomingNumber != null && incomingNumber.length() > 0) // check for null in case call comes in with suppressed number.
setLastPhoneNumber(incomingNumber);
switch(state)
switch(stateStr)
{
case TelephonyManager.CALL_STATE_IDLE:
Miscellaneous.logEvent("i", "Call state", "New call state: CALL_STATE_IDLE", 4);
case "RINGING":
state = TelephonyManager.CALL_STATE_RINGING;
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Miscellaneous.logEvent("i", "Call state", "New call state: CALL_STATE_OFFHOOK", 4);
case "IDLE":
state = TelephonyManager.CALL_STATE_IDLE;
break;
case TelephonyManager.CALL_STATE_RINGING:
Miscellaneous.logEvent("i", "Call state", String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.outgoingCallTo), incomingNumber), 4);
case "OFFHOOK":
state = TelephonyManager.CALL_STATE_OFFHOOK;
break;
}
ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.phoneCall);
for(int i=0; i<ruleCandidates.size(); i++)
{
AutomationService asInstance = AutomationService.getInstance();
if(asInstance != null)
if(ruleCandidates.get(i).getsGreenLight(asInstance))
ruleCandidates.get(i).activate(asInstance, false);
}
}
else
{
setCurrentState(state);
setLastPhoneDirection(1);
if (incomingNumber != null && incomingNumber.length() > 0) // check for null in case call comes in with suppressed number.
setLastPhoneNumber(incomingNumber);
switch (state)
{
case TelephonyManager.CALL_STATE_IDLE:
Miscellaneous.logEvent("i", "Call state", "New call state: CALL_STATE_IDLE", 4);
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Miscellaneous.logEvent("i", "Call state", "New call state: CALL_STATE_OFFHOOK", 4);
break;
case TelephonyManager.CALL_STATE_RINGING:
Miscellaneous.logEvent("i", "Call state", String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.incomingCallFrom), incomingNumber), 4);
break;
}
ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.phoneCall);
for (int i = 0; i < ruleCandidates.size(); i++)
{
AutomationService asInstance = AutomationService.getInstance();
if (asInstance != null)
if (ruleCandidates.get(i).getsGreenLight(asInstance))
ruleCandidates.get(i).activate(asInstance, false);
}
String number = intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
Log.i("test", "test");
}
}
}
@ -201,7 +253,12 @@ public class PhoneStatusListener implements AutomationListenerInterface
}
if(incomingCallsReceiverInstance == null)
incomingCallsReceiverInstance = new IncomingCallsReceiver();
{
// if(Build.VERSION.SDK_INT >= 31)
// incomingCallsReceiverInstance = new IncomingCallsReceiverNew();
// else
incomingCallsReceiverInstance = new IncomingCallsReceiverOld();
}
if(outgoingCallsReceiverInstance == null)
outgoingCallsReceiverInstance = new OutgoingCallsReceiver();
@ -211,8 +268,17 @@ public class PhoneStatusListener implements AutomationListenerInterface
if(!incomingCallsReceiverActive)
{
Miscellaneous.logEvent("i", "PhoneStatusListener", "Starting PhoneStatusListener->incomingCallsReceiver", 4);
TelephonyManager tm = (TelephonyManager)automationService.getSystemService(Context.TELEPHONY_SERVICE);
tm.listen(incomingCallsReceiverInstance, PhoneStateListener.LISTEN_CALL_STATE);
// if(Build.VERSION.SDK_INT >= problematicAndroidLevel)
// {
// IntentFilter callsFilter = new IntentFilter();
// callsFilter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
// automationService.registerReceiver((IncomingCallsReceiverNew)incomingCallsReceiverInstance, callsFilter);
// }
// else
// {
TelephonyManager tm = (TelephonyManager) automationService.getSystemService(Context.TELEPHONY_SERVICE);
tm.listen((IncomingCallsReceiverOld)incomingCallsReceiverInstance, PhoneStateListener.LISTEN_CALL_STATE);
// }
incomingCallsReceiverActive = true;
}
@ -236,8 +302,15 @@ public class PhoneStatusListener implements AutomationListenerInterface
if(incomingCallsReceiverActive)
{
Miscellaneous.logEvent("i", "PhoneStatusListener", "Stopping phoneStatusListener", 4);
TelephonyManager tm = (TelephonyManager)automationService.getSystemService(Context.TELEPHONY_SERVICE);
tm.listen(incomingCallsReceiverInstance, PhoneStateListener.LISTEN_NONE);
// if(Build.VERSION.SDK_INT >= 31)
// {
// automationService.unregisterReceiver((IncomingCallsReceiverNew)incomingCallsReceiverInstance);
// }
// else
// {
TelephonyManager tm = (TelephonyManager) automationService.getSystemService(Context.TELEPHONY_SERVICE);
tm.listen((IncomingCallsReceiverOld)incomingCallsReceiverInstance, PhoneStateListener.LISTEN_NONE);
// }
incomingCallsReceiverActive = false;
}

View File

@ -304,6 +304,18 @@
android:layout_height="wrap_content"
android:text="@string/addIntentValue" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="25dp"
android:text="@string/variablesOnlyForTypes" />
<TextView
android:id="@+id/tvLegend"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/urlLegend" />
<ImageView
android:layout_width="match_parent"
android:layout_height="1dp"

View File

@ -793,4 +793,6 @@
<string name="wifiMonitoringAlsoRequiresThis">Diese Berechtigung wird auch benötigt, wenn man die aktuelle WLAN Verbindung auslesen möchte.</string>
<string name="copyTextToClipboard">Text in die Zwischenablage kopieren</string>
<string name="textToCopy">Text, der kopiert werden soll</string>
<string name="android.permission.SYSTEM_ALERT_WINDOW">Über anderen Anwendungen anzeigen</string>
<string name="overlayPermissionHint">Nachdem Sie auf OK geklickt haben, werden Sie zu einem Systemdialog weitergeleitet. Bitte wählen Sie dort Automation aus und erlauben Sie die Anzeige über anderen Apps.</string>
</resources>

View File

@ -792,4 +792,6 @@
<string name="wifiMonitoringAlsoRequiresThis">Este permiso también es necesario si el disparador está utilizando la conexión wifi actual.</string>
<string name="copyTextToClipboard">Copiar texto al portapapeles</string>
<string name="textToCopy">Texto para copiar</string>
<string name="android.permission.SYSTEM_ALERT_WINDOW">Dibujar encima otras aplicaciones</string>
<string name="overlayPermissionHint">Después de hacer cliquear en Aceptar, se le enviará a un cuadro de diálogo del sistema. Seleccione Automation allí y permita dibujar encima otras aplicaciones.</string>
</resources>

View File

@ -792,4 +792,6 @@
<string name="wifiMonitoringAlsoRequiresThis">Cette autorisation est également requise si le déclencheur utilise la connexion wifi actuelle.</string>
<string name="copyTextToClipboard">Copier du texte dans le presse-papiers</string>
<string name="textToCopy">Texte à copier</string>
<string name="android.permission.SYSTEM_ALERT_WINDOW">Dessiner sur d\'autres applications</string>
<string name="overlayPermissionHint">Après avoir cliqué sur OK, vous serez redirigé vers une boîte de dialogue système. Veuillez sélectionner Automatisation et autoriser le tirage sur d\'autres applications.</string>
</resources>

View File

@ -793,4 +793,6 @@
<string name="wifiMonitoringAlsoRequiresThis">Questa autorizzazione è necessaria anche se il trigger utilizza la connessione wifi corrente.</string>
<string name="copyTextToClipboard">Copiare testo negli appunti</string>
<string name="textToCopy">Testo da copiare</string>
<string name="android.permission.SYSTEM_ALERT_WINDOW">Disegna su altre app</string>
<string name="overlayPermissionHint">Dopo aver fatto clic su OK, verrai indirizzato a una finestra di dialogo di sistema. Seleziona Automazione lì e consenti il disegno su altre app.</string>
</resources>

View File

@ -791,5 +791,7 @@
<string name="wifiMonitoringAlsoRequiresThis">Deze toestemming is ook vereist als de trigger de huidige wifi-verbinding gebruikt.</string>
<string name="copyTextToClipboard">Tekst naar klembord kopiëren</string>
<string name="textToCopy">Tekst om te kopiëren</string>
<string name="android.permission.SYSTEM_ALERT_WINDOW">Tekenen over andere apps</string>
<string name="overlayPermissionHint">Nadat u op OK hebt geklikt, wordt u naar een systeemdialoogvenster gestuurd. Selecteer daar Automatisering en sta tekenen toe over andere apps.</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[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[notificationTitle] - заголовок последнего уведомления\n[notificationText] - текст последнего уведомления\n[variable-VARIABLENAME] - Значение переменной, определенной пользователем</string>
<string name="wifi">Wi-Fi</string>
<string name="activating">Активация</string>
<string name="deactivating">Деактивация</string>
@ -120,7 +120,7 @@
<string name="soundSettings">Настройки звука</string>
<string name="showHelp">Показать справку</string>
<string name="rules">Правила</string>
<string name="helpTextRules">Все триггеры в правиле связаны логикой И. Правило будет применяться только в том случае, если будут выполнены все триггеры. Если вы хотите логику ИЛИ, создайте другое правило.\nТермины триггер и условие используются как синонимы. Все они являются условиями, но последний, отвечающий требуемому значению, может быть назван триггером, потому что это последняя часть головоломки, которая вызывает выполнение правила.</string>
<string name="helpTextRules">Все триггеры в правиле связаны логикой И. Правило будет применяться только в том случае, если будут выполнены все триггеры. Если вы хотите логику ИЛИ, создайте другое правило.\nТермины триггер и условие используются как синонимы. Все они являются условиями, но последний, отвечающий требуемому значению, может быть назван триггером, потому что это последняя часть паззла, которая вызывает выполнение правила.</string>
<string name="timeframes">Временные интервалы</string>
<string name="helpTextTimeFrame">Если вы указываете правило с временными интервалами, у вас есть два варианта. Вы можете выбрать между началом ИЛИ окончанием временного интервала. Правило срабатывает только один раз. Поэтому, если вы создадите правило с &quot;начало временного интервала&quot; в качестве триггера и позволите ему изменить ваш звуковой профиль на вибрацию, это не означает, что телефон автоматически перейдет в обычный режим, когда временной интервал закончится. Если вам это необходимо,создайте другое правило с другим временным интервалом.</string>
<string name="helpTextSound">На главном экране есть возможность заблокировать изменение уровня громкости вызова сконфигурированными правилами, например, вы можете быть в ситуации или месте, где необходим обычный режим звука, но в настоящее время его использовать нельзя. Эта функция автоматически отключится по истечении заданного времени. Нажмите кнопку +, чтобы задать необходимый период времени. После включения, вы можете вручную выключить его с помощью кнопки переключения (и таким образом снова включить изменения громкости звука).</string>
@ -213,12 +213,12 @@
<string name="runManually">Запуск вручную</string>
<string name="serviceHasToRunForThat">Для этого служба должна быть запущена.</string>
<string name="gpsComparison">Сравнение GPS</string>
<string name="gpsComparisonTimeoutStop" translatable="false">Stopping comparison GPS measurement due to timeout.</string>
<string name="gpsComparisonTimeoutStop" translatable="false">Остановка измерений GPS из-за превышения времени ожидания.</string>
<string name="timeoutForGpsComparisonsTitle">Тайм-аут GPS [сек]</string>
<string name="timeoutForGpsComparisonsSummary">Максимальное время получения GPS-местоположения в секундах. По истечении этого времени будет применено последнее известное местоположение.</string>
<string name="startingGpsTimeout" translatable="false">Starting GPS timeout.</string>
<string name="forcedLocationUpdate" translatable="false">Forced location update</string>
<string name="forcedLocationUpdateLong" translatable="false">Due to timeout in comparison measurement the last best location will be applied.</string>
<string name="forcedLocationUpdate" translatable="false">Принудительное обновление местоположения</string>
<string name="forcedLocationUpdateLong" translatable="false">Из-за таймаута измерений будет использовано последнее успешное местоположение.</string>
<string name="rememberLastActivePoiSummary">Если вы находитесь в каком-то местоположении, перезагружаете устройство или приложение и покидаете это местоположение, при старте приложение будет запускать правила, связанные с выходом из этого местоположения.</string>
<string name="rememberLastActivePoiTitle">Запомнить последнее активное местоположение</string>
<string name="muteTextToSpeechDuringCallsTitle">Отключение звука во время звонков</string>
@ -232,37 +232,37 @@
<string name="errorStartingOtherActivity">Ошибка запуска Activity</string>
<string name="anotherAppIsRunning">Другое приложение запускается/останавливается</string>
<string name="settingsCategoryProcessMonitoring">Мониторинг процесса</string>
<string name="timeBetweenProcessMonitoringsTitle">Период мониторингама процесса в секундах</string>
<string name="timeBetweenProcessMonitoringsTitle">Период мониторинга процесса в секундах</string>
<string name="timeBetweenProcessMonitoringsSummary">Чем меньше, тем выше расход батареи</string>
<string name="refreshingProcessList" translatable="false">Refreshing process list.</string>
<string name="refreshingProcessList" translatable="false">Обновление списка процессов.</string>
<string name="processes">Процессы</string>
<string name="startingPeriodicProcessMonitoringEngine" translatable="false">Starting periodic process monitoring engine.</string>
<string name="startingPeriodicProcessMonitoringEngine" translatable="false">Запуск периодического мониторинга процессов.</string>
<string name="processMonitoring">Мониторинг процесса</string>
<string name="periodicProcessMonitoringIsAlreadyRunning" translatable="false">Periodic process monitoring is already running. Won\&apos;t start it again.</string>
<string name="stoppingPeriodicProcessMonitoringEngine" translatable="false">Stopping periodic process monitoring engine.</string>
<string name="periodicProcessMonitoringIsNotActive" translatable="false">Periodic process monitoring is not active. Can\&apos;t stop it.</string>
<string name="periodicProcessMonitoringStarted" translatable="false">Periodic process monitoring started.</string>
<string name="periodicProcessMonitoringStopped" translatable="false">Periodic process monitoring stopped.</string>
<string name="periodicProcessMonitoringIsAlreadyRunning" translatable="false">Периодический мониторинг процессов уже запущен и не может быть запущен еще раз.</string>
<string name="stoppingPeriodicProcessMonitoringEngine" translatable="false">Остановка периодического мониторинга процессов.</string>
<string name="periodicProcessMonitoringIsNotActive" translatable="false">Периодический мониторинг процессов не запущен, поэтому не может быть остановлен.</string>
<string name="periodicProcessMonitoringStarted" translatable="false">Периодический мониторинг процессов запущен.</string>
<string name="periodicProcessMonitoringStopped" translatable="false">Периодический мониторинг процессов остановлен.</string>
<string name="rearmingProcessMonitoringMessage" translatable="false">Rearming process monitoring message.</string>
<string name="notRearmingProcessMonitoringMessageStopRequested" translatable="false">Not rearming process monitoring message, stop requested.</string>
<string name="messageReceivedStatingProcessMonitoringIsComplete" translatable="false">Message received stating process monitoring is complete.</string>
<string name="appStarted" translatable="false">App started.</string>
<string name="appStopped" translatable="false">App stopped.</string>
<string name="runningApp" translatable="false">Running app</string>
<string name="errorWritingSettingsToPersistentMemory" translatable="false">Error writing settings to persistent memory.</string>
<string name="messageReceivedStatingProcessMonitoringIsComplete" translatable="false">Получено сообщение о завершении мониторинга процессов.</string>
<string name="appStarted" translatable="false">Приложение запущено.</string>
<string name="appStopped" translatable="false">Приложение остановлено.</string>
<string name="runningApp" translatable="false">Приложение выполняется</string>
<string name="errorWritingSettingsToPersistentMemory" translatable="false">Ошибка записи настроек.</string>
<string name="settings">Настройки</string>
<string name="writingSettingsToPersistentMemory" translatable="false">Writing settings to persistent memory.</string>
<string name="refreshingSettingsFromFileToMemory" translatable="false">Refreshing settings from file to memory.</string>
<string name="errorReadingSettings" translatable="false">Error reading settings.</string>
<string name="invalidStuffStoredInSettingsErasing" translatable="false">Invalid stuff stored in settings. Erasing settings...</string>
<string name="initializingSettingsToPersistentMemory" translatable="false">Initializing settings to persistent memory.</string>
<string name="errorInitializingSettingsToPersistentMemory" translatable="false">Error initializing settings to persistent memory.</string>
<string name="writingSettingsToPersistentMemory" translatable="false">Запись настроек.</string>
<string name="refreshingSettingsFromFileToMemory" translatable="false">Загрузка настроек из файла в память.</string>
<string name="errorReadingSettings" translatable="false">Ошибка чтения настроек.</string>
<string name="invalidStuffStoredInSettingsErasing" translatable="false">Неверное содержимое в настройках. Удаление...</string>
<string name="initializingSettingsToPersistentMemory" translatable="false">Инициализация настроек.</string>
<string name="errorInitializingSettingsToPersistentMemory" translatable="false">Ошибка инициализации настроек.</string>
<string name="settingsErased">Настройки стерты.</string>
<string name="settingsSetToDefault">Настройки установлены по умолчанию.</string>
<string name="batteryLevel">Уровень заряда батареи</string>
<string name="selectSpeed">Выберите скорость</string>
<string name="selectBattery">Выберите уровень заряда батареи</string>
<string name="applyingSettingsAndRules" translatable="false">Applying settings, rules and locations.</string>
<string name="applyingSettingsAndRules" translatable="false">Применение настроек, правил и местоположений.</string>
<string name="privacy">Политика конфиденциальности</string>
<string name="privacyConfirmationText">На вашем устройстве будет запущен браузер и загрузится политика конфиденциальности с веб-сайта разработчика.</string>
<string name="waitBeforeNextAction">Ожидание перед следующим действием</string>
@ -274,15 +274,15 @@
<string name="moveDown">Переместить вниз</string>
<string name="cantMoveUp">Невозможно переместить элемент вверх. Он уже находится на самом верху.</string>
<string name="cantMoveDown">Невозможно переместить элемент вниз. Он уже в самом низу.</string>
<string name="wifiNameSpecifiedCheckingThat" translatable="false">Wifi name specified, checking that.</string>
<string name="wifiNameMatchesRuleWillApply" translatable="false">Wifi name matches. Rule will apply.</string>
<string name="noWifiNameSpecifiedAnyWillDo" translatable="false">No wifi name specified, any will do.</string>
<string name="ruleCheckOf" translatable="false">RuleCheck of %1$s</string>
<string name="wifiNameSpecifiedCheckingThat" translatable="false">Указана сеть Wifi, проверка.</string>
<string name="wifiNameMatchesRuleWillApply" translatable="false">Сеть Wifi совпадает. Правило применяется.</string>
<string name="noWifiNameSpecifiedAnyWillDo" translatable="false">Не указана сеть Wifi, будет использована любая.</string>
<string name="ruleCheckOf" translatable="false">Проверка правила %1$s</string>
<string name="airplaneMode">Режим полета</string>
<string name="activate">Активировать</string>
<string name="deactivate">Деактивировать</string>
<string name="airplaneModeSdk17Warning">Начиная с версии Android 4.2 эта функция работает только в том случае, если на вашем устройстве есть root-права.</string>
<string name="triggerUrlReplacementPositionError" translatable="false">You asked for a position to be added to your URL. Unfortunately at this point I do not have any location, yet.</string>
<string name="triggerUrlReplacementPositionError" translatable="false">Вы запросили добавить координаты в ваш URL. К сожалению, в настоящий момент у меня нет никаких координат.</string>
<string name="addIntentValue">Добавить Intent пару</string>
<string name="parameterName">Имя параметра</string>
<string name="parameterValue">Значение параметра</string>
@ -336,7 +336,7 @@
<string name="nfcNoNdefIntentBut">Нет NFC NDEF Intent, но</string>
<string name="nfcNotSupportedInThisAndroidVersionYet">NFC пока не поддерживается в этой версии Android.</string>
<string name="cantRunRule">Не удается запустить правила.</string>
<string name="cantDownloadTooFewRequestsInSettings" translatable="false">Can\&apos;t download anything. Amount of http requests in settings is lower than 1.</string>
<string name="cantDownloadTooFewRequestsInSettings" translatable="false">Не получается загрузить. Количество http запросов в настройках меньше 1.</string>
<string name="nfcApplyTagToRule">Применить метку к правилу</string>
<string name="nfcTagReadSuccessfully">Метка прочитана успешно.</string>
<string name="nfcValueNotSuitable">Сохранённое значение не подходит.</string>
@ -351,7 +351,7 @@
<string name="toggling">Переключение</string>
<string name="toggle">переключить</string>
<string name="overlapBetweenPois">Обнаружено перекрытие с местоположением %1$s на %2$s метров. Уменьшите радиус хотя бы на это значение.</string>
<string name="noOverLap" translatable="false">No overlap to other locations detected.</string>
<string name="noOverLap" translatable="false">Не обнаружено перекрытия с другими местоположениями.</string>
<string name="ruleToggable" translatable="false">Rule %1$s is toggable.</string>
<string name="ruleNotToggable" translatable="false">Rule %1$s is not suitable for toggling.</string>
<string name="none">Нет</string>
@ -395,8 +395,8 @@
<string name="bluetoothDeviceInRange">Устройство Bluetooth %1$s в диапазоне.</string>
<string name="bluetoothDeviceOutOfRange">Устройство Bluetooth %1$s вне диапазона.</string>
<string name="anyDevice">любое устройство</string>
<string name="ruleDoesntApplyNotTheCorrectDeviceName" translatable="false">Rule %1$s doesn\&apos;t apply. Not the correct bluetooth device name.</string>
<string name="ruleDoesntApplyNotTheCorrectDeviceAddress" translatable="false">Rule %1$s doesn\&apos;t apply. Not the correct bluetooth device address.</string>
<string name="ruleDoesntApplyNotTheCorrectDeviceName" translatable="false">Правило %1$s неприменимо. Неверное имя устройства bluetooth.</string>
<string name="ruleDoesntApplyNotTheCorrectDeviceAddress" translatable="false">Правило %1$s неприменимо. Неверный адрес устройства bluetooth.</string>
<string name="noDevice">нет устройства</string>
<string name="selectDeviceFromList">один из списка</string>
<string name="connectionToDevice">подключение к устройству</string>
@ -405,8 +405,8 @@
<string name="deviceOutOfRange">устройство вне зоны досягаемости</string>
<string name="selectDeviceOption">Выберите опцию устройства.</string>
<string name="selectConnectionOption">Выберите вариант подключения.</string>
<string name="ruleDoesntApplyDeviceInRangeButShouldNotBe" translatable="false">Rule %1$s doesn\&apos;t apply. Device is in range, but should not be.</string>
<string name="ruleDoesntApplyStateNotCorrect" translatable="false">Rule %1$s doesn\&apos;t apply. Wrong state.</string>
<string name="ruleDoesntApplyDeviceInRangeButShouldNotBe" translatable="false">Правило %1$s неприменимо. Устройство в пределах досягаемости, хотя так быть не должно.</string>
<string name="ruleDoesntApplyStateNotCorrect" translatable="false">Правило %1$s неприменимо. Неверное состояние.</string>
<string name="triggerHeadsetPlugged">Подключение гарнитуры</string>
<string name="actionPlayMusic">Открыть музыкальный плеер</string>
<string name="headsetConnected">Гарнитура (тип: %1$s) подключена</string>
@ -415,17 +415,17 @@
<string name="headphoneMicrophone">Микрофон</string>
<string name="headphoneAny">Любой</string>
<string name="headphoneSelectType">Выберите тип гарнитуры</string>
<string name="ruleDoesntApplyWrongHeadphoneType" translatable="false">Rule %1$s doesn\&apos;t apply. Wrong headphone type.</string>
<string name="ignoringActivityDetectionUpdateTooSoon" translatable="false">Ignoring activity detection update. Came in sooner that %1$s seconds.</string>
<string name="ruleDoesntApplyWrongHeadphoneType" translatable="false">Правило %1$s неприменимо. Неверный тип гарнитуры.</string>
<string name="ignoringActivityDetectionUpdateTooSoon" translatable="false">Игнорирование запроса обнаружения активности. Получено ранее %1$s секунд.</string>
<string name="whatsThis">Что это такое?</string>
<string name="atLeastRuleXisUsingY" translatable="false">At least rule \&quot;%1$s\&quot; is using a trigger of type \&quot;%2$s\&quot;.</string>
<string name="atLeastRuleXisUsingY" translatable="false">По меньшей мере одно правило \&quot;%1$s\&quot; использует триггер типа \&quot;%2$s\&quot;.</string>
<string name="privacyLocationingTitle">Только приватное определение местоположения</string>
<string name="privacyLocationingSummary">Избегайте методов определения местоположения, которые могут отправить ваши данные внешним компаниями, например Google. При включении будет использоваться только GPS, определение местоположения может занять больше времени или работать менее надежно.</string>
<string name="enforcingGps" translatable="false">Private Locationing enabled, enforcing GPS use.</string>
<string name="notEnforcingGps" translatable="false">Private Locationing not enabled, using regular provider search.</string>
<string name="gpsMeasurement" translatable="false">GPS measurement</string>
<string name="gpsMeasurementTimeout" translatable="false">GPS measurement stopped due to timeout.</string>
<string name="cellMastChanged" translatable="false">Cell tower changed: %1$s</string>
<string name="enforcingGps" translatable="false">Private Locationing включен, принудительное использование GPS .</string>
<string name="notEnforcingGps" translatable="false">Private Locationing не включен, использование обычных источников.</string>
<string name="gpsMeasurement" translatable="false">Измерение GPS</string>
<string name="gpsMeasurementTimeout" translatable="false">Измерение GPS остановлено из-за превышение времени ожидания.</string>
<string name="cellMastChanged" translatable="false">Сотовая вышка изменилась: %1$s</string>
<string name="noiseDetectionHint">Если вы думаете, что обнаружение шума работает некорректно (в зависимости от значения, которое вы указываете), пожалуйста, имейте в виду, что каждое устройство отличается, поэтому вы можете изменить &quot;Эталон для измерения шума&quot; в настройках. См . http://en.wikipedia.org/wiki/Decibel для получения дополнительной информации. Для калибровки устройства можно использовать калибратор громкости на главном экране.</string>
<string name="hint">Подсказка</string>
<string name="selectNoiseLevel">Выбор уровня шума</string>
@ -763,16 +763,16 @@
<string name="musicPlayingDetection">Обнаружение воспроизведения музыки</string>
<string name="musicCheckFrequencyTitle">Частота проверки [мс]</string>
<string name="musicCheckFrequencySummary">Миллисекунды между проверками</string>
<string name="locationNotWorkingOn12">Получение местоположения, похоже, не работает на устройствах Android 12 в настоящее время. Если это не коснулось вас, мне очень жаль. Я постараюсь исправить это, как только узнаю причину. Так что если кружочек не перестанет вращаться, вы предупреждены.</string>
<string name="locationNotWorkingOn12">Получение местоположения, похоже, не работает на устройствах Android 12 в настоящее время. Если это коснулось вас, мне очень жаль. Я постараюсь это исправить, как только узнаю причину. Так что если кружочек не перестанет вращаться, вы предупреждены.</string>
<string name="lastProfile">Последний профиль:</string>
<string name="queryAllPackages">Получить список установленных приложений</string>
<string name="helpTextEnergySaving">Многие производители устройств пытаются снизить потребление энергии при помощи ограничения работы фоновых приложений. К сожалению, это приводит к тому, что они перестают работать корректно, Automation относится к их числу. Посетите эту <a href="https://dontkillmyapp.com/">web-страницу</a> для того, чтобы узнать как исключить Automation из этого процесса.</string>
<string name="timeFrameDaysHint">Если вы используете временной период, который переходит через полночь, вам нужно выбрать следующий день, если хотите, чтобы триггер сработал после полночи.</string>
<string name="featureNotInGooglePlayVersion">Эта функция больше не доступа для версии Google Play.\n\nGoogle постоянно усложняет жизнь разработчикам и требуют оформления бумажных заявлений для обоснавания необходимости использования определённых функций. К сожалению, эти заявления в 99% случаев откланяются. Почти как в комиксе Астерикс.\n\nЯ потратил недели на споры с ними, но заявления продолжают отклоняться ботами или людьми со схожим интеллектуальным развитием.\nПожалуйста, используйте версию APK или скачайте его с F-Droid, если вам нужны эти функции.</string>
<string name="timeFrameDaysHint">Если вы используете временной период, который переходит через полночь, вам нужно выбрать следующий день, если хотите, чтобы триггер сработал после полуночи.</string>
<string name="featureNotInGooglePlayVersion">Эта функция больше не доступа для версии Google Play.\n\nGoogle постоянно усложняет жизнь разработчикам и требуют оформления бумажных заявлений для обоснавания необходимости использования определённых функций. К сожалению, эти заявления в 99% случаев отклоняются. Почти как в комиксе Астерикс.\n\nЯ потратил недели на споры с ними, но заявления продолжают отклоняться ботами или людьми со схожим интеллектуальным развитием.\nПожалуйста, используйте версию APK или скачайте его с F-Droid, если вам нужны эти функции.</string>
<string name="startActivityInsertManually">Это ограничение касается только выбора приложения, но не его запуска. Вы можете указать имя приложения вручную, если знаете его.</string>
<string name="deviceStarts">Включение устройства</string>
<string name="serviceStarts">Запуск службы</string>
<string name="deviceIsStarting">устройство запускается</string>
<string name="deviceIsStarting">Устройство запускается</string>
<string name="serviceIsStarting">Служба запускается</string>
<string name="broadcastReceived">получено сообщение broadcast</string>
<string name="broadcastNotReceived">сообщение broadcast не получено</string>
@ -784,10 +784,10 @@
<string name="lockedWithoutSecurity">заблокировано (только swipe, без PIN)</string>
<string name="lockedWithSecurity">заблокировано (с PIN и т.д.)</string>
<string name="lockedCommentScreenMustBeOff">Любое состояние блокировки будет обнаружено только когда экран выключен.</string>
<string name="emailPretext">Если вы обнаружили проблему или хотите задать вопрос или предложить улучшение, пожалуйста, напишите что-нибудь в теле письма. Не нужно просто отправлять мне скриншоты без текста. Подобные письма будут проигнорированы, за исключением подобных писем, которые часть уже существующей переписки.</string>
<string name="emailPretext">Если вы обнаружили проблему или хотите задать вопрос или предложить улучшение, пожалуйста, напишите что-нибудь в теле письма. Не нужно просто отправлять мне скриншоты без текста. Подобные письма будут проигнорированы, за исключением тех писем, которые уже являются частью существующей переписки.</string>
<string name="sendBroadcast">Отправить broadcast</string>
<string name="enterBroadcast">Ввести broadcast действие.</string>
<string name="broadcastExplanation">Это действиет позволяет отправить Broadcast сообщение через систему сообщений Android. Их невидно пользователю, но приложения, которые "слушают" определённые сообщения могут реагировать на них определённым образом.</string>
<string name="broadcastExplanation">Это действиет позволяет отправить Broadcast сообщение через систему сообщений Android. Их не видно пользователю, но приложения, которые "слушают" определённые сообщения могут реагировать на них определённым образом.</string>
<string name="directionStringDoesNotContain">не содержит</string>
<string name="runExecutable">Запуск скрипта или файла</string>
<string name="path">Путь</string>
@ -799,7 +799,7 @@
<string name="wifiExplanation1">Приложения, реализуемые совместимость с Android Q и выше больше не могут включать/выключать Wi-Fi. Пожалуйста, вините не меня, а Google за это.\n\nВы можете обойти это ограничение получив root права и активировав чекбокс ниже. Так же вы можете скачать это приложение из F-Droid или с моего сайта, потому что для этих версий приложения нет ограничения на совместимость с последним уровнем API.</string>
<string name="wifiExplanation2">Когда активирован режим "В самолете" Wi-Fi может быть включен только приложениями с доступом к root правам.</string>
<string name="usingRoot">используя root-права</string>
<string name="runExecutableExplanation">Здесь вы можете выбрать сценарий или исполняемый файл, который будет выполняться как действие.\n\nНо есть некоторые предварительные условия, с которыми вам придется иметь дело самостоятельно. Google очень усложнил запуск чего-либо, кроме обычных приложений Android.\n\n1. Сценарий должен быть помечен как исполняемый. В обычной системе Android (без root) это на самом деле самая сложная часть.\n\n2. Это также означает, что автоматизация должна иметь возможность выполнять файл, а не только владельца или группу.\n\n3. Если это сценарий, в заголовке скрипта указывается допустимая оболочка.\n\nЕсли вы не можете выполнить вышеуказанные требования, можно в качестве альтернативы попытаться указать оболочку в качестве фактического исполняемого файла (например, /system/bin/sh) и скрипт в качестве параметра. Это сработало, по крайней мере, для одного пользователя.</string>
<string name="runExecutableExplanation">Здесь вы можете выбрать сценарий или исполняемый файл, который будет выполняться как действие.\n\nНо есть некоторые предварительные условия, с которыми вам придется иметь дело самостоятельно. Google очень усложнил запуск чего-либо, кроме обычных приложений Android.\n\n1. Сценарий должен быть помечен как исполняемый. В обычной системе Android (без root) это сделать непросто.\n\n2. Помимо владельца или группы, разрешение на исполнение файла должно также быть и у Automation.\n\n3. Если это сценарий, в заголовке скрипта указывается допустимая оболочка.\n\nЕсли вы не можете выполнить вышеуказанные требования, можно попробовать другое решение - попытаться указать оболочку в качестве фактического исполняемого файла (например, /system/bin/sh), а скрипт в качестве параметра. Это сработало, по крайней мере, для одного пользователя.</string>
<string name="tetheringActive">раздача интернета активна</string>
<string name="tetheringNotActive">раздача интернета не активна</string>
<string name="tetheringState">Раздача интернета</string>
@ -815,7 +815,7 @@
<string name="bluetooth">Bluetooth</string>
<string name="subSystemState">Состояние подсистемы</string>
<string name="clickNotificationButton">Нажмите кнопку</string>
<string name="simplyDismissNotification">Просто уволить</string>
<string name="simplyDismissNotification">Игнорировать сообщение</string>
<string name="usb">USB</string>
<string name="cable">Кабель</string>
<string name="tetheringBluetoothNotPossible">В настоящее время модем Bluetooth не может быть обнаружен. Только другие средства связи активируют этот триггер.</string>
@ -850,4 +850,6 @@
<string name="wifiMonitoringAlsoRequiresThis">Это разрешение также требуется, если триггер использует текущее соединение Wi-Fi.</string>
<string name="copyTextToClipboard">Копирование текста в буфер обмена</string>
<string name="textToCopy">Текст для копирования</string>
<string name="android.permission.SYSTEM_ALERT_WINDOW">Запуск поверх других приложений</string>
<string name="overlayPermissionHint">После нажатия кнопки «ОК» вы попадете в системный диалог. Пожалуйста, выберите там Automation и разрешите запуск поверх других приложений.</string>
</resources>

View File

@ -882,4 +882,7 @@
<string name="wifiMonitoringAlsoRequiresThis">This permission is also required if the trigger is using the current wifi connection.</string>
<string name="copyTextToClipboard">Copy text to clipboard</string>
<string name="textToCopy">Text to copy</string>
<string name="android.permission.SYSTEM_ALERT_WINDOW">Draw over other apps</string>
<string name="overlayPermissionHint">After clicking OK you\'ll be sent to a system dialog. Please select Automation there and allow "draw over other apps".</string>
<string name="variablesOnlyForTypes">Variables are only available for parameter types String and URI</string>
</resources>

View File

@ -0,0 +1,2 @@
* Behoben: Einführung der Overlay-Berechtigung, damit startActivity() im Hintergrund arbeiten kann
* Behoben: Rufnummer wieder als Variable verfügbar (Berechtigung READ_CALL_LOGS erforderlich)

View File

@ -0,0 +1 @@
* Behoben: Absturz bei der Verwaltung von Telefonanrufaktionen in der F-Droid-Version

View File

@ -0,0 +1,2 @@
* Fixed: Introduced overlay permission to enable startActivity() to work from the background
* Fixed: Phone number available as variable again (permission READ_CALL_LOGS required)

View File

@ -0,0 +1 @@
* Fixed: Crash when managing phone call action in the F-Droid version

View File

@ -0,0 +1,2 @@
* Fixed: Run executable action - when editing values were not loaded in editor
* Added: Variables usable in intent parameters

View File

@ -0,0 +1,2 @@
* Corregido: Se introdujo el permiso de superposición para permitir que startActivity() funcione desde el fondo
* Corregido: Número de teléfono disponible como variable de nuevo (READ_CALL_LOGS requiere permiso)

View File

@ -0,0 +1 @@
* Corregido: Bloqueo al administrar la acción de la llamada telefónica en la versión F-Droid

View File

@ -0,0 +1,2 @@
* Correction : Introduction de l'autorisation de superposition pour permettre à startActivity() de travailler en arrière-plan
* Correction : Numéro de téléphone à nouveau disponible en tant que variable (autorisation READ_CALL_LOGS requise)

View File

@ -0,0 +1 @@
* Correction : Crash lors de la gestion de l'action d'appel téléphonique dans la version F-Droid

View File

@ -0,0 +1,2 @@
* Risolto: Introdotto il permesso di sovrapposizione per consentire a startActivity () di funzionare dallo sfondo
* Risolto: numero di telefono disponibile di nuovo come variabile (READ_CALL_LOGS richiesta l'autorizzazione)

View File

@ -0,0 +1 @@
* Risolto: arresto anomalo durante la gestione dell'azione di chiamata telefonica nella versione F-Droid

View File

@ -0,0 +1,2 @@
* Opgelost: Overlay-machtiging geïntroduceerd om startActivity() in staat te stellen vanaf de achtergrond te werken
* Vast: Telefoonnummer weer beschikbaar als variabele (toestemming READ_CALL_LOGS vereist)

View File

@ -0,0 +1 @@
* Opgelost: Crash bij het beheren van telefoongesprek actie in de F-Droid versie

View File

@ -0,0 +1,2 @@
* Исправлено: Введено разрешение наложения для включения startActivity() для работы в фоновом режиме.
* Исправлено: номер телефона снова доступен в качестве переменной (требуется разрешение READ_CALL_LOGS)

View File

@ -0,0 +1 @@
* Исправлено: Сбой при управлении действием телефонного звонка в версии F-Droid