9 Commits

Author SHA1 Message Date
27e9b3e0d1 New release 2023-02-09 23:24:29 +01:00
a6c6dfc6ba Bug fixed in TTS 2023-02-06 14:24:46 +01:00
6a7875cc61 Bugfix release 2023-02-01 23:29:26 +01:00
6f80caa1c6 Bugfix release 2023-01-17 22:38:49 +01:00
a9646cbf28 Autostart error fixed 2023-01-16 23:44:28 +01:00
52edfa32df Fixed bug with multiple time frames with reoccurrence configured 2023-01-16 16:54:54 +01:00
ca81e6a7bd Log improvements 2023-01-15 23:18:42 +01:00
49e4c20ab6 Allow negative integers as intents 2023-01-14 22:50:43 +01:00
ab98b4d1db Build number changed because of Google Play version 2023-01-14 22:20:31 +01:00
41 changed files with 194 additions and 29 deletions

View File

@ -11,8 +11,8 @@ android {
compileSdkVersion 31
buildToolsVersion '29.0.2'
useLibrary 'org.apache.http.legacy'
versionCode 123
versionName "1.7.8"
versionCode 126
versionName "1.7.11"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
@ -36,7 +36,7 @@ android {
{
dimension "version"
versionNameSuffix "-googlePlay"
targetSdkVersion 30
targetSdkVersion 31
}
fdroidFlavor

View File

@ -347,7 +347,16 @@ public class Rule implements Comparable<Rule>
if(oneTrigger.getTriggerType().equals(Trigger.Trigger_Enum.timeFrame))
{
if(oneTrigger.getTimeFrame().repetition > 0)
return true;
{
if(this.getLastExecution() != null)
{
Calendar now = Calendar.getInstance();
if (this.getLastExecution().getTimeInMillis() + oneTrigger.getTimeFrame().getRepetition() * 1000 <= now.getTimeInMillis())
return true;
}
else
return true;
}
}
else if(oneTrigger.getTriggerType().equals(Trigger.Trigger_Enum.broadcastReceived))
{
@ -467,7 +476,9 @@ public class Rule implements Comparable<Rule>
{
AutomationService service = AutomationService.getInstance();
service.speak(messages[0], false);
Toast.makeText(service, messages[0], Toast.LENGTH_LONG).show();
if(Settings.showToasts)
Toast.makeText(service, messages[0], Toast.LENGTH_LONG).show();
super.onProgressUpdate(messages);
}

View File

@ -440,7 +440,9 @@ public class Rule implements Comparable<Rule>
{
AutomationService service = AutomationService.getInstance();
service.speak(messages[0], false);
Toast.makeText(service, messages[0], Toast.LENGTH_LONG).show();
if(Settings.showToasts)
Toast.makeText(service, messages[0], Toast.LENGTH_LONG).show();
super.onProgressUpdate(messages);
}

View File

@ -111,6 +111,7 @@
</intent-filter>
</receiver>
<receiver android:name=".receivers.PackageReplacedReceiver"
android:exported="true"
android:enabled="true">
<intent-filter>
<action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
@ -122,6 +123,7 @@
<receiver
android:name=".DeviceAdmin"
android:exported="true"
android:description="@string/app_name"
android:label="@string/app_name"
android:permission= "android.permission.BIND_DEVICE_ADMIN" >
@ -160,6 +162,7 @@
<activity android:name=".ActivityManageTriggerCheckVariable" />
<activity
android:name=".ActivityMainTabLayout"
android:exported="true"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@ -208,6 +211,7 @@
<service
android:name=".receivers.NotificationListener"
android:exported="true"
android:label="@string/app_name"
android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE" >
<intent-filter>

View File

@ -467,7 +467,9 @@ public class Rule implements Comparable<Rule>
{
AutomationService service = AutomationService.getInstance();
service.speak(messages[0], false);
Toast.makeText(service, messages[0], Toast.LENGTH_LONG).show();
if(Settings.showToasts)
Toast.makeText(service, messages[0], Toast.LENGTH_LONG).show();
super.onProgressUpdate(messages);
}

View File

@ -225,7 +225,7 @@ public class ActivityManageActionSendBroadcast extends Activity
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3)
{
if(supportedIntentTypes[arg2].equals("int") || supportedIntentTypes[arg2].equals("long") || supportedIntentTypes[arg2].equals("short"))
ActivityManageActionSendBroadcast.this.etParameterValue.setInputType(InputType.TYPE_CLASS_NUMBER);
ActivityManageActionSendBroadcast.this.etParameterValue.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED);
else if(supportedIntentTypes[arg2].equals("double") || supportedIntentTypes[arg2].equals("float"))
ActivityManageActionSendBroadcast.this.etParameterValue.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL);
else

View File

@ -268,7 +268,7 @@ public class ActivityManageActionStartActivity extends Activity
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3)
{
if(supportedIntentTypes[arg2].equals("int") || supportedIntentTypes[arg2].equals("long") || supportedIntentTypes[arg2].equals("short"))
ActivityManageActionStartActivity.this.etParameterValue.setInputType(InputType.TYPE_CLASS_NUMBER);
ActivityManageActionStartActivity.this.etParameterValue.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED);
else if(supportedIntentTypes[arg2].equals("double") || supportedIntentTypes[arg2].equals("float"))
ActivityManageActionStartActivity.this.etParameterValue.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL);
else

View File

@ -34,6 +34,7 @@ import com.jens.automation2.receivers.PhoneStatusListener;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
@ -41,6 +42,7 @@ import java.util.Set;
public class AutomationService extends Service implements OnInitListener
{
protected TextToSpeech ttsEngine = null;
protected int ttsStatus = -1;
protected final static int notificationId = 1000;
protected final static int notificationIdRestrictions = 1005;
protected final static int notificationIdLocationRestriction = 1006;
@ -97,6 +99,11 @@ public class AutomationService extends Service implements OnInitListener
this.lockSoundChangesEnd = lockSoundChangesEnd;
}
public int getTtsStatus()
{
return ttsStatus;
}
protected final IBinder myBinder = new LocalBinder();
protected LocationProvider myLocationProvider;
@ -226,7 +233,8 @@ public class AutomationService extends Service implements OnInitListener
this.isRunning = true;
Miscellaneous.logEvent("i", "Service", this.getResources().getString(R.string.serviceStarted) + " VERSION_CODE: " + BuildConfig.VERSION_CODE + ", VERSION_NAME: " + BuildConfig.VERSION_NAME + ", flavor: " + BuildConfig.FLAVOR, 1);
Toast.makeText(this, this.getResources().getString(R.string.serviceStarted), Toast.LENGTH_LONG).show();
if(Settings.showToasts)
Toast.makeText(this, this.getResources().getString(R.string.serviceStarted), Toast.LENGTH_LONG).show();
/*
On normal phones the app is supposed to automatically restart in case of any problems.
@ -306,7 +314,8 @@ public class AutomationService extends Service implements OnInitListener
stopRoutine();
this.isRunning = false;
Toast.makeText(this, getResources().getString(R.string.serviceStopped), Toast.LENGTH_LONG).show();
if(Settings.showToasts)
Toast.makeText(this, getResources().getString(R.string.serviceStopped), Toast.LENGTH_LONG).show();
Miscellaneous.logEvent("i", "Service", getResources().getString(R.string.serviceStopped), 1);
}
@ -315,8 +324,26 @@ public class AutomationService extends Service implements OnInitListener
if (Settings.useTextToSpeechOnNormal || Settings.useTextToSpeechOnSilent || Settings.useTextToSpeechOnVibrate || Rule.isAnyRuleUsing(Action.Action_Enum.speakText))
{
if (ttsEngine == null)
ttsEngine = new TextToSpeech(this, this);
} else
{
ttsEngine = new TextToSpeech(this, new TextToSpeech.OnInitListener()
{
@Override
public void onInit(int status)
{
ttsStatus = status;
if (status == TextToSpeech.SUCCESS)
{
ttsEngine.setLanguage(Locale.getDefault());
Miscellaneous.logEvent("i", "TTS engine", "TTS engine available.", 3);
}
else
Miscellaneous.logEvent("i", "TTS engine", "TTS engine not available. Status: " + String.valueOf(status), 3);
}
});
}
}
else
{
if (ttsEngine != null)
ttsEngine.shutdown();
@ -671,25 +698,26 @@ public class AutomationService extends Service implements OnInitListener
{
try
{
for(int i = 0; i < 5; i++)
for(int i = 0; i < 60; i++)
{
if(ttsEngine != null)
{
break;
}
else
if(ttsEngine == null || ttsStatus != TextToSpeech.SUCCESS)
{
try
{
Miscellaneous.logEvent("i", "TTS", "Waiting for a moment to give the TTS service time to load...", 4);
Thread.sleep(1000); // give the tts engine time to load
Thread.sleep(500); // give the tts engine time to load
}
catch(Exception e)
{}
}
else
{
Miscellaneous.logEvent("i", "TextToSpeech", "Speaking \"" + text + "\" in language " + ttsEngine.getLanguage().toLanguageTag(), 3);
this.ttsEngine.speak(text, TextToSpeech.QUEUE_ADD, null);
break;
}
}
Miscellaneous.logEvent("i", "TextToSpeech", "Speaking " + text + " in language " + ttsEngine.getLanguage().toLanguageTag(), 3);
this.ttsEngine.speak(text, TextToSpeech.QUEUE_ADD, null);
Miscellaneous.logEvent("i", "TextToSpeech", "TTS engine not available after waiting 30 seconds, yet. Aborting.", 3);
}
catch(Exception e)
{

View File

@ -111,6 +111,8 @@ import androidx.documentfile.provider.DocumentFile;
public class Miscellaneous extends Service
{
protected static String writeableFolderStringCache = null;
public static Context startupContext;
public static final String lineSeparator = System.getProperty("line.separator");
public static String downloadURL(String url, String username, String password)
@ -273,7 +275,7 @@ public class Miscellaneous extends Service
{
writeToLogFile(type, header, description);
if(!logCleanerRunning && Math.random() < 0.1) // tidy up with 10% probability
if (!logCleanerRunning && Math.random() < 0.1) // tidy up with 10% probability
{
rotateLogFile(getLogFile());
}
@ -557,7 +559,10 @@ public class Miscellaneous extends Service
returnContext = ActivityPermissions.getInstance().getApplicationContext();
if(returnContext != null)
return returnContext;
if(startupContext != null)
return startupContext;
return null;
}

View File

@ -421,14 +421,18 @@ public class PointOfInterest implements Comparable<PointOfInterest>
public boolean create(Context context)
{
for(PointOfInterest poi : PointOfInterest.pointOfInterestCollection)
if(poi.getName().equals(this.getName()))
{
if (poi.getName().equals(this.getName()))
{
Toast.makeText(context, context.getResources().getString(R.string.anotherPoiByThatName), Toast.LENGTH_LONG).show();
return false;
}
}
if(plausibilityCheck())
{
Miscellaneous.logEvent("i", "Creating POI", this.toStringLong(), 3);
PointOfInterest.pointOfInterestCollection.add(this);
PointOfInterest.writePoisToFile();
@ -490,8 +494,10 @@ public class PointOfInterest implements Comparable<PointOfInterest>
Check for change of rule name END
*/
if (plausibilityCheck())
if(plausibilityCheck())
{
Miscellaneous.logEvent("i", "Changing POI", "Old name: " + this.oldName + ", new data: " + this.toStringLong(), 3);
if(PointOfInterest.writePoisToFile())
{
AutomationService service = AutomationService.getInstance();

View File

@ -65,6 +65,7 @@ public class Settings implements SharedPreferences
public static int tabsPlacement;
public static boolean executeRulesAndProfilesWithSingleClick;
public static boolean displayNewsOnMainScreen;
public static boolean showToasts;
public static boolean automaticUpdateCheck;
public static long musicCheckFrequency;
@ -130,6 +131,8 @@ public class Settings implements SharedPreferences
public static final int default_tabsPlacement = 0;
public static final boolean default_executeRulesAndProfilesWithSingleClick = false;
public static final boolean default_displayNewsOnMainScreen = false;
public static final boolean default_showToasts = true;
public static final boolean default_automaticUpdateCheck = false;
public static final boolean default_lockSoundChanges = false;
public static final long default_lastNewsPolltime = -1;
@ -277,6 +280,7 @@ public class Settings implements SharedPreferences
executeRulesAndProfilesWithSingleClick = prefs.getBoolean("executeRulesAndProfilesWithSingleClick", default_executeRulesAndProfilesWithSingleClick);
automaticUpdateCheck = prefs.getBoolean("automaticUpdateCheck", default_automaticUpdateCheck);
displayNewsOnMainScreen = prefs.getBoolean("displayNewsOnMainScreen", default_displayNewsOnMainScreen);
showToasts = prefs.getBoolean("showToasts", default_showToasts);
lockSoundChanges = prefs.getBoolean("lockSoundChanges", default_lockSoundChanges);
noticeAndroid9MicrophoneShown = prefs.getBoolean("noticeAndroid9MicrophoneShown", false);
@ -472,6 +476,9 @@ public class Settings implements SharedPreferences
if(!prefs.contains("displayNewsOnMainScreen") || force)
editor.putBoolean("displayNewsOnMainScreen", default_displayNewsOnMainScreen);
if(!prefs.contains("showToasts") || force)
editor.putBoolean("showToasts", default_showToasts);
if(!prefs.contains("musicCheckFrequency") || force)
editor.putLong("musicCheckFrequency", default_musicCheckFrequency);
@ -555,6 +562,7 @@ public class Settings implements SharedPreferences
editor.putBoolean("executeRulesAndProfilesWithSingleClick", executeRulesAndProfilesWithSingleClick);
editor.putBoolean("automaticUpdateCheck", automaticUpdateCheck);
editor.putBoolean("displayNewsOnMainScreen", displayNewsOnMainScreen);
editor.putBoolean("showToasts", showToasts);
if(Settings.musicCheckFrequency == 0)
Settings.musicCheckFrequency = Settings.default_musicCheckFrequency;

View File

@ -11,12 +11,13 @@ import com.jens.automation2.Settings;
public class StartupIntentReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
Settings.readFromPersistentStorage(context);
Miscellaneous.startupContext = context;
// Miscellaneous.logEvent("i", "Boot event", "Received event: " + intent.getAction(), 5);
if(Settings.startServiceAtSystemBoot)

View File

@ -74,7 +74,12 @@
android:title="@string/displayNewsOnMainScreen"
android:summary="@string/displayNewsOnMainScreenDescription" />
</PreferenceCategory>
<CheckBoxPreference
android:key="showToasts"
android:title="@string/showToastsForEvents"
android:summary="@string/showToastsForEventsSummary" />
</PreferenceCategory>
<PreferenceCategory
android:summary="@string/soundSettings"

View File

@ -771,4 +771,12 @@
<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="variableCheckStringDeleted">wenn Variable %1$s nicht gesetzt ist</string>
<string name="messageType">Nachrichtentyp</string>
<string name="sms">SMS</string>
<string name="mms">MMS</string>
<string name="attachment">Dateianhang</string>
<string name="chooseFile">Datei wählen</string>
<string name="startAppByStartService">via startService()</string>
<string name="showToastsForEvents">Toasts anzeigen</string>
<string name="showToastsForEventsSummary">Popups anzeigen, wenn Ereignisse wie Regelausführungen auftreten</string>
</resources>

View File

@ -770,4 +770,12 @@
<string name="VariableKey">Clave variable</string>
<string name="deleteVariable">Eliminar variable</string>
<string name="setVariable">Establecer una variable</string>
<string name="messageType">Tipo de mensaje</string>
<string name="sms">SMS</string>
<string name="mms">MMS</string>
<string name="attachment">Archivo adjunto</string>
<string name="chooseFile">elegir archivo</string>
<string name="startAppByStartService">via startService()</string>
<string name="showToastsForEvents">Mostrar toasts</string>
<string name="showToastsForEventsSummary">Mostrar notificaciones del sistema cuando se producen eventos como ejecuciones de reglas</string>
</resources>

View File

@ -117,7 +117,7 @@
<string name="helpTextTimeFrame">Si vous créez une règle avec une période déxécution vous avez deux options. Vous pouvez choisir déxécuter dans la période OU hors de la période. Quel que soit votre choix laction ne sera déclenchée quune seule fois. Si vous créez une règle avec pour déclencheur \«dans la période xyz\» qui modifie votre profil audio en le passant en mode vibreur cela ne signifie pas que votre téléphone repassera automatiquement en mode sonnerie à la fin de la période. Si vous souhaitez le faire vous devez définir une autre règle avec une autre période.</string>
<string name="helpTextSound">Sur lécran principal vous pouvez utiliser le verrouillage des modifications audio pour temporairement ne pas utiliser les règles de changement des paramètres audio. Par exemple vous pouvez êtes dans un lieu où à un moment où les sonneries peuvent être dérangeantes. Cette fonctionnalité se désactivera automatiquement une fois le temps configuré écoulé. Appuyez sur le bouton +15min pour ajouter la durée souhaitée. Une fois activé vous pouvez le désactiver en appuyant sur le bouton \«OUI\» (la règle de gestion des paramètres audio sera de nouveau active).</string>
<string name="toggableRules">Inverser la règle</string>
<string name="helpTextToggable">Les règles ont une option appelée \«Inversion\». Si une règle est exécutée et que les mêmes déclencheurs sappliquent à nouveau, la règle sera exécutée dans le sens opposé. Pour linstant, cela nest possible qu'avec les étiquettes NFC : si vous les touchez deux fois et que loption est activée, cela fera linverse des actions demandées. Par exemple désactiver le wifi sil est actuellement actif.</string>
<string name="helpTextToggable">Les règles ont une option appelée \«Inversion\». Si une règle est exécutée et que les mêmes déclencheurs sappliquent à nouveau, la règle sera exécutée dans le sens opposé. Pour linstant, cela nest possible qu\'avec les étiquettes NFC : si vous les touchez deux fois et que loption est activée, cela fera linverse des actions demandées. Par exemple désactiver le wifi sil est actuellement actif.</string>
<string name="helpTextProcessMonitoring">Si vous spécifiez une règle avec une surveillance de processus, lapplication vérifira ce processus toutes les xsecondes (vous pouvez modifier cette variable dans les réglages). Cela peut être un peu lent, mais un contrôle continu viderait la batterie trop vite, et il ny a pas de transmission de lOS pour cet événement.</string>
<string name="helpTitleEnergySaving">Économie dénergie</string>
<string name="helpTextEnergySaving">Beaucoup de marques dappareils Android essaient déconomiser en limitant les activités des applications en arrière-plan. Malheureusement cela signifie souvent ques ces applications ne fonctionnent pas correctement, Automation en fait partie. Consultez cette <a href="https://dontkillmyapp.com/">page web</a> pour savoir comment exclure Automation de ces restrictions.</string>
@ -274,6 +274,7 @@
<string name="with">avec</string>
<string name="phoneNumber">Numéro de téléphone</string>
<string name="enterPhoneNumberBlankForAny">Saisissez un numéro de téléphone. Laissez vide pour nimporte quel numéro.</string>
<string name="enterPhoneNumber">Entrez le numéro de téléphone.</string>
<string name="phoneDirection">Sélectionnez le type \ndappel</string>
<string name="any">tout</string>
<string name="incoming">entrant</string>
@ -769,4 +770,12 @@
<string name="VariableKey">Clé variable</string>
<string name="deleteVariable">Supprimer la variable</string>
<string name="setVariable">Définir une variable</string>
<string name="messageType">Type de message</string>
<string name="sms">SMS</string>
<string name="mms">MMS</string>
<string name="attachment">Attachement</string>
<string name="chooseFile">Choisissez un fichier</string>
<string name="startAppByStartService">via startService()</string>
<string name="showToastsForEvents">Afficher les toasts</string>
<string name="showToastsForEventsSummary">Afficher les toasts lorsque des événements tels que des exécutions de règles se produisent</string>
</resources>

View File

@ -771,4 +771,12 @@
<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="variableCheckStringDeleted">Se la variabile %1$s non è impostata</string>
<string name="messageType">Tipo di messaggio</string>
<string name="sms">SMS</string>
<string name="mms">MMS</string>
<string name="attachment">Allegato</string>
<string name="chooseFile">Scegli file</string>
<string name="startAppByStartService">tramite startService()</string>
<string name="showToastsForEvents">Mostra toast</string>
<string name="showToastsForEventsSummary">Mostrare gli avvisi popup quando si verificano eventi come le esecuzioni di regole</string>
</resources>

View File

@ -769,5 +769,13 @@
<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="variableCheckStringDeleted">als variabele %1$s niet is ingesteld</string>
<string name="messageType">Type bericht</string>
<string name="sms">SMS</string>
<string name="mms">MMS</string>
<string name="attachment">Bijlage</string>
<string name="chooseFile">kies bestand</string>
<string name="startAppByStartService">via startService()</string>
<string name="showToastsForEvents">Toon toasts</string>
<string name="showToastsForEventsSummary">Pop-ups weergeven wanneer gebeurtenissen zoals regeluitvoeringen plaatsvinden</string>
</resources>

View File

@ -828,4 +828,12 @@
<string name="checkVariableExplanation">Если оставить значение пустым, переменная не должна быть задана для того, чтобы условие возвращало значение true.</string>
<string name="variableCheckString">если переменная %1$s равно %2$s</string>
<string name="variableCheckStringDeleted">Если переменная %1$s не задана</string>
<string name="messageType">Тип сообщения</string>
<string name="sms">SMS</string>
<string name="mms">MMS</string>
<string name="attachment">Прикрепление</string>
<string name="chooseFile">выберите файл</string>
<string name="startAppByStartService">дорога startService()</string>
<string name="showToastsForEvents">Показать тосты</string>
<string name="showToastsForEventsSummary">Отображение всплывающих уведомлений при таких событиях, как выполнение правил</string>
</resources>

View File

@ -874,4 +874,6 @@
<string name="attachment">Attachment</string>
<string name="chooseFile">choose file</string>
<string name="startAppByStartService">by startService()</string>
<string name="showToastsForEvents">Show toasts</string>
<string name="showToastsForEventsSummary">Show toasts when events like rule executions occur</string>
</resources>

View File

@ -0,0 +1,4 @@
* Behoben: Negative Ganzzahlen werden als Intent-Parameter akzeptiert
* Behoben: Mehrere parallele Zeiträume mit Wiederholung konnten dazu führen, daß alle zu häufig ausgeführt wurden
* Behoben: Automatischer Start der Anwendung beim Gerätestart konnte in manchen Fällen scheitern
* Übersetzungen aktualisiert

View File

@ -0,0 +1,2 @@
* Behoben: Sprachausgabe hat nicht immer funktioniert, vor allem beim Programmstart
* Neu: Möglichkeit Toasts zu deaktivieren, z.B. für Regel-Aktivierungen

View File

@ -0,0 +1,4 @@
* Fixed: Now allowing negative integers as intent data
* Fixed: Multiple time frames with reoccurrence configured would trigger to early executions
* Fixed: Automatic app start at boot might fail in some cases
* Translations updated

View File

@ -0,0 +1,2 @@
* Fixed: TTS engine wouldn't always speak, especially at the startup of the app
* Added: Possibility to disable toasts for e.g. announcing rule activations

View File

@ -0,0 +1,4 @@
* Corregido: Ahora permite enteros negativos como datos de intención
* Corregido: Múltiples marcos de tiempo con la repetición configurada se desencadenarían en ejecuciones tempranas
* Corregido: el inicio automático de la aplicación en el arranque puede fallar en algunos casos
* Traducciones actualizadas

View File

@ -0,0 +1,2 @@
* Corregido: el motor TTS no siempre hablaba, especialmente al inicio de la aplicación
* Añadido: Posibilidad de desactivar las notificaciones del sistema para, por ejemplo, anunciar activaciones de reglas

View File

@ -0,0 +1,4 @@
* Correction : Autorise désormais les entiers négatifs comme données d'intention
* Correction : Plusieurs délais avec récurrence configurée déclenchaient des exécutions anticipées
* Correction : le démarrage automatique de l'application au démarrage peut échouer dans certains cas
* Traductions mises à jour

View File

@ -0,0 +1,2 @@
* Correction : le moteur TTS ne parlait pas toujours, surtout au démarrage de l'application
* Ajouté: Possibilité de désactiver les toasts pour, par exemple, annoncer les activations de règles

View File

@ -0,0 +1,4 @@
* Risolto: ora consente numeri interi negativi come dati di intento
* Risolto: più intervalli di tempo con ripetizione configurata si attiverebbero per le esecuzioni anticipate
* Risolto: l'avvio automatico dell'app all'avvio potrebbe non riuscire in alcuni casi
* Traduzioni aggiornate

View File

@ -0,0 +1,2 @@
* Risolto: il motore TTS non parlava sempre, specialmente all'avvio dell'app
* Aggiunto: Possibilità di disabilitare gli avvisi popup ad esempio per annunciare l'attivazione delle regole

View File

@ -0,0 +1,4 @@
* Opgelost: nu negatieve gehele getallen toestaan als intentiegegevens
* Opgelost: Meerdere tijdframes met reoccurence geconfigureerd zouden leiden tot vroege uitvoeringen
* Opgelost: Automatische app-start bij het opstarten kan in sommige gevallen mislukken
* Vertalingen bijgewerkt

View File

@ -0,0 +1,2 @@
* Opgelost: TTS-engine zou niet altijd spreken, vooral bij het opstarten van de app
* Toegevoegd: Mogelijkheid om toasts uit te schakelen voor bijvoorbeeld het aankondigen van regelactiveringen

View File

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

View File

@ -0,0 +1,2 @@
* Исправлено: движок TTS не всегда говорил, особенно при запуске приложения
* Добавлено: Возможность отключения всплывающих уведомлений, например, для объявления активации правил