diff --git a/app/src/apkFlavor/AndroidManifest.xml b/app/src/apkFlavor/AndroidManifest.xml
index 0188eca4..41dd23ad 100644
--- a/app/src/apkFlavor/AndroidManifest.xml
+++ b/app/src/apkFlavor/AndroidManifest.xml
@@ -261,6 +261,17 @@
android:exported="true"
/>
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/fdroidFlavor/AndroidManifest.xml b/app/src/fdroidFlavor/AndroidManifest.xml
index 1a7d25e2..e02e0287 100644
--- a/app/src/fdroidFlavor/AndroidManifest.xml
+++ b/app/src/fdroidFlavor/AndroidManifest.xml
@@ -246,6 +246,17 @@
android:exported="true"
/>
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/googlePlayFlavor/AndroidManifest.xml b/app/src/googlePlayFlavor/AndroidManifest.xml
index b4426bca..cbc088a4 100644
--- a/app/src/googlePlayFlavor/AndroidManifest.xml
+++ b/app/src/googlePlayFlavor/AndroidManifest.xml
@@ -245,6 +245,17 @@
android:exported="true"
/>
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/jens/automation2/Action.java b/app/src/main/java/com/jens/automation2/Action.java
index d2694aef..da605244 100644
--- a/app/src/main/java/com/jens/automation2/Action.java
+++ b/app/src/main/java/com/jens/automation2/Action.java
@@ -56,6 +56,7 @@ public class Action
startPhoneCall,
stopPhoneCall,
copyToClipboard,
+ takeScreenshot,
sendTextMessage;
public String getFullName(Context context)
@@ -140,6 +141,9 @@ public class Action
return context.getResources().getString(R.string.endPhoneCall);
case copyToClipboard:
return context.getResources().getString(R.string.copyTextToClipboard);
+ case takeScreenshot:
+ return context.getResources().getString(R.string.takeScreenshot);
+
default:
return "Unknown";
}
@@ -307,6 +311,10 @@ public class Action
break;
case copyToClipboard:
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.copyTextToClipboard));
+ break;
+ case takeScreenshot:
+ returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.takeScreenshot));
+ break;
default:
returnString.append(action.toString());
}
@@ -632,6 +640,9 @@ public class Action
case copyToClipboard:
Actions.copyToClipboard(context, Miscellaneous.replaceVariablesInText(this.getParameter2(), context));
break;
+ case takeScreenshot:
+ Actions.takeScreenshot();
+ break;
default:
Miscellaneous.logEvent("w", "Action", context.getResources().getString(R.string.unknownActionSpecified), 3);
break;
diff --git a/app/src/main/java/com/jens/automation2/Actions.java b/app/src/main/java/com/jens/automation2/Actions.java
index d20eb8e0..52fcd6bc 100644
--- a/app/src/main/java/com/jens/automation2/Actions.java
+++ b/app/src/main/java/com/jens/automation2/Actions.java
@@ -1,6 +1,7 @@
package com.jens.automation2;
import android.Manifest;
+import android.accessibilityservice.AccessibilityService;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.NotificationManager;
@@ -2286,14 +2287,18 @@ public class Actions
public static void startPhoneCall(Context context, String phoneNumber)
{
+ Intent intent;
+
/*
- You can use Intent.ACTION_DIAL instead of Intent.ACTION_CALL.
- This shows the dialer with the number already entered, but
- allows the user to decide whether to actually make the call or not.
- ACTION_DIAL does not require the CALL_PHONE permission.
+ Bug in Android 14 makes it necessary to add double quotes around MMI code.
+ More precisely it's required for codes containing the # character.
*/
- Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + Uri.encode(phoneNumber)));
+ if(Build.VERSION.SDK_INT >= 34)
+ intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + Uri.encode("\"" + phoneNumber + "\"")));
+ else
+ intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + Uri.encode(phoneNumber)));
+
// intent.setClassName("com.android.phone","com.android.phone.OutgoingCallBroadcaster");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_FROM_BACKGROUND);
@@ -2346,4 +2351,12 @@ public class Actions
clipboard.setPrimaryClip(clip);
}
}
+
+ public static void takeScreenshot()
+ {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
+ {
+ MyAccessibilityService.getInstance().performGlobalAction(AccessibilityService.GLOBAL_ACTION_TAKE_SCREENSHOT);
+ }
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/jens/automation2/ActivityManageRule.java b/app/src/main/java/com/jens/automation2/ActivityManageRule.java
index 32fda94b..b5c62051 100644
--- a/app/src/main/java/com/jens/automation2/ActivityManageRule.java
+++ b/app/src/main/java/com/jens/automation2/ActivityManageRule.java
@@ -2126,6 +2126,8 @@ public class ActivityManageRule extends Activity
}
else if(types[i].toString().equals(Action_Enum.copyToClipboard.toString()))
items.add(new Item(typesLong[i].toString(), R.drawable.clipboard));
+ else if(types[i].toString().equals(Action_Enum.takeScreenshot.toString()))
+ items.add(new Item(typesLong[i].toString(), R.drawable.copier));
else
items.add(new Item(typesLong[i].toString(), R.drawable.placeholder));
}
@@ -2352,6 +2354,12 @@ public class ActivityManageRule extends Activity
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionCopyToClipboard.class);
startActivityForResult(intent, requestCodeActionCopyTextToClipboardAdd);
}
+ else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.takeScreenshot.toString()))
+ {
+ newAction.setAction(Action_Enum.takeScreenshot);
+ ruleToEdit.getActionSet().add(newAction);
+ refreshActionList();
+ }
}
});
diff --git a/app/src/main/java/com/jens/automation2/ActivityPermissions.java b/app/src/main/java/com/jens/automation2/ActivityPermissions.java
index f18c2238..bd04ea0e 100644
--- a/app/src/main/java/com/jens/automation2/ActivityPermissions.java
+++ b/app/src/main/java/com/jens/automation2/ActivityPermissions.java
@@ -18,6 +18,7 @@ import android.os.Bundle;
import android.os.PowerManager;
import android.provider.Settings;
import android.text.Html;
+import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
@@ -51,12 +52,13 @@ public class ActivityPermissions extends Activity
private static final int requestCodeForPermissionsBatteryOptimization = 12048;
private static final int requestCodeForPermissionNotificationAccessAndroid13 = 12049;
private static final int requestCodeForPermissionsManageOverlay = 12050;
+ private static final int requestCodeForPermissionsAccessibility = 12051;
protected String[] specificPermissionsToRequest = null;
public static String intentExtraName = "permissionsToBeRequested";
Button bCancelPermissions, bRequestPermissions;
- TextView tvPermissionsExplanation, tvPermissionsExplanationSystemSettings, tvPermissionsExplanationLong;
+ TextView tvPermissionsExplanation, tvPermissionsExplanationSystemSettings, tvPermissionsExplanationLong, tvRestrictionPermissionsNotice;
static ActivityPermissions instance = null;
public final static String permissionNameWireguard = "com.wireguard.android.permission.CONTROL_TUNNELS";
@@ -87,6 +89,7 @@ public class ActivityPermissions extends Activity
tvPermissionsExplanation = (TextView)findViewById(R.id.tvPermissionsExplanation);
tvPermissionsExplanationSystemSettings = (TextView)findViewById(R.id.tvPermissionsExplanationSystemSettings);
tvPermissionsExplanationLong = (TextView)findViewById(R.id.tvPermissionsExplanationLong);
+ tvRestrictionPermissionsNotice = (TextView)findViewById(R.id.tvRestrictionPermissionsNotice);
bCancelPermissions.setOnClickListener(new View.OnClickListener()
{
@@ -305,6 +308,10 @@ public class ActivityPermissions extends Activity
{
return android.provider.Settings.canDrawOverlays(Miscellaneous.getAnyContext());
}
+ else if(s.equals(Manifest.permission.BIND_ACCESSIBILITY_SERVICE))
+ {
+ return haveAccessibilityAccess(Miscellaneous.getAnyContext());
+ }
else
{
int res = context.checkCallingOrSelfPermission(s);
@@ -323,11 +330,59 @@ public class ActivityPermissions extends Activity
return active;
}
+ public static boolean haveAccessibilityAccess(Context mContext)
+ {
+ int accessibilityEnabled = 0;
+
+ final String service = mContext.getPackageName() + "/" + BuildConfig.APPLICATION_ID + ".MyAccessibilityService";
+
+ boolean accessibilityFound = false;
+ try
+ {
+ accessibilityEnabled = Settings.Secure.getInt(mContext.getApplicationContext().getContentResolver(), Settings.Secure.ACCESSIBILITY_ENABLED);
+// Log.v(TAG, "accessibilityEnabled = " + accessibilityEnabled);
+ }
+ catch (Settings.SettingNotFoundException e)
+ {
+// Log.e(TAG, "Error finding setting, default accessibility to not found: " + e.getMessage());
+ }
+ TextUtils.SimpleStringSplitter mStringColonSplitter = new TextUtils.SimpleStringSplitter(':');
+
+ if (accessibilityEnabled == 1)
+ {
+ String settingValue = Settings.Secure.getString(mContext.getApplicationContext().getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
+ if (settingValue != null)
+ {
+ TextUtils.SimpleStringSplitter splitter = mStringColonSplitter;
+ splitter.setString(settingValue);
+ while (splitter.hasNext())
+ {
+ String accessibilityService = splitter.next();
+
+ if (accessibilityService.equalsIgnoreCase(service))
+ {
+ return true;
+ }
+ }
+ }
+ }
+
+ return accessibilityFound;
+ }
+
public static void requestOverlay()
{
Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
ActivityPermissions.getInstance().startActivityForResult(intent, requestCodeForPermissionsManageOverlay);
}
+
+ public static void requestBindAccessibilityService()
+ {
+ Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ ActivityPermissions.getInstance().startActivityForResult(intent, requestCodeForPermissionsAccessibility);
+ }
+
public static void requestDeviceAdmin()
{
if(!haveDeviceAdmin())
@@ -370,10 +425,13 @@ public class ActivityPermissions extends Activity
if(!havePermission(Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS, workingContext))
addToArrayListUnique(Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS, requiredPermissions);
- for(Profile p : Profile.getProfileCollection())
+ if(!havePermission(Manifest.permission.READ_EXTERNAL_STORAGE, workingContext))
{
- if(p.changeIncomingCallsRingtone || p.changeNotificationRingtone)
- addToArrayListUnique(Manifest.permission.READ_EXTERNAL_STORAGE, requiredPermissions);
+ for (Profile p : Profile.getProfileCollection())
+ {
+ if (p.changeIncomingCallsRingtone || p.changeNotificationRingtone)
+ addToArrayListUnique(Manifest.permission.READ_EXTERNAL_STORAGE, requiredPermissions);
+ }
}
if (!onlyGeneral)
@@ -407,27 +465,6 @@ public class ActivityPermissions extends Activity
}
}
}
-
- /*
- Not all permissions need to be asked for.
- */
-
- /*if(shouldShowRequestPermissionRationale("android.permission.RECORD_AUDIO"))
- Toast.makeText(ActivityMainScreen.this, "shouldShowRequestPermissionRationale", Toast.LENGTH_LONG).show();
- else
- Toast.makeText(ActivityMainScreen.this, "not shouldShowRequestPermissionRationale", Toast.LENGTH_LONG).show();*/
-
-// addToArrayListUnique("Manifest.permission.RECORD_AUDIO", requiredPermissions);
- /*int hasPermission = checkSelfPermission(Manifest.permission.RECORD_AUDIO);
- if (hasPermission == PackageManager.PERMISSION_DENIED)
- {
- Toast.makeText(ActivityMainScreen.this, "Don't have record_audio. Requesting...", Toast.LENGTH_LONG).show();
-// requestPermissions(new String[]{"Manifest.permission.CAMERA"}, requestCodeForPermissions);
- ActivityCompat.requestPermissions(ActivityMainScreen.this, new String[]{"Manifest.permission.CAMERA"}, requestCodeForPermissions);
- }
- else
- Toast.makeText(ActivityMainScreen.this, "Have record_audio.", Toast.LENGTH_LONG).show();*/
-
}
return requiredPermissions.toArray(new String[requiredPermissions.size()]);
@@ -722,6 +759,8 @@ public class ActivityPermissions extends Activity
case stopPhoneCall:
addToArrayListUnique(Manifest.permission.ANSWER_PHONE_CALLS, requiredPermissions);
break;
+ case takeScreenshot:
+ addToArrayListUnique(Manifest.permission.BIND_ACCESSIBILITY_SERVICE, requiredPermissions);
default:
break;
}
@@ -971,6 +1010,10 @@ public class ActivityPermissions extends Activity
case Manifest.permission.QUERY_ALL_PACKAGES:
usingElements.add(getResources().getString(R.string.queryAllPackages));
break;
+ case Manifest.permission.BIND_ACCESSIBILITY_SERVICE:
+ for(String ruleName : getRulesUsing(Action.Action_Enum.takeScreenshot))
+ usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
+ break;
}
return usingElements;
@@ -979,6 +1022,15 @@ public class ActivityPermissions extends Activity
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
+ /*
+ All of the following permissions need to be "manually" activated by the user in some
+ buried system menu.
+ In my opinion by mistake the function will be called when the user has just landed
+ on one of those screens, not when he exits it again. To compensate for that onResume()
+ is overridden. This enables the permission screen to automatically close after all
+ required permissions have been granted.
+ */
+
super.onActivityResult(requestCode, resultCode, data);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
@@ -1026,6 +1078,10 @@ public class ActivityPermissions extends Activity
if (requestCode == requestCodeForPermissionsManageOverlay)
if(havePermission(Manifest.permission.SYSTEM_ALERT_WINDOW, ActivityPermissions.this))
requestPermissions(cachedPermissionsToRequest, true);
+
+ if (requestCode == requestCodeForPermissionsAccessibility)
+ if(havePermission(Manifest.permission.BIND_ACCESSIBILITY_SERVICE, ActivityPermissions.this))
+ requestPermissions(cachedPermissionsToRequest, true);
}
}
@@ -1085,10 +1141,14 @@ public class ActivityPermissions extends Activity
}
else if (s.equalsIgnoreCase(Manifest.permission.ACCESS_NOTIFICATION_POLICY))
{
+ if(BuildConfig.FLAVOR.equals(AutomationService.flavor_name_apk))
+ Miscellaneous.messageBox(getResources().getString(R.string.info), getResources().getString(R.string.noticeRestrictedPermissions), ActivityPermissions.this).show();
+
requiredPermissions.remove(s);
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))
@@ -1107,6 +1167,22 @@ public class ActivityPermissions extends Activity
diag.show();
return;
}
+ else if (s.equalsIgnoreCase(Manifest.permission.BIND_ACCESSIBILITY_SERVICE))
+ {
+ AlertDialog diag = Miscellaneous.messageBox(getResources().getString(R.string.info), getResources().getString(R.string.accessibilityApiPermissionHint), ActivityPermissions.this);
+ diag.setOnDismissListener(new DialogInterface.OnDismissListener()
+ {
+ @Override
+ public void onDismiss(DialogInterface dialogInterface)
+ {
+ requiredPermissions.remove(s);
+ cachedPermissionsToRequest = requiredPermissions;
+ requestBindAccessibilityService();
+ }
+ });
+ diag.show();
+ return;
+ }
else if (s.equalsIgnoreCase(Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE))
{
if(Build.VERSION.SDK_INT >= 33)
@@ -1589,4 +1665,47 @@ public class ActivityPermissions extends Activity
return false;
}
}
+
+ @Override
+ protected void onResume()
+ {
+ super.onResume();
+
+ if(Build.VERSION.SDK_INT >= 33 && BuildConfig.FLAVOR.equals(AutomationService.flavor_name_apk))
+ {
+ for (String p : getRequiredPermissions(false))
+ {
+ if (p.equals(Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE) || p.equals(Manifest.permission.BIND_ACCESSIBILITY_SERVICE))
+ {
+ tvRestrictionPermissionsNotice.setText(getResources().getString(R.string.noticeRestrictedPermissions));
+
+ /*
+ Opening the app's settings directly does not work because the
+ mentioned 3 dots are only displayed when you went there the hard way.
+ */
+ /*
+ tvRestrictionPermissionsNotice.setOnClickListener(new View.OnClickListener()
+ {
+ @Override
+ public void onClick(View view)
+ {
+ Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
+ intent.setData(Uri.parse("package:" + getPackageName()));
+ startActivity(intent);
+ }
+ })*/;
+ break;
+ }
+ }
+ }
+
+ for(String p : getRequiredPermissions(false))
+ {
+ if(!havePermission(p, this))
+ return;
+ }
+
+ // have all
+ setHaveAllPermissions();
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/jens/automation2/MyAccessibilityService.java b/app/src/main/java/com/jens/automation2/MyAccessibilityService.java
new file mode 100644
index 00000000..79edbd13
--- /dev/null
+++ b/app/src/main/java/com/jens/automation2/MyAccessibilityService.java
@@ -0,0 +1,51 @@
+package com.jens.automation2;
+
+import android.accessibilityservice.AccessibilityService;
+import android.os.Build;
+import android.util.Log;
+import android.view.Display;
+import android.view.accessibility.AccessibilityEvent;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+
+public class MyAccessibilityService extends AccessibilityService
+{
+ static MyAccessibilityService instance;
+
+ public static MyAccessibilityService getInstance()
+ {
+ if(instance == null)
+ {
+ instance = new MyAccessibilityService();
+ }
+
+ return instance;
+ }
+
+ @Override
+ public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent)
+ {
+
+ }
+
+ @Override
+ public void onInterrupt()
+ {
+
+ }
+
+ @Override
+ public void onCreate()
+ {
+ super.onCreate();
+ instance = this;
+ }
+
+ @Override
+ protected void onServiceConnected()
+ {
+ super.onServiceConnected();
+ Miscellaneous.logEvent("i", "Accessibility service", "Service started.", 4);
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-hdpi/copier.png b/app/src/main/res/drawable-hdpi/copier.png
new file mode 100644
index 00000000..81257cb0
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/copier.png differ
diff --git a/app/src/main/res/layout/permissions_activity.xml b/app/src/main/res/layout/permissions_activity.xml
index 83dd4362..2b0567b5 100644
--- a/app/src/main/res/layout/permissions_activity.xml
+++ b/app/src/main/res/layout/permissions_activity.xml
@@ -66,6 +66,12 @@
+
+
Dieser Auslöser ist gültig, wenn Sie gerade die Verbindung zu dem oben angegebenen WLAN getrennt haben ODER während der Dienst noch gestartet wird und wenn Sie mit keinem WLAN verbunden sind. Wenn Sie möchten, dass der Auslöser nur ausgelöst wird, wenn Sie die Verbindung zu einem bestimmten WLAN explizit trennen, fügen Sie einen weiteren Auslöser hinzu: \"Der Dienst wird nicht gestartet\".
Klassenname
per startForegroundService()
+ Methode
+ Screenshot erstellen
+ An den Barrierefreiheitsdienst anbinden
+ An den Barrierefreiheitsdienst anbinden
+ Nachdem Sie auf OK geklickt haben, werden Sie zu einem Systemdialog weitergeleitet. Bitte wählen Sie dort Automatisierung aus und erlauben Sie die Barrierefreiheits-API.
+ Erforderlich für bestimmte Aktionen.
+ Wenn Sie eine der folgenden Berechtigungen nicht erteilen und eine Systemmeldung wie \"Eingeschränkte Berechtigung\" erhalten, müssen Sie zuerst zu den Android-Einstellungen und dann zu den Anwendungen gehen und Automatisierung auswählen. Nun sollten sich 3 Punkte in der oberen rechten Ecke befinden. Klicken Sie auf \"Eingeschränkte Einstellungen zulassen\". Danach sollte die erforderliche Erlaubnis erteilt werden können. Dies sollte nur für die APK-Version der App gelten, nicht für die von F-Droid oder dem Play Store.
\ No newline at end of file
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index a6852db6..2b1aa293 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -43,7 +43,7 @@
Inserte un nombre.
Nombre de usuario
Ok
- continuar
+ Continuar
Regla
Enviar mensajes SMS
Leer directorio
@@ -197,7 +197,7 @@
Grabar audio
Detectar llamadas salientes
Detectar el estado del dispositivo
- Leer la almacenamiento
+ Leer el almacenamiento
Escribir en el almacenamiento
Modificar la configuración del dispositivo
Determinar el estado de la bateria
@@ -801,4 +801,11 @@
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\".
Nombre de la clase
a través de startForegroundService((
+ Método
+ Tomar captura de pantalla
+ Enlazar al servicio de accesibilidad
+ Enlazar al servicio de accesibilidad
+ Después de hacer clic en Aceptar, se le enviará a un cuadro de diálogo del sistema. Seleccione Automatización allí y permita Permitir API de accesibilidad.
+ Requerido para ciertas acciones.
+ Si no le otorga a uno el siguiente permiso y un mensaje del sistema como \"Ajuste restringido\", primero debe ir a la configuración de Android, luego a las aplicaciones, elija Automatización. Ahora debería haber 3 puntos en la esquina superior derecha. Haga clic en \"Permitir configuraciones restringidas\". Después de eso, el permiso necesario debería poder otorgarse. Esto solo debería aplicarse a la versión APK de la aplicación, no a las de F-Droid o Play Store.
\ No newline at end of file
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index ba24aefd..59ccb7b9 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -801,4 +801,11 @@
Ce déclencheur sera valide si vous venez de vous déconnecter du wifi spécifié ci-dessus OU alors que le service est encore en cours de démarrage et si vous n\'êtes connecté à aucun wifi. Si vous souhaitez que le déclencheur ne se déclenche que lorsque vous vous déconnectez explicitement d\'un certain wifi, ajoutez un autre déclencheur « le service ne démarre pas ».
Nom de la classe
par startForegroundService()
+ Méthode
+ Prendre une capture d\'écran
+ Se lier au service d\'accessibilité
+ Se lier au service d\'accessibilité
+ Après avoir cliqué sur OK, vous serez redirigé vers une boîte de dialogue système. Sélectionnez Automatisation et autorisez l\'option Autoriser l\'API d\'accessibilité.
+ Obligatoire pour certaines actions.
+ Si vous ne parvenez pas à accorder à l\'un d\'entre eux l\'autorisation suivante et un message système tel que « Autorisation restreinte », vous devez d\'abord accéder aux paramètres Android, puis aux applications, puis choisir Automatisation. Maintenant, il devrait y avoir 3 points dans le coin supérieur droit. Cliquez sur « Autoriser les paramètres restreints ». Après cela, l\'autorisation nécessaire devrait pouvoir être accordée. Cela ne devrait s\'appliquer qu\'à la version APK de l\'application, pas à celles de F-Droid ou du Play Store.
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 2268f498..6fb53289 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -802,4 +802,11 @@
Questo trigger sarà valido se ti sei appena disconnesso dal Wi-Fi specificato sopra OPPURE mentre il servizio è ancora in fase di avvio e se non sei connesso a nessuna rete Wi-Fi. Se vuoi che il trigger si attivi solo quando ti stai disconnettendo esplicitamente da una determinata rete Wi-Fi, aggiungi un altro trigger \"il servizio non si avvia\".
Nome della classe
di startForegroundService()
+ Metodo
+ Fai uno screenshot
+ Associare al servizio di accessibilità
+ Associare al servizio di accessibilità
+ Dopo aver fatto clic su OK, verrà visualizzata una finestra di dialogo di sistema. Seleziona Automazione e consenti Consenti API di accessibilità.
+ Obbligatorio per determinate azioni.
+ Se non riesci a concedere una delle seguenti autorizzazioni e un messaggio di sistema come \"Autorizzazione limitata\", devi prima andare alle impostazioni di Android, quindi alle applicazioni, scegli Automazione. Ora dovrebbero esserci 3 punti nell\'angolo in alto a destra. Fai clic su \"Consenti impostazioni limitate\". Dopodiché dovrebbe essere concessa l\'autorizzazione necessaria. Questo dovrebbe valere solo per la versione APK dell\'app, non per quelle di F-Droid o Play Store.
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 67866c49..f6c296ad 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -800,5 +800,12 @@
Deze trigger is geldig als je net de verbinding met de hierboven gespecificeerde wifi hebt verbroken OF terwijl de service nog aan het starten is en als je niet verbonden bent met wifi. Als je wilt dat de trigger alleen wordt geactiveerd wanneer je expliciet de verbinding met een bepaalde wifi verbreekt, voeg dan nog een trigger toe \"service start niet\".
Naam van de klasse
door startForegroundService()
+ Methode
+ Screenshot maken
+ Binden aan toegankelijkheidsservice
+ Binden aan toegankelijkheidsservice
+ Nadat u op OK hebt geklikt, wordt u naar een systeemdialoogvenster gestuurd. Selecteer daar Automatisering en sta Toegankelijkheids-API toestaan toe.
+ Vereist voor bepaalde acties.
+ Als u er niet in slaagt om een van de volgende machtigingen en een systeembericht zoals \"Beperkte toestemming\" te verlenen, moet u eerst naar Android-instellingen gaan en vervolgens naar toepassingen en Automatisering kiezen. Nu zouden er 3 stippen in de rechterbovenhoek moeten zijn. Klik op \"Beperkte instellingen toestaan\". Daarna moet de benodigde toestemming aanvaardbaar zijn. Dit zou alleen van toepassing moeten zijn op de APK-versie van de app, niet die van F-Droid of Play Store.
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 2b524dd4..7903f3bb 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -899,4 +899,11 @@
Ten wyzwalacz będzie prawidłowy, jeśli właśnie rozłączyłeś się z Wi-Fi określonym powyżej LUB gdy usługa jest nadal uruchomiona i jeśli nie masz połączenia z żadną siecią Wi-Fi. Jeśli chcesz, aby wyzwalacz uruchamiał się tylko wtedy, gdy jawnie rozłączasz się z określoną siecią Wi-Fi, dodaj kolejny wyzwalacz \"usługa nie uruchamia się\".
nazwa klasy
przez startForegroundService()
+ Metoda
+ Zrób zrzut ekranu
+ Powiąż z usługą ułatwień dostępu
+ Powiąż z usługą ułatwień dostępu
+ Po kliknięciu OK zostaniesz przekierowany do systemowego okna dialogowego. Wybierz tam Automatyzację i zezwól na Zezwalaj na interfejs API ułatwień dostępu.
+ Wymagane w przypadku niektórych działań.
+ Jeśli nie uda Ci się przyznać następującego uprawnienia i komunikatu systemowego, takiego jak \"Ograniczone uprawnienia\", musisz najpierw przejść do ustawień Androida, a następnie aplikacji, wybrać Automatyzacja. Teraz w prawym górnym rogu powinny znajdować się 3 kropki. Kliknij \"Zezwól na ustawienia z ograniczeniami\". Następnie powinno być możliwe udzielenie niezbędnego pozwolenia. Powinno to dotyczyć tylko wersji APK aplikacji, a nie tych z F-Droid lub Sklepu Play.
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 243604ff..3b269bb2 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -859,4 +859,11 @@
Этот триггер будет действителен, если вы только что отключились от Wi-Fi, указанного выше, ИЛИ во время запуска службы и если вы не подключены ни к одному Wi-Fi. Если вы хотите, чтобы триггер срабатывал только тогда, когда вы явно отключаетесь от определенного Wi-Fi, добавьте еще один триггер «сервис не запускается».
Имя класса
no startForegroundService()
+ Метод
+ Сделать снимок экрана
+ Привязка к службе специальных возможностей
+ Привязка к службе специальных возможностей
+ После нажатия кнопки «ОК» вы попадете в системное диалоговое окно. Выберите там «Автоматизация» и разрешите «Разрешить API специальных возможностей».
+ Required for certain actions.
+ Если вы не можете предоставить одно из следующих разрешений и системное сообщение типа «Ограниченное разрешение», вам нужно сначала перейти в настройки Android, затем в приложения, выбрать «Автоматизация». Теперь в правом верхнем углу должно быть 3 точки. Нажмите «Разрешить ограниченные настройки». После этого необходимо получить необходимое разрешение. Это должно относиться только к APK-версии приложения, а не к версии из F-Droid или Play Store.
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index 5c1b9b90..147d5c47 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -800,4 +800,11 @@
如果您刚刚断开了与上面指定的 wifi 的连接,或者在服务仍在启动并且您没有连接到任何 wifi,则此触发器将有效。 如果您希望触发器仅在您明确断开与某个 wifi 的连接时触发,请添加另一个触发器\"服务未启动\"。
类名
来自 startForegroundService()
+ 方法
+ 截屏
+ 绑定到辅助功能服务
+ 绑定到辅助功能服务
+ 单击\"确定\"后,您将被发送到系统对话框。请在此处选择\"自动化\",并允许\"允许辅助功能 API\"。
+ 对于某些操作是必需的。
+ 如果您未能授予以下权限和\"受限权限\"之类的系统消息,则需要先转到 Android 设置,然后转到应用程序,选择自动化。现在右上角应该有 3 个点。单击\"允许受限设置\"。之后,应该可以授予必要的权限。这应该仅适用于应用的 APK 版本,而不适用于 F-Droid 或 Play 商店中的版本。
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index c71f261b..c94aadb0 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -892,4 +892,10 @@
Method
GET
POST
+ Take screenshot
+ Bind to accessibility service
+ Bind to accessibility service
+ After clicking OK you\'ll be sent to a system dialog. Please select Automation there and allow "Allow accessibility API".
+ Required for certain actions.
+ If you fail to grant one the following permission and a system message like \"Restricted permission\" you need to go to Android settings first, then applications, choose Automation. Now there should be 3 dots in the upper right corner. Click \"Allow restricted settings\". After that the necessary permission should be grantable. This should only apply to the APK version of the app, not the ones from F-Droid or Play Store.
\ No newline at end of file
diff --git a/app/src/main/res/xml/config_accessibility_service.xml b/app/src/main/res/xml/config_accessibility_service.xml
new file mode 100644
index 00000000..b1f0a7e9
--- /dev/null
+++ b/app/src/main/res/xml/config_accessibility_service.xml
@@ -0,0 +1,12 @@
+
+
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/changelogs/138.txt b/fastlane/metadata/android/en-US/changelogs/138.txt
index 7c8e11a0..b4ffd349 100644
--- a/fastlane/metadata/android/en-US/changelogs/138.txt
+++ b/fastlane/metadata/android/en-US/changelogs/138.txt
@@ -1,3 +1,5 @@
* Fixed: Overlay permission for start other program action only required if startByActivity() is selected
* Fixed: Broadcast receiver trigger would not trigger anything, but crash
-* Added: One can now choose between GET and POST when using triggerURL action
\ No newline at end of file
+* Fixed: Bug in Android 14 (not in Automation!!!) required a change when dialing MMI codes containing a # character.
+* Added: One can now choose between GET and POST when using triggerURL action
+* Added: new action -> take screenshot
\ No newline at end of file