Compare commits

..

No commits in common. "e11cc09da22a9a76d6eaa32ccd66f6b97bc52317" and "7bc858fee312cd601d5ebf695dc270f1667acc68" have entirely different histories.

59 changed files with 198 additions and 2332 deletions

2
.gitignore vendored
View File

@ -145,7 +145,7 @@ fabric.properties
# End of https://www.toptal.com/developers/gitignore/api/androidstudio # End of https://www.toptal.com/developers/gitignore/api/androidstudio
output-metadata.json
/app/app-release.apk /app/app-release.apk
Automation_settings.xml Automation_settings.xml
/app/googlePlayFlavor/ /app/googlePlayFlavor/

View File

@ -72,9 +72,9 @@ dependencies {
//implementation "androidx.security:security-crypto:1.0.0" //implementation "androidx.security:security-crypto:1.0.0"
//implementation "androidx.security:security-identity-credential:1.0.0-alpha02" //implementation "androidx.security:security-identity-credential:1.0.0-alpha02"
implementation 'androidx.appcompat:appcompat:1.4.2' implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'com.google.android.material:material:1.6.1' implementation 'com.google.android.material:material:1.3.0'
testImplementation 'junit:junit:4' testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
} }

View File

@ -0,0 +1,20 @@
{
"version": 3,
"artifactType": {
"type": "APK",
"kind": "Directory"
},
"applicationId": "com.jens.automation2",
"variantName": "googlePlayFlavorRelease",
"elements": [
{
"type": "SINGLE",
"filters": [],
"attributes": [],
"versionCode": 121,
"versionName": "1.7.6-googlePlay",
"outputFile": "app-googlePlayFlavor-release.apk"
}
],
"elementType": "File"
}

View File

@ -169,8 +169,6 @@
<activity android:name=".ActivityManageActionRunExecutable" /> <activity android:name=".ActivityManageActionRunExecutable" />
<activity android:name=".ActivityManageActionWifi" /> <activity android:name=".ActivityManageActionWifi" />
<activity android:name=".ActivityManageTriggerTethering" /> <activity android:name=".ActivityManageTriggerTethering" />
<activity android:name=".ActivityManageActionWakeLock" />
<activity android:name=".ActivityManageTriggerSubSystemState" />
<activity <activity
android:name=".ActivityMainTabLayout" android:name=".ActivityMainTabLayout"
android:launchMode="singleTask"> android:launchMode="singleTask">

View File

@ -396,7 +396,7 @@ public class Rule implements Comparable<Rule>
return true; return true;
} }
Miscellaneous.logEvent("i", String.format(context.getResources().getString(R.string.ruleCheckOf), this.getName()), String.format(context.getResources().getString(R.string.ruleIsDeactivatedCantApply), this.getName()), 4); Miscellaneous.logEvent("i", String.format(context.getResources().getString(R.string.ruleCheckOf), this.getName()), String.format(context.getResources().getString(R.string.ruleIsDeactivatedCantApply), this.getName()), 3);
return false; return false;
} }

View File

@ -167,8 +167,6 @@
<activity android:name=".ActivityManageActionRunExecutable" /> <activity android:name=".ActivityManageActionRunExecutable" />
<activity android:name=".ActivityManageActionWifi" /> <activity android:name=".ActivityManageActionWifi" />
<activity android:name=".ActivityManageTriggerTethering" /> <activity android:name=".ActivityManageTriggerTethering" />
<activity android:name=".ActivityManageActionWakeLock" />
<activity android:name=".ActivityManageTriggerSubSystemState" />
<activity <activity
android:name=".ActivityMainTabLayout" android:name=".ActivityMainTabLayout"
android:launchMode="singleTask"> android:launchMode="singleTask">

View File

@ -393,7 +393,7 @@ public class Rule implements Comparable<Rule>
return true; return true;
} }
Miscellaneous.logEvent("i", String.format(context.getResources().getString(R.string.ruleCheckOf), this.getName()), String.format(context.getResources().getString(R.string.ruleIsDeactivatedCantApply), this.getName()), 4); Miscellaneous.logEvent("i", String.format(context.getResources().getString(R.string.ruleCheckOf), this.getName()), String.format(context.getResources().getString(R.string.ruleIsDeactivatedCantApply), this.getName()), 3);
return false; return false;
} }

View File

@ -154,8 +154,6 @@
<activity android:name=".ActivityManageActionRunExecutable" /> <activity android:name=".ActivityManageActionRunExecutable" />
<activity android:name=".ActivityManageActionWifi" /> <activity android:name=".ActivityManageActionWifi" />
<activity android:name=".ActivityManageTriggerTethering" /> <activity android:name=".ActivityManageTriggerTethering" />
<activity android:name=".ActivityManageActionWakeLock" />
<activity android:name=".ActivityManageTriggerSubSystemState" />
<activity <activity
android:name=".ActivityMainTabLayout" android:name=".ActivityMainTabLayout"
android:launchMode="singleTask"> android:launchMode="singleTask">

View File

@ -396,7 +396,7 @@ public class Rule implements Comparable<Rule>
return true; return true;
} }
Miscellaneous.logEvent("i", String.format(context.getResources().getString(R.string.ruleCheckOf), this.getName()), String.format(context.getResources().getString(R.string.ruleIsDeactivatedCantApply), this.getName()), 4); Miscellaneous.logEvent("i", String.format(context.getResources().getString(R.string.ruleCheckOf), this.getName()), String.format(context.getResources().getString(R.string.ruleIsDeactivatedCantApply), this.getName()), 3);
return false; return false;
} }

View File

@ -1,4 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <manifest xmlns:android="http://schemas.android.com/apk/res/android">
</manifest> </manifest>

View File

@ -53,7 +53,6 @@ public class Action
closeNotification, closeNotification,
sendBroadcast, sendBroadcast,
runExecutable, runExecutable,
wakelock,
sendTextMessage; sendTextMessage;
public String getFullName(Context context) public String getFullName(Context context)
@ -128,8 +127,6 @@ public class Action
return context.getResources().getString(R.string.sendBroadcast); return context.getResources().getString(R.string.sendBroadcast);
case runExecutable: case runExecutable:
return context.getResources().getString(R.string.runExecutable); return context.getResources().getString(R.string.runExecutable);
case wakelock:
return context.getResources().getString(R.string.keepDeviceAwake);
default: default:
return "Unknown"; return "Unknown";
} }
@ -276,9 +273,6 @@ public class Action
case runExecutable: case runExecutable:
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.runExecutable)); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.runExecutable));
break; break;
case wakelock:
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.keepDeviceAwake) + " (" + String.valueOf(getParameter1()) + ")");
break;
default: default:
returnString.append(action.toString()); returnString.append(action.toString());
} }
@ -336,14 +330,6 @@ public class Action
if (parts.length > 4 && !StringUtils.isBlank(parts[4])) if (parts.length > 4 && !StringUtils.isBlank(parts[4]))
returnString.append(", " + Miscellaneous.getAnyContext().getResources().getString(R.string.ifString) + " " + Miscellaneous.getAnyContext().getResources().getString(R.string.text) + " " + Trigger.getMatchString(parts[3]) + " " + parts[4]); returnString.append(", " + Miscellaneous.getAnyContext().getResources().getString(R.string.ifString) + " " + Miscellaneous.getAnyContext().getResources().getString(R.string.text) + " " + Trigger.getMatchString(parts[3]) + " " + parts[4]);
if(parts.length >= 6)
{
if(!parts[5].equals(ActivityManageActionCloseNotification.dismissRegularString))
{
returnString.append(" " + String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.withButton), parts[5]));
}
}
} }
else if(this.getAction().equals(Action_Enum.setWifi)) else if(this.getAction().equals(Action_Enum.setWifi))
{ {
@ -499,7 +485,7 @@ public class Action
Actions.setUsbTethering(context, getParameter1(), toggleActionIfPossible); Actions.setUsbTethering(context, getParameter1(), toggleActionIfPossible);
break; break;
case setWifi: case setWifi:
Actions.WifiStuff.setWifi(context, getParameter1(), getParameter2(), toggleActionIfPossible); Actions.WifiStuff.setWifi(context, getParameter1(), toggleActionIfPossible);
break; break;
case setWifiTethering: case setWifiTethering:
Actions.setWifiTethering(context, getParameter1(), toggleActionIfPossible); Actions.setWifiTethering(context, getParameter1(), toggleActionIfPossible);
@ -584,12 +570,6 @@ public class Action
else if(execParts.length == 2) else if(execParts.length == 2)
Actions.runExecutable(context, this.getParameter1(), execParts[0], execParts[1]); Actions.runExecutable(context, this.getParameter1(), execParts[0], execParts[1]);
break; break;
case wakelock:
if(this.getParameter1())
Actions.wakeLockStart(context, Long.parseLong(this.getParameter2()));
else
Actions.wakeLockStop();
break;
default: default:
Miscellaneous.logEvent("w", "Action", context.getResources().getString(R.string.unknownActionSpecified), 3); Miscellaneous.logEvent("w", "Action", context.getResources().getString(R.string.unknownActionSpecified), 3);
break; break;

View File

@ -36,7 +36,6 @@ import android.view.KeyEvent;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.RequiresApi; import androidx.annotation.RequiresApi;
import androidx.legacy.content.WakefulBroadcastReceiver;
import com.jens.automation2.actions.wifi_router.MyOnStartTetheringCallback; import com.jens.automation2.actions.wifi_router.MyOnStartTetheringCallback;
import com.jens.automation2.actions.wifi_router.MyOreoWifiManager; import com.jens.automation2.actions.wifi_router.MyOreoWifiManager;
@ -44,7 +43,6 @@ import com.jens.automation2.location.WifiBroadcastReceiver;
import com.jens.automation2.receivers.ConnectivityReceiver; import com.jens.automation2.receivers.ConnectivityReceiver;
import com.jens.automation2.receivers.NotificationListener; import com.jens.automation2.receivers.NotificationListener;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.http.client.HttpClient; import org.apache.http.client.HttpClient;
import org.apache.http.conn.ClientConnectionManager; import org.apache.http.conn.ClientConnectionManager;
@ -84,6 +82,10 @@ public class Actions
public static AutomationService automationServerRef; public static AutomationService automationServerRef;
public static Context context; public static Context context;
private static Intent playMusicIntent; private static Intent playMusicIntent;
private static boolean suAvailable = false;
private static String suVersion = null;
private static String suVersionInternal = null;
private static List<String> suResult = null;
public final static String smsSeparator = "&sms&"; public final static String smsSeparator = "&sms&";
public final static String dummyPackageString = "dummyPkg239asd"; public final static String dummyPackageString = "dummyPkg239asd";
@ -125,14 +127,11 @@ public class Actions
String myTitleDir = params[1]; String myTitleDir = params[1];
String requiredTitle = params[2]; String requiredTitle = params[2];
String myTextDir = params[3]; String myTextDir = params[3];
String requiredText = ""; String requiredText;
String method = ActivityManageActionCloseNotification.dismissRegularString; if (params.length >= 5)
if(params.length >= 5)
requiredText = params[4]; requiredText = params[4];
else
if(params.length >= 6 && !params[5].equals(ActivityManageActionCloseNotification.dismissRegularString)) requiredText = "";
method = params[5];
for (StatusBarNotification sbn : NotificationListener.getInstance().getActiveNotifications()) for (StatusBarNotification sbn : NotificationListener.getInstance().getActiveNotifications())
{ {
@ -186,12 +185,7 @@ public class Actions
Miscellaneous.logEvent("i", "NotificationCloseCheck", "All criteria matches. Closing notification: " + sbn.getNotification().toString(), 3); Miscellaneous.logEvent("i", "NotificationCloseCheck", "All criteria matches. Closing notification: " + sbn.getNotification().toString(), 3);
if(NotificationListener.getInstance() != null) if(NotificationListener.getInstance() != null)
{
if(method == ActivityManageActionCloseNotification.dismissRegularString)
NotificationListener.getInstance().dismissNotification(sbn); NotificationListener.getInstance().dismissNotification(sbn);
else
NotificationListener.getInstance().clickNotificationButton(sbn, method);
}
else else
Miscellaneous.logEvent("i", "NotificationCloseCheck", "NotificationListener instance is null. Can\'t close notification.", 3); Miscellaneous.logEvent("i", "NotificationCloseCheck", "NotificationListener instance is null. Can\'t close notification.", 3);
} }
@ -220,20 +214,9 @@ public class Actions
public static class WifiStuff public static class WifiStuff
{ {
public static Boolean setWifi(Context context, Boolean desiredState, String parameter2, boolean toggleActionIfPossible) public static Boolean setWifi(Context context, Boolean desiredState, boolean toggleActionIfPossible)
{ {
boolean forceUseRoot = false; if(context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.Q)
try
{
forceUseRoot = Boolean.parseBoolean(parameter2);
}
catch(Exception e)
{
}
if(context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.Q || forceUseRoot)
return setWifiWithRoot(context, desiredState, toggleActionIfPossible); return setWifiWithRoot(context, desiredState, toggleActionIfPossible);
else else
return setWifiOldFashioned(context, desiredState, toggleActionIfPossible); return setWifiOldFashioned(context, desiredState, toggleActionIfPossible);
@ -269,15 +252,8 @@ public class Actions
{ {
Miscellaneous.logEvent("i", "Wifi", "Changing wifi to " + String.valueOf(desiredState), 4); Miscellaneous.logEvent("i", "Wifi", "Changing wifi to " + String.valueOf(desiredState), 4);
try
{
if (desiredState && Settings.useWifiForPositioning) if (desiredState && Settings.useWifiForPositioning)
WifiBroadcastReceiver.startWifiReceiver(automationServerRef.getLocationProvider()); WifiBroadcastReceiver.startWifiReceiver(automationServerRef.getLocationProvider());
}
catch(Exception e)
{
Miscellaneous.logEvent("w", "setWifiOldFashioned()", Log.getStackTraceString(e), 4);
}
WifiManager myWifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); WifiManager myWifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
@ -1888,12 +1864,6 @@ public class Actions
protected static boolean executeCommandViaSu(String[] commands) protected static boolean executeCommandViaSu(String[] commands)
{ {
boolean suAvailable = false;
String suVersion = null;
String suVersionInternal = null;
// List<String> suResult = null;
int suResult;
boolean success = false; boolean success = false;
try try
@ -1903,30 +1873,17 @@ public class Actions
{ {
suVersion = Shell.SU.version(false); suVersion = Shell.SU.version(false);
suVersionInternal = Shell.SU.version(true); suVersionInternal = Shell.SU.version(true);
suResult = Shell.SU.run(commands);
Miscellaneous.logEvent("i", "executeCommandViaSu()", "suVersion: " + suVersion + ", suVersionInternal: " + suVersionInternal, 5); if (suResult != null)
// suResult = Shell.SU.run(commands);
suResult = Shell.Pool.SU.run(commands);
// if (suResult != null)
// success = true;
Miscellaneous.logEvent("i", "executeCommandViaSu()", "RC=" + String.valueOf(suResult), 3);
if(suResult == 0)
success = true; success = true;
} }
else
Miscellaneous.logEvent("w", "executeCommandViaSu()", "su not available.", 4);
} }
catch (Exception e) catch (Exception e)
{ {
success = false; success = false;
} }
Miscellaneous.logEvent("i", "executeCommandViaSu()", "Returning " + String.valueOf(success), 4);
return success; return success;
} }
@ -2135,61 +2092,4 @@ public class Actions
return false; return false;
} }
public final static int wakeLockTimeoutDisabled = -1;
static boolean wakeLockStopRequested = false;
public static void wakeLockStart(Context context, long duration)
{
Thread lockThread = new Thread(new Runnable()
{
@Override
public void run()
{
wakeLockStopRequested = false;
long waited = 0;
int step = 2000;
try
{
PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock fullWakeLock = powerManager.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "Loneworker - FULL WAKE LOCK");
fullWakeLock.acquire(); // turn on
do
{
try
{
Thread.sleep(step); // turn on duration
}
catch (InterruptedException e)
{
e.printStackTrace();
}
if(duration > 0)
waited += step;
if(wakeLockStopRequested) //stop requested
Miscellaneous.logEvent("i", "WakeLockStart", "Stop requested.", 4);
}
while(!wakeLockStopRequested && (duration < 0 || waited <= duration));
fullWakeLock.release();
}
catch (Exception e)
{
}
}
});
lockThread.start();
}
public static void wakeLockStop()
{
Miscellaneous.logEvent("i", "WakeLockStart", "Requesting stop.", 4);
wakeLockStopRequested = true;
}
} }

View File

@ -16,12 +16,9 @@ import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.Button; import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.EditText; import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.Spinner; import android.widget.Spinner;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -42,16 +39,13 @@ public class ActivityManageActionCloseNotification extends Activity
boolean edit = false; boolean edit = false;
ProgressDialog progressDialog = null; ProgressDialog progressDialog = null;
EditText etNotificationTitle, etNotificationText, etNotificationDismissalButtonText; EditText etNotificationTitle, etNotificationText;
Button bSelectApp, bSaveActionCloseNotification; Button bSelectApp, bSaveActionCloseNotification;
Spinner spinnerTitleDirection, spinnerTextDirection; Spinner spinnerTitleDirection, spinnerTextDirection;
TextView tvSelectedApplication; TextView tvSelectedApplication;
RadioButton rbNotificationDismissSimple, rbNotificationDismissButton;
private static List<PackageInfo> pInfos = null; private static List<PackageInfo> pInfos = null;
final static String dismissRegularString = "p0815DismissString";
private static String[] directions; private static String[] directions;
ArrayAdapter<String> directionSpinnerAdapter; ArrayAdapter<String> directionSpinnerAdapter;
@ -268,9 +262,6 @@ public class ActivityManageActionCloseNotification extends Activity
spinnerTitleDirection = (Spinner)findViewById(R.id.spinnerTitleDirection); spinnerTitleDirection = (Spinner)findViewById(R.id.spinnerTitleDirection);
spinnerTextDirection = (Spinner)findViewById(R.id.spinnerTextDirection); spinnerTextDirection = (Spinner)findViewById(R.id.spinnerTextDirection);
tvSelectedApplication = (TextView)findViewById(R.id.etActivityOrActionPath); tvSelectedApplication = (TextView)findViewById(R.id.etActivityOrActionPath);
etNotificationDismissalButtonText = (EditText)findViewById(R.id.etNotificationDismissalButtonText);
rbNotificationDismissSimple = (RadioButton)findViewById(R.id.rbNotificationDismissSimple);
rbNotificationDismissButton = (RadioButton)findViewById(R.id.rbNotificationDismissButton);
directions = new String[] { directions = new String[] {
getResources().getString(R.string.directionStringEquals), getResources().getString(R.string.directionStringEquals),
@ -303,7 +294,7 @@ public class ActivityManageActionCloseNotification extends Activity
public void onClick(View v) public void onClick(View v)
{ {
String app; String app;
if (tvSelectedApplication.getText().toString().equalsIgnoreCase(getResources().getString(R.string.anyApp))) if(tvSelectedApplication.getText().toString().equalsIgnoreCase(getResources().getString(R.string.anyApp)))
app = Trigger.anyAppString; app = Trigger.anyAppString;
else else
app = tvSelectedApplication.getText().toString(); app = tvSelectedApplication.getText().toString();
@ -314,41 +305,31 @@ public class ActivityManageActionCloseNotification extends Activity
String text = etNotificationText.getText().toString(); String text = etNotificationText.getText().toString();
Intent responseData = new Intent(); Intent responseData = new Intent();
if(edit)
String dismissMethod;
if (rbNotificationDismissSimple.isChecked())
dismissMethod = dismissRegularString;
else
{ {
if(StringUtils.isEmpty(etNotificationDismissalButtonText.getText().toString())) // editedNotificationAction.setTriggerParameter(chkNotificationDirection.isChecked());
{ responseData.putExtra(ActivityManageRule.intentNameActionParameter2, app + Action.actionParameter2Split + titleDir + Action.actionParameter2Split + title + Action.actionParameter2Split + textDir + Action.actionParameter2Split + text);
Toast.makeText(ActivityManageActionCloseNotification.this, getResources().getString(R.string.enterText), Toast.LENGTH_LONG).show(); ActivityManageActionCloseNotification.this.setResult(RESULT_OK, responseData);
return;
} }
else else
dismissMethod = etNotificationDismissalButtonText.getText().toString(); {
} // data.putExtra(intentNameNotificationDirection, chkNotificationDirection.isChecked());
responseData.putExtra(ActivityManageRule.intentNameActionParameter2, responseData.putExtra(ActivityManageRule.intentNameActionParameter2,
app + Action.actionParameter2Split + app + Action.actionParameter2Split +
titleDir + Action.actionParameter2Split + titleDir + Action.actionParameter2Split +
title + Action.actionParameter2Split + title + Action.actionParameter2Split +
textDir + Action.actionParameter2Split + textDir + Action.actionParameter2Split +
text + Action.actionParameter2Split + text
dismissMethod
); );
// data.putExtra(intentNameNotificationApp, app);
// data.putExtra(intentNameNotificationTitleDir, titleDir);
// data.putExtra(intentNameNotificationTitle, title);
// data.putExtra(intentNameNotificationTextDir, textDir);
// data.putExtra(intentNameNotificationText, text);
ActivityManageActionCloseNotification.this.setResult(RESULT_OK, responseData); ActivityManageActionCloseNotification.this.setResult(RESULT_OK, responseData);
finish();
} }
});
rbNotificationDismissSimple.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() finish();
{
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b)
{
etNotificationDismissalButtonText.setEnabled(!b);
} }
}); });
@ -374,24 +355,6 @@ public class ActivityManageActionCloseNotification extends Activity
else else
text = ""; text = "";
/*
That's not reliable, yet. Last parameter may be empty, hence the method might
be incorrectly interpreted as a text notification text.
*/
if (params.length >= 6 && !params[5].equals(dismissRegularString))
{
rbNotificationDismissButton.setChecked(true);
etNotificationDismissalButtonText.setText(params[5]);
etNotificationDismissalButtonText.setEnabled(true);
}
else
{
rbNotificationDismissSimple.setChecked(true);
etNotificationDismissalButtonText.setText("");
etNotificationDismissalButtonText.setEnabled(false);
}
if(!app.equals(Trigger.anyAppString)) if(!app.equals(Trigger.anyAppString))
tvSelectedApplication.setText(app); tvSelectedApplication.setText(app);

View File

@ -1,99 +0,0 @@
package com.jens.automation2;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.Toast;
import androidx.annotation.Nullable;
import org.apache.commons.lang3.StringUtils;
public class ActivityManageActionWakeLock extends Activity
{
RadioButton rbWakeLockActivate, rbWakeLockDeactivate;
CheckBox chkWakeLockTimeout;
EditText etWakeLockDuration;
Button bSaveWakelock;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_manage_action_wakelock);
rbWakeLockActivate = (RadioButton)findViewById(R.id.rbWakeLockActivate);
rbWakeLockDeactivate = (RadioButton)findViewById(R.id.rbWakeLockDeactivate);
chkWakeLockTimeout = (CheckBox)findViewById(R.id.chkWakeLockTimeout);
etWakeLockDuration = (EditText)findViewById(R.id.etWakeLockDuration);
bSaveWakelock = (Button)findViewById(R.id.bSaveWakelock);
etWakeLockDuration.setEnabled(chkWakeLockTimeout.isChecked());
chkWakeLockTimeout.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean wakeLockTimeoutSet)
{
etWakeLockDuration.setEnabled(wakeLockTimeoutSet);
if(wakeLockTimeoutSet)
etWakeLockDuration.setText(String.valueOf(Actions.wakeLockTimeoutDisabled));
}
});
if(getIntent().hasExtra(ActivityManageRule.intentNameActionParameter1))
{
rbWakeLockActivate.setChecked(getIntent().getBooleanExtra(ActivityManageRule.intentNameActionParameter1, true));
rbWakeLockDeactivate.setChecked(!getIntent().getBooleanExtra(ActivityManageRule.intentNameActionParameter1, false));
if(getIntent().hasExtra(ActivityManageRule.intentNameActionParameter2))
{
if(Miscellaneous.isNumeric(getIntent().getStringExtra(ActivityManageRule.intentNameActionParameter2)))
{
long timeout = Long.parseLong((getIntent().getStringExtra(ActivityManageRule.intentNameActionParameter2)));
chkWakeLockTimeout.setChecked(timeout != Actions.wakeLockTimeoutDisabled);
etWakeLockDuration.setText(String.valueOf(timeout));
}
else
{
chkWakeLockTimeout.setChecked(false);
etWakeLockDuration.setText(String.valueOf(Actions.wakeLockTimeoutDisabled));
}
}
}
bSaveWakelock.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
if(chkWakeLockTimeout.isChecked())
{
if((StringUtils.isEmpty(etWakeLockDuration.getText().toString()) || Integer.parseInt(etWakeLockDuration.getText().toString()) <= 0))
{
Toast.makeText(ActivityManageActionWakeLock.this, getResources().getString(R.string.enterAPositiveValidNonDecimalNumber), Toast.LENGTH_LONG).show();
return;
}
}
Intent response = new Intent();
response.putExtra(ActivityManageRule.intentNameActionParameter1, rbWakeLockActivate.isChecked());
if(chkWakeLockTimeout.isChecked())
response.putExtra(ActivityManageRule.intentNameActionParameter2, etWakeLockDuration.getText().toString());
else
response.putExtra(ActivityManageRule.intentNameActionParameter2, String.valueOf(Actions.wakeLockTimeoutDisabled));
setResult(RESULT_OK, response);
finish();
}
});
}
}

View File

@ -129,10 +129,6 @@ public class ActivityManageRule extends Activity
final static int requestCodeActionSetWifiEdit = 816; final static int requestCodeActionSetWifiEdit = 816;
final static int requestCodeTriggerTetheringAdd = 817; final static int requestCodeTriggerTetheringAdd = 817;
final static int requestCodeTriggerTetheringEdit = 818; final static int requestCodeTriggerTetheringEdit = 818;
final static int requestCodeActionWakeLockAdd = 819;
final static int requestCodeActionWakeLockEdit = 820;
final static int requestCodeTriggerSubSystemStateAdd = 821;
final static int requestCodeTriggerSubSystemStateEdit = 822;
public static ActivityManageRule getInstance() public static ActivityManageRule getInstance()
{ {
@ -321,15 +317,8 @@ public class ActivityManageRule extends Activity
case tethering: case tethering:
Intent tetheringEditor = new Intent(ActivityManageRule.this, ActivityManageTriggerTethering.class); Intent tetheringEditor = new Intent(ActivityManageRule.this, ActivityManageTriggerTethering.class);
tetheringEditor.putExtra(intentNameTriggerParameter1, selectedTrigger.getTriggerParameter()); tetheringEditor.putExtra(intentNameTriggerParameter1, selectedTrigger.getTriggerParameter());
tetheringEditor.putExtra(intentNameTriggerParameter2, selectedTrigger.getTriggerParameter2());
startActivityForResult(tetheringEditor, requestCodeTriggerTetheringEdit); startActivityForResult(tetheringEditor, requestCodeTriggerTetheringEdit);
break; break;
case subSystemState:
Intent subSystemStateEditor = new Intent(ActivityManageRule.this, ActivityManageTriggerSubSystemState.class);
subSystemStateEditor.putExtra(intentNameTriggerParameter1, selectedTrigger.getTriggerParameter());
subSystemStateEditor.putExtra(intentNameTriggerParameter2, selectedTrigger.getTriggerParameter2());
startActivityForResult(subSystemStateEditor, requestCodeTriggerSubSystemStateEdit);
break;
default: default:
break; break;
} }
@ -404,12 +393,6 @@ public class ActivityManageRule extends Activity
activityEditSendBroadcastIntent.putExtra(intentNameActionParameter2, a.getParameter2()); activityEditSendBroadcastIntent.putExtra(intentNameActionParameter2, a.getParameter2());
startActivityForResult(activityEditSendBroadcastIntent, requestCodeActionSendBroadcastEdit); startActivityForResult(activityEditSendBroadcastIntent, requestCodeActionSendBroadcastEdit);
break; break;
case wakelock:
Intent activityEditWakeLockIntent = new Intent(ActivityManageRule.this, ActivityManageActionWakeLock.class);
activityEditWakeLockIntent.putExtra(intentNameActionParameter1, a.getParameter1());
activityEditWakeLockIntent.putExtra(intentNameActionParameter2, a.getParameter2());
startActivityForResult(activityEditWakeLockIntent, requestCodeActionWakeLockEdit);
break;
case runExecutable: case runExecutable:
Intent activityEditRunExecutableIntent = new Intent(ActivityManageRule.this, ActivityManageActionRunExecutable.class); Intent activityEditRunExecutableIntent = new Intent(ActivityManageRule.this, ActivityManageActionRunExecutable.class);
activityEditRunExecutableIntent.putExtra(intentNameActionParameter1, a.getParameter1()); activityEditRunExecutableIntent.putExtra(intentNameActionParameter1, a.getParameter1());
@ -594,8 +577,6 @@ public class ActivityManageRule extends Activity
items.add(new Item(typesLong[i].toString(), R.drawable.alarm)); items.add(new Item(typesLong[i].toString(), R.drawable.alarm));
else if(types[i].toString().equals(Trigger_Enum.tethering.toString())) else if(types[i].toString().equals(Trigger_Enum.tethering.toString()))
items.add(new Item(typesLong[i].toString(), R.drawable.router)); items.add(new Item(typesLong[i].toString(), R.drawable.router));
else if(types[i].toString().equals(Trigger_Enum.subSystemState.toString()))
items.add(new Item(typesLong[i].toString(), R.drawable.subsystemstate));
else else
items.add(new Item(typesLong[i].toString(), R.drawable.placeholder)); items.add(new Item(typesLong[i].toString(), R.drawable.placeholder));
} }
@ -768,22 +749,19 @@ public class ActivityManageRule extends Activity
Miscellaneous.messageBox(getResources().getString(R.string.info), getResources().getString(R.string.lockedCommentScreenMustBeOff), ActivityManageRule.this).show(); Miscellaneous.messageBox(getResources().getString(R.string.info), getResources().getString(R.string.lockedCommentScreenMustBeOff), ActivityManageRule.this).show();
return; return;
} }
/*else if(triggerType == Trigger_Enum.deviceStarts) else if(triggerType == Trigger_Enum.deviceStarts)
{ {
newTrigger.setTriggerType(Trigger_Enum.deviceStarts); newTrigger.setTriggerType(Trigger_Enum.deviceStarts);
ruleToEdit.getTriggerSet().add(newTrigger); ruleToEdit.getTriggerSet().add(newTrigger);
refreshTriggerList(); refreshTriggerList();
return; return;
}*/ }
else if(triggerType == Trigger_Enum.deviceStarts || triggerType == Trigger_Enum.serviceStarts) else if(triggerType == Trigger_Enum.serviceStarts)
{ {
// newTrigger.setTriggerType(Trigger_Enum.serviceStarts); newTrigger.setTriggerType(Trigger_Enum.serviceStarts);
// ruleToEdit.getTriggerSet().add(newTrigger); ruleToEdit.getTriggerSet().add(newTrigger);
refreshTriggerList();
booleanChoices = new String[]{getResources().getString(R.string.yes), getResources().getString(R.string.no)}; return;
// refreshTriggerList();
// return;
} }
else if(triggerType == Trigger_Enum.headsetPlugged) else if(triggerType == Trigger_Enum.headsetPlugged)
booleanChoices = new String[]{getResources().getString(R.string.connected), getResources().getString(R.string.disconnected)}; booleanChoices = new String[]{getResources().getString(R.string.connected), getResources().getString(R.string.disconnected)};
@ -807,13 +785,6 @@ public class ActivityManageRule extends Activity
startActivityForResult(tetheringTriggerEditor, requestCodeTriggerTetheringAdd); startActivityForResult(tetheringTriggerEditor, requestCodeTriggerTetheringAdd);
return; return;
} }
else if(triggerType == Trigger_Enum.subSystemState)
{
newTrigger.setTriggerType(Trigger_Enum.subSystemState);
Intent subSystemStateTriggerEditor = new Intent(myContext, ActivityManageTriggerSubSystemState.class);
startActivityForResult(subSystemStateTriggerEditor, requestCodeTriggerSubSystemStateAdd);
return;
}
else else
getTriggerParameterDialog(context, booleanChoices).show(); getTriggerParameterDialog(context, booleanChoices).show();
@ -905,7 +876,6 @@ public class ActivityManageRule extends Activity
return alertDialog; return alertDialog;
} }
private AlertDialog getTriggerBatteryDialog(final Context myContext, final String[] choices) private AlertDialog getTriggerBatteryDialog(final Context myContext, final String[] choices)
{ {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context); AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
@ -920,7 +890,6 @@ public class ActivityManageRule extends Activity
triggerBattery = (which+1); triggerBattery = (which+1);
newTrigger.setTriggerType(Trigger_Enum.batteryLevel); newTrigger.setTriggerType(Trigger_Enum.batteryLevel);
newTrigger.setBatteryLevel(triggerBattery); newTrigger.setBatteryLevel(triggerBattery);
newTrigger.setTriggerParameter2(String.valueOf(triggerBattery));
// Log.i("test", newTrigger.toString()); // Log.i("test", newTrigger.toString());
// Log.i("test", String.valueOf(newTrigger.getBatteryLevel())); // Log.i("test", String.valueOf(newTrigger.getBatteryLevel()));
ruleToEdit.getTriggerSet().add(newTrigger); ruleToEdit.getTriggerSet().add(newTrigger);
@ -1582,17 +1551,6 @@ public class ActivityManageRule extends Activity
this.refreshActionList(); this.refreshActionList();
} }
} }
else if(requestCode == requestCodeActionWakeLockAdd)
{
if(resultCode == RESULT_OK)
{
newAction.setParentRule(ruleToEdit);
newAction.setParameter1(data.getBooleanExtra(intentNameActionParameter1, false));
newAction.setParameter2(data.getStringExtra(intentNameActionParameter2));
ruleToEdit.getActionSet().add(newAction);
this.refreshActionList();
}
}
else if(requestCode == requestCodeActionControlMediaAdd) else if(requestCode == requestCodeActionControlMediaAdd)
{ {
if(resultCode == RESULT_OK) if(resultCode == RESULT_OK)
@ -1662,21 +1620,6 @@ public class ActivityManageRule extends Activity
this.refreshActionList(); this.refreshActionList();
} }
} }
else if(requestCode == requestCodeActionWakeLockEdit)
{
if(resultCode == RESULT_OK)
{
ruleToEdit.getActionSet().get(editIndex).setParentRule(ruleToEdit);
if(data.hasExtra(intentNameActionParameter1))
ruleToEdit.getActionSet().get(editIndex).setParameter1(data.getBooleanExtra(intentNameActionParameter1, true));
if(data.hasExtra(intentNameActionParameter2))
ruleToEdit.getActionSet().get(editIndex).setParameter2(data.getStringExtra(intentNameActionParameter2));
this.refreshActionList();
}
}
else if(requestCode == requestCodeActionRunExecutableEdit) else if(requestCode == requestCodeActionRunExecutableEdit)
{ {
if(resultCode == RESULT_OK) if(resultCode == RESULT_OK)
@ -1869,18 +1812,6 @@ public class ActivityManageRule extends Activity
if(resultCode == RESULT_OK) if(resultCode == RESULT_OK)
{ {
newTrigger.setTriggerParameter(data.getBooleanExtra(intentNameTriggerParameter1, true)); newTrigger.setTriggerParameter(data.getBooleanExtra(intentNameTriggerParameter1, true));
newTrigger.setTriggerParameter2(data.getStringExtra(intentNameTriggerParameter2));
newTrigger.setParentRule(ruleToEdit);
ruleToEdit.getTriggerSet().add(newTrigger);
this.refreshTriggerList();
}
}
else if(requestCode == requestCodeTriggerSubSystemStateAdd)
{
if(resultCode == RESULT_OK)
{
newTrigger.setTriggerParameter(data.getBooleanExtra(intentNameTriggerParameter1, true));
newTrigger.setTriggerParameter2(data.getStringExtra(intentNameTriggerParameter2));
newTrigger.setParentRule(ruleToEdit); newTrigger.setParentRule(ruleToEdit);
ruleToEdit.getTriggerSet().add(newTrigger); ruleToEdit.getTriggerSet().add(newTrigger);
this.refreshTriggerList(); this.refreshTriggerList();
@ -1893,20 +1824,6 @@ public class ActivityManageRule extends Activity
Trigger editedTrigger = new Trigger(); Trigger editedTrigger = new Trigger();
editedTrigger.setTriggerType(Trigger_Enum.tethering); editedTrigger.setTriggerType(Trigger_Enum.tethering);
editedTrigger.setTriggerParameter(data.getBooleanExtra(intentNameTriggerParameter1, true)); editedTrigger.setTriggerParameter(data.getBooleanExtra(intentNameTriggerParameter1, true));
editedTrigger.setTriggerParameter2(data.getStringExtra(intentNameTriggerParameter2));
editedTrigger.setParentRule(ruleToEdit);
ruleToEdit.getTriggerSet().set(editIndex, editedTrigger);
this.refreshTriggerList();
}
}
else if(requestCode == requestCodeTriggerSubSystemStateEdit)
{
if(resultCode == RESULT_OK)
{
Trigger editedTrigger = new Trigger();
editedTrigger.setTriggerType(Trigger_Enum.subSystemState);
editedTrigger.setTriggerParameter(data.getBooleanExtra(intentNameTriggerParameter1, true));
editedTrigger.setTriggerParameter2(data.getStringExtra(intentNameTriggerParameter2));
editedTrigger.setParentRule(ruleToEdit); editedTrigger.setParentRule(ruleToEdit);
ruleToEdit.getTriggerSet().set(editIndex, editedTrigger); ruleToEdit.getTriggerSet().set(editIndex, editedTrigger);
this.refreshTriggerList(); this.refreshTriggerList();
@ -1967,8 +1884,6 @@ public class ActivityManageRule extends Activity
items.add(new Item(typesLong[i].toString(), R.drawable.notification)); items.add(new Item(typesLong[i].toString(), R.drawable.notification));
else if(types[i].toString().equals(Action_Enum.sendBroadcast.toString())) else if(types[i].toString().equals(Action_Enum.sendBroadcast.toString()))
items.add(new Item(typesLong[i].toString(), R.drawable.megaphone)); items.add(new Item(typesLong[i].toString(), R.drawable.megaphone));
else if(types[i].toString().equals(Action_Enum.wakelock.toString()))
items.add(new Item(typesLong[i].toString(), R.drawable.coffee));
else if(types[i].toString().equals(Action_Enum.runExecutable.toString())) else if(types[i].toString().equals(Action_Enum.runExecutable.toString()))
items.add(new Item(typesLong[i].toString(), R.drawable.script)); items.add(new Item(typesLong[i].toString(), R.drawable.script));
else if(types[i].toString().equals(Action_Enum.sendTextMessage.toString())) else if(types[i].toString().equals(Action_Enum.sendTextMessage.toString()))
@ -2143,12 +2058,6 @@ public class ActivityManageRule extends Activity
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionRunExecutable.class); Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionRunExecutable.class);
startActivityForResult(intent, requestCodeActionRunExecutableAdd); startActivityForResult(intent, requestCodeActionRunExecutableAdd);
} }
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.wakelock.toString()))
{
newAction.setAction(Action_Enum.wakelock);
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionWakeLock.class);
startActivityForResult(intent, requestCodeActionWakeLockAdd);
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.controlMediaPlayback.toString())) else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.controlMediaPlayback.toString()))
{ {
newAction.setAction(Action_Enum.controlMediaPlayback); newAction.setAction(Action_Enum.controlMediaPlayback);

View File

@ -1,72 +0,0 @@
package com.jens.automation2;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import androidx.annotation.Nullable;
import com.jens.automation2.Trigger.subSystemStates;
public class ActivityManageTriggerSubSystemState extends Activity
{
RadioButton rbSubSystemStateWifi, rbSubSystemStateBluetooth;
RadioButton rbSubSystemStateEnabled, rbSubSystemStateDisabled;
Button bSubSystemStateSave;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_manage_trigger_subsystemstate);
rbSubSystemStateWifi = (RadioButton)findViewById(R.id.rbSubSystemStateWifi);
rbSubSystemStateBluetooth = (RadioButton)findViewById(R.id.rbSubSystemStateBluetooth);
rbSubSystemStateEnabled = (RadioButton)findViewById(R.id.rbSubSystemStateEnabled);
rbSubSystemStateDisabled = (RadioButton)findViewById(R.id.rbSubSystemStateDisabled);
bSubSystemStateSave = (Button)findViewById(R.id.bSubSystemStateSave);
if(getIntent().hasExtra(ActivityManageRule.intentNameTriggerParameter1) && getIntent().hasExtra(ActivityManageRule.intentNameTriggerParameter2))
{
subSystemStates desiredState = subSystemStates.valueOf(getIntent().getStringExtra(ActivityManageRule.intentNameTriggerParameter2));
switch(desiredState)
{
case wifi:
rbSubSystemStateWifi.setChecked(true);
break;
case bluetooth:
rbSubSystemStateBluetooth.setChecked(true);
break;
default:
}
if(getIntent().getBooleanExtra(ActivityManageRule.intentNameTriggerParameter1, true))
rbSubSystemStateEnabled.setChecked(true);
else
rbSubSystemStateDisabled.setChecked(true);
}
bSubSystemStateSave.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
Intent data = new Intent();
data.putExtra(ActivityManageRule.intentNameTriggerParameter1, rbSubSystemStateEnabled.isChecked());
if(rbSubSystemStateWifi.isChecked())
data.putExtra(ActivityManageRule.intentNameTriggerParameter2, subSystemStates.wifi.name());
else if(rbSubSystemStateBluetooth.isChecked())
data.putExtra(ActivityManageRule.intentNameTriggerParameter2, subSystemStates.bluetooth.name());
ActivityManageTriggerSubSystemState.this.setResult(RESULT_OK, data);
finish();
}
});
}
}

View File

@ -9,19 +9,11 @@ import android.widget.RadioButton;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import org.apache.commons.lang3.StringUtils;
public class ActivityManageTriggerTethering extends Activity public class ActivityManageTriggerTethering extends Activity
{ {
RadioButton rbTetheringOn, rbTetheringOff, rbTetheringTypeAny, rbTetheringTypeWifi, rbTetheringTypeBluetooth, rbTetheringTypeUsb, rbTetheringTypeCable; RadioButton rbTetheringOn, rbTetheringOff;
Button bTriggerTetheringSave; Button bTriggerTetheringSave;
public final static String tetheringTypeAny = "tetheringTypeAny";
public final static String tetheringTypeWifi = "tetheringTypeWifi";
public final static String tetheringTypeBluetooth = "tetheringTypeBluetooth";
public final static String tetheringTypeUsb = "tetheringTypeUsb";
public final static String tetheringTypeCable = "tetheringTypeCable";
@Override @Override
protected void onCreate(@Nullable Bundle savedInstanceState) protected void onCreate(@Nullable Bundle savedInstanceState)
{ {
@ -30,11 +22,6 @@ public class ActivityManageTriggerTethering extends Activity
rbTetheringOn = (RadioButton) findViewById(R.id.rbTetheringOn); rbTetheringOn = (RadioButton) findViewById(R.id.rbTetheringOn);
rbTetheringOff = (RadioButton)findViewById(R.id.rbTetheringOff); rbTetheringOff = (RadioButton)findViewById(R.id.rbTetheringOff);
rbTetheringTypeAny = (RadioButton) findViewById(R.id.rbTetheringTypeAny);
rbTetheringTypeWifi = (RadioButton) findViewById(R.id.rbTetheringTypeWifi);
rbTetheringTypeBluetooth = (RadioButton) findViewById(R.id.rbTetheringTypeBluetooth);
rbTetheringTypeUsb = (RadioButton) findViewById(R.id.rbTetheringTypeUsb);
rbTetheringTypeCable = (RadioButton) findViewById(R.id.rbTetheringTypeCable);
bTriggerTetheringSave = (Button) findViewById(R.id.bTriggerTetheringSave); bTriggerTetheringSave = (Button) findViewById(R.id.bTriggerTetheringSave);
Intent input = getIntent(); Intent input = getIntent();
@ -44,36 +31,6 @@ public class ActivityManageTriggerTethering extends Activity
rbTetheringOff.setChecked(!input.getBooleanExtra(ActivityManageRule.intentNameTriggerParameter1, false)); rbTetheringOff.setChecked(!input.getBooleanExtra(ActivityManageRule.intentNameTriggerParameter1, false));
} }
if(input.hasExtra(ActivityManageRule.intentNameTriggerParameter2))
{
String type = input.getStringExtra(ActivityManageRule.intentNameTriggerParameter2);
if(!StringUtils.isEmpty(type))
{
switch(type)
{
case tetheringTypeAny:
rbTetheringTypeAny.setChecked(true);
break;
case tetheringTypeWifi:
rbTetheringTypeWifi.setChecked(true);
break;
case tetheringTypeBluetooth:
rbTetheringTypeBluetooth.setChecked(true);
break;
case tetheringTypeUsb:
rbTetheringTypeUsb.setChecked(true);
break;
case tetheringTypeCable:
rbTetheringTypeCable.setChecked(true);
break;
default:
}
}
}
else
rbTetheringTypeAny.setChecked(true);
bTriggerTetheringSave.setOnClickListener(new View.OnClickListener() bTriggerTetheringSave.setOnClickListener(new View.OnClickListener()
{ {
@Override @Override
@ -81,18 +38,6 @@ public class ActivityManageTriggerTethering extends Activity
{ {
Intent response = new Intent(); Intent response = new Intent();
response.putExtra(ActivityManageRule.intentNameTriggerParameter1, rbTetheringOn.isChecked()); response.putExtra(ActivityManageRule.intentNameTriggerParameter1, rbTetheringOn.isChecked());
if(rbTetheringTypeAny.isChecked())
response.putExtra(ActivityManageRule.intentNameTriggerParameter2, tetheringTypeAny);
else if(rbTetheringTypeWifi.isChecked())
response.putExtra(ActivityManageRule.intentNameTriggerParameter2, tetheringTypeWifi);
else if(rbTetheringTypeBluetooth.isChecked())
response.putExtra(ActivityManageRule.intentNameTriggerParameter2, tetheringTypeBluetooth);
else if(rbTetheringTypeUsb.isChecked())
response.putExtra(ActivityManageRule.intentNameTriggerParameter2, tetheringTypeUsb);
else if(rbTetheringTypeCable.isChecked())
response.putExtra(ActivityManageRule.intentNameTriggerParameter2, tetheringTypeCable);
setResult(RESULT_OK, response); setResult(RESULT_OK, response);
finish(); finish();
} }

View File

@ -20,13 +20,15 @@ import android.widget.Button;
import android.widget.EditText; import android.widget.EditText;
import android.widget.RadioButton; import android.widget.RadioButton;
import android.widget.Spinner; import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat; import androidx.core.app.ActivityCompat;
import com.jens.automation2.receivers.BluetoothReceiver;
import java.lang.reflect.Array;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@ -39,11 +41,10 @@ public class ActivityManageTriggerWifi extends Activity
RadioButton rbTriggerWifiConnected, rbTriggerWifiDisconnected; RadioButton rbTriggerWifiConnected, rbTriggerWifiDisconnected;
EditText etTriggerWifiName; EditText etTriggerWifiName;
Spinner spinnerWifiList; Spinner spinnerWifiList;
Button bTriggerWifiSave, bLoadWifiList; Button btriggerWifiSave, bLoadWifiList;
List<String> wifiList = new ArrayList<>(); List<String> wifiList = new ArrayList<>();
ArrayAdapter<String> wifiSpinnerAdapter; ArrayAdapter<String> wifiSpinnerAdapter;
private final static int requestCodeLocationPermission = 124; private final static int requestCodeLocationPermission = 124;
TextView tvWifiTriggerNameLocationNotice;
@Override @Override
protected void onCreate(@Nullable Bundle savedInstanceState) protected void onCreate(@Nullable Bundle savedInstanceState)
@ -55,21 +56,13 @@ public class ActivityManageTriggerWifi extends Activity
rbTriggerWifiDisconnected = (RadioButton) findViewById(R.id.rbTriggerWifiDisconnected); rbTriggerWifiDisconnected = (RadioButton) findViewById(R.id.rbTriggerWifiDisconnected);
etTriggerWifiName = (EditText) findViewById(R.id.etTriggerWifiName); etTriggerWifiName = (EditText) findViewById(R.id.etTriggerWifiName);
spinnerWifiList = (Spinner) findViewById(R.id.spinnerWifiList); spinnerWifiList = (Spinner) findViewById(R.id.spinnerWifiList);
bTriggerWifiSave = (Button) findViewById(R.id.bTriggerWifiSave); btriggerWifiSave = (Button) findViewById(R.id.btriggerWifiSave);
bLoadWifiList = (Button) findViewById(R.id.bLoadWifiList); bLoadWifiList = (Button) findViewById(R.id.bLoadWifiList);
tvWifiTriggerNameLocationNotice = (TextView)findViewById(R.id.tvWifiTriggerNameLocationNotice);
wifiSpinnerAdapter = new ArrayAdapter<String>(this, R.layout.text_view_for_poi_listview_mediumtextsize, wifiList); wifiSpinnerAdapter = new ArrayAdapter<String>(this, R.layout.text_view_for_poi_listview_mediumtextsize, wifiList);
spinnerWifiList.setAdapter(wifiSpinnerAdapter); spinnerWifiList.setAdapter(wifiSpinnerAdapter);
spinnerWifiList.setEnabled(false); // bug in Android; this only works when done in code, not in xml spinnerWifiList.setEnabled(false); // bug in Android; this only works when done in code, not in xml
if(
Miscellaneous.getTargetSDK(Miscellaneous.getAnyContext()) >= 29
&&
!ActivityPermissions.isPermissionDeclaratedInManifest(Miscellaneous.getAnyContext(), Manifest.permission.ACCESS_BACKGROUND_LOCATION)
)
tvWifiTriggerNameLocationNotice.setVisibility(View.VISIBLE);
if (getIntent().hasExtra("edit")) if (getIntent().hasExtra("edit"))
{ {
boolean connected = getIntent().getBooleanExtra("wifiState", false); boolean connected = getIntent().getBooleanExtra("wifiState", false);
@ -81,7 +74,7 @@ public class ActivityManageTriggerWifi extends Activity
etTriggerWifiName.setText(wifiName); etTriggerWifiName.setText(wifiName);
} }
bTriggerWifiSave.setOnClickListener(new View.OnClickListener() btriggerWifiSave.setOnClickListener(new View.OnClickListener()
{ {
@Override @Override
public void onClick(View v) public void onClick(View v)

View File

@ -509,12 +509,6 @@ public class ActivityPermissions extends Activity
case wifiConnection: case wifiConnection:
addToArrayListUnique(Manifest.permission.ACCESS_NETWORK_STATE, requiredPermissions); addToArrayListUnique(Manifest.permission.ACCESS_NETWORK_STATE, requiredPermissions);
addToArrayListUnique(Manifest.permission.ACCESS_WIFI_STATE, requiredPermissions); addToArrayListUnique(Manifest.permission.ACCESS_WIFI_STATE, requiredPermissions);
if(
Miscellaneous.getTargetSDK(Miscellaneous.getAnyContext()) >= 29
&&
isPermissionDeclaratedInManifest(Miscellaneous.getAnyContext(), Manifest.permission.ACCESS_BACKGROUND_LOCATION)
)
addToArrayListUnique(Manifest.permission.ACCESS_BACKGROUND_LOCATION, requiredPermissions);
break; break;
case notification: case notification:
addToArrayListUnique(Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE, requiredPermissions); addToArrayListUnique(Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE, requiredPermissions);

View File

@ -473,7 +473,6 @@ public class AutomationService extends Service implements OnInitListener
PackageReplacedReceiver.setHasServiceBeenRunning(false, this); PackageReplacedReceiver.setHasServiceBeenRunning(false, this);
centralInstance = null; centralInstance = null;
Settings.serviceStartDone = false;
} }
protected static Builder createDefaultNotificationBuilderOld() protected static Builder createDefaultNotificationBuilderOld()

View File

@ -476,9 +476,6 @@ public class Miscellaneous extends Service
switch(direction) switch(direction)
{ {
case Trigger.directionEquals: case Trigger.directionEquals:
if(Miscellaneous.isRegularExpression(needle))
return haystack.matches(needle);
else
return haystack.equalsIgnoreCase(needle); return haystack.equalsIgnoreCase(needle);
case Trigger.directionNotEquals: case Trigger.directionNotEquals:
return !haystack.equalsIgnoreCase(needle); return !haystack.equalsIgnoreCase(needle);
@ -1772,12 +1769,13 @@ public class Miscellaneous extends Service
public static boolean comparePhoneNumbers(String number1, String number2) public static boolean comparePhoneNumbers(String number1, String number2)
{ {
if(Build.VERSION.SDK_INT > Build.VERSION_CODES.S) /* To be activated when Android S SDK comes out
if(Build.VERSION.SDK_INT > Build.VERSION_CODES.Q)
{ {
TelephonyManager tm = (TelephonyManager)Miscellaneous.getAnyContext().getSystemService(Context.TELEPHONY_SERVICE); TelephonyManager tm = (TelephonyManager)Miscellaneous.getAnyContext().getSystemService(Context.TELEPHONY_SERVICE);
return PhoneNumberUtils.areSamePhoneNumber(number1, number2, tm.getNetworkCountryIso()); return PhoneNumberUtils.areSamePhoneNumber(number1, number2, tm.getNetworkCountryIso());
} }
else else*/
return PhoneNumberUtils.compare(number1, number2); return PhoneNumberUtils.compare(number1, number2);
} }
@ -1911,9 +1909,4 @@ public class Miscellaneous extends Service
return null; return null;
} }
public static int getTargetSDK(Context context)
{
return context.getApplicationContext().getApplicationInfo().targetSdkVersion;
}
} }

View File

@ -18,7 +18,6 @@ import com.jens.automation2.receivers.NoiseListener;
import com.jens.automation2.receivers.PhoneStatusListener; import com.jens.automation2.receivers.PhoneStatusListener;
import com.jens.automation2.receivers.ProcessListener; import com.jens.automation2.receivers.ProcessListener;
import com.jens.automation2.receivers.ScreenStateReceiver; import com.jens.automation2.receivers.ScreenStateReceiver;
import com.jens.automation2.receivers.SubSystemStateReceiver;
import com.jens.automation2.receivers.TetheringReceiver; import com.jens.automation2.receivers.TetheringReceiver;
import com.jens.automation2.receivers.TimeZoneListener; import com.jens.automation2.receivers.TimeZoneListener;
@ -183,9 +182,6 @@ public class ReceiverCoordinator
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.tethering)) if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.tethering))
TetheringReceiver.getInstance().startListener(AutomationService.getInstance()); TetheringReceiver.getInstance().startListener(AutomationService.getInstance());
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.subSystemState))
SubSystemStateReceiver.getInstance().startListener(AutomationService.getInstance());
try try
{ {
Class testClass = Class.forName(ActivityManageRule.activityDetectionClassPath); Class testClass = Class.forName(ActivityManageRule.activityDetectionClassPath);
@ -227,7 +223,6 @@ public class ReceiverCoordinator
MediaPlayerListener.getInstance().stopListener(AutomationService.getInstance()); MediaPlayerListener.getInstance().stopListener(AutomationService.getInstance());
DeviceOrientationListener.getInstance().stopListener(AutomationService.getInstance()); DeviceOrientationListener.getInstance().stopListener(AutomationService.getInstance());
TetheringReceiver.getInstance().stopListener(AutomationService.getInstance()); TetheringReceiver.getInstance().stopListener(AutomationService.getInstance());
SubSystemStateReceiver.getInstance().stopListener(AutomationService.getInstance());
try try
{ {
@ -445,24 +440,6 @@ public class ReceiverCoordinator
} }
} }
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.subSystemState))
{
if(!SubSystemStateReceiver.getInstance().isListenerRunning())
{
Miscellaneous.logEvent("i", "SubSystemStateReceiver", "Starting SubSystemStateReceiver because used in a new/changed rule.", 4);
// if(DevicePositionListener.getInstance().haveAllPermission())
TetheringReceiver.getInstance().startListener(AutomationService.getInstance());
}
}
else
{
if(SubSystemStateReceiver.getInstance().isListenerRunning())
{
Miscellaneous.logEvent("i", "SubSystemStateReceiver", "Shutting down SubSystemStateReceiver because not used in any rule.", 4);
SubSystemStateReceiver.getInstance().stopListener(AutomationService.getInstance());
}
}
AutomationService.updateNotification(); AutomationService.updateNotification();
} }
} }

View File

@ -60,7 +60,6 @@ public class Trigger
serviceStarts, serviceStarts,
broadcastReceived, broadcastReceived,
tethering, tethering,
subSystemState,
phoneCall; //phoneCall always needs to be at the very end because of Google's shitty so called privacy phoneCall; //phoneCall always needs to be at the very end because of Google's shitty so called privacy
public String getFullName(Context context) public String getFullName(Context context)
@ -117,16 +116,12 @@ public class Trigger
return context.getResources().getString(R.string.broadcastReceivedTitle); return context.getResources().getString(R.string.broadcastReceivedTitle);
case tethering: case tethering:
return context.getResources().getString(R.string.tetheringState); return context.getResources().getString(R.string.tetheringState);
case subSystemState:
return context.getResources().getString(R.string.subSystemState);
default: default:
return "Unknown"; return "Unknown";
} }
} }
}; };
public static enum subSystemStates { wifi, bluetooth };
Rule parentRule = null; Rule parentRule = null;
Calendar lastTimeNotApplied = null; Calendar lastTimeNotApplied = null;
@ -240,10 +235,6 @@ public class Trigger
if(!checkTetheringActive()) if(!checkTetheringActive())
result = false; result = false;
break; break;
case subSystemState:
if(!checkSubSystemState())
result = false;
break;
default: default:
break; break;
} }
@ -411,17 +402,12 @@ public class Trigger
boolean checkDeviceStarts() boolean checkDeviceStarts()
{ {
if(triggerParameter && checkServiceStarts() && !Settings.deviceStartDone) return checkServiceStarts() && !Settings.deviceStartDone;
return true;
else if(!triggerParameter && !checkServiceStarts() && Settings.deviceStartDone)
return true;
else
return false;
} }
boolean checkServiceStarts() boolean checkServiceStarts()
{ {
return !Settings.serviceStartDone == getTriggerParameter(); return !Settings.serviceStartDone;
} }
boolean checkProfileActive() boolean checkProfileActive()
@ -549,31 +535,6 @@ public class Trigger
return true; return true;
} }
boolean checkSubSystemState()
{
try
{
subSystemStates state = subSystemStates.valueOf(triggerParameter2);
switch (state)
{
case wifi:
return WifiBroadcastReceiver.isWifiEnabled(Miscellaneous.getAnyContext()) == triggerParameter;
case bluetooth:
return BluetoothReceiver.isBluetoothEnabled() == triggerParameter;
default:
Miscellaneous.logEvent("w", "checkSubSystemState()", "Invalid subSystemState: " + state.name(), 3);
return false;
}
}
catch(Exception e)
{
Miscellaneous.logEvent("e", "checkSubSystemState()", Log.getStackTraceString(e), 1);
}
return false;
}
boolean checkBluetooth() boolean checkBluetooth()
{ {
Miscellaneous.logEvent("i", Miscellaneous.getAnyContext().getResources().getString(R.string.ruleCheckOf), String.format("Checking for bluetooth...", this.getParentRule().getName()), 4); Miscellaneous.logEvent("i", Miscellaneous.getAnyContext().getResources().getString(R.string.ruleCheckOf), String.format("Checking for bluetooth...", this.getParentRule().getName()), 4);
@ -767,8 +728,7 @@ public class Trigger
if(this.getTriggerParameter2().length() > 0) // only check if any wifi name specified, otherwise any wifi will do if(this.getTriggerParameter2().length() > 0) // only check if any wifi name specified, otherwise any wifi will do
{ {
Miscellaneous.logEvent("i", Miscellaneous.getAnyContext().getResources().getString(R.string.ruleCheckOf), String.format("Wifi name specified, checking that.", this.getParentRule().getName()), 4); Miscellaneous.logEvent("i", Miscellaneous.getAnyContext().getResources().getString(R.string.ruleCheckOf), String.format("Wifi name specified, checking that.", this.getParentRule().getName()), 4);
if(!WifiBroadcastReceiver.getLastWifiSsid().equals(this.getTriggerParameter2()))
if(!WifiBroadcastReceiver.getLastWifiSsid().equals(this.getTriggerParameter2()) && !(Miscellaneous.isRegularExpression(this.getTriggerParameter2()) && WifiBroadcastReceiver.getLastWifiSsid().matches(this.getTriggerParameter2())))
{ {
Miscellaneous.logEvent("i", Miscellaneous.getAnyContext().getResources().getString(R.string.ruleCheckOf), String.format(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.ruleDoesntApplyNotTheCorrectSsid), getParentRule().getName(), this.getTriggerParameter2(), WifiBroadcastReceiver.getLastWifiSsid()),this.getParentRule().getName()), 3); Miscellaneous.logEvent("i", Miscellaneous.getAnyContext().getResources().getString(R.string.ruleCheckOf), String.format(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.ruleDoesntApplyNotTheCorrectSsid), getParentRule().getName(), this.getTriggerParameter2(), WifiBroadcastReceiver.getLastWifiSsid()),this.getParentRule().getName()), 3);
return false; return false;
@ -834,15 +794,9 @@ public class Trigger
boolean checkBatteryLevel() boolean checkBatteryLevel()
{ {
/*
-1 means value is not known, yet.
*/
if(BatteryReceiver.getBatteryLevel() == -1)
return false;
if(this.getTriggerParameter()) if(this.getTriggerParameter())
{ {
if(BatteryReceiver.getBatteryLevel() < this.getBatteryLevel()) if(BatteryReceiver.getBatteryLevel() <= this.getBatteryLevel())
{ {
Miscellaneous.logEvent("i", Miscellaneous.getAnyContext().getResources().getString(R.string.ruleCheckOf), String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.ruleDoesntApplyBatteryLowerThan) + " " + String.valueOf(this.getBatteryLevel()), this.getParentRule().getName()), 3); Miscellaneous.logEvent("i", Miscellaneous.getAnyContext().getResources().getString(R.string.ruleCheckOf), String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.ruleDoesntApplyBatteryLowerThan) + " " + String.valueOf(this.getBatteryLevel()), this.getParentRule().getName()), 3);
return false; return false;
@ -850,10 +804,7 @@ public class Trigger
} }
else else
{ {
if(BatteryReceiver.getBatteryLevel() < 100 && BatteryReceiver.getBatteryLevel() >= this.getBatteryLevel() if(this.getBatteryLevel() >= this.getBatteryLevel())
||
BatteryReceiver.getBatteryLevel() > this.getBatteryLevel()
)
{ {
Miscellaneous.logEvent("i", Miscellaneous.getAnyContext().getResources().getString(R.string.ruleCheckOf), String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.ruleDoesntApplyBatteryHigherThan) + " " + String.valueOf(this.getBatteryLevel()), this.getParentRule().getName()), 3); Miscellaneous.logEvent("i", Miscellaneous.getAnyContext().getResources().getString(R.string.ruleCheckOf), String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.ruleDoesntApplyBatteryHigherThan) + " " + String.valueOf(this.getBatteryLevel()), this.getParentRule().getName()), 3);
return false; return false;
@ -977,24 +928,7 @@ public class Trigger
boolean checkTetheringActive() boolean checkTetheringActive()
{ {
if(TetheringReceiver.isTetheringActive() == triggerParameter) return TetheringReceiver.isTetheringActive() == triggerParameter;
{
if(getTriggerParameter2().equals(ActivityManageTriggerTethering.tetheringTypeAny))
return true;
for(String oneOfLastTypes : TetheringReceiver.getLastTetheringTypes())
{
if(oneOfLastTypes.equals(getTriggerParameter2()))
{
if(triggerParameter)
return true;
else
return false;
}
}
}
return false;
} }
public boolean checkDateTime(Object triggeringObject, boolean checkifStateChangedSinceLastRuleExecution) public boolean checkDateTime(Object triggeringObject, boolean checkifStateChangedSinceLastRuleExecution)
@ -1700,11 +1634,11 @@ public class Trigger
break; break;
case deviceStarts: case deviceStarts:
// This type doesn't have an activate/deactivate equivalent // This type doesn't have an activate/deactivate equivalent
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.deviceIsStarting) + ": " + String.valueOf(triggerParameter)); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.deviceHasJustStarted));
break; break;
case serviceStarts: case serviceStarts:
// This type doesn't have an activate/deactivate equivalent // This type doesn't have an activate/deactivate equivalent
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.serviceIsStarting) + ": " + String.valueOf(triggerParameter)); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.serviceHasJustStarted));
break; break;
case broadcastReceived: case broadcastReceived:
if(triggerParameter) if(triggerParameter)
@ -1719,27 +1653,6 @@ public class Trigger
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.tetheringActive)); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.tetheringActive));
else else
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.tetheringNotActive)); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.tetheringNotActive));
returnString.append(" (" + Miscellaneous.getAnyContext().getResources().getString(R.string.type) + ": " + triggerParameter2 + ")");
break;
case subSystemState:
Trigger.subSystemStates desiredState = subSystemStates.valueOf(triggerParameter2);
switch(desiredState)
{
case wifi:
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.wifi));
break;
case bluetooth:
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.bluetooth));
break;
}
returnString.append(" " + Miscellaneous.getAnyContext().getResources().getString(R.string.is) + " ");
if(triggerParameter)
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.activated));
else
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.deactivated));
break; break;
default: default:
returnString.append("error"); returnString.append("error");

View File

@ -63,7 +63,7 @@ public class WifiBroadcastReceiver extends BroadcastReceiver
// int state = -1; // int state = -1;
NetworkInfo myWifi = null; NetworkInfo myWifi = null;
if(intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) // fired upon disconnection if(intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) //gefeuert bei Trennung
{ {
// state = intent.getIntExtra(WifiManager.NETWORK_STATE_CHANGED_ACTION, -1); // state = intent.getIntExtra(WifiManager.NETWORK_STATE_CHANGED_ACTION, -1);
// Miscellaneous.logEvent("i", "WifiReceiver", "NETWORK_STATE_CHANGED_ACTION: " + String.valueOf(state)); // Miscellaneous.logEvent("i", "WifiReceiver", "NETWORK_STATE_CHANGED_ACTION: " + String.valueOf(state));

View File

@ -300,16 +300,4 @@ public class BluetoothReceiver extends BroadcastReceiver implements AutomationLi
{ {
return new Trigger_Enum[] { Trigger_Enum.bluetoothConnection }; return new Trigger_Enum[] { Trigger_Enum.bluetoothConnection };
} }
/**
* Check for Bluetooth.
*
* @return true if Bluetooth is available.
*/
public static boolean isBluetoothEnabled()
{
final BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
return bluetoothAdapter != null && bluetoothAdapter.isEnabled() && bluetoothAdapter.getState() == BluetoothAdapter.STATE_ON;
}
} }

View File

@ -2,7 +2,6 @@ package com.jens.automation2.receivers;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.Notification; import android.app.Notification;
import android.app.PendingIntent;
import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothDevice;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.os.Build; import android.os.Build;
@ -150,6 +149,51 @@ public class NotificationListener extends NotificationListenerService// implemen
return returnNotification; return returnNotification;
} }
/*@Override
public void startListener(AutomationService automationService)
{
if(instance == null)
instance = new NotificationListener();
if(notificationReceiverIntentFilter == null)
{
notificationReceiverIntentFilter = new IntentFilter();
notificationReceiverIntentFilter.addAction("android.service.notification.NotificationListenerService");
}
try
{
if(!listenerRunning)
{
Miscellaneous.logEvent("i", "NotificationListener", "Starting NotificationListener", 4);
listenerRunning = true;
AutomationService.getInstance().registerReceiver(instance, notificationReceiverIntentFilter);
}
}
catch(Exception ex)
{
Miscellaneous.logEvent("e", "BluetoothReceiver", "Error starting BluetoothReceiver: " + Log.getStackTraceString(ex), 3);
}
}
@Override
public void stopListener(AutomationService automationService)
{
}
@Override
public boolean isListenerRunning()
{
return false;
}
@Override
public Trigger.Trigger_Enum[] getMonitoredTrigger()
{
return new Trigger.Trigger_Enum[0];
}*/
public static class SimpleNotification public static class SimpleNotification
{ {
boolean created; boolean created;
@ -239,35 +283,4 @@ public class NotificationListener extends NotificationListenerService// implemen
cancelNotification(sbn.getKey()); cancelNotification(sbn.getKey());
} }
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public void clickNotificationButton(StatusBarNotification sbn, String buttonText)
{
boolean buttonFound = false;
if(sbn.getNotification().actions != null)
{
for (Notification.Action a : sbn.getNotification().actions)
{
if((Miscellaneous.isRegularExpression(buttonText) && a.title.toString().matches(buttonText)) || a.title.toString().equalsIgnoreCase(buttonText))
{
if (!buttonFound)
buttonFound = true;
try
{
Miscellaneous.logEvent("w", "clickNotificationButton()", "Pressing button with text \"" + a.title.toString() + "\".", 2);
a.actionIntent.send();
}
catch (PendingIntent.CanceledException e)
{
Miscellaneous.logEvent("w", "clickNotificationButton()", Log.getStackTraceString(e), 2);
}
}
}
}
if(!buttonFound)
Miscellaneous.logEvent("w", "clickNotificationButton()", "Button with text \n" + buttonText + "\n could not found.", 2);
}
} }

View File

@ -22,6 +22,8 @@ import java.util.ArrayList;
public class PhoneStatusListener implements AutomationListenerInterface public class PhoneStatusListener implements AutomationListenerInterface
{ {
// protected static int currentStateIncoming = -1;
// protected static int currentStateOutgoing = -1;
protected static String lastPhoneNumber=""; protected static String lastPhoneNumber="";
protected static int lastPhoneDirection = -1; //0=incoming, 1=outgoing protected static int lastPhoneDirection = -1; //0=incoming, 1=outgoing
protected static int currentState = -1; protected static int currentState = -1;
@ -118,6 +120,8 @@ public class PhoneStatusListener implements AutomationListenerInterface
} }
else else
{ {
// state != TelephonyManager.CALL_STATE_IDLE &&
setCurrentState(state); setCurrentState(state);
setLastPhoneDirection(1); setLastPhoneDirection(1);
@ -171,7 +175,7 @@ public class PhoneStatusListener implements AutomationListenerInterface
Miscellaneous.logEvent("i", "Call state", String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.outgoingCallTo), getLastPhoneNumber()), 4); Miscellaneous.logEvent("i", "Call state", String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.outgoingCallTo), getLastPhoneNumber()), 4);
ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.phoneCall); ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.phoneCall);
for(int i = 0; i < ruleCandidates.size(); i++) for(int i=0; i<ruleCandidates.size(); i++)
{ {
AutomationService asInstance = AutomationService.getInstance(); AutomationService asInstance = AutomationService.getInstance();
if(asInstance != null) if(asInstance != null)

View File

@ -1,151 +0,0 @@
package com.jens.automation2.receivers;
import android.bluetooth.BluetoothAdapter;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.wifi.WifiManager;
import com.jens.automation2.AutomationService;
import com.jens.automation2.Miscellaneous;
import com.jens.automation2.Rule;
import com.jens.automation2.Trigger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class SubSystemStateReceiver extends BroadcastReceiver implements AutomationListenerInterface
{
public static AutomationService automationServiceRef = null;
private static IntentFilter subSystemStateIntentFilter = null;
private static BroadcastReceiver subSystemStateReceiverInstance = null;
private static Intent subSystemStatusIntent = null;
private static boolean subSystemStateReceiverActive = false;
static SubSystemStateReceiver instance;
final static String stateBluetooth = "android.bluetooth.adapter.action.STATE_CHANGED";
final static String stateWifi = "android.net.wifi.STATE_CHANGE";
final static String connectivityBroadcast = "android.net.conn.CONNECTIVITY_CHANGE";
static Map<String, Boolean> stateMap = null;
@Override
public void onReceive(Context context, Intent intent)
{
if (intent == null)
return;
if (context == null)
return;
Miscellaneous.logEvent("e", "ScreenStateReceiver", "Received: " + intent.getAction(), 3);
if(stateMap == null)
stateMap = new HashMap<>();
try
{
/*if (intent.getAction().equals(stateWifi) || intent.getAction().equals(connectivityBroadcast))
{
if(intent.hasExtra(WifiManager.EXTRA_WIFI_STATE))
{
int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN);
if (wifiState == WifiManager.WIFI_STATE_ENABLED)
stateMap.put("wifi", true);
else if (wifiState == WifiManager.WIFI_STATE_DISABLED)
stateMap.put("wifi", false);
}
}
else if (intent.getAction().equals(stateBluetooth))
{
if(intent.hasExtra(BluetoothAdapter.EXTRA_STATE))
{
int bluetoothState = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);
if (bluetoothState == BluetoothAdapter.STATE_ON)
stateMap.put("bluetooth", true);
else if (bluetoothState == BluetoothAdapter.STATE_OFF)
stateMap.put("bluetooth", false);
}
}*/
if (intent.getAction().equals(stateWifi) || intent.getAction().equals(connectivityBroadcast) || intent.getAction().equals(stateBluetooth))
{
ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger.Trigger_Enum.subSystemState);
for (int i = 0; i < ruleCandidates.size(); i++)
{
if (ruleCandidates.get(i).getsGreenLight(context))
ruleCandidates.get(i).activate(automationServiceRef, false);
}
}
else
{
Miscellaneous.logEvent("e", "SubSystemStateReceiver", "Unknown state received: " + intent.getAction(), 3);
}
}
catch (Exception e)
{
Miscellaneous.logEvent("e", "SubSystemStateReceiver", "Error receiving screen state: " + e.getMessage(), 3);
}
}
public static SubSystemStateReceiver getInstance()
{
if(instance == null)
instance = new SubSystemStateReceiver();
return instance;
}
@Override
public void startListener(AutomationService automationService)
{
if (!subSystemStateReceiverActive)
{
automationServiceRef = automationService;
if (subSystemStateReceiverInstance == null)
subSystemStateReceiverInstance = new SubSystemStateReceiver();
if (subSystemStateIntentFilter == null)
{
subSystemStateIntentFilter = new IntentFilter();
subSystemStateIntentFilter.addAction(stateWifi);
subSystemStateIntentFilter.addAction(connectivityBroadcast);
subSystemStateIntentFilter.addAction(stateBluetooth);
}
subSystemStatusIntent = automationServiceRef.registerReceiver(subSystemStateReceiverInstance, subSystemStateIntentFilter);
subSystemStateReceiverActive = true;
}
}
@Override
public void stopListener(AutomationService automationService)
{
if (subSystemStateReceiverActive)
{
if (subSystemStateReceiverInstance != null)
{
automationServiceRef.unregisterReceiver(subSystemStateReceiverInstance);
subSystemStateReceiverInstance = null;
}
subSystemStateReceiverActive = false;
}
}
@Override
public boolean isListenerRunning()
{
return subSystemStateReceiverActive;
}
@Override
public Trigger.Trigger_Enum[] getMonitoredTrigger()
{
return new Trigger.Trigger_Enum[]{Trigger.Trigger_Enum.subSystemState};
}
}

View File

@ -6,17 +6,12 @@ import android.content.IntentFilter;
import android.os.Build; import android.os.Build;
import android.util.Log; import android.util.Log;
import com.jens.automation2.ActivityManageTriggerTethering;
import com.jens.automation2.AutomationService; import com.jens.automation2.AutomationService;
import com.jens.automation2.Miscellaneous; import com.jens.automation2.Miscellaneous;
import com.jens.automation2.Rule; import com.jens.automation2.Rule;
import com.jens.automation2.Trigger; import com.jens.automation2.Trigger;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
public class TetheringReceiver extends android.content.BroadcastReceiver implements AutomationListenerInterface public class TetheringReceiver extends android.content.BroadcastReceiver implements AutomationListenerInterface
{ {
@ -25,14 +20,8 @@ public class TetheringReceiver extends android.content.BroadcastReceiver impleme
private static TetheringReceiver receiverInstance = null; private static TetheringReceiver receiverInstance = null;
private static IntentFilter intentFilter = null; private static IntentFilter intentFilter = null;
private static List<String> lastTetheringTypes = null;
private static boolean tetheringActive = false; private static boolean tetheringActive = false;
public static List<String> getLastTetheringTypes()
{
return lastTetheringTypes;
}
public static TetheringReceiver getInstance() public static TetheringReceiver getInstance()
{ {
if(receiverInstance == null) if(receiverInstance == null)
@ -49,91 +38,28 @@ public class TetheringReceiver extends android.content.BroadcastReceiver impleme
@Override @Override
public void onReceive(Context context, Intent intent) public void onReceive(Context context, Intent intent)
{ {
Miscellaneous.logEvent("i", "TetheringReceiver", "Received " + intent.getAction(), 5); for(String key : intent.getExtras().keySet())
/*
DETECT BY DATA DELIVERED IN INTENT
*/
// if(intent.getAction().equals("android.net.conn.TETHER_STATE_CHANGED"))
// {
String searchArray = null;
if (Build.VERSION.SDK_INT >= 26)
searchArray = "tetherArray";
else
searchArray = "activeArray";
for (String key : intent.getExtras().keySet())
{ {
// Miscellaneous.logEvent("i", "Broadcast extra", "Broadcast " + intent.getAction() + " has extra " + key + " and type " + intent.getExtras().get(key).getClass().getName(), 4); // Miscellaneous.logEvent("i", "Broadcast extra", "Broadcast " + intent.getAction() + " has extra " + key + " and type " + intent.getExtras().get(key).getClass().getName(), 4);
Object ob = intent.getExtras().get(key); Object ob = intent.getExtras().get(key);
if (key.equals(searchArray) && ob instanceof ArrayList) String target = null;
{
if (((ArrayList<String>) ob).size() > 0)
{
tetheringActive = true;
if (lastTetheringTypes == null)
lastTetheringTypes = new ArrayList<>();
else
lastTetheringTypes.clear();
for (String adapterName : (ArrayList<String>) ob) if(Build.VERSION.SDK_INT >= 26)
target = "tetherArray";
else
target = "activeArray";
if(key.equals(target) && ob instanceof ArrayList)
{ {
if (adapterName.contains("wlan")) if(((ArrayList<String>)ob).size() > 0)
lastTetheringTypes.add(ActivityManageTriggerTethering.tetheringTypeWifi); tetheringActive = true;
else if (adapterName.contains("bluetooth"))
lastTetheringTypes.add(ActivityManageTriggerTethering.tetheringTypeBluetooth);
else if (adapterName.contains("rndis"))
lastTetheringTypes.add(ActivityManageTriggerTethering.tetheringTypeUsb);
else if (adapterName.contains("ndis"))
lastTetheringTypes.add(ActivityManageTriggerTethering.tetheringTypeCable);
}
}
else else
tetheringActive = false; tetheringActive = false;
} }
// Miscellaneous.logEvent("i", "Broadcast extra", "Broadcast " + intent.getAction() + " has extra " + key + " and type " + intent.getExtras().get(key).getClass().getName(), 4); // Miscellaneous.logEvent("i", "Broadcast extra", "Broadcast " + intent.getAction() + " has extra " + key + " and type " + intent.getExtras().get(key).getClass().getName(), 4);
} }
// }
// else if(intent.getAction().equals("android.net.conn.CONNECTIVITY_CHANGE"))
/*
DETECT BY CHECKING ALL NETWORK INTERFACES
*/
// {
/*try
{
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); )
{
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); )
{
InetAddress inetAddress = enumIpAddr.nextElement();
if (!intf.isLoopback())
{
if (intf.getName().contains("rndis"))
{
Miscellaneous.logEvent("i", "TetheringReceiver", "Tethering on interface " + intf.getName() + " seems to be active.", 4);
lastTetheringTypes.add(ActivityManageTriggerTethering.tetheringTypeUsb);
tetheringActive = true;
}
else if (intf.getName().contains("ndis"))
{
Miscellaneous.logEvent("i", "TetheringReceiver", "Tethering on interface " + intf.getName() + " seems to be active.", 4);
lastTetheringTypes.add(ActivityManageTriggerTethering.tetheringTypeCable);
tetheringActive = true;
}
}
}
}
}
catch (Exception e)
{
Miscellaneous.logEvent("e", "TetheringReceiver", Log.getStackTraceString(e), 1);
}*/
// }
ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger.Trigger_Enum.tethering); ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger.Trigger_Enum.tethering);
for(int i=0; i<ruleCandidates.size(); i++) for(int i=0; i<ruleCandidates.size(); i++)
@ -157,7 +83,6 @@ public class TetheringReceiver extends android.content.BroadcastReceiver impleme
{ {
intentFilter = new IntentFilter(); intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.TETHER_STATE_CHANGED"); intentFilter.addAction("android.net.conn.TETHER_STATE_CHANGED");
// intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
} }
try try

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

View File

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

Before

Width:  |  Height:  |  Size: 679 B

After

Width:  |  Height:  |  Size: 679 B

View File

@ -100,7 +100,6 @@
android:id="@+id/bSendEmailToDev" android:id="@+id/bSendEmailToDev"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/default_margin"
android:text="@string/sendEmailToDev" /> android:text="@string/sendEmailToDev" />
<TextView <TextView

View File

@ -76,14 +76,6 @@
android:text="@string/comparisonCaseInsensitive" android:text="@string/comparisonCaseInsensitive"
android:layout_marginBottom="@dimen/default_margin"/> android:layout_marginBottom="@dimen/default_margin"/>
<TextView
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textStyle="bold"
android:text="@string/regularExpressionsIfEquals"
android:layout_marginBottom="@dimen/default_margin"/>
<TableRow <TableRow
android:layout_marginBottom="@dimen/activity_vertical_margin"> android:layout_marginBottom="@dimen/activity_vertical_margin">
@ -120,22 +112,6 @@
android:layout_marginVertical="@dimen/default_margin" android:layout_marginVertical="@dimen/default_margin"
android:background="#aa000000" /> android:background="#aa000000" />
<TextView
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textStyle="bold"
android:text="@string/comparisonCaseInsensitive"
android:layout_marginBottom="@dimen/default_margin"/>
<TextView
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textStyle="bold"
android:text="@string/regularExpressionsIfEquals"
android:layout_marginBottom="@dimen/default_margin"/>
<TableRow <TableRow
android:layout_marginBottom="@dimen/activity_vertical_margin"> android:layout_marginBottom="@dimen/activity_vertical_margin">
@ -165,69 +141,6 @@
</TableRow>> </TableRow>>
<ImageView
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_margin="10dp"
android:layout_marginVertical="@dimen/default_margin"
android:background="#aa000000" />
<TableRow>
<RadioGroup>
<RadioButton
android:id="@+id/rbNotificationDismissSimple"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/simplyDismissNotification" />
<RadioButton
android:id="@+id/rbNotificationDismissButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/clickNotificationButton" />
</RadioGroup>
<EditText
android:layout_gravity="bottom"
android:id="@+id/etNotificationDismissalButtonText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:enabled="false"
android:inputType="text" />
</TableRow>
<TableRow>
<TextView />
<TextView
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textStyle="bold"
android:text="@string/comparisonCaseInsensitive"
android:layout_marginBottom="@dimen/default_margin"/>
</TableRow>
<TableRow>
<TextView />
<TextView
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textStyle="bold"
android:text="@string/mayUseRegularExpressions"
android:layout_marginBottom="@dimen/default_margin"/>
</TableRow>
</TableLayout> </TableLayout>
<Button <Button

View File

@ -1,100 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_margin="@dimen/default_margin">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_span="2"
android:textSize="25dp"
android:textStyle="bold"
android:layout_marginBottom="@dimen/default_margin"
android:text="@string/keepDeviceAwake" />
<TableLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:shrinkColumns="1"
android:stretchColumns="1">
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="@string/direction" />
<RadioGroup>
<RadioButton
android:id="@+id/rbWakeLockActivate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="@string/activate" />
<RadioButton
android:id="@+id/rbWakeLockDeactivate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/deactivate" />
</RadioGroup>
</TableRow>
<TableRow>
<TextView
android:text="@string/wakeLockExplanation"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:layout_span="2"
android:layout_marginVertical="@dimen/default_margin" />
</TableRow>
<TableRow>
<TextView
android:text="@string/wakeLockTimeout"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/chkWakeLockTimeout"
android:text=""
android:layout_height="wrap_content"
android:layout_width="wrap_content" />
</TableRow>
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/duration" />
<EditText
android:id="@+id/etWakeLockDuration"
android:inputType="number"
android:layout_height="wrap_content"
android:layout_width="wrap_content" />
</TableRow>
</TableLayout>
<Button
android:id="@+id/bSaveWakelock"
android:layout_marginTop="@dimen/default_margin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/save" />
</LinearLayout>

View File

@ -96,7 +96,6 @@
android:layout_margin="10dp" android:layout_margin="10dp"
android:layout_marginVertical="@dimen/default_margin" android:layout_marginVertical="@dimen/default_margin"
android:background="#aa000000" /> android:background="#aa000000" />
<TextView <TextView
android:gravity="center" android:gravity="center"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -105,14 +104,6 @@
android:text="@string/comparisonCaseInsensitive" android:text="@string/comparisonCaseInsensitive"
android:layout_marginBottom="@dimen/default_margin"/> android:layout_marginBottom="@dimen/default_margin"/>
<TextView
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textStyle="bold"
android:text="@string/regularExpressionsIfEquals"
android:layout_marginBottom="@dimen/default_margin"/>
<TableRow <TableRow
android:layout_marginBottom="@dimen/activity_vertical_margin"> android:layout_marginBottom="@dimen/activity_vertical_margin">

View File

@ -1,75 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="@dimen/default_margin" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_span="2"
android:textSize="25dp"
android:textStyle="bold"
android:layout_marginBottom="@dimen/default_margin"
android:text="@string/subSystemState" />
<RadioGroup
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RadioButton
android:id="@+id/rbSubSystemStateWifi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="@string/wifi" />
<RadioButton
android:id="@+id/rbSubSystemStateBluetooth"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/bluetooth" />
</RadioGroup>
<ImageView
android:layout_width="match_parent"
android:layout_span="2"
android:layout_height="1dp"
android:layout_margin="10dp"
android:background="#aa000000" />
<RadioGroup
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RadioButton
android:id="@+id/rbSubSystemStateEnabled"
android:checked="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/activated" />
<RadioButton
android:id="@+id/rbSubSystemStateDisabled"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/deactivated" />
</RadioGroup>
<Button
android:id="@+id/bSubSystemStateSave"
android:layout_marginTop="@dimen/default_margin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/save" />
</LinearLayout>
</ScrollView>

View File

@ -58,59 +58,6 @@
</TableRow> </TableRow>
<ImageView
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_margin="10dp"
android:background="#aa000000" />
<TableRow>
<TextView
android:layout_gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/default_margin"
android:text="@string/type" />
<RadioGroup>
<RadioButton
android:id="@+id/rbTetheringTypeAny"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="@string/any" />
<RadioButton
android:id="@+id/rbTetheringTypeWifi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/wifi" />
<RadioButton
android:visibility="gone"
android:id="@+id/rbTetheringTypeBluetooth"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/bluetooth" />
<RadioButton
android:id="@+id/rbTetheringTypeUsb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/usb" />
<RadioButton
android:id="@+id/rbTetheringTypeCable"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/cable" />
</RadioGroup>
</TableRow>
</TableLayout> </TableLayout>
<Button <Button

View File

@ -47,19 +47,6 @@
</TableRow> </TableRow>
<TableRow>
<TextView
android:id="@+id/tvWifiTriggerNameLocationNotice"
android:layout_span="2"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:textColor="@color/red"
android:text="@string/locationRequiredToDetermineWifiName"
android:layout_marginVertical="@dimen/default_margin"
android:visibility="gone" />
</TableRow>
<TableRow> <TableRow>
<TextView <TextView
@ -75,16 +62,6 @@
</TableRow> </TableRow>
<TableRow>
<TextView />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/mayUseRegularExpressions"/>
</TableRow>
<TableRow> <TableRow>
<Button <Button
@ -104,7 +81,7 @@
</TableLayout> </TableLayout>
<Button <Button
android:id="@+id/bTriggerWifiSave" android:id="@+id/btriggerWifiSave"
android:layout_marginTop="@dimen/default_margin" android:layout_marginTop="@dimen/default_margin"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"

View File

@ -519,7 +519,7 @@
<string name="notification">Benachrichtigung</string> <string name="notification">Benachrichtigung</string>
<string name="title">Titel</string> <string name="title">Titel</string>
<string name="text">Text</string> <string name="text">Text</string>
<string name="anyApp">irgendeine Anwendung</string> <string name="anyApp">Irgendeine Anwendung</string>
<string name="postsNotification">%1$s zeigt eine Benachrichtung an</string> <string name="postsNotification">%1$s zeigt eine Benachrichtung an</string>
<string name="removedNotification">Benachrichtigung von %1$s wurde entfernt</string> <string name="removedNotification">Benachrichtigung von %1$s wurde entfernt</string>
<string name="notificationAppears">Benachrichtigung wird angezeigt</string> <string name="notificationAppears">Benachrichtigung wird angezeigt</string>
@ -688,7 +688,7 @@
<string name="screenIs">Bildschirm ist %1$s</string> <string name="screenIs">Bildschirm ist %1$s</string>
<string name="sendEmailToDev">Email an Entwickler schicken</string> <string name="sendEmailToDev">Email an Entwickler schicken</string>
<string name="controlCenter">Steuerungszentrale</string> <string name="controlCenter">Steuerungszentrale</string>
<string name="emailContactNotice">Email ist mein bevorzugtes Kommunikationsmittel, um Fehler zu melden, Fragen zu stellen or Vorschläge zu machen. Bitte gehen Sie für weitere Infos in die Steuerungszentrale.\nViele Fragen können nicht einfach gleich beantwortet werden, sondern erfordern eine technische Prüfung. Haben Sie also bitte etwas Geduld.</string> <string name="emailContactNotice">Email ist mein bevorzugtes Kommunikationsmittel, um Fehler zu melden, Fragen zu stellen or Vorschläge zu machen. Bitte gehen Sie für weitere Infos in die Steuerungszentrale.</string>
<string name="featureCeasedToWorkLastWorkingAndroidVersion">Aufgrund Google\'s unendlicher Weisheit, ist die letzte Android Version, mit der diese Funktion noch funktioniert, die Version %1$s. Sie können es hier einrichten, aber vermutlich wird es keine Auswirkung haben.</string> <string name="featureCeasedToWorkLastWorkingAndroidVersion">Aufgrund Google\'s unendlicher Weisheit, ist die letzte Android Version, mit der diese Funktion noch funktioniert, die Version %1$s. Sie können es hier einrichten, aber vermutlich wird es keine Auswirkung haben.</string>
<string name="musicPlaying">Musik läuft</string> <string name="musicPlaying">Musik läuft</string>
<string name="selectParameters">Wählen Sie die Parameter</string> <string name="selectParameters">Wählen Sie die Parameter</string>
@ -706,8 +706,8 @@
<string name="startActivityInsertManually">Diese Einschränkung betrifft nur die Auswahl einer App, nicht den eigentlichen Start. So können Sie den Namen einer Anwendung immer noch manuell eingeben, falls Sie ihn kennen.</string> <string name="startActivityInsertManually">Diese Einschränkung betrifft nur die Auswahl einer App, nicht den eigentlichen Start. So können Sie den Namen einer Anwendung immer noch manuell eingeben, falls Sie ihn kennen.</string>
<string name="serviceStarts">Dienst startet</string> <string name="serviceStarts">Dienst startet</string>
<string name="deviceStarts">Gerät startet</string> <string name="deviceStarts">Gerät startet</string>
<string name="deviceIsStarting">Gerät startet gerade</string> <string name="deviceHasJustStarted">Gerät ist gerade gestartet</string>
<string name="serviceIsStarting">Dienst startet gerade</string> <string name="serviceHasJustStarted">Dienst ist gerade gestartet</string>
<string name="broadcastReceived">Broadcast empfangen</string> <string name="broadcastReceived">Broadcast empfangen</string>
<string name="broadcastNotReceived">Broadcast nicht empfangen</string> <string name="broadcastNotReceived">Broadcast nicht empfangen</string>
<string name="broadcastReceivedTitle">Broadcast empfangen</string> <string name="broadcastReceivedTitle">Broadcast empfangen</string>
@ -737,17 +737,5 @@
<string name="wifiExplanation2">Während der Flugmodus aktiv ist, kann WLAN nur von Anwendungen ein- oder ausgeschaltet werden, wenn root-Rechte dafür verwendet werden.</string> <string name="wifiExplanation2">Während der Flugmodus aktiv ist, kann WLAN nur von Anwendungen ein- oder ausgeschaltet werden, wenn root-Rechte dafür verwendet werden.</string>
<string name="wifiExplanation1">Anwendungen, die auf Android Q oder höher ausgerichtet sind, können WLAN nicht mehr ein- oder ausschalten. Daran ist Google schuld, nicht ich.\n\nSie können diese Einschränkung umgehen, indem Sie Ihr Gerät rooten und die Checkbox unten aktivieren. Alternativ laden Sie sich diese Anwendung von F-Droid oder meiner Webseite herunter. In diesen Versionen bin ich nicht gezwungen, die Anwendungen auf die neuesten API Level zu unterstützen.</string> <string name="wifiExplanation1">Anwendungen, die auf Android Q oder höher ausgerichtet sind, können WLAN nicht mehr ein- oder ausschalten. Daran ist Google schuld, nicht ich.\n\nSie können diese Einschränkung umgehen, indem Sie Ihr Gerät rooten und die Checkbox unten aktivieren. Alternativ laden Sie sich diese Anwendung von F-Droid oder meiner Webseite herunter. In diesen Versionen bin ich nicht gezwungen, die Anwendungen auf die neuesten API Level zu unterstützen.</string>
<string name="runExecutableExplanation">Sie können ein Script oder eine andere ausführbare Datei auswählen, die dann als Aktion ausgeführt wird.\n\nAllerdings gibt es ein paar Voraussetzungen, um die Sie sich selbst kümmern müssen. Google hat es sehr schwer gemacht, irgendetwas außer normalen Android Anwendungen auszuführen.\n\n1.\nDie Datei muß im Dateisystem als ausführbar markiert sein. Auf einem normalen Android-System (ohne Root) ist das in der Tat der schwierigste Teil.\n\n2.\nDas bedeutet auch, daß auch Automation in der Lage sein muß, die Datei auszuführen, nicht nur der Besitzer oder die Gruppe.\n\n3.\nWenn es ein Script ist, muß eine gültige Shell im Header des Scripts definiert sein.</string> <string name="runExecutableExplanation">Sie können ein Script oder eine andere ausführbare Datei auswählen, die dann als Aktion ausgeführt wird.\n\nAllerdings gibt es ein paar Voraussetzungen, um die Sie sich selbst kümmern müssen. Google hat es sehr schwer gemacht, irgendetwas außer normalen Android Anwendungen auszuführen.\n\n1.\nDie Datei muß im Dateisystem als ausführbar markiert sein. Auf einem normalen Android-System (ohne Root) ist das in der Tat der schwierigste Teil.\n\n2.\nDas bedeutet auch, daß auch Automation in der Lage sein muß, die Datei auszuführen, nicht nur der Besitzer oder die Gruppe.\n\n3.\nWenn es ein Script ist, muß eine gültige Shell im Header des Scripts definiert sein.</string>
<string name="regularExpressionsIfEquals">Falls \"ist gleich\" ausgewählt ist, können Sie reguläre Ausdrücke eingeben.</string>
<string name="enter_a_number">Geben Sie eine Zahl ein.</string> <string name="enter_a_number">Geben Sie eine Zahl ein.</string>
<string name="duration">Dauer [ms]</string>
<string name="keepDeviceAwake">Gerät wach halten</string>
<string name="wakeLockTimeout">Zeitlimit angeben</string>
<string name="wakeLockExplanation">Aktivieren wird den Bildschirm anbehalten, während deaktivieren dem Bildschirm erlaubt, auszugehen. Um ihn anzubehalten, können Sie entweder eine Dauer angeben, nach der er ausgehen darf, oder Sie können Sie unendlich lange anlassen. Im letzteren Fall müßten Sie eine neue Gerät wach halten-Aktion definieren, in der Sie \"deaktivieren\" auswählen.</string>
<string name="mayUseRegularExpressions">Sie können hier auch einen regulären Ausdruck eingeben.</string>
<string name="locationRequiredToDetermineWifiName">Um die SSID auslesen zu können, benötigt die Anwendung das Recht Ihren Standort zu erkennen. Weil die Google-Version das nicht kann, können Sie in diesem Auslöser keine SSID spezifizieren. Sie können ihn nur wenden, um zu erkennen, ob WLAN verbunden ist oder nicht.</string>
<string name="withButton">mit der Schaltfläche %1$s</string>
<string name="bluetooth">Bluetooth</string>
<string name="subSystemState">Subsystem Status</string>
<string name="clickNotificationButton">Eine Schaltfläche klicken</string>
<string name="simplyDismissNotification">Regulär schließen</string>
</resources> </resources>

View File

@ -117,7 +117,7 @@
<string name="actionSetUsbTethering">Enrutador USB</string> <string name="actionSetUsbTethering">Enrutador USB</string>
<string name="actionTurnBluetoothOn">encender Bluetooth</string> <string name="actionTurnBluetoothOn">encender Bluetooth</string>
<string name="actionTurnWifiOn">encender wifi</string> <string name="actionTurnWifiOn">encender wifi</string>
<string name="actionTurnWifiOff">desactivar wifi</string> <string name="actionTurnWifiOff">desactivar Bluetooth</string>
<string name="actionTurnBluetoothOff">desactivar Bluetooth</string> <string name="actionTurnBluetoothOff">desactivar Bluetooth</string>
<string name="actionTriggerUrl">Abrir URL en antecedentes</string> <string name="actionTriggerUrl">Abrir URL en antecedentes</string>
<string name="actionChangeSoundProfile">Cambiar perfil sonido</string> <string name="actionChangeSoundProfile">Cambiar perfil sonido</string>
@ -687,7 +687,7 @@
<string name="screenIs">pantalla esta %1$s</string> <string name="screenIs">pantalla esta %1$s</string>
<string name="sendEmailToDev">Enviar email al desrollador</string> <string name="sendEmailToDev">Enviar email al desrollador</string>
<string name="featureCeasedToWorkLastWorkingAndroidVersion">Debido a la infinita sabiduría de Google, la última versión de Android en la que se sabe que funciona esta función es %1$s. Puede configurarlo, pero probablemente no tendrá ningún efecto.</string> <string name="featureCeasedToWorkLastWorkingAndroidVersion">Debido a la infinita sabiduría de Google, la última versión de Android en la que se sabe que funciona esta función es %1$s. Puede configurarlo, pero probablemente no tendrá ningún efecto.</string>
<string name="emailContactNotice">El correo electrónico es mi método preferido de contacto para informar errores, hacer preguntas o hacer propuestas. Vaya al centro de control para obtener más información.\nMuchas preguntas no se pueden responder de inmediato, pero requieren cierta investigación técnica. Así que, por favor, tengan un poco de paciencia.</string> <string name="emailContactNotice">El correo electrónico es mi método preferido de contacto para informar errores, hacer preguntas o hacer propuestas. Vaya al centro de control para obtener más información.</string>
<string name="actionMediaControlNotice">Ten en cuenta que esta acción puede no funcionar con TODOS los jugadores. E incluso si lo hace, no todos los botones funcionan necesariamente.</string> <string name="actionMediaControlNotice">Ten en cuenta que esta acción puede no funcionar con TODOS los jugadores. E incluso si lo hace, no todos los botones funcionan necesariamente.</string>
<string name="musicPlaying">Musica esta reproduciendo</string> <string name="musicPlaying">Musica esta reproduciendo</string>
<string name="selectParameters">Elije parametros</string> <string name="selectParameters">Elije parametros</string>
@ -705,8 +705,8 @@
<string name="startActivityInsertManually">Esta limitación se refiere solo a la selección de una aplicación, no al inicio real. Por lo tanto, aún puede ingresar el nombre de una aplicación manualmente si lo conoce.</string> <string name="startActivityInsertManually">Esta limitación se refiere solo a la selección de una aplicación, no al inicio real. Por lo tanto, aún puede ingresar el nombre de una aplicación manualmente si lo conoce.</string>
<string name="deviceStarts">Dispositivo esta enciendo</string> <string name="deviceStarts">Dispositivo esta enciendo</string>
<string name="serviceStarts">Servicio esta enciendo</string> <string name="serviceStarts">Servicio esta enciendo</string>
<string name="deviceIsStarting">el dispositivo justamente esta encendido</string> <string name="deviceHasJustStarted">el dispositivo justamente ha encendido</string>
<string name="serviceIsStarting">el servicio justamente esta encendido</string> <string name="serviceHasJustStarted">el servicio justamente ha encendido</string>
<string name="emailPretext">Si tiene un problema, sugerencia o pregunta, escriba algo en el correo electrónico. No solo envíeme los archivos con el cuerpo de correo predeterminado. Ignoraré todo eso a menos que ya estemos en una conversación.</string> <string name="emailPretext">Si tiene un problema, sugerencia o pregunta, escriba algo en el correo electrónico. No solo envíeme los archivos con el cuerpo de correo predeterminado. Ignoraré todo eso a menos que ya estemos en una conversación.</string>
<string name="lockedCommentScreenMustBeOff">Cualquier estado de bloqueo solo se detectará si la pantalla está apagada.</string> <string name="lockedCommentScreenMustBeOff">Cualquier estado de bloqueo solo se detectará si la pantalla está apagada.</string>
<string name="lockedWithSecurity">bloqueado (con PIN, etc.)</string> <string name="lockedWithSecurity">bloqueado (con PIN, etc.)</string>
@ -723,30 +723,4 @@
<string name="logsExplanation">Para evitar el uso innecesario del almacenamiento, los registros no se guardan de forma predeterminada. Entonces, si tiene un problema, active primero la configuración de inicio de sesión y establezca el nivel de registro en 5. A continuación, reproduzca el problema. Solo entonces se pueden adjuntar registros.</string> <string name="logsExplanation">Para evitar el uso innecesario del almacenamiento, los registros no se guardan de forma predeterminada. Entonces, si tiene un problema, active primero la configuración de inicio de sesión y establezca el nivel de registro en 5. A continuación, reproduzca el problema. Solo entonces se pueden adjuntar registros.</string>
<string name="directionStringDoesNotContain">no contiene</string> <string name="directionStringDoesNotContain">no contiene</string>
<string name="enter_a_number">Introduzca un número.</string> <string name="enter_a_number">Introduzca un número.</string>
<string name="regularExpressionsIfEquals">Si se selecciona \"igual\", puede introducir una expresión regular.</string>
<string name="duration">Duración [ms]</string>
<string name="keepDeviceAwake">Mantenga el dispositivo despierto</string>
<string name="wakeLockTimeout">Especificar el tiempo de espera</string>
<string name="runAsRoot">Ejecutar con root</string>
<string name="path">Ruta de acceso</string>
<string name="runExecutable">Ejecutar script o ejecutable</string>
<string name="parameters">Parámetros</string>
<string name="chooseExecutable">Elegir ejecutable</string>
<string name="selectValidExecutable">Elija valido archivo ejecutable.</string>
<string name="fileNotExecutable">Este archivo no es ejecutable.</string>
<string name="usingRoot">con root</string>
<string name="tetheringActive">tethering esta activo</string>
<string name="tetheringNotActive">tethering no esta activo</string>
<string name="tetheringState">Estado de tethering</string>
<string name="wifiExplanation2">Mientras modo vuelo esta activo, solo aplicaciones que tienen el permiso root pueden encender/desactivar wifi.</string>
<string name="wifiExplanation1">Las aplicaciones dirigidas a Android Q o superior ya no pueden activar o desactivar el wifi. Por favor, culpe a Google por esta restricción, no a mí. Puede omitir esta restricción rooteando su dispositivo y activando la casilla de verificación a continuación. Alternativamente, descargue esta aplicación de F-Droid o mi sitio web, ya que no estoy obligado a apuntar al último nivel de API en esas versiones.</string>
<string name="runExecutableExplanation">Puede seleccionar un script o un archivo ejecutable aquí que se ejecutará como una acción. Pero hay algunos requisitos previos con los que tienes que lidiar por tu cuenta. Google ha hecho que sea muy difícil ejecutar cualquier otra cosa que no sean aplicaciones normales de Android. 1. El archivo debe estar marcado como ejecutable en el sistema de archivos. En un sistema Android normal (sin root) esta es en realidad la parte difícil. 2. Eso también significa que la automatización debe poder ejecutar el archivo, no solo el propietario o el grupo. 3. Si se trata de un script, se especificará un shell válido en el encabezado del script.</string>
<string name="wakeLockExplanation">Activar mantendrá la pantalla encendida mientras desactiva la dejará apagarla. Para mantenerlo encendido, puede ingresar una duración después de la cual puede apagarse nuevamente o puede mantenerlo encendido indefinidamente. En este último caso, deberá crear otra acción de mantenerse despierto (en esta u otra regla) en la que seleccione desactivar.</string>
<string name="mayUseRegularExpressions">Aqui tambien puede insertar expressiones regulares.</string>
<string name="locationRequiredToDetermineWifiName">Para obtener el SSID wifi, la aplicación requiere permisos de ubicación. Debido a que la versión de Google no puede obtener eso, solo puede usar este desencadenador si no especifica un SSID. Por lo tanto, solo se puede usar para detectar si wifi está conectado o no.</string>
<string name="withButton">con botón %1$s</string>
<string name="bluetooth">Bluetooth</string>
<string name="subSystemState">Estado del subsystema</string>
<string name="clickNotificationButton">Cliquar un botón</string>
<string name="simplyDismissNotification">Simplemente desestimar</string>
</resources> </resources>

View File

@ -1,856 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name" translatable="false">Automation</string>
<string name="ruleActivate">Activation de la règle %1$s</string>
<string name="profilActivate">Activation du profil %1$s</string>
<string name="ruleActivateToggle">Activation de la règle %1$s en mode alternatif</string>
<string name="addPoi">Ajouter une localisation</string>
<string name="addRule">Ajouter une règle</string>
<string name="poiList">Liste des localisation:</string>
<string name="ruleList">Liste des règles:</string>
<string name="pleaseEnterValidName">Veuillez entrer un nom valide.</string>
<string name="pleaseSpecifiyTrigger">Veuillez spécifier au moins un dćlencheur.</string>
<string name="pleaseSpecifiyAction">Veuillez spécifier au moins une action.</string>
<string name="serviceWontStart">Aucune règle définie. Le service ne démarrera pas.</string>
<string name="serviceStarted">Automation démarre.</string>
<string name="version">Version %1$s.</string>
<string name="logServiceStarting" translatable="false">Starting service.</string>
<string name="logNotAllMeasurings" translatable="false">Don\'t have all location measurings, yet. Can\'t do comparison.</string>
<string name="distanceBetween">La distance entre la position GPS et la position du réseau est de %1$d mètres. +1m est le rayon absolue minimal.</string>
<string name="comparing" translatable="false">Have both network and gps location. Comparing...</string>
<string name="logNoSuitableProvider" translatable="false">No suitable location providers could be used.</string>
<string name="positioningWindowNotice">Si vous êtes dans un bâtiment il est fortement recommandé de vous approcher d\'une fenêtre pour qu\'une géolocalisation soit trouvée. Sinon la géolocalisation peut prendre beaucoup de temps ou ne pas fonctionner.</string>
<string name="gettingPosition">Acquisition de la géolocalisation. Veuillez patienter...</string>
<string name="logGettingPositionWithProvider" translatable="false">Requesting location using provider:</string>
<string name="yes">Oui</string>
<string name="no">Non</string>
<string name="logGotGpsUpdate" translatable="false">Got GPS update. Accuracy:</string>
<string name="logGotNetworkUpdate" translatable="false">Got network update. Accuracy:</string>
<string name="pleaseEnterValidLatitude">Veuillez saisir une latitude valide.</string>
<string name="pleaseEnterValidLongitude">Veuillez saisir une longitude valide.</string>
<string name="pleaseEnterValidRadius">Veuillez entrer une valeur de rayon positive.</string>
<string name="selectOneDay">Sélectionnez au moins un jour.</string>
<string name="logAttemptingToBindToService" translatable="false">Attempting to bind to service... </string>
<string name="logAttemptingToUnbindFromService" translatable="false">Attempting to unbind from service... </string>
<string name="logBoundToService" translatable="false">Bound to service.</string>
<string name="logUnboundFromService" translatable="false">Unbound from service.</string>
<string name="logServiceAlreadyRunning" translatable="false">Request to start service, but it is already running.</string>
<string name="whatToDoWithRule">Que faire avec la règle ?</string>
<string name="whatToDoWithPoi">Que faire avec la géolocalisation ?</string>
<string name="whatToDoWithprofil">Que faire avec le profil ?</string>
<string name="delete">supprimer</string>
<string name="deleteCapital">Supprimer</string>
<string name="serviceStopped">Automation s\'arrête.</string>
<string name="logServiceStopping">Arrêt du service.</string>
<string name="stillGettingPosition">Géolocalisation en cours d\'acquisition</string>
<string name="lastRule">Dernière règle:</string>
<string name="at">à</string>
<string name="service">Service:</string>
<string name="getCurrentPosition">Acquérir la géolocalisation actuelle</string>
<string name="savePoi">Enregistrer la géolocalisation</string>
<string name="deletePoi">Supprimer la géolocalisation</string>
<string name="latitude">Latitude</string>
<string name="longitude">Longitude</string>
<string name="ruleName">Nom de la règle</string>
<string name="triggers">Déclencheur(s)</string>
<string name="triggersComment">(tous les déclencheurs s\'appliqueront simultanément)</string>
<string name="addTrigger">Ajouter une déclencheur</string>
<string name="actions">Action(s)</string>
<string name="actionsComment">(sera éxécuter dans cet ordre)</string>
<string name="addAction">Ajouter une action</string>
<string name="saveRule">Enregistrer la règle</string>
<string name="monday">Lundi</string>
<string name="tuesday">Mardi</string>
<string name="wednesday">Mercredi</string>
<string name="thursday">Jeudi</string>
<string name="friday">Vendredi</string>
<string name="saturday">Samedi</string>
<string name="sunday">Dimanche</string>
<string name="start">Démarrage</string>
<string name="end">Arrêt</string>
<string name="save">Enregistrer</string>
<string name="urlToTrigger">URL à déclencher:</string>
<string name="urlLegend">Variables:\nVous pouvez utiliser les variables suivantes. Lors du déclenchement, elles seront remplacées par les variables correspondantes sur votre appareil. Insérez les parenthèses dans votre texte.\n\n[uniqueid] - Identifiant unique de votre appareil\n[serialnr] - Numéro de série de votre appraeil (&lt; Android 9)\n[latitude] - Latitude de votre appraeil\n[longitude] - Longitude de votre appraeil\n[phonenr] - Nombre des derniers appels entrants ou sortants\n[d] - Jour du mois, @ chiffres commençant par 0\n[m] - Valeur numérique du mois, avec @ chiffres\n[Y] - Valeur numérique de l\'année, $ chiffres\n[h] - Format horaire 12 heures, 2 chiffres\n[H] - Format horaire 24 heures, 2 chiffres\n[i] - Nombre de minutes, 2 chiffres\n[s] - Nombre de secondes, 2 chiffres\n[ms] - Nombre de milisecondes\n[notificationTitle] - tire de la dernière notification\n[notificationText] - texte de la dernière notification</string>
<string name="wifi">wifi</string>
<string name="activating">Allumer</string>
<string name="deactivating">Éteindre</string>
<string name="bluetoothFailed">Échec de l\'activation du Bluetooth. Votre appareil a le Bluetooth ?</string>
<string name="urlTooShort">L\'url saisie doit être de 10 caractères minimum.</string>
<string name="enterPhoneNumberAndText">Saisissez le numéro de télephone et le message.</string>
<string name="selectTypeOfTrigger">Sélectionnez le type de déclencheur</string>
<string name="entering">enterant</string>
<string name="leaving">sortant</string>
<string name="noPoisSpecified">Vous n\'avez pas spécifié de géolocalisation. Indiquez en une.</string>
<string name="started">En charge</string>
<string name="stopped">Hors charge</string>
<string name="connected">connecté</string>
<string name="disconnected">déconnecté</string>
<string name="selectPoi">Sélectionnez une géolocalisation</string>
<string name="selectTypeOfAction">Sélectionnez une action</string>
<string name="selectSoundprofil">Sélectionnez une profil audio</string>
<string name="whatToDoWithTrigger">Que faire avec le déclencheur ?</string>
<string name="whatToDoWithAction">Que faire avec l\'action ?</string>
<string name="radiusHasToBePositive">Le rayon doit être une valeur positive.</string>
<string name="poiStillReferenced">Ceratines règles se réfèrent toujours à cette position (%1$s). Impossible de la supprimer maintenant.</string>
<string name="generalSettings">Réglages généraux</string>
<string name="startAtSystemBoot">Lancement au démarrage du système</string>
<string name="onOff">On/Off</string>
<string name="writeLogFile">Écriture du fichier de log</string>
<string name="useTextToSpeechOnNormalSummary">Utiliser la synthèse vocale en mode sonnerie</string>
<string name="useTextToSpeechOnVibrateSummary">Utiliser la synthèse vocale en mode vibreur</string>
<string name="useTextToSpeechOnSilentSummary">Utiliser la synthèse vocale en mode silenceuse</string>
<string name="useTextToSpeechOnNormalTitle">Synthèse vocale en sonnerie</string>
<string name="useTextToSpeechOnVibrateTitle">Synthèse vocale en vibreur</string>
<string name="useTextToSpeechOnSilentTitle">Synthèse vocale en silence</string>
<string name="positioningSettings">Paramètre de géolocalisation</string>
<string name="listenToWifiState">Écoute des changements d\'état du wifi si possible</string>
<string name="wifiState">État du wifi</string>
<string name="listenToAccelerometerState">Surveillance des mouvement de l\'appareil quand le wifi n\'est pas disponible</string>
<string name="accelerometer">Accéléromètre</string>
<string name="accelerometerTimer">Utilisation de l\'accéléromètre après x minutes sans changement de tour relais cellulaire</string>
<string name="cellMastIdleTime">Temps d\'inactivité de la tour cellulaire</string>
<string name="accelerometerThresholdDescription">Seuil limite pour les mouevments de laccéléromètre</string>
<string name="accelerometerThreshold">Seuil de l\'accéléromètre</string>
<string name="positioningThresholds">Seuil de positionnement</string>
<string name="minimumDistanceChangeForGpsLocationUpdates">Changement de distance minimum pour les mises à jour de la localisation GPS</string>
<string name="distanceForGpsUpdate">Distance pour la mise à jour du GPS [m]</string>
<string name="minimumDistanceChangeForNetworkLocationUpdates">Changement de distance minimum pour les mises à jour de la localisation par le réseau cellulaire</string>
<string name="distanceForNetworkUpdate">Distance pour la mise à jour du réseau [m]</string>
<string name="satisfactoryAccuracyGps">Précision acceptable en mètres lors de l\'acquisition de la localisation par GPS</string>
<string name="gpsAccuracy">Précision du GPS [m]</string>
<string name="satisfactoryAccuracyNetwork">Précision acceptable en mètres lors de l\'acquisition de la localisation par les relais téléphoniques</string>
<string name="networkAccuracy">Précision du réseau [m]</string>
<string name="minimumTimeForLocationUpdates">Variation minimale du temps en millisecondes pour les mises à jour de localisation</string>
<string name="timeForUpdate">Délais de mise à jour [millisecondes]</string>
<string name="soundSettings">Réglages audio</string>
<string name="showHelp">Afficher l\'aide</string>
<string name="rules">Règles</string>
<string name="helpTextRules">Tous les déclencheurs d\'une règle sont reliés par un lien logique ET. La règle ne s\'applique que si tous les déclencheurs sont satisfaits. Si vous voulez une lien logique OU, créez une autre règle.</string>
<string name="timeframes">Délais d\'éxécution</string>
<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 l\'\action ne sera déclenchée qu\'une seule fois. Si vous créez une règle qui une déclencheur \"dans une 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 vérouillage des modifications audio pour temporairement ne pas utiliser les règles de changement des paramètres audio. Par exmple vous pouvez 6etre dans une encroit ou à un moment où les sonneries peuvent être dérangeantes. Cette fonctionnalité se désactivera automatiquement une fois le temps configuré écoulé. Cliquez sur le bouton +15 min pour ajouter la durée souhaitée. Une fois activé vous pouvez le désactiver en appuyant sur le bouton \"OUI\" (ainsi 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 un indicateur appelé \"Inversion"\. Cela signifie que si une règle est exécutée et qu\'ensuite les mêmes déclencheurs s\'appliquent à nouveau, la règle sera exécutée dans un mode opposé. Pour l\'instant, cela n\'est possible qu'avec les étiquettes NFC. Si vous les touchez deux fois et qu\'il y a un inverseur associé, cela fera l\'inverse de la situation actuelle, par exemple désactiver le wifi s\'il est actuellement actif.</string>
<string name="helpTextProcessMonitoring">Si vous spécifiez une règle avec une surveillance de processus, l\'application vérifira ce processus toutes les x secondes (vous pouvez modifier cette variable dans les réglages). Je sais que ça peut être un peu lent, mais un contrôle continu viderait la batterie trop vite. Et il n\'y a pas de transmission de l\'OS pour cet événement.</string>
<string name="helpTitleEnergySaving">Économie d\'énergie</string>
<string name="helpTextEnergySaving">Beaucoup de fabriquants d\'appareil Android essaient d\'économiser en limitant les activités des applications en tâches de fond. Malheureusement cela signifie souvent ques ces applications ne fonctionnent pas correctement, Automation en fait partie. Consultez cette <a href="https://dontkillmyapp.com/">page weeb</a> pour savoir comment exclure Automation de ces restrictions.</string>
<string name="speedMaximumTimeBetweenLocations">Durée maximale entre 2 géolocalisations pour le détermination de la vitesse.</string>
<string name="speedMaximumTime">Durée en minutes</string>
<string name="exceeds">au dessus de </string>
<string name="dropsBelow">en dessous de</string>
<string name="settingsCategoryNoiseLevelMeasurements">Mesure du niveau sonore</string>
<string name="timeBetweenNoiseLevelMeasurementsSummary">Temps en secondes entre les mesures du niveau sonore</string>
<string name="timeBetweenNoiseLevelMeasurementsTitle">Temps en secondes entre les mesures du niveau sonore</string>
<string name="lengthOfNoiseLevelMeasurementsSummary">Durée en seconde pour chaque mesure de niveau sonore</string>
<string name="lengthOfNoiseLevelMeasurementsTitle">Durée en seconde pour chaque mesure de niveau sonore</string>
<string name="referenceValueForNoiseLevelMeasurementsSummary">Valeur de référence physique pour la mesure du niveau sonore</string>
<string name="referenceValueForNoiseLevelMeasurementsTitle">Référence pour la mesure du niveau sonore</string>
<string name="logLevelSummary">Niveau de log (1=minimum, 5=maximum)</string>
<string name="logLevelTitle">Niveau de log</string>
<string name="ruleActive">Règle active</string>
<string name="triggerPointOfInterest">Géolocalisation</string>
<string name="triggerTimeFrame">Délai</string>
<string name="triggerCharging">Batterie en charge</string>
<string name="triggerUsb_host_connection">Connexion USB à un ordinateur</string>
<string name="triggerSpeed">Vitesse</string>
<string name="triggerNoiseLevel">Niveau du bruit de fond</string>
<string name="actionSetWifi">Wifi</string>
<string name="actionSetBluetooth">Bluetooth</string>
<string name="actionSetUsbTethering">connexion USB</string>
<string name="actionSetWifiTethering">connexion wifi</string>
<string name="actionSetBluetoothTethering">connexion Bluetooth</string>
<string name="actionSetDisplayRotation">Rotation de l\'écran</string>
<string name="actionTurnWifiOn">allumer le Wifi</string>
<string name="actionTurnWifiOff">eteindre le Wifi</string>
<string name="actionTurnBluetoothOn">allumer le Bluetooth</string>
<string name="actionTurnBluetoothOff">\'eteindre le Bluetooth</string>
<string name="actionTriggerUrl">Atteindre une URL</string>
<string name="actionChangeSoundprofil">Changer de profil audio</string>
<string name="actionTurnUsbTetheringOn">activer la connexion USB</string>
<string name="actionTurnUsbTetheringOff">éteindre la connexion USB</string>
<string name="actionTurnWifiTetheringOn">activer la connexion Wifi</string>
<string name="actionTurnWifiTetheringOff">éteindre la connexion Wifi</string>
<string name="actionTurnBluetoothTetheringOn">Activer la connexion Bluetooth</string>
<string name="actionTurnBluetoothTetheringOff">éteindre la connexion Bluetooth</string>
<string name="actionTurnAirplaneModeOn">activer le mode avion</string>
<string name="actionTurnAirplaneModeOff">désactiver le mode avion</string>
<string name="actionEnableScreenRotation">activer la rotation de l\'écran</string>
<string name="actionDisableScreenRotation">désactiver la rotation de l\'écran</string>
<string name="screenRotationEnabled">Rotation de l\'écran active.</string>
<string name="screenRotationDisabled">Rotation de l\'écran inactive.</string>
<string name="screenRotationAlreadyEnabled">Rotation de l\'écran déjà active.</string>
<string name="screenRotationAlreadyDisabled">Rotation de l\'écran déjà inactive.</string>
<string name="noPoisDefinedShort">Aucune géolocalisation définie.</string>
<string name="activePoi">Géolocalisation active:</string>
<string name="closestPoi">Géolocalisation proche:</string>
<string name="overview">Aperçu</string>
<string name="poi">Géolocalisation</string>
<string name="pois">\Geolocalisations</string>
<string name="helpTextPoi">Une géolocalisation est définie par des coordonnées GPS et un rayon. La géolocalisation par les antennes relais téléphonique est plutôt imprécise (mais rapide et peu gourmande en data) ne définissez pas un rayon trop petit. L\'application vous indiquera un rayon minimal lors de la création d\'une géolocalisation.</string>
<string name="serviceNotRunning">Le service n\'est pas actif.</string>
<string name="general">Général</string>
<string name="generalText">Pour utiliser cette application vous devez définir des règles, qui contiennent des déclencheur, par exemple si vous êtes dans un endroit précis ou à une certaine heure. Une fois cela fait, cliquez sur le bouton on/off sur l\'écran principal.</string>
<string name="unknownActionSpecified" translatable="false">Action inconnue précisée</string>
<string name="logErrorTriggeringUrl" translatable="false">Erreur dans l\'atteinte de l\'URL</string>
<string name="errorChangingScreenRotation" translatable="false">Erreur de rotation de l\'écran</string>
<string name="errorDeterminingWifiApState" translatable="false">Erreur de détermination de l\'état du wifi</string>
<string name="errorActivatingWifiAp" translatable="false">Erreur d\'activation du wifi</string>
<string name="failedToTriggerBluetooth">Impossible de lancer le Bluetooth. Votre appraeil a le BluetoothFailed to trigger Bluetooth. ?</string>
<string name="logAttemptingDownloadOf" translatable="false">tentative de télechargement de</string>
<string name="logErrorGettingConnectionManagerService" translatable="false">Erreur du service connexionManager. Pas d\'activité de la connexion USB.</string>
<string name="logErrorDeterminingCurrentUsbTetheringState" translatable="false">Erreur de détermination de l\'état de la connexion USB actuelle.</string>
<string name="logDetectingTetherableUsbInterface" translatable="false">Détection de l\'interface USB connecctable.</string>
<string name="logClearingBothLocationListeners" translatable="false">Nettoyage des services d\'écoute de géolocalisation.</string>
<string name="logStartingServiceAfterAppUpdate" translatable="false">Démarrer le service après la mise à jour de l\'application.</string>
<string name="logNotStartingServiceAfterAppUpdate" translatable="false">Ne pas démarrer le service après la mise à jour de l\'application.</string>
<string name="logStartingServiceAtPhoneBoot" translatable="false">Démarrer le service au démarrage du téléphone.</string>
<string name="logNotStartingServiceAtPhoneBoot" translatable="false">Ne pas démarrer le service au démarrage du téléphone.</string>
<string name="applicationHasBeenUpdated" translatable="false">L\'application a été mise à jour.</string>
<string name="startServiceAfterAppUpdate">Redémarrer le service après une mise à jour si l\'application fonctionnait avant.</string>
<string name="startServiceAfterAppUpdateShort">Démarrer le service après une mise à jour</string>
<string name="wifiConnection">connexion Wifi</string>
<string name="wifiName">Nom du Wifi</string>
<string name="enterWifiName">Saisissez le nom d\'un réseau Wifi. Laissez vide pour n\'importe quel réseau.</string>
<string name="cancel">Annuler</string>
<string name="ruleDoesntApplyWeAreSlowerThan" translatable="false">Rule %1$s doesn\'t apply. We are slower than</string>
<string name="ruleDoesntApplyWeAreFasterThan" translatable="false">Rule %1$s doesn\'t apply. We are faster than</string>
<string name="ruleDoesntApplyItsQuieterThan" translatable="false">Rule %1$s doesn\'t apply. It\'s quieter than</string>
<string name="ruleDoesntApplyItsLouderThan" translatable="false">Rule %1$s doesn\'t apply. It\'s louder than</string>
<string name="ruleDoesntApplyBatteryLowerThan" translatable="false">Rule %1$s doesn\'t apply. Battery level is lower than</string>
<string name="ruleDoesntApplyBatteryHigherThan" translatable="false">Rule %1$s doesn\'t apply. Battery level is higher than</string>
<string name="ruleDoesntApplyNotTheCorrectSsid" translatable="false">Rule %1$s doesn\'t apply. Not the correct SSID (demanded: \"%2$s\", given: \"%3$s\").</string>
<string name="ruleDoesntApplyNoTagLabel" translatable="false">Rule %1$s doesn\'t apply. There is no tag label or not tag at all.</string>
<string name="ruleDoesntApplyWrongTagLabel" translatable="false">Rule %1$s doesn\'t apply. Wrong tag label.</string>
<string name="ruleIsDeactivatedCantApply" translatable="false">Rule %1$s is deactivated, can\'t apply.</string>
<string name="starting">démarrer</string>
<string name="stopping">arrêter</string>
<string name="connecting">connecter</string>
<string name="disconnecting">déconnecté</string>
<string name="exceeding">au dessus</string>
<string name="droppingBelow">en dessous</string>
<string name="connectedToWifi">connecté au Wifi \"%1$s\"</string>
<string name="disconnectedFromWifi">déconnecté du Wifi \"%1$s\"</string>
<string name="anyWifi">tous les réseaux wifi</string>
<string name="cantStopIt">impossible à arrêter.</string>
<string name="settingsCategoryHttp">requêtes HTTP(s)</string>
<string name="httpAcceptAllCertificatesTitle">Acceptez tous les certificats</string>
<string name="httpAcceptAllCertificatesSummary">Passer le contrôle de validité des certificats SSL (non recommandé)</string>
<string name="httpAttemptsSummary">Nombre d\'essais suite à des problèmes de connectivité des requêtes HTTP</string>
<string name="httpAttemptsTitle">Nombre d\'essais HTTP</string>
<string name="httpAttemptsTimeoutSummary">Délais d\'expiration des requêtes HTTP</string>
<string name="httpAttemptsTimeoutTitle">Délais d\'expiration [sec]</string>
<string name="httpAttemptGapSummary">Délais avant le prochain essais [secondes]</string>
<string name="httpAttemptGapTitle">Pause [sec]</string>
<string name="runManually">Lancer manuellement</string>
<string name="serviceHasToRunForThat">Le service doit être actif pour cette action.</string>
<string name="gpsComparison">Comparaison GPS</string>
<string name="gpsComparisonTimeoutStop" translatable="false">Stopping comparison GPS measurement due to timeout.</string>
<string name="timeoutForGpsComparisonsTitle">Délais d\'expiration GPS [sec]</string>
<string name="timeoutForGpsComparisonsSummary">Durée maximum en secondes de comparaison des positions GPS. Si le délais est dépassé, la dernière position connue sera utilisée.</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="rememberLastActivePoiSummary">Si vous vous trouvez dans un lieu, que vous redémarrez votre appareil ou l\'application et que vous quittez ce lieu, l\'application exécutera les règles associées au dernier lieu connu lors de son prochain démarrage.</string>
<string name="rememberLastActivePoiTitle">Se souvenir de la dernière position active</string>
<string name="muteTextToSpeechDuringCallsTitle">Couper le son durant les appels</string>
<string name="muteTextToSpeechDuringCallsSummary">Couper la synthèse vocale durant les appels</string>
<string name="anotherPoiByThatName">Une autre géolocalisation possède le même nom.</string>
<string name="anotherRuleByThatName">Une autre règle possède le même nom.</string>
<string name="startOtherActivity">Démarrer un autre programme</string>
<string name="selectApplication">Selectionnez une application</string>
<string name="selectPackageOfApplication">Selectionnez le paquet de l\'application</string>
<string name="selectActivityToBeStarted">Selectionnez l\'activité du paquet choisit</string>
<string name="errorStartingOtherActivity">Erreur de démarrage d\'une autre activité</string>
<string name="anotherAppIsRunning">Démarrage/arrêt d\'une application</string>
<string name="settingsCategoryProcessMonitoring">Surveillance des processus</string>
<string name="timeBetweenProcessMonitoringsTitle">Intervalle en secondes entre deux surveillances des processus</string>
<string name="timeBetweenProcessMonitoringsSummary">Plus la valeur est basse, plus l\'utilisation de la batterie est élevée</string>
<string name="refreshingProcessList" translatable="false">Refreshing process list.</string>
<string name="processes">Processus</string>
<string name="startingPeriodicProcessMonitoringEngine" translatable="false">Starting periodic process monitoring engine.</string>
<string name="processMonitoring">Surveillance des processus</string>
<string name="periodicProcessMonitoringIsAlreadyRunning" translatable="false">Periodic process monitoring is already running. Won\'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\'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="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="settings">Réglages</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="settingsErased">Effacer les réglages.</string>
<string name="settingsSetToDefault">Réinitialiser les réglages.</string>
<string name="batteryLevel">Niveau de la batterie</string>
<string name="selectSpeed">Sélectionnez la vitesse</string>
<string name="selectBattery">Sélectionnez le niveau de batterie</string>
<string name="applyingSettingsAndRules" translatable="false">Applying settings, rules and locations.</string>
<string name="privacy">Politique de confidentialité</string>
<string name="privacyConfirmationText">Ouverture du navigateur internet et chargement de la politique de confidentialité depuis le site web du développeur.</string>
<string name="waitBeforeNextAction">Attente avant la prochaine action</string>
<string name="wakeupDevice">Réveil</string>
<string name="waitBeforeNextActionEnterValue">Saisissez la durée en miliseccondes du délais d\'attente avant la prochaine action.</string>
<string name="wakeupDeviceValue">Saisissez la durée en milisecondes durant laquelle le téléphone doit rester actif.La valeur par défaut est 0.</string>
<string name="enterAPositiveValidNonDecimalNumber">Entrez une valeur sans décimale positive.</string>
<string name="moveUp">Monter</string>
<string name="moveDown">Déscendre</string>
<string name="cantMoveUp">Impossible de déplacer l\'objet en haut. Il est déjà tout en haut.</string>
<string name="cantMoveDown">Impossible de déplacer l\'objet en bas. Il est déjà tout en bas.</string>
<string name="wifiNameSpecifiedCheckingThat" translatable="false">Nom du réseau Wifi défnit, vérification en cours.</string>
<string name="wifiNameMatchesRuleWillApply" translatable="false">Le nom du réseau Wifi correspond. La règle s\'applique.</string>
<string name="noWifiNameSpecifiedAnyWillDo" translatable="false">Pas de nom de réseau définit, n\'importe quel réseau sera utilisé.</string>
<string name="ruleCheckOf" translatable="false">RuleCheck of %1$s</string>
<string name="airplaneMode">Mode avion</string>
<string name="activate">Activatation</string>
<string name="deactivate">Désactivation</string>
<string name="airplaneModeSdk17Warning">Depuis la version 4.2 d\'Android cette fonctionnalité requiert un téléphone 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="addIntentValue">ajouter Intent pair</string>
<string name="parameterName">Nom du paramètre</string>
<string name="parameterValue">Valeur du paramètre</string>
<string name="parameterType">Type du paramètre</string>
<string name="selectTypeOfIntentPair">Selectionnew le type d\'intent pair.</string>
<string name="enterNameForIntentPair">Saisissez un nom pourl\'intent pair.</string>
<string name="enterValueForIntentPair">Saisissez une valeur pour l\'intent pair.</string>
<string name="whatToDoWithIntentPair">Que faire avec le pair?</string>
<string name="gettingListOfInstalledApplications">Création de liste des applications...</string>
<string name="timeFrameWhichDays">Quels jours ?</string>
<string name="insideOrOutsideTimeFrames">Dans ou hors du délais ?</string>
<string name="selectToggleDirection">Allumer ou éteindre ?</string>
<string name="name">Nom</string>
<string name="radiusWithUnit">Rayon [m]</string>
<string name="status">Statut</string>
<string name="actionDataConnection">Réseau mobile</string>
<string name="actionSetDataConnectionOn">Activer le réseau mobile</string>
<string name="actionSetDataConnectionOff">Désactiver le réseau mobile</string>
<string name="roaming">Itinérance</string>
<string name="activated">activaté</string>
<string name="deactivated">désactivé</string>
<string name="until">jusqu\'à</string>
<string name="application">Application</string>
<string name="is">est</string>
<string name="phoneCall">Appel téléphonique</string>
<string name="with">avec</string>
<string name="phoneNumber">Numéro de téléphone</string>
<string name="enterPhoneNumber">Saisissez un numéro de téléphone. Laissez vide pour n\'importe quel numéro.</string>
<string name="phoneDirection">Sélectionnez le type \nd\'appel</string>
<string name="any">tout</string>
<string name="incoming">entrant</string>
<string name="outgoing">sortant</string>
<string name="incomingAdjective">entrant</string>
<string name="outgoingAdjective">sortant</string>
<string name="anyNumber">tous les numéros</string>
<string name="number">numéro</string>
<string name="nfcTag">Tag NFC</string>
<string name="closeTo">proche de</string>
<string name="withLabel">avec une étiquette</string>
<string name="deviceDoesNotHaveNfc">Il semble que votre apprail n\'est pas de NFC.</string>
<string name="nfcReadTag">Lire l\'identité depuis le tag</string>
<string name="nfcWriteTag">Écrire le tag</string>
<string name="nfcEnterValidIdentifier">Saisissez un identifiant valide pour le tag (comme \"Porte d\'entrée\").</string>
<string name="nfcTagWrittenSuccessfully">Succès d\'écriture du Tag.</string>
<string name="nfcTagWriteError">Erreur d\'écriture du Tag. Est il à porté?</string>
<string name="nfcTagDiscovered">Tag trouvé.</string>
<string name="nfcBringTagIntoRange">Tag NFC à portée.</string>
<string name="nfcTagFoundWithText">Tag trouvé:</string>
<string name="nfcUnsupportedEncoding">Codage non supporté:</string>
<string name="nfcNoNdefIntentBut">Aucun NFC NDEF atteint, mais</string>
<string name="nfcNotSupportedInThisAndroidVersionYet">NFC non encore supporté dans cette version Android.</string>
<string name="cantRunRule">Impossible d\'éxécuter les règles.</string>
<string name="cantDownloadTooFewRequestsInSettings" translatable="false">Can\'t download anything. Amount of http requests in settings is lower than 1.</string>
<string name="nfcApplyTagToRule">Affecter le Tag à la règle</string>
<string name="nfcTagReadSuccessfully">Succès de lecture du Tag.</string>
<string name="nfcValueNotSuitable">Valeur stockée ne convient pas.</string>
<string name="nfcNoTag">Aucun Tag présent.</string>
<string name="newNfcId">Écriture d\'une nouvelle identitié NFC</string>
<string name="useExistingTag">Utilisation d\'un Tag NFC existant</string>
<string name="newId">Nouvelle identité:</string>
<string name="currentId">Identité actuelle:</string>
<string name="nfcTagDataNotUsable">Données du Tag inutilisable, écrivez en un nouveau.</string>
<string name="nfcBringTagIntoRangeToRead">Approcher un tag pour le lire.</string>
<string name="toggleRule">Changer de règle</string>
<string name="toggling">Changement</string>
<string name="toggle">changer</string>
<string name="overlapBetweenPois">Chevauchement de géolocalisation %1$s de %2$s mètres. Réduisez le rayon.</string>
<string name="noOverLap" translatable="false">Pas de chevauchement sur d\'autres géolocalisations détecté.</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">aucun</string>
<string name="anyLocation">n\'importe quelle géolocalisation</string>
<string name="invalidPoiName">Nom invalide pour une géolocalisation.</string>
<string name="eraseSettings">Effacer les réglages</string>
<string name="defaultSettings">Réglages par défaut</string>
<string name="areYouSure">Êtes vous sûr?</string>
<string name="poiCouldBeInRange" translatable="false">At least location %1$s could be in range, if not others in addition.</string>
<string name="noPoiInRelevantRange" translatable="false">No location in relevant range.</string>
<string name="activityDetection">Détection d\'activité</string>
<string name="android.permission.ACTIVITY_RECOGNITION">Détection d\'activité</string>
<string name="detectedActivity">Activité détectée:</string>
<string name="detectedActivityInVehicle">Dans un véhicule (voiture/bus)</string>
<string name="detectedActivityOnBicycle">En vélo</string>
<string name="detectedActivityOnFoot">À pied</string>
<string name="detectedActivityStill">Encore</string>
<string name="detectedActivityUnknown">Inconnu</string>
<string name="detectedActivityTilting">Inclinaison</string>
<string name="detectedActivityWalking">Marche</string>
<string name="detectedActivityRunning">Course</string>
<string name="detectedActivityInvalidStatus">Activité non valide</string>
<string name="ruleDoesntApplyActivityGivenButTooLowProbability" translatable="false">Rule %1$s doesn\'t apply. Detected activity %2$s given, but too low probability (%3$s %%), required %4$s %%.</string>
<string name="ruleDoesntApplyActivityNotPresent" translatable="false">Rule %1$s doesn\'t apply. Required activity %2$s not present.</string>
<string name="selectTypeOfActivity">Sélectionnez le type d\'activité</string>
<string name="triggerOnlyAvailableIfPlayServicesInstalled">Ce déclencheur n\'est disponible que si les services Google sont installés.</string>
<string name="activityDetectionFrequencyTitle">Fréquence de détection de l\'activité [sec]</string>
<string name="activityDetectionFrequencySummary">Secondes entre les tentatives de détection de l\'activité.</string>
<string name="activityDetectionRequiredProbabilityTitle">Probabilité de détection de l\'activité</string>
<string name="activityDetectionRequiredProbabilitySummary">Degré de certitude à partir duquel les activités sont acceptées comme des faits.</string>
<string name="incomingCallFrom">Appel entrant de %1$s.</string>
<string name="outgoingCallTo">Appel sortant vers %1$s.</string>
<string name="actionSpeakText">Synthèse vocale</string>
<string name="textToSpeak">Texte à lire</string>
<string name="toggleNotAllowed">L\'inversion de règle n\'est autorisé que pour les règles basés sur un déclencheur NFC.</string>
<string name="errorReadingPoisAndRulesFromFile">Erreur de lecture des géolocalisation et des règles depuis le fichier.</string>
<string name="noDataChangedReadingAnyway">Les modifications n\'ont aps éte enregistrées. Cependant, il peut y avoir eu des changements dans la mémoire qui doivent être rechargés. Relecture du fichier.</string>
<string name="bluetoothConnection">connexion Bluetooth</string>
<string name="bluetoothConnectionTo">connexion Bluetooth à %1$s</string>
<string name="bluetoothDisconnectFrom">connexion Bluetooth à %1$s perdue</string>
<string name="bluetoothDeviceInRange">Dispositif Bluetooth %1$s à portée.</string>
<string name="bluetoothDeviceOutOfRange">Dispositif Bluetooth %1$s hors de portée.</string>
<string name="anyDevice">n\'importe quel appareil</string>
<string name="ruleDoesntApplyNotTheCorrectDeviceName" translatable="false">Rule %1$s doesn\'t apply. Not the correct bluetooth device name.</string>
<string name="ruleDoesntApplyNotTheCorrectDeviceAddress" translatable="false">Rule %1$s doesn\'t apply. Not the correct bluetooth device address.</string>
<string name="noDevice">aucun appareil</string>
<string name="selectDeviceFromList">sélectionnez un appareil</string>
<string name="connectionToDevice">connexion à l\'appareil</string>
<string name="disconnectionFromDevice">déconnexion de l\'appareil</string>
<string name="deviceInRange">appareil à portée</string>
<string name="deviceOutOfRange">appareil hors de portée</string>
<string name="selectDeviceOption">Choisissez une option.</string>
<string name="selectConnectionOption">Choissez une option de connexion.</string>
<string name="ruleDoesntApplyDeviceInRangeButShouldNotBe" translatable="false">La règle %1$s ne fonctionne pas. Le dispositif est à porté, mais ne doit pas l\'être.</string>
<string name="ruleDoesntApplyStateNotCorrect" translatable="false">La règle %1$s ne fonctionne pas. Mauvais état.</string>
<string name="triggerHeadsetPlugged">Connection écouteurs</string>
<string name="actionPlayMusic">Lancer le lecteur de musique</string>
<string name="headsetConnected">Écouteurs (type: %1$s) est connecté</string>
<string name="headsetDisconnected">Écouteurs (type: %1$s) est déconnecté</string>
<string name="headphoneSimple">Écouteurs</string>
<string name="headphoneMicrophone">Microphone</string>
<string name="headphoneAny">Tous</string>
<string name="headphoneSelectType">Choisissez le type d\'écouteurs</string>
<string name="ruleDoesntApplyWrongHeadphoneType" translatable="false">Rule %1$s doesn\'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="whatsThis">Qu\'est ce que c\'est?</string>
<string name="atLeastRuleXisUsingY" translatable="false">At least rule \"%1$s\" is using a trigger of type \"%2$s\".</string>
<string name="privacyLocationingTitle">Géolocalisation privée uniquement</string>
<string name="privacyLocationingSummary">Empêcher les méthodes de géolocalisation d\'envoyer vos données, par exemple à Google. Cette fonction utilise uniquement le GPS et peut donc être lente ou ne pas fonctionner de manière fiable.</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="noiseDetectionHint">Si vous pensez que la détection du bruit ne fonctionne pas correctement (en fonction de la valeur que vous avez défini) gardez à l\'esprit que chaque téléphone est différent. Cependant vous pouvez changer You can therefore change la \"Référence de mesure du bruit\" dans les réglages. Visitez http://fr.wikipedia.org/wiki/Decibel pour plus d\'informations. Vous pouvez utiliser le calibrateur de volume à partir de l\'écran principal pour calibrer votre appareil.</string>
<string name="hint">Indication</string>
<string name="selectNoiseLevel">Choisissez le niveau sonore</string>
<string name="poiHasWifiStoppingCellLocationListener" translatable="false">Location has wifi. Stopping CellLocationChangedReceiver.</string>
<string name="poiHasNoWifiNotStoppingCellLocationListener" translatable="false">Location doesn\'t have wifi. Not stopping CellLocationChangedReceiver.</string>
<string name="showOnMap">Montrer sur la carte</string>
<string name="noMapsApplicationFound">Aucune application de géolocalisation trouvée sur votre téléphone.</string>
<string name="locationEngineNotActive">Géolocalisation non activée.</string>
<string name="addprofil">Ajouter un profil</string>
<string name="profil">profil</string>
<string name="soundMode">Mode audio</string>
<string name="volumes">Volumes</string>
<string name="incomingCallsRingtone">Sonnerie des appels entrants</string>
<string name="notificationRingtone">Sonnerie des notifications</string>
<string name="hapticFeedback">Vibration au toucher</string>
<string name="volumeMusicVideoGameMedia">Musiques, vidéos, jeux and autres médias</string>
<string name="volumeRingtoneNotifications">Sonnerie et notifications</string>
<string name="volumeAlarms">Alarmes</string>
<string name="change">Changement</string>
<string name="audibleSelection">Son de sélection (son émis lors d\'une sélection à l\'écran)</string>
<string name="screenLockUnlockSound">Son de vérouillage/dévérouillage de l\'écran</string>
<string name="vibrateWhenRinging">Sonnerie et vibration</string>
<string name="profils">profils</string>
<string name="soundModeNormal">Normal</string>
<string name="soundModeVibrate">Vibration</string>
<string name="soundModeSilent">Silence</string>
<string name="enterAname">Entrez un nom.</string>
<string name="noChangeSelectedprofilDoesntMakeSense">Pas de changement sélectionné. Le profil n\'a pas de sens.</string>
<string name="noprofilsCreateOneFirst">Aucun profil audio dans votre configuration. Créez en un.</string>
<string name="errorActivatingprofil">Erreur d\'activation du profil:</string>
<string name="anotherprofilByThatName">Un porfile portant le même nom existe déjà.</string>
<string name="invalidprofilName">Nom de profil invalide.</string>
<string name="errorWritingFile">Erreur d\'enregistrement des paramètres.</string>
<string name="unknownError">Erreur inconnue.</string>
<string name="noWritableFolderFound">Aucun dossier accessible en écriture pour enregistrer le fichier de configuration.</string>
<string name="usbTetheringFailForAboveGingerbread">Cela ne fonctionnera pas si votre version d\'Adnroid est inférieure à 2.3.Vous pouvez utiliser le réseau Wifi à la place.</string>
<string name="usingNewThreadForRuleExecution">Utilisation d\'un nouveau flux pour l\'activation de la règle.</string>
<string name="startNewThreadForRuleExecution">Démarrage d\'un nouveau flux pour l\'activation de la règle.</string>
<string name="newThreadRules">Nouveau flux</string>
<string name="showIcon">Montrer l\'icône</string>
<string name="showIconWhenServiceIsRunning">Montrer l\'icône lorsque l\'application fonctionne (la cacher ne fonctionne que pour les version en dessous d\'Android 7). Si votre version est supérieure, allez dans les paramètres système, puis Automation, désactivez les notifications.</string>
<string name="ruleHistory">Historique des règles (la plus récente en premier):</string>
<string name="someOptionsNotAvailableYet">Certaines fonctionnalités sont désactivées et ne peuvent pas être utilisées pour le moment. Elles seront activés dans une version ultérieure.</string>
<string name="lockSoundChanges">Voir les modifications de son</string>
<string name="noprofilChangeSoundLocked">Le profil ne sera pas activé. Le dernier profil actif est vérouillé.</string>
<string name="currentVolume">Volume actuel</string>
<string name="enterValidReferenceValue">Saisissez une valeur de référence valide.</string>
<string name="volumeTest">Étalonnage du volume</string>
<string name="volumeCalibrationExplanation">Pour calculer une valeur en dB pour la surveillance du bruit, vous devez spécifier une valeur de référence dite physique. Veuillez lire Wikipedia pour plus d\'informations. Cette valeur est très probablement différente pour chaque téléphone. Faites glisser la barre pour modifier la valeur de référence physique définie. Plus la valeur de référence est élevée, plus la valeur en dB sera faible. Des mesures constantes seront effectuées toutes les %1$s secondes et les résultats seront affichés ci-dessous. Appuyez sur la touche retour lorsque vous avez trouvé une valeur appropriée.</string>
<string name="settingsWillTakeTime">Certains réglages ne seront actifs qu\'après la modifications de certains réglages d\'environnement ou le redémarrage de l\'application.</string>
<string name="phoneIsRooted" translatable="false">Phone is rooted.</string>
<string name="phoneIsNotRooted" translatable="false">Phone is not rooted.</string>
<string name="dataConWithRootSuccess" translatable="false">Data connexion was successfully changed using superuser permissions.</string>
<string name="dataConWithRootFail" translatable="false">Data could not be changed using superuser permissions.</string>
<string name="rootExplanation">Vous devez rooté votre téléphone pour que cette action fonctionne. Ensuite, vous devez \"exécuter la règle manuellement\" pour faire apparaître la question de l\'autorisation du superutilisateur. Lorsque la fenêtre du super-utilisateur s\'affiche, vous devez toujours autoriser l\'application à le faire. Sinon, la règle ne peut pas fonctionner lorsque le téléphone est sans surveillance.</string>
<string name="errorWritingConfig">Erreur lors de l\'écriture de la configuration. Avez vous les droits d\'écriture ?</string>
<string name="phoneNrReplacementError">Absence de dernier numéro de téléphone, impossible de l\'insérer dans la variable..</string>
<string name="username">Nom d\'utilisateur</string>
<string name="password">Mot de passe</string>
<string name="useAuthentication">Authentification</string>
<string name="permissionsTitle">Permissions requises</string>
<string name="permissionsExplanation">Explication des autorisations requises</string>
<string name="ok">Ok</string>
<string name="disabledFeatures">Désactiver les fonctionnalités</string>
<string name="theFollowingPermissionsHaveBeenDenied">Les permissions suivantes n\'ont pas été autorisées :</string>
<string name="permissionsExplanationGeneric">L\'application fonctionne actuellement en mode limité et a désactivé certaines fonctionnalités. Pour fonctionner pleinement, elle nécessite des autorisations. Si vous voulez utiliser toutes les fonctionnalités, vous devez accorder les permissions dans les boites de dialogues suivantes. Si vous ne le faites pas, certaines règles ne pourront pas être exécutées. Dans ce qui suit, vous trouverez une explication des permissions demandées. Cliquez sur "continuer", lorsque vous êtes prêt à poursuivre..</string>
<string name="permissionsExplanationSmall">Pour utiliser cette fonctionnalité vous devez accorder plus de permissions. Cliquez sur continuer.</string>
<string name="continueText">continuer</string>
<string name="rule">Règle</string>
<string name="storeSettings">Lire et stocker les réglages</string>
<string name="featuresDisabled">ATTENTION: les fonctionnalités sont désactivées, Automation fonctionne en mode limité. Cliquer ici pour plus d\'informations.</string>
<string name="ruleLegend">Vert = actif, rouge = inactif, jaune = permissions manquantes</string>
<string name="systemSettingsNote1">Il faut la permission de modifier les paramètres de l\'OS (même pour des choses basiques comme activer le Wifi ou le Bluetooth). Après avoir appuyé sur "continue" une fenêtre s\'affichera, vous devez alors donner l\'autorisation.Ensuite cliquez sur le bouton retour.</string>
<string name="systemSettingsNote2">D\'autres autoristaions seront demandées dans une seconde fenêtre.</string>
<string name="appRequiresPermissiontoAccessExternalStorage">Automation doit accéder au stockage externe pour lire les paramètres et les règless.</string>
<string name="mainScreenPermissionNote">Automation a besoin de plus d\'autorisation pour pleinement fonctionner. Cliquez sur ce texte pour en savoir plus et les accorder.</string>
<string name="invalidDevice">Appareil non valide</string>
<string name="google_app_id" translatable="false">your app id</string>
<string name="logFileMaxSizeSummary">Taille maximum du journal de log en Mégabyte.</string>
<string name="logFileMaxSizeTitle">Taille maximum du journal de log [Mb]</string>
<string name="android.permission.READ_CALL_LOG">Accéder au journal des appels</string>
<string name="android.permission.READ_CALENDAR">Accéder aux enrées du calendrier</string>
<string name="android.permission.ACCESS_FINE_LOCATION">Accéder à la position précise</string>
<string name="android.permission.ACCESS_COARSE_LOCATION">Accéder à la position approximative</string>
<string name="readLocation">Accéder à la position</string>
<string name="android.permission.INTERNET">Envoyer des données via le réseau cellulaire</string>
<string name="android.permission.ACCESS_NETWORK_STATE">Consulter l\'état du réseau</string>
<string name="android.permission.ACCESS_WIFI_STATE">Consulter l\'état du Wifi</string>
<string name="android.permission.BLUETOOTH">Modifier les paramètres Bluetooth</string>
<string name="android.permission.BLUETOOTH_ADMIN">Modifier les paramètres Bluetooth</string>
<string name="android.permission.NFC">Utiliser le NFC</string>
<string name="android.permission.VIBRATE">Activer le vibreur</string>
<string name="android.permission.WAKE_LOCK">Garder le téléphone actif</string>
<string name="android.permission.MODIFY_AUDIO_SETTINGS">Modifier les paramètres de son</string>
<string name="android.permission.RECORD_AUDIO">Enregistrer l\'audio</string>
<string name="android.permission.PROCESS_OUTGOING_CALLS">Détecter les appels sortants</string>
<string name="android.permission.MODIFY_PHONE_STATE">Modifier les paramètres du téléphone</string>
<string name="android.permission.READ_PHONE_STATE">Détecter l\'état du téléphone</string>
<string name="android.permission.READ_EXTERNAL_STORAGE">Lire la mémoire</string>
<string name="android.permission.WRITE_EXTERNAL_STORAGE">Ëcrire dans la méemoire</string>
<string name="android.permission.GET_TASKS">Détecter les processus actifs</string>
<string name="android.permission.WRITE_SETTINGS">Modifier les paramètres du téléphone</string>
<string name="android.permission.RECEIVE_BOOT_COMPLETED">Détecter le redémarrage du téléphone</string>
<string name="android.permission.WRITE_SECURE_SETTINGS">Modifier les paramètres du téléphone</string>
<string name="android.permission.BATTERY_STATS">Lire l\'état de la batterie</string>
<string name="android.permission.CHANGE_BACKGROUND_DATA_SETTING">Modifier la connexion</string>
<string name="android.permission.SEND_SMS">Envoyer des messages</string>
<string name="android.permission.READ_CONTACTS">Accéder aux contacts</string>
<string name="android.permission.ACCESS_NOTIFICATION_POLICY">Remplacer le mode "ne pas déranger"</string>
<string name="theseAreThePermissionsRequired">Ces permissions sont requises:</string>
<string name="ruleXrequiresThis">La règle \"%1$s\" requiert.</string>
<string name="profilXrequiresThis">Le profil \"%1$s\" requiert.</string>
<string name="helpTextActivityDetection">Cette fonctionnalité peut détecter si vous êtes actuellement en déplacement et si c\'est à pied ou dans n\'importe quel type de véhicule (dans une certaine mesure). Cette fonctionnalité n\'est pas entièrement intégrée à Automation, mais est fournie par les services Google Play. Techniquement, elle ne donne pas un résultat oui/non, mais renvoie à un pourcentage de détection de votre statut. Vous pouvez définir la valeur du pourcentage à partir duquel Automation acceptera un résultat. Deux remarques : 1) Plus d\'un statut peut se produire en même temps. Par exemple, vous pouvez être en train de marcher dans un bus en marche. 2) Ce capteur est relativement gourmand en termes d\'utilisation de la batterie. Si cela est possible, vous pouvez utiliser des alternatives, par exemple exiger que le dispositif mains libres de votre voiture soit connecté pour détecter que vous êtes en train de conduire.</string>
<string name="sendTextMessage">Envoyer un message</string>
<string name="textToSend">Message à envoyer</string>
<string name="textMessageAnnotations">Vous pouvez saisir un numéro de téléphone. Sinon vous pouvez sélectionnner un contact. Souvenez vous : le numéro de téléphon est enregistré ici, pas dans la fiche du contact. Si vous modifier le numéro d\'un contact, vous devez mettre à jour la règle, cela ne se fait automatiquement..</string>
<string name="importNumberFromContacts">Importer le numéro d\'un contact</string>
<string name="android9RecordAudioNotice">SI vous utilisez la détection de bruit : malheureusement depuis Android 9 Google interdit aux applications en tâche de fond d\'utiliser le microphone. Ce déclencheur n\' a plus d\'effet.</string>
<string name="android10WifiToggleNotice">Malheureusement Google a décider de supprimer cette fonctionnalité dans Android 10. Les applications ne sont plus autorisées à activer ou désactiver le Wifi. Si vos téléphone est rooté cela fonctionnera toujours. Sinon, j\'ai bien peur que cela n\'est plus d\'effet.</string>
<string name="messageNotShownAgain">Ce message ne sera plus affiché.</string>
<string name="chooseActivityHint">Dans cette dernière fenêtre popup de sélection, vous devez choisir une activité spécifique. De manière simplifiée, il s\'agit d\'une fenêtre de l\'application souhaitée. Si vous ne savez pas laquelle, il est généralement conseillé de choisir celle dont le nom contient \"main\" ou \"launcher\"..</string>
<string name="edit">Éditez</string>
<string name="clickAndHoldForOptions">Cliquez et maintenez un objet pour les options.</string>
<string name="ruleActivationComplete" translatable="false">La règle \"%1$s\" est terminée.</string>
<string name="positioningEngine">Outil de positionnement</string>
<string name="googleSarcasm">Grâce à l\'infinie sagesse de Google et à son souci constant de protéger la vie privée de chacun, toutes les règles qui peuvent être utilisées pour envoyer des sms ou lire l\'état du téléphone ont été dépouillées de tous les déclencheurs et actions que Google considère comme risqués.</string>
<string name="startAutomationAsService">Lancer Automation comme service</string>
<string name="setScreenBrightness">Luminosité de l\'écran</string>
<string name="setScreenBrightnessEnterValue">Saisissez la luminosité souhaitée (de 0 à 100).</string>
<string name="autoBrightness">Activez la luminosité automatique</string>
<string name="apply">appliquer</string>
<string name="brightnessAuto">luminosité automatique</string>
<string name="brightnessManual">luminosité manuelle</string>
<string name="autoBrightnessNotice">If you use auto brightness the brightness value you use below will probably not be used long.</string>
<string name="screenLockSoundNotice">Les sons de verrouillage d\'écran ne peuvent plus être modifiés automatiquement sur les appareils fonctionnant sous Android version 6.0 ou supérieure. Quel que soit le réglage effectué ici, il ne fonctionnera pas dans les deux sens..</string>
<string name="startScreen">Écran de démarrage</string>
<string name="startScreenSummary">Sélectionnez l\'écran de démarrage de l\'application.</string>
<string name="executeRulesAndprofilsWithSingleClickTitle">Lancer les règles/profils d\'un seul clique.</string>
<string name="googleLocationChicanery">Cette application collecte les informations de géolocalisations pour activer les règles basées sur la géolocalisation et de l\'accéléromètre pour les règles basées sur la détection de la vitesse même si l\'application est fermée.</string>
<string name="googleLocationChicaneryOld">Cette application collecte les données de géolocalisation pour déterminer si vous vous trouvé dans un lieu que vous avez créé. De plus l\'application détermine votre vitesse actuelle si vous utilisez un déclencheur de ce type dans vos règles. Cela se produit même si l\'application est fermée ou non en cours d\'utilisation (mais uniquement sir le service est actif).</string>
<string name="android.permission.ACCESS_BACKGROUND_LOCATION">Accéder à la géolocalisation en arrière plan.</string>
<string name="deviceDoesNotHaveBluetooth">Il semble que votre téléphone ne dispose pas du Bluetooth. Vous pouvez poursuivre votre configuration, mais elle n\'aura pas d\'effet.</string>
<string name="manageLocations">Créer ou modifier des géolocalisations</string>
<string name="error">Erreur</string>
<string name="featureNotInFdroidVersion">Cette fonctionnalité est basée sur un logiciel non libre. Donc elle n\'est pas disponible dans la version F-Droid.</string>
<string name="settingsReferringToRestrictedFeatures">Vos réglages et/ou règles font référence à des fonctionnalités non libre qui ne sont pas disponibles dans la version F-Droid. Cela inclue la détection de votre activité physique.</string>
<string name="publishedOn">publié le</string>
<string name="displayNewsOnMainScreen">Afficher les nouveautés de l\'application sur l\'écran principal</string>
<string name="displayNewsOnMainScreenDescription">Les annonces concernent uniquement cette application, 1 à 2 fois par an, pas plus.</string>
<string name="filesHaveBeenMovedTo">Automation utilise maintenant un nouveau chemin pour enregistrer vos fichiers. Tous les fichiers d\'Automation ont été déplacer ici : \"%s\". L\'autorisation d\'accès au stockage externe n\'est plus requise; vous pouvez la révoquer. Elle sera révoqué dans une version future.</string>
<string name="locationDisabled">Géolocalisation désactivée</string>
<string name="locationEngineDisabledShort">La géolocalisation en tâche de fond ne peut plus être utilisée. ľiquer ici pour plus d\'informations.</string>
<string name="locationEngineDisabledLong">Malheureusement, votre position ne peut plus être déterminée. \\n\\nToute ma gratitude à Google pour son infinie sagesse et son amabilité. Laissez-moi vous expliquer cela plus en détail. Depuis Android 10, une nouvelle autorisation a été introduite pour déterminer votre position en arrière-plan (ce qui est bien sûr nécessaire pour une application comme celle-ci). Bien que je considère que c\'est une bonne idée en général, les chicaneries que cela implique pour les développeurs ne le sont pas. \\n\\nLorsque vous développez une application, vous pouvez essayer de vous qualifier pour cette permission en vous conformant à un ensemble d\'exigences. Malheureusement, de nouvelles versions de mon application ont été rejetées pour une période de trois mois. J\'ai rempli toutes les exigences, le support de développement merdique de Google\ a prétendu que je ne le fesais pas. Après leur avoir donné la preuve que je l\'avais fait, j\'ai reçu une réponse du genre: \"Je ne peux plus vous aider\". J\'ai fini par abandonner. \\n\\nEn conséquence, la version Google Play ne peut plus utiliser votre position comme déclencheur. Ma seule option alternative aurait été de faire retirer cette application de la boutique entièrement. \\n\\nJe suis vraiment désolé, mais j\'ai fait de mon mieux pour argumenter avec un \"support\" qui a échoué à plusieurs reprises le test de Turing. \\n\\nLa bonne nouvelle : vous pouvez encore tout avoir! \\n\\nAutomation est maintenant open source et peut être trouvé dans F-Droid. C\'est un magasin d\'applications qui se soucie vraiment de votre vie privée - plutôt que de simplement agir comme tel. Il suffit de sauvegarder votre fichier de configuration, de désinstaller cette application, de l\'installer à nouveau depuis F-Droid, de restaurer votre fichier de configuration - c\'est fait. \\n\\nCliquez ici pour en savoir plus:</string>
<string name="filesStoredAt">Les fichiers de configuration et de log sont stockés dans le dossier %1$s. Cliquez sur ce texte pour ouvrir l\'explorateur de fichiers. Malheureusement cela ne fonctionnera que sur un appareil rooté. POUR TOUS LES AUTRES APPAREILS: cliquez sur le bouton d\'export pour faire une sauvegarde.</string>
<string name="notification">Notification</string>
<string name="title">Titre</string>
<string name="text">Texte</string>
<string name="directionStringEquals">égal à</string>
<string name="directionStringContains">contient</string>
<string name="directionStringStartsWith">commence par</string>
<string name="directionStringEndsWith">se termine par</string>
<string name="directionStringNotEquals">n\'est pas égal à</string>
<string name="anyApp">n\'importe quelle application</string>
<string name="notificationTriggerExplanation">Ce déclencheur répondra à l\'ouverture (ou à la fermeture) de notifications par d\'autres applications dans la zone de notification. Vous pouvez spécifier l\'application émettrice de la notification. Si vous ne le faites pas, les notifications de toute autre application qu\'Automation seront prises en compte. Vous pouvez également spécifier des chaînes qui doivent ou ne doivent pas figurer dans le titre ou le texte de la notification. La comparaison est effectuée en tenant compte de la casse.</string>
<string name="postsNotification">%1$s notification de messages</string>
<string name="removedNotification">la notification de %1$s a été supprimée</string>
<string name="notificationAppears">La notification s\'affiche</string>
<string name="notificationDisappears">La notification disparait</string>
<string name="direction">Direction</string>
<string name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">Accès aux notifications système</string>
<string name="playSound">Jouer le son</string>
<string name="alwaysPlay">toujours jouer</string>
<string name="alwaysPlayExplanation">Si ce paramètre est activé, le son sera toujours joué. S\'il est désactivé, il ne sera joué que si votre téléphone n\'est ni en mode silencieux ni en mode vibreur. Cependant, s\'il est actif, il n\'aura pas d\'effet sur le volume. Ainsi, si votre téléphone est en mode sonnerie, il n\'augmentera pas le volume des médias. Ainsi, si le volume des médias est en mode silencieux, vous n\'entendrez rien non plus..</string>
<string name="selectSoundFile">Sélectionnez le fichier son</string>
<string name="fileDoesNotExist">Le fichier n\'existe pas.</string>
<string name="noFileManageInstalled">Il n\' y a pas de gestionnaire de fichier d\'installer.</string>
<string name="shareConfigAndLogFilesWithDev">Joindre les fichiers de configuration et les journaux de log.</string>
<string name="shareConfigAndLogExplanation">Cela lancera un nouvel email avec votre configuration et les fichiers de logs attachés en fichier zip. Il ne sera pas envoyé automatiquement, vous devez toujours cliquer sur "envoyer". Vous pouvez également changer le destinataire pour vous-même, par exemple.</string>
<string name="startAppChoiceNote">Ici, vous disposez de 2 options générales : \n\n1. Vous pouvez démarrer un programme en sélectionnant une activité. Imaginez cela comme la présélection de l\'écran/fenêtre spécifique d\'une application. Gardez à l\'esprit que cela ne fonctionne pas toujours. En effet, les fenêtres d\'une application peuvent interagir les unes avec les autres, par exemple en transmettant des paramètres. En démarrant simplement un écran spécifique, cette interaction n\'a pas eu lieu et la fenêtre peut se fermer instantanément (elle n\'est donc jamais vraiment affichée). Essayez quand même! Vous pouvez saisir un chemin d\'activité manuellement, mais il est recommandé d\'utiliser le bouton \"Sélectionner\". Si vous décidez de le saisir manuellement, entrez le nom du package de l\'application dans le champ supérieur et le chemin complet de l\'activité dans le champ inférieur.\n\n2. Sélection par action. Contrairement à la sélection d\'une fenêtre spécifique, vous pouvez également lancer un programme par une action. Cela revient à demander "Je voudrais xyz" et si une application installée peut vous aider, elle sera lancée. Un bon exemple serait le démarrage du navigateur - vous pouvez même en avoir plusieurs installés (l\'un d\'eux est généralement celui par défaut). Vous devez entrer ceci manuellement, PackageName est optionnel ici. Gardez à l\'esprit qu\'aucune variable ne sera résolue. Si vous voulez démarrer la caméra, par exemple, en utilisant \"MediaStore.ACTION_IMAGE_CAPTURE\", cela ne fonctionnera pas. Vous devez jeter un coup d\'œil à la documentation Android et utiliser la valeur réelle de cette variable qui, dans cet exemple, serait \"android.media.action.IMAGE_CAPTURE\".</string>
<string name="errorRunningRule">une erreur s\'est produite lors de l\'éxécution d\'une règle.</string>
<string name="cantFindSoundFile">Impossible de trouver le fichier audio %1$s et donc de le lire.</string>
<string name="addParameters">Ajouter des paramètres</string>
<string name="com.wireguard.android.permission.CONTROL_TUNNELS">Autorisation de contrôle des tunnels de l\'application wiregard</string>
<string name="startAppSelectionType">Sélection \n de l\'application</string>
<string name="startAppByActivity">par activité</string>
<string name="startAppByAction">par action</string>
<string name="enterValidAction">Saisissez une action valide</string>
<string name="enterPackageName">Saisissez un nom de package valide.</string>
<string name="state">État</string>
<string name="phoneNumberExplanation">Vous pouvez saisir un numéro de téléphone distant spécifique, mais ce n\'est pas obligatoire. Si vous souhaitez en spécifier un, vous pouvez soit le choisir dans votre carnet d\'adresses, soit le saisir manuellement. En outre, vous pouvez utiliser des expressions régulières. Pour tester une expression régulière, j\'aime cette page:</string>
<string name="importConfiguration">Importer la configuration</string>
<string name="exportConfiguration">Exporter la configuration</string>
<string name="moreSettings">Réglages supplémentaires</string>
<string name="configurationExportedSuccessfully">Configuration exportée avec succès.</string>
<string name="ConfigurationExportError">Une erreur est survenue lors de l\'export de la configuration.</string>
<string name="rulesImportedSuccessfully">Les règles et les géolocalisations ont été importées avec succès.</string>
<string name="rulesImportError">Une erreur est survenue lors de l\'import des règles et géolocalisations.</string>
<string name="configurationImportedSuccessfully">Configuration importée avec succès.</string>
<string name="prefsImportError">Une erreur est survenue lors de l\'import des préférences.</string>
<string name="noApplicableFilesFoundInDirectory">Aucun fichier compatible n\'a pu être trouvé dans ce répertoire.</string>
<string name="noFilesImported">Aucun fichier ne peut être importé.</string>
<string name="notAllFilesImported">Aucun fichiers compatible ne peut être importé.</string>
<string name="importExportExplanation">Lorsque vous cliquez sur importer ou exporter, vous sélectionnez le répertoire à partir duquel les fichiers sont importés ou exportés. Lors de l\'exportation, les fichiers existants pourraient être écrasés.</string>
<string name="intentDataComment">Si votre paramètre est de type Uri ET que vous spécifiez \"IntentData\" comme nom (la minuscule/majuscule n\'est pas importante), le paramètre ne sera pas ajouté comme un paramètre normal avec putExtra(), mais sera plutôt ajouté à l\'intention avec setData().</string>
<string name="stringNotAllowed">La chaîne %1$s n\'est pas autorisée.</string>
<string name="startAppStartType">Sélectionnez le type de lancement</string>
<string name="startAppByStartActivity">par startActivity()</string>
<string name="startAppBySendBroadcast">par sendBroadcast()</string>
<string name="openExamplesPage">Ouvrir la page web des exemples</string>
<string name="packageName">Nom du package</string>
<string name="activityOrActionName">Nom de l\'activité/action </string>
<string name="warning">Attention</string>
<string name="ringing">sonnerie</string>
<string name="from">de</string>
<string name="to">à</string>
<string name="matching">correspondant à</string>
<string name="urlRegex" translatable="false">https://regex101.com/</string>
<string name="loadWifiList">Chargement de la liste des Wifi</string>
<string name="needLocationPermForWifiList">La liste des réseaux wifis auxquels votre appareil a été connecté pourrait être utilisée pour déterminer les endroits où vous vous êtes rendu. C\'est pourquoi l\'autorisation de localisation est nécessaire pour charger la liste des wifis. Si vous voulez être en mesure d\'en choisir un dans la liste, vous devez accorder cette permission. Si vous ne le souhaitez pas, vous pouvez toujours entrer le nom de votre wifi manuellement..</string>
<string name="noKnownWifis">Il n\'y a pas de réseau Wifi connu dans votre téléphone.</string>
<string name="urlToTriggerExplanation">Cette fonctionnalité n\'ouvre PAS le navigateur, mais lance une URL en tâche de fond. Vous pouvez utiliser cette fonctionnalité pour commander votre domotique par exemple.</string>
<string name="automaticUpdateCheck">Vérification des mises à jour</string>
<string name="automaticUpdateCheckSummary">S\'applique seulement à la version APK.</string>
<string name="updateAvailable">Une nouvelle mise à jour est disponible. Souhaitez vous ouvrir votre navigateur pour la télécharger ?</string>
<string name="locationFound">Géolocalisation trouvée. Le rayon minimum suggéré pour cette géolocalisation est de %1$d m.</string>
<string name="locationFoundInaccurate">Seul un emplacement avec une précision limitée a pu être trouvé. Il se peut qu\'il ne fonctionne pas de manière fiable. Le rayon minimum suggéré pour cette géolocalisation est de %1$d m."</string>
<string name="clone">Copier</string>
<string name="noLocationCouldBeFound">Aucune géolocalisation n\'a peut être trouvée après un délai de %1$s secondes.</string>
<string name="pleaseGiveBgLocation">Sur l\'écran suivant allez dans les autorisations puis position. Sélectionnez \"Autorisé tout le temps\" pour per;ettre à Automation d\'accéder à votre position en tâche de fond.</string>
<string name="vibrate">Vibreur</string>
<string name="test">Test</string>
<string name="VibrateExplanation">Saisissez une durée de vibration, suivie d\'une virgule, puis d\'une durée de pause. Vous pouvez concaténer autant de vibrations que vous le souhaitez. Séparez-les à nouveau par des virgules. Par exemple, le motif 100,500,500,1000,100 fera vibrer 100, attendre 500, vibrer 500, attendre 1000, vibrer 100 ms. Si vous pensez qu\'une vibration n\'a pas fonctionnée, essayez d\'augmenter la pause qui les précède.</string>
<string name="pleaseEnterValidVibrationPattern">Veuillez entrer un modèle de vibration valide.</string>
<string name="newsOptIn">Souhaitez-vous recevoir sur l\'écran principal les actualités (uniquement les actualités importantes) de cette application? Celles-ci sont récupérées depuis le site web du développeur. Il n\'y aura pas de notification intrusive, juste un texte sur l\'écran principal lorsque vous ouvrez l\'application..</string>
<string name="top">Haut</string>
<string name="bottom">Bas</string>
<string name="tabsPlacement">Position de la barre de menu</string>
<string name="tabsPlacementSummary">Choisissez la position de la barre de menu.</string>
<string name="wifiApi30">Parce que Google s\'est encore planté sur une autre partie d\'Android, à partir de l\'API 30, seuls les wifis actuellement visibles peuvent être affichés, et non plus tous ceux auxquels votre appareil s\'est connecté.</string>
<string name="silentTriggersDnd">REMARQUE: le mode silencieux déclenche souvent le mode NE PAS DÉRANGER sur les appareils récents.Si cela vous arrive, je vous recommande d\'utiliser le mode normal et de baisser le volume à zéro.</string>
<string name="tones">Tonalité</string>
<string name="miscellaneous">Divers</string>
<string name="dnd">Ne pas déranger</string>
<string name="dndOff">Désactiver ne pas déranger</string>
<string name="dndPriority">Laisser afficher les notifications prioritaires</string>
<string name="dndAlarms">Laisser les alarmes fonctionner</string>
<string name="dndNothing">Ne rien laisser passer</string>
<string name="dndRemarks">Les réglages précis (autoriser les appels,choisir des numéros, etc.) ne peuvent être effectués que depuis les paramètres système.</string>
<string name="automationNotificationsIgnored">Si vous ne choisissez pas une application précise, mais \"n\'importe quel application\", les notifications d\'Automation seront ignorées pour éviter de créer une boucle.</string>
<string name="repeatEveryXseconds">Répéter toues les x secondes</string>
<string name="repeatEveryXsecondsWithVariable">répéter toutes les %1$s secondes</string>
<string name="enterRepetitionTime">Pour la période de répétition, vous devez saisir une valeur positive, non décimale.</string>
<string name="elementSkipped">Un élément du fichier de configuration ne peut pas être lu. Le fichier doit avoir éte créé avec une verions plus récente du programme.</string>
<string name="donate">Faire un don</string>
<string name="btTetheringNotice">Cette fonctionnalité est opérationnelle jusqu\'à la version 8.0 d\'Android. Pour les versions plus récentes elle ne fonctionne plus, mais de part le manque de capteurs physique, je ne peux savoir duquel il s\'agit. Sur Android 11, cela ne fonctionne définitvement plus. SI vous avez une version entre la 8.0 et la 11 et que cela focntionne, dites le moi.</string>
<string name="notice">Information</string>
<string name="deviceOrientation">Orientation de l\'appareil</string>
<string name="tolerance">Tolérance (0-180)</string>
<string name="orientationAzimuth">Azimut:</string>
<string name="orientationPitch">Hauteur:</string>
<string name="orientationRoll">Inclinaison:</string>
<string name="enterValidNumbersIntoAllFields">Saisissez des chiffres valides dans tous les champs.</string>
<string name="deviceOrientationExplanation">Lorsque vous bougez votre appareil, les chiffres ci-dessous sont mis à jour. Vous pouvez voir ici l\'orientation de votre appraeil indiquée en degrés. S\'il s\'\agit de l\'orientation souhaitée, cliquer sur le bouton appliquer pour copier les données dans les champs adéquats. Atteindre systématiquement cette orientation exacte est compliquée vous devez saisir une tolérance, il s\'agit d\'un nombre de degrés de déviation valable dans toutes les directions. 15° entrainera un angle total de 30°, soit 15° dans toutes les directions. Si vous voulez une tolérance sur un axe spécifique, saisissez une tolérance de 180° sur les deux autres axes.</string>
<string name="wouldCurrentlyApply">Appliquer?</string>
<string name="deviceIsInCertainOrientation">l\'appareil est dans une certaine rotation</string>
<string name="toleranceOf180OnlyAllowedIn2Fields">Une tolérance de 180° est autorisé pour 2 axes uniquement, pas 3. Sinon le déclencheur sera TOUJOURS actif.</string>
<string name="unknown">inconnu</string>
<string name="orientation">Orientation</string>
<string name="triggerWrong">quelque chose ne fonctionne pas avec ce déclencheur. Il ne peut pas être chargé correctement.</string>
<string name="turnScreenOnOrOff">Allumer ou éteindre l\'écran</string>
<string name="turnScreenOn">allumer l\'ran</string>
<string name="turnScreenOff">étaindre l\'écran</string>
<string name="mustApply">Doit être appliqué</string>
<string name="deviceOrientationTimeAcceptIntervalTitle">Fréquence du signal</string>
<string name="deviceOrientationTimeAcceptIntervalSummary">Accepter de nouveaux signaux de mouvement toutes les x millisecondes</string>
<string name="deviceOrientationSettings">Réglages de l\'orientation de l\'appareil</string>
<string name="android.permission.BIND_DEVICE_ADMIN">Administration de l\'appareil</string>
<string name="deviceAdminNote">La permission d\'administration de l\'appareil est nécessaire pour au moins l\'une des règles que vous avez crées.</string>
<string name="explanationDeviceOrientationDirection">Si la case est cochée, cela signifie que l\'appareil doit être dans une orientation spécifique. Si elle n\'est pas cochée, n\'importe quelle orientation ne correspondant PAS a vos critères sera le déclencheur.</string>
<string name="permissionsRequiredNotAvailable">Vos règles nécessitent des autorisations qui ne peuvent pas être demandées à partir de cette version installée d\'Automation..</string>
<string name="smsDialogNotice">Si vous n\'avez pas utilisé une action d\'envoi de SMS avant, Android vous demandera de confirmer l\'autorisation pour qu\'Automation puisse envoyer des messages. Vous devez sélectionner \"toujours autoriser\" et confirmer que cette action puisse fonctionner en arrière plan. Il est conseillé de lancer cette règle une fois manuellement pour afficher la fenêtre de demande d\'autorisation.</string>
<string name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS">Exclure de l\'optimisation de la batterie</string>
<string name="recommendedForBetterReliability">Recommandé pour une meilleure fiabilité</string>
<string name="needsToBeActive">Doit être actif</string>
<string name="checkSettings">Vérifiez les paramètres</string>
<string name="profilActive">le profil %1$s est actif</string>
<string name="profilNotActive">le profil %1$s n\'est plus actif</string>
<string name="profilTriggerCheckSettings">Si cette case n\'est pas désactivée, elle ne sera cochée que si le profil sélectionné a été le dernier à être activé. Peu importe que les paramètres audio aient été modifiés en externe. Toutefois, si la case à cocher est activée, les paramètres audio actuels doivent vraiment être ceux définis dans le profil. ATTENTION : La vérification du fichier de sonnerie n\'est pas encore prise en charge.</string>
<string name="ruleXIsUsingprofilY">Impossible de supprimer ce profil. La règle %1$s fait référence au profil %2$s.</string>
<string name="profilCouldNotBeDeleted">Le profil ne peut pas être supprimé.</string>
<string name="noRepetition">pas de répétition</string>
<string name="usingAuthentication">utiliser l\'authentification</string>
<string name="toNumber">au nombre</string>
<string name="message">message</string>
<string name="onDays">les jours</string>
<string name="notSet">non fixé</string>
<string name="takeLauncherActivity">Trouver automatiquement</string>
<string name="pickActivityManually">Choisir manuellement</string>
<string name="launcherOrManualExplanation">Mode facile : Automation essaye d\'identifier automatiquement le lenceur du programme. Sinon, vous pouvez sasir manuellement le lanceur du programme. que souhaitez vous faire ?</string>
<string name="launcherNotFound">Aucun lanceur pour cette application n\'a pu être trouvé. Vous devez le saisir manuellement.</string>
<string name="createNotification">Créer une notification</string>
<string name="enterTitle">Saisissez un titre.</string>
<string name="enterText">Saisissez le texte.</string>
<string name="info">Info</string>
<string name="profilWasNotFound">Le profil utiliser pour cette rêgle semble ne plus exister. Le premier profil dans l\'ordre alphabétique a été sélectionné.</string>
<string name="notificationCloseActionExplanation">Si vous n\'indiquez aucun critère cette action clôturera toutes les notifications. Il est conseillé de définir au moins un critère, titre ou texte, par application.</string>
<string name="closeNotifications">Fermer les notifications</string>
<string name="comparisonCaseInsensitive">La coparaisonn est sensible à la casse du texte</string>
<string name="profilWarning">Les paramètres que vous pouvez régler ici affecter les évènements audio sur votre télephone. Ils peuvent même annuler votre alarme de réveil. Donc, quoi que vous fassiez, il est fortement recommandé de le tester, même après les mises à jour d\'Android.</string>
<string name="ifString">si</string>
<string name="emailContactNotice">L\'e-mail est mon moyen de contact préféré pour signaler les bogues, poser des questions ou faire des propositions. Rendez-vous sur le centre de contrôle pour en savoir plus.\Plusieurs questions ne peuvent pas recevoir de réponse immédiate, mais nécessitent des recherches techniques. Veuillez donc faire preuve de patience.</string>
<string name="controlCenter">Centre de contrôle</string>
<string name="sendEmailToDev">Envoyer un email au développeur</string>
<string name="screenIs">l\'écran est %1$s</string>
<string name="on">en marche</string>
<string name="off">à l\'arrêt</string>
<string name="unlocked">déverroullé</string>
<string name="selectDesiredState">Sélectionnez l\'état souhaité</string>
<string name="screenState">État de l\'écran</string>
<string name="featureCeasedToWorkLastWorkingAndroidVersion">En raison de l\'infinie sagesse de Google\, la dernière version d\'Android sur laquelle cette fonctionnalité est connue pour fonctionner est la %1$s. Vous pouvez la configurer, mais cela n\'aura probablement aucun effet.</string>
<string name="actionMediaControl">Contrôle de lecture des médias</string>
<string name="selectCommand">Sélectionnez une commande</string>
<string name="playPause">play/pause</string>
<string name="play">play</string>
<string name="pause">pause</string>
<string name="previous">précédent</string>
<string name="next">suivant</string>
<string name="android.permission.MEDIA_CONTENT_CONTROL">Contrôle de lecture des média</string>
<string name="stop">stop</string>
<string name="pleaseSelectActionValue">Veuillez choisir une action !</string>
<string name="actionMediaControlNotice">Gardez à l\'esprit que cette action peut ne pas fonctionner avec tous les lecteurs de musique existants. Si cela fonctionne, certains boutons peuvent ne pas fonctionner.</string>
<string name="musicPlaying">jouer la musique</string>
<string name="selectParameters">Choisissez un paramètre</string>
<string name="musicIsPlaying">la musique est est en cours de lecture</string>
<string name="musicIsNotPlaying">aucune musaique en cours de lecture</string>
<string name="musicPlayingDetection">Détection de la lecture de musique</string>
<string name="musicCheckFrequencyTitle">Vérification de la fréquence [ms]</string>
<string name="musicCheckFrequencySummary">Durée en millisecondes entre les vérifications</string>
<string name="locationNotWorkingOn12">La géolocalisation semble ne pas fonctionner sur les appareils équipé d\'droid 12. Si vous êtes dans ce cas, j\'en suis désolé. Je corrigerai ce problème dès que la cause sera identifiée. Si la localisation tourne en continue, vous savez pourquoi.</string>
<string name="lastprofil">Dernier profil:</string>
<string name="queryAllPackages">Obtention de la liste des applications installées</string>
<string name="timeFrameDaysHint">Si vous utilisez une période qui s\'étend au-delà de minuit, vous devez également sélectionner le jour suivant si vous voulez que le déclencheur s\'applique après minuit.</string>
<string name="featureNotInGooglePlayVersion">Cette fonctionnalité n\'est plus disponible dans la version Google Play. De temps en temps, Google intimide les développeurs. Si vous voulez continuer à utiliser certaines fonctionnalités, vous devez remplir des papiers. Malheureusement, il y a 99% de chances que ces documents soient rejetés. C\'est un peu comme dans la bande dessinée ou le film Astérix. J\'ai passé des semaines à discuter avec eux de ce genre de cas dans le passé, mais je continuais à recevoir des refus - soit par des robots, soit par des personnes qui sont à peu près aussi intelligentes que des robots. Dans ce cas, je peux décider de retirer l\'application du Play Store ou de supprimer la fonctionnalité. Veuillez utiliser la version APK de mon site Web ou celle de F-Droid si vous avez besoin de ces fonctionnalités..</string>
<string name="startActivityInsertManually">Cette limitation ne concerne que la sélection d\'une application, et non le démarrage proprement dit. Vous pouvez donc toujours entrer le nom d\'une application manuellement si vous le connaissez..</string>
<string name="deviceStarts">Démarrage de l\'appareil</string>
<string name="serviceStarts">Démarrage du servicce</string>
<string name="deviceIsStarting">l\'appareil démarre</string>
<string name="serviceIsStarting">le service démarre</string>
<string name="broadcastReceived">réception de transmission</string>
<string name="broadcastNotReceived">transmission non reçue</string>
<string name="explanationBroadcastTrigger">La plupart des événements sur votre téléphone seront "publiés" en les diffusant à travers le système d\'exploitation. Par exemple, l\'activation ou la désactivation du mode avion déclenchera ce genre de diffusion. Ces diffusions ne sont pas automatiquement visibles/audibles, mais si une application (comme Automation) est intéressée, elle peut s\'y connecter et réagir. Vous pouvez définir ici un événement de diffusion que l\'application Automation attendra. Vous pouvez le saisir manuellement, le copier &amp; le coller depuis n\'importe quelle application de votre téléphone ou en choisir un dans la liste des suggestions. Comme ce déclencheur est destiné à être et à rester très flexible, je ne peux pas vous fournir d\'explications sur les éléments.\n\nLa liste des suggestions ne prétend pas être complète. Veuillez visiter l\'URL ci-dessous pour consulter la documentation Android. \n\nDe plus, toute application peut envoyer des événements personnalisés qui n\'apparaîtront pas dans la documentation Android. J\'essaie de demander des autorisations uniquement lorsque je sais qu\'elles seront nécessaires. Si vous pensez qu\'une autorisation est nécessaire pour l\'action que vous avez crée, veuillez me le faire savoir.\n\nNon reçu signifie qu\'il n\'y a pas eu de diffusion de ce type depuis que le service a été lancé. La réponse à certains paramètres est en cours de développement.</string>
<string name="broadcastListUrl" translatable="false">https://developer.android.com/reference/android/content/Intent.html</string>
<string name="broadcastReceivedTitle">Émission reçue</string>
<string name="logsExplanation">Pour éviter d\'utiliser inutilement votre espace de stockage, les journaux ne sont pas enregistrés par défaut. Donc, si vous avez un problème, veuillez d\'abord activer la journalisation dans les paramètres et définir le niveau de journalisation à 5. Reproduisez ensuite le problème. Ce n\'est qu\'alors que les journaux pourront être joints.</string>
<string name="broadcastsShowSuggestions">Montrer les suggestions</string>
<string name="selectBroadcast">Sélectionnez l\'emission</string>
<string name="lockedWithoutSecurity">vérouiller (balayez l\'écran, pas de code PIN)</string>
<string name="lockedWithSecurity">vérouiller (avec un code PIN, etc.)</string>
<string name="lockedCommentScreenMustBeOff">Les états de vérouillage ne sont détecter que si l\'"ecran est éteind.</string>
<string name="emailPretext">Si vous rencontrez un problème, que vous avez une question ou une suggestion, faites m\'en part par email. Ne vous contentez pas d\'envoyer uniquement les fichiers dans le corps du mail. J\'ignorerai ce type de mail sauf si une converstaion est déjà entamée.</string>
<string name="sendBroadcast">Envoyer l\'émission</string>
<string name="enterBroadcast">Saisissez une action d\'envoi.</string>
<string name="broadcastExplanation">Cette action permet d\'envoyer des diffusion à travers le système de message d\'Android. Cela n\'est pas visible par l\'utilisateur, mais les applications écoutent ces messages et peuvent y répondrent.</string>
<string name="directionStringDoesNotContain">ne contient pas</string>
<string name="runExecutable">Éxécuter le script</string>
<string name="path">Chemin</string>
<string name="parameters">Paramètres</string>
<string name="chooseExecutable">Choisir l\'exécutable</string>
<string name="runAsRoot">Exécuter en tant que root</string>
<string name="selectValidExecutable">Sélectionnez un fichier exécutable valide.</string>
<string name="fileNotExecutable">Le fichier n\'est pas exécutable.</string>
<string name="wifiExplanation1">Les applications ciblant Android Q ou supérieur ne peuvent plus activer ou désactiver le wifi. Veuillez blâmer Google pour cette restriction, pas moi. Vous pouvez contourner cette restriction en rootant votre appareil et en activant la case à cocher ci-dessous. Vous pouvez également télécharger cette application depuis F-Droid ou mon site web car je ne suis pas obligé de cibler le dernier niveau d\'API dans ces versions.</string>
<string name="wifiExplanation2">Lorsque le mode avion est activé, le wifi ne peut être activé qu\'à partir d\'applications pour lesquelles vous disposez des droits d\'accès root.</string>
<string name="usingRoot">utilisation root</string>
<string name="runExecutableExplanation">Vous pouvez sélectionner ici un script ou un fichier exécutable qui sera exécuté en tant qu\'action. Mais il y a quelques conditions préalables que vous devez gérer vous-même. Google a fait en sorte qu\'il soit très difficile d\'exécuter autre chose que des applications Android normales. 1. Le fichier doit être marqué comme exécutable dans le système de fichiers. Sur un système Android normal (sans root), c\'est en fait la partie la plus difficile. 2. Cela signifie également qu\'Automation doit être en mesure d\'exécuter le fichier, pas seulement le propriétaire ou le groupe. 3. Si c\'est un script, un shell valide doit être spécifié dans l\'en-tête du script.</string>
<string name="tetheringActive">la connexion est active</string>
<string name="tetheringNotActive">la connexion n\'est pas active</string>
<string name="tetheringState">État de la connexion</string>
<string name="regularExpressionsIfEquals">Si \"égal\" est sélectionné, vous pouvez saisir une expression régulière.</string>
<string name="enter_a_number">Entrez un nombre.</string>
<string name="duration">Durée [ms]</string>
<string name="keepDeviceAwake">Garder mon téléphone actif</string>
<string name="wakeLockTimeout">Définissez un délais d\'expiration</string>
<string name="wakeLockExplanation">Activer permet de garder l\'écran allumé tandis que désactiver permet de l\'éteindre. Pour le maintenir allumé, vous pouvez soit entrer une durée après laquelle il peut s\'éteindre à nouveau, soit le maintenir allumé indéfiniment. Dans ce dernier cas, vous devrez créer une autre action de veille (dans cette règle ou une autre) dans laquelle vous sélectionnerez la désactivation.</string>
<string name="mayUseRegularExpressions">Vous pouvez aussi saisir une expression régulière ici.</string>
<string name="simplyDismissNotification">Rejeter simplement</string>
<string name="clickNotificationButton">Appuyer sur un bouton</string>
<string name="withButton">avec le bouton %1$s</string>
<string name="subSystemState">État du sous système</string>
<string name="bluetooth">Bluetooth</string>
<string name="locationRequiredToDetermineWifiName">Pour obtenir le SSID wifi, l\'application a besoin des autorisations de localisation. Comme la version Google ne peut pas l\'obtenir, vous ne pouvez utiliser ce déclencheur que si vous ne spécifiez pas de SSID. Il ne peut donc être utilisé que pour détecter si le wifi est connecté ou non..</string>
<string name="title_activity_main_tabs">MainActivityTabs</string>
<string name="tab_text_1">Tab 1</string>
<string name="tab_text_2">Tab 2</string>
<string name="usb">USB</string>
<string name="type">Type</string>
<string name="cable">Cable</string>
</resources>

View File

@ -90,7 +90,7 @@
<string name="anotherProfileByThatName">Nome già usato per un altro profilo.</string> <string name="anotherProfileByThatName">Nome già usato per un altro profilo.</string>
<string name="anotherRuleByThatName">Nome già usato per un\'altra regola.</string> <string name="anotherRuleByThatName">Nome già usato per un\'altra regola.</string>
<string name="any">qualsiasi</string> <string name="any">qualsiasi</string>
<string name="anyApp">qualsiasi applicazione</string> <string name="anyApp">Qualsiasi applicazione</string>
<string name="anyDevice">qualsiasi dispositivo</string> <string name="anyDevice">qualsiasi dispositivo</string>
<string name="anyLocation">qualsiasi posizione</string> <string name="anyLocation">qualsiasi posizione</string>
<string name="anyNumber">qualsiasi numero</string> <string name="anyNumber">qualsiasi numero</string>
@ -689,7 +689,7 @@
<string name="screenIs">lo schermo è %1$s</string> <string name="screenIs">lo schermo è %1$s</string>
<string name="sendEmailToDev">Invia email allo sviluppatore</string> <string name="sendEmailToDev">Invia email allo sviluppatore</string>
<string name="controlCenter">Centro di controllo</string> <string name="controlCenter">Centro di controllo</string>
<string name="emailContactNotice">L\'e-mail è il mio metodo di contatto preferito per segnalare bug, porre domande o fare proposte. Vai al centro di controllo per saperne di più.\nMolte domande non possono essere risolte immediatamente, ma richiedono alcune ricerche tecniche. Quindi, per favore, abbiate un po\' di pazienza.</string> <string name="emailContactNotice">L\'e-mail è il mio metodo di contatto preferito per segnalare bug, porre domande o fare proposte. Vai al centro di controllo per saperne di più.</string>
<string name="musicPlaying">La musica è in riproduzione</string> <string name="musicPlaying">La musica è in riproduzione</string>
<string name="musicIsPlaying">la musica è in riproduzione</string> <string name="musicIsPlaying">la musica è in riproduzione</string>
<string name="musicIsNotPlaying">la musica non viene riprodotta</string> <string name="musicIsNotPlaying">la musica non viene riprodotta</string>
@ -706,8 +706,8 @@
<string name="startActivityInsertManually">Questa limitazione riguarda solo la selezione di un\'app, non l\'avvio effettivo. Quindi puoi comunque inserire manualmente il nome di un\'applicazione se lo conosci.</string> <string name="startActivityInsertManually">Questa limitazione riguarda solo la selezione di un\'app, non l\'avvio effettivo. Quindi puoi comunque inserire manualmente il nome di un\'applicazione se lo conosci.</string>
<string name="deviceStarts">Device starts</string> <string name="deviceStarts">Device starts</string>
<string name="serviceStarts">Avvio del servizio</string> <string name="serviceStarts">Avvio del servizio</string>
<string name="deviceIsStarting">Il dispositivo si sta avviando</string> <string name="deviceHasJustStarted">il dispositivo è appena stato avviato</string>
<string name="serviceIsStarting">il servizio è in fase di avvio</string> <string name="serviceHasJustStarted">il servizio è appena stato avviato</string>
<string name="broadcastReceived">broadcast ricevuto</string> <string name="broadcastReceived">broadcast ricevuto</string>
<string name="broadcastNotReceived">broadcast non ricevuto</string> <string name="broadcastNotReceived">broadcast non ricevuto</string>
<string name="broadcastReceivedTitle">Broadcast ricevuto</string> <string name="broadcastReceivedTitle">Broadcast ricevuto</string>
@ -738,16 +738,4 @@
<string name="wifiExplanation1">Le app che hanno come target Android Q o superiore non possono più attivare o disattivare il wifi. Lamentatevi con Google per questa limitazione, non con me.\n\nSi può aggirare questa limitazione usando il root e spuntando la casella qua sotto. In alternativa si può scaricare questa applicazione da F-Droid o dal mio sito, dove non sono obbligato a usare come target le ultime API.</string> <string name="wifiExplanation1">Le app che hanno come target Android Q o superiore non possono più attivare o disattivare il wifi. Lamentatevi con Google per questa limitazione, non con me.\n\nSi può aggirare questa limitazione usando il root e spuntando la casella qua sotto. In alternativa si può scaricare questa applicazione da F-Droid o dal mio sito, dove non sono obbligato a usare come target le ultime API.</string>
<string name="runExecutableExplanation">"Si può scegliere uno script o un eseguibile che sarà eseguito come azione.\n\nCi sono però dei prerequisiti che devi sistemare per conto tuo. Google ha reso molto difficile eseguire tutto tranne le normali applicazioni Android.\n\n1.\nIl file deve essere eseguibile nel file system. In un sistema Android normale (senza root) questa è la parte più difficile.\n\n2.\nAnche Automation deve poter eseguire il file, non soltanto il proprietario o il gruppo.\n\n3.\nSe si tratta di uno script, deve essere specificata una shell valida nell'intestazione. "</string> <string name="runExecutableExplanation">"Si può scegliere uno script o un eseguibile che sarà eseguito come azione.\n\nCi sono però dei prerequisiti che devi sistemare per conto tuo. Google ha reso molto difficile eseguire tutto tranne le normali applicazioni Android.\n\n1.\nIl file deve essere eseguibile nel file system. In un sistema Android normale (senza root) questa è la parte più difficile.\n\n2.\nAnche Automation deve poter eseguire il file, non soltanto il proprietario o il gruppo.\n\n3.\nSe si tratta di uno script, deve essere specificata una shell valida nell'intestazione. "</string>
<string name="enter_a_number">Inserisci un numero.</string> <string name="enter_a_number">Inserisci un numero.</string>
<string name="regularExpressionsIfEquals">Se è selezionato \"uguale\", è possibile immettere un\'espressione regolare.</string>
<string name="duration">Durata [ms]</string>
<string name="keepDeviceAwake">Mantieni il dispositivo attivo</string>
<string name="wakeLockTimeout">Specificare il timeout</string>
<string name="wakeLockExplanation">Attiva manterrà lo schermo acceso mentre disattivato lo lascerà spegnere. Per tenerlo acceso puoi inserire una durata dopo la quale potrebbe spegnersi di nuovo o puoi tenerlo acceso a tempo indeterminato. In quest\'ultimo caso è necessario creare un\'altra azione keep-awake (in questa o in un\'altra regola) in cui selezionare disattiva.</string>
<string name="mayUseRegularExpressions">Puoi anche inserire un\'espressione regolare qui.</string>
<string name="locationRequiredToDetermineWifiName">Per ottenere l\'SSID wifi, l\'app richiede autorizzazioni di posizione. Poiché la versione di Google non è in grado di ottenerlo, è possibile utilizzare questo trigger solo se non si specifica un SSID. Quindi può essere utilizzato solo per rilevare se il wifi è connesso o meno.</string>
<string name="simplyDismissNotification">Semplicemente licenziare</string>
<string name="clickNotificationButton">Fai clic su un pulsante</string>
<string name="withButton">con pulsante %1$s</string>
<string name="subSystemState">Stato del sottosistema</string>
<string name="bluetooth">Bluetooth</string>
</resources> </resources>

View File

@ -1,3 +0,0 @@
<resources>
<dimen name="fab_margin">48dp</dimen>
</resources>

View File

@ -516,7 +516,7 @@
<string name="directionStringStartsWith">begint met</string> <string name="directionStringStartsWith">begint met</string>
<string name="directionStringEndsWith">eindigt met</string> <string name="directionStringEndsWith">eindigt met</string>
<string name="directionStringNotEquals">is niet gelijk aan</string> <string name="directionStringNotEquals">is niet gelijk aan</string>
<string name="anyApp">elke app</string> <string name="anyApp">Elke app</string>
<string name="notificationTriggerExplanation">Deze trigger zal reageren op andere applicaties die meldingen openen in het meldingsgebied (of die worden gesloten). Je kunt een andere applicatie specificeren waar de melding vandaan moet komen. Als je dat niet doet, tellen de meldingen van een andere toepassing mee. U kunt ook tekenreeksen opgeven die wel of niet in de titel of de body van de melding moeten voorkomen. De vergelijking gebeurt hoofdletter-IN-sensitief.</string> <string name="notificationTriggerExplanation">Deze trigger zal reageren op andere applicaties die meldingen openen in het meldingsgebied (of die worden gesloten). Je kunt een andere applicatie specificeren waar de melding vandaan moet komen. Als je dat niet doet, tellen de meldingen van een andere toepassing mee. U kunt ook tekenreeksen opgeven die wel of niet in de titel of de body van de melding moeten voorkomen. De vergelijking gebeurt hoofdletter-IN-sensitief.</string>
<string name="postsNotification">%1$s berichten notificatie</string> <string name="postsNotification">%1$s berichten notificatie</string>
<string name="removedNotification">kennisgeving van %1$s verwijderd</string> <string name="removedNotification">kennisgeving van %1$s verwijderd</string>
@ -667,7 +667,7 @@
<string name="comparisonCaseInsensitive">Vergelijkingen worden gedaan case-INsensitief</string> <string name="comparisonCaseInsensitive">Vergelijkingen worden gedaan case-INsensitief</string>
<string name="profileWarning">De instellingen die je hier maakt kunnen ervoor zorgen dat je bepaalde dingen niet meer van je telefoon merkt. Ze kunnen zelfs je wekker dempen. Dus wat je ook doet - het wordt aanbevolen om het te testen - ook na Android upgrades.</string> <string name="profileWarning">De instellingen die je hier maakt kunnen ervoor zorgen dat je bepaalde dingen niet meer van je telefoon merkt. Ze kunnen zelfs je wekker dempen. Dus wat je ook doet - het wordt aanbevolen om het te testen - ook na Android upgrades.</string>
<string name="ifString">als</string> <string name="ifString">als</string>
<string name="emailContactNotice">E-mail is mijn favoriete contactmethode om bugs te melden, vragen te stellen of voorstellen te doen. Ga naar het controlecentrum voor meer informatie.\nVeel vragen kunnen niet meteen worden beantwoord, maar vereisen wel wat technisch onderzoek. Dus heb alsjeblieft wat geduld.</string> <string name="emailContactNotice">E-mail is mijn favoriete contactmethode om bugs te melden, vragen te stellen of voorstellen te doen. Ga naar het controlecentrum voor meer informatie.</string>
<string name="controlCenter">Controlecentrum</string> <string name="controlCenter">Controlecentrum</string>
<string name="sendEmailToDev">Stuur een e-mail naar de ontwikkelaar</string> <string name="sendEmailToDev">Stuur een e-mail naar de ontwikkelaar</string>
<string name="screenIs">scherm is %1$s</string> <string name="screenIs">scherm is %1$s</string>
@ -702,8 +702,8 @@
<string name="timeFrameDaysHint">Als u een tijdsbestek gebruikt dat zich uitstrekt over middernacht, moet u ook de volgende dag selecteren als u wilt dat de trigger na middernacht van toepassing is.</string> <string name="timeFrameDaysHint">Als u een tijdsbestek gebruikt dat zich uitstrekt over middernacht, moet u ook de volgende dag selecteren als u wilt dat de trigger na middernacht van toepassing is.</string>
<string name="featureNotInGooglePlayVersion">Deze functie is niet meer beschikbaar in de Google Play-versie.\\n\\nAlles af en toe pest Google ontwikkelaars. Als u bepaalde functies wilt blijven gebruiken, moet u papierwerk indienen. Helaas is er een kans van 99% dat het papierwerk wordt afgewezen. Het is vrijwel net als in de Asterix-strip / film.\\n\\nIk heb in het verleden wekenlang met hen gediscussieerd over dergelijke gevallen, maar ik bleef afwijzingen krijgen - hetzij door bots of mensen die ongeveer net zo intelligent zijn als bots. In de ik kan kiezen tussen de app die volledig uit de Play Store wordt verwijderd of de functie verwijdert.\\n Overweeg de APK-versie van mijn website of die van F-Droid te gebruiken als je die functies nodig hebt.</string> <string name="featureNotInGooglePlayVersion">Deze functie is niet meer beschikbaar in de Google Play-versie.\\n\\nAlles af en toe pest Google ontwikkelaars. Als u bepaalde functies wilt blijven gebruiken, moet u papierwerk indienen. Helaas is er een kans van 99% dat het papierwerk wordt afgewezen. Het is vrijwel net als in de Asterix-strip / film.\\n\\nIk heb in het verleden wekenlang met hen gediscussieerd over dergelijke gevallen, maar ik bleef afwijzingen krijgen - hetzij door bots of mensen die ongeveer net zo intelligent zijn als bots. In de ik kan kiezen tussen de app die volledig uit de Play Store wordt verwijderd of de functie verwijdert.\\n Overweeg de APK-versie van mijn website of die van F-Droid te gebruiken als je die functies nodig hebt.</string>
<string name="startActivityInsertManually">Deze beperking heeft alleen betrekking op de selectie van een app, niet op de daadwerkelijke start. U kunt dus nog steeds handmatig de naam van een toepassing invoeren als u deze kent.</string> <string name="startActivityInsertManually">Deze beperking heeft alleen betrekking op de selectie van een app, niet op de daadwerkelijke start. U kunt dus nog steeds handmatig de naam van een toepassing invoeren als u deze kent.</string>
<string name="deviceIsStarting">apparaat start</string> <string name="deviceHasJustStarted">apparaat is net gestart</string>
<string name="serviceIsStarting">service wordt gestart</string> <string name="serviceHasJustStarted">service is net begonnen</string>
<string name="serviceStarts">Service start</string> <string name="serviceStarts">Service start</string>
<string name="deviceStarts">Apparaat start</string> <string name="deviceStarts">Apparaat start</string>
<string name="emailPretext">Als je een probleem, suggesties of vraag hebt, schrijf dan iets in de e-mail. Stuur me niet alleen de bestanden met de standaard e-mailtekst. Ik zal alles negeren, tenzij we al in gesprek zijn.</string> <string name="emailPretext">Als je een probleem, suggesties of vraag hebt, schrijf dan iets in de e-mail. Stuur me niet alleen de bestanden met de standaard e-mailtekst. Ik zal alles negeren, tenzij we al in gesprek zijn.</string>
@ -736,17 +736,5 @@
<string name="tetheringNotActive">tethering is niet actief</string> <string name="tetheringNotActive">tethering is niet actief</string>
<string name="tetheringState">Tethering-status</string> <string name="tetheringState">Tethering-status</string>
<string name="enter_a_number">Voer een getal in.</string> <string name="enter_a_number">Voer een getal in.</string>
<string name="regularExpressionsIfEquals">Als \'gelijk aan\' is geselecteerd, kunt u een reguliere expressie invoeren.</string>
<string name="duration">Duur [ms]</string>
<string name="keepDeviceAwake">Houd het apparaat wakker</string>
<string name="wakeLockTimeout">Time-out opgeven</string>
<string name="wakeLockExplanation">Activeren houdt het scherm aan terwijl deactiveren het uitschakelt. Om het aan te houden, kunt u een duur invoeren waarna het weer kan worden uitgeschakeld of u kunt het voor onbepaalde tijd aanhouden. In het laatste geval zou je nog een keep-awake actie moeten maken (in deze of een andere regel) waarin je deactiveren selecteert.</string>
<string name="mayUseRegularExpressions">U kunt hier ook een reguliere expressie invoeren.</string>
<string name="locationRequiredToDetermineWifiName">Om de wifi-SSID te krijgen, heeft de app locatiemachtigingen nodig. Omdat de Google-versie dat niet kan krijgen, kun je deze trigger alleen gebruiken als je geen SSID opgeeft. Het kan dus alleen worden gebruikt om te detecteren of wifi is verbonden of niet.</string>
<string name="simplyDismissNotification">Gewoon negeren</string>
<string name="clickNotificationButton">Klik op een knop</string>
<string name="withButton">met knop %1$s</string>
<string name="subSystemState">Status van het subsysteem</string>
<string name="bluetooth">Bluetooth</string>
</resources> </resources>

View File

@ -671,6 +671,7 @@
<string name="from">от</string> <string name="from">от</string>
<string name="to">к</string> <string name="to">к</string>
<string name="matching">совпадает</string> <string name="matching">совпадает</string>
<string name="urlRegex" translatable="false">https://regex101.com/</string>
<string name="loadWifiList">Загрузить список Wi-Fi</string> <string name="loadWifiList">Загрузить список Wi-Fi</string>
<string name="needLocationPermForWifiList">Список Wi-Fi, к которому было подключено ваше устройство. Можно использовать для определения того, в каких местах вы были. Вот почему для загрузки списка Wi-Fi требуется разрешение на доступ к местоположению. Если вы хотите выбрать один из из списка, вам необходимо предоставить это разрешение. Если вы этого не хотите, вы все равно можете ввести свое имя Wi-Fi вручную.</string> <string name="needLocationPermForWifiList">Список Wi-Fi, к которому было подключено ваше устройство. Можно использовать для определения того, в каких местах вы были. Вот почему для загрузки списка Wi-Fi требуется разрешение на доступ к местоположению. Если вы хотите выбрать один из из списка, вам необходимо предоставить это разрешение. Если вы этого не хотите, вы все равно можете ввести свое имя Wi-Fi вручную.</string>
<string name="noKnownWifis">На вашем устройстве нет известных Wi-Fi.</string> <string name="noKnownWifis">На вашем устройстве нет известных Wi-Fi.</string>
@ -764,7 +765,7 @@
<string name="comparisonCaseInsensitive">Сравнения проводятся без учета регистра</string> <string name="comparisonCaseInsensitive">Сравнения проводятся без учета регистра</string>
<string name="profileWarning">Настройки, которые вы можете изменить здесь, могут привести к тому, что вы больше не заметите определенных вещей с вашего телефона. Они могут даже отключить будильник. Так что что бы вы ни делали - рекомендуется это проверять.</string> <string name="profileWarning">Настройки, которые вы можете изменить здесь, могут привести к тому, что вы больше не заметите определенных вещей с вашего телефона. Они могут даже отключить будильник. Так что что бы вы ни делали - рекомендуется это проверять.</string>
<string name="ifString">если</string> <string name="ifString">если</string>
<string name="emailContactNotice">Электронная почта - мой предпочтительный способ связи, для сообщений об ошибках, вопросов или предложений. Перейдите в центр управления, чтобы узнать больше.\nМногие вопросы не могут быть решены сразу, но требуют некоторых технических исследований. Поэтому, пожалуйста, наберитесь терпения.</string> <string name="emailContactNotice">Электронная почта - мой предпочтительный способ связи, для сообщений об ошибках, вопросов или предложений. Перейдите в центр управления, чтобы узнать больше.</string>
<string name="controlCenter">Центр управления</string> <string name="controlCenter">Центр управления</string>
<string name="sendEmailToDev">Отправить электронное письмо разработчику</string> <string name="sendEmailToDev">Отправить электронное письмо разработчику</string>
<string name="screenIs">экран %1$s</string> <string name="screenIs">экран %1$s</string>
@ -801,8 +802,8 @@
<string name="startActivityInsertManually">Это ограничение касается только выбора приложения, но не его запуска. Вы можете указать имя приложения вручную, если знаете его.</string> <string name="startActivityInsertManually">Это ограничение касается только выбора приложения, но не его запуска. Вы можете указать имя приложения вручную, если знаете его.</string>
<string name="deviceStarts">Включение устройства</string> <string name="deviceStarts">Включение устройства</string>
<string name="serviceStarts">Запуск службы</string> <string name="serviceStarts">Запуск службы</string>
<string name="deviceIsStarting">устройство запускается</string> <string name="deviceHasJustStarted">устроство было включено</string>
<string name="serviceIsStarting">Служба запускается</string> <string name="serviceHasJustStarted">служба была запущена</string>
<string name="broadcastReceived">получено сообщение broadcast</string> <string name="broadcastReceived">получено сообщение broadcast</string>
<string name="broadcastNotReceived">сообщение broadcast не получено</string> <string name="broadcastNotReceived">сообщение broadcast не получено</string>
<string name="explanationBroadcastTrigger">Большинство событий на вашем телефоне будут \"опубликованы\" при помощи Broadcast сообщений, которые передаются через операционную систему Android.\nНапример, включение/выключение режима "В самолёте" отправит подобное сообщение. Эти сообщения не видны/слышны, но если какое-нибудь приложение (как Automation) могут \"слушать\" их и когда они появляются, реагировать каким-либо образом.\n\nЗдесь вы можете настроить broadcast сообщение, которое Automation будет слушать. Вы можете ввести его вручную, скопировать откуда-нибудь или выбрать из списка. Так как этот триггер является очень гибким, я не могу предоставить вам объяснения по каждому из пунктов списка.\n\nПолнота списка не гарантируется, пожалуйста, перейдите по ссылке ниже для ознакомления с документацией Android.\nДополнительно, любое приложение может отправлять свои собственные сообщения, формат которых в документации Android, конечно же отсутствует.\n\nМногие broadcast сообщения для работы требуют специальных разрешений. Я попытался реализовать запрос разрешений там, где я знаю, что они необходимы. Если вы обнаружите, что где-то не происходит запрос разрешения, где по вашему мнению это нобходимо, пожалуйста сообщите мне.\n\n"Не получено"- значит такое сообщение не было получено с момента старта службы Automation. Реакция на некоторые параметры находится в разработке.</string> <string name="explanationBroadcastTrigger">Большинство событий на вашем телефоне будут \"опубликованы\" при помощи Broadcast сообщений, которые передаются через операционную систему Android.\nНапример, включение/выключение режима "В самолёте" отправит подобное сообщение. Эти сообщения не видны/слышны, но если какое-нибудь приложение (как Automation) могут \"слушать\" их и когда они появляются, реагировать каким-либо образом.\n\nЗдесь вы можете настроить broadcast сообщение, которое Automation будет слушать. Вы можете ввести его вручную, скопировать откуда-нибудь или выбрать из списка. Так как этот триггер является очень гибким, я не могу предоставить вам объяснения по каждому из пунктов списка.\n\nПолнота списка не гарантируется, пожалуйста, перейдите по ссылке ниже для ознакомления с документацией Android.\nДополнительно, любое приложение может отправлять свои собственные сообщения, формат которых в документации Android, конечно же отсутствует.\n\nМногие broadcast сообщения для работы требуют специальных разрешений. Я попытался реализовать запрос разрешений там, где я знаю, что они необходимы. Если вы обнаружите, что где-то не происходит запрос разрешения, где по вашему мнению это нобходимо, пожалуйста сообщите мне.\n\n"Не получено"- значит такое сообщение не было получено с момента старта службы Automation. Реакция на некоторые параметры находится в разработке.</string>
@ -833,16 +834,4 @@
<string name="tetheringNotActive">раздача интернета не активна</string> <string name="tetheringNotActive">раздача интернета не активна</string>
<string name="tetheringState">Раздача интернета</string> <string name="tetheringState">Раздача интернета</string>
<string name="enter_a_number">Введите число.</string> <string name="enter_a_number">Введите число.</string>
<string name="regularExpressionsIfEquals">Если выбрано значение \"равно\", можно ввести регулярное выражение.</string>
<string name="duration">продолжительность [мс]</string>
<string name="keepDeviceAwake">Держите устройство в режиме сна</string>
<string name="wakeLockTimeout">указать время ожидания</string>
<string name="wakeLockExplanation">Activate будет держать экран включенным, в то время как деактивация позволит ему выключиться. Для поддержания его включенным вы можете либо ввести продолжительность, после которой он может снова отключиться, либо вы можете держать его включенным на неопределенный срок. В последнем случае вам нужно будет создать еще одно действие keep-awake (в том или ином правиле), в котором вы выберете деактивировать.</string>
<string name="mayUseRegularExpressions">Здесь также можно ввести регулярное выражение.</string>
<string name="locationRequiredToDetermineWifiName">Чтобы получить SSID Wi-Fi, приложению требуются разрешения на местоположение. Поскольку версия Google не может получить его, вы можете использовать этот триггер только в том случае, если вы не указали SSID. Таким образом, его можно использовать только для определения того, подключен ли Wi-Fi или нет.</string>
<string name="withButton">с кнопкой %1$s</string>
<string name="bluetooth">Bluetooth</string>
<string name="subSystemState">Состояние подсистемы</string>
<string name="clickNotificationButton">Нажмите кнопку</string>
<string name="simplyDismissNotification">Просто уволить</string>
</resources> </resources>

View File

@ -1,3 +0,0 @@
<resources>
<dimen name="fab_margin">200dp</dimen>
</resources>

View File

@ -1,3 +0,0 @@
<resources>
<dimen name="fab_margin">48dp</dimen>
</resources>

View File

@ -3,7 +3,4 @@
<dimen name="activity_horizontal_margin">16dp</dimen> <dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen> <dimen name="activity_vertical_margin">16dp</dimen>
<dimen name="default_margin">20dp</dimen> <dimen name="default_margin">20dp</dimen>
<dimen name="appbar_padding">16dp</dimen>
<dimen name="fab_margin">16dp</dimen>
<dimen name="appbar_padding_top">8dp</dimen>
</resources> </resources>

View File

@ -618,7 +618,7 @@
<string name="directionStringStartsWith">starts with</string> <string name="directionStringStartsWith">starts with</string>
<string name="directionStringEndsWith">ends with</string> <string name="directionStringEndsWith">ends with</string>
<string name="directionStringNotEquals">not equals</string> <string name="directionStringNotEquals">not equals</string>
<string name="anyApp">any app</string> <string name="anyApp">Any app</string>
<string name="notificationTriggerExplanation">This trigger will respond to other applications opening notifications in the notification area (or such being closed). You can specify another application from which the notification has to come from. If you don\'t the notifications from any other application will count. You can also specify strings that must be or must not be in their title or notification body. The comparison is done case-INsensitive.</string> <string name="notificationTriggerExplanation">This trigger will respond to other applications opening notifications in the notification area (or such being closed). You can specify another application from which the notification has to come from. If you don\'t the notifications from any other application will count. You can also specify strings that must be or must not be in their title or notification body. The comparison is done case-INsensitive.</string>
<string name="postsNotification">%1$s posts notification</string> <string name="postsNotification">%1$s posts notification</string>
<string name="removedNotification">notification from %1$s removed</string> <string name="removedNotification">notification from %1$s removed</string>
@ -766,7 +766,7 @@
<string name="comparisonCaseInsensitive">Comparisons are done case-INsensitive</string> <string name="comparisonCaseInsensitive">Comparisons are done case-INsensitive</string>
<string name="profileWarning">The settings you can adjust here, can cause that you don\'t notice certain things from your phone anymore. They may even silence your wakeup alarm. So whatever you do - it is highly recommended that you test it - also after Android updates.</string> <string name="profileWarning">The settings you can adjust here, can cause that you don\'t notice certain things from your phone anymore. They may even silence your wakeup alarm. So whatever you do - it is highly recommended that you test it - also after Android updates.</string>
<string name="ifString">if</string> <string name="ifString">if</string>
<string name="emailContactNotice">Email is my preferred method of contact to report bugs, ask questions or make proposals. Go to control center to learn more.\nMany questions cannot be answered straight away, but require some technical research. So please have some patience.</string> <string name="emailContactNotice">Email is my preferred method of contact to report bugs, ask questions or make proposals. Go to control center to learn more.</string>
<string name="controlCenter">Control center</string> <string name="controlCenter">Control center</string>
<string name="sendEmailToDev">Send email to developer</string> <string name="sendEmailToDev">Send email to developer</string>
<string name="screenIs">screen is %1$s</string> <string name="screenIs">screen is %1$s</string>
@ -802,8 +802,8 @@
<string name="startActivityInsertManually">This limitation concerns only the selection of an app, not the actual start. So you can still enter the name of an application manually if you know it.</string> <string name="startActivityInsertManually">This limitation concerns only the selection of an app, not the actual start. So you can still enter the name of an application manually if you know it.</string>
<string name="deviceStarts">Device starts</string> <string name="deviceStarts">Device starts</string>
<string name="serviceStarts">Service starts</string> <string name="serviceStarts">Service starts</string>
<string name="deviceIsStarting">device is starting</string> <string name="deviceHasJustStarted">device has just started</string>
<string name="serviceIsStarting">service is starting</string> <string name="serviceHasJustStarted">service has just started</string>
<string name="broadcastReceived">broadcast received</string> <string name="broadcastReceived">broadcast received</string>
<string name="broadcastNotReceived">broadcast not received</string> <string name="broadcastNotReceived">broadcast not received</string>
<string name="explanationBroadcastTrigger">Most events on your phone will be \"published\" by broadcasting them throughout the operating system.\nFor example turning on/off airplane mode will trigger such a broadcast. Those broadcasts are not automatically visible/audible, but if an application (like Automation) is interested it can hook up to them. When they occur it will get notified and can react.\n\nYou can define a broadcast event here for which the application will wait. You may enter it manually, copy &amp; paste it from somewhere or pick one from the list of suggestions. As this trigger is meant to be and remain very flexible I cannot provide you with explanations for the items.\n\nThe list of suggestions does not claim to be complete. Please visit the below URL to have a look at the Android documentation.\nAlso any app can send custom events which will not appear in the Android documentation of course.\n\nMany broadcasts require specific permissions in order to work. I try to request permissions where I know they will be required. If you think a permission is required for the action you entered, please let me know.\n\nNot received means there has not been such a broadcast ever since the service has been started. Responding to certain parameters is in development.</string> <string name="explanationBroadcastTrigger">Most events on your phone will be \"published\" by broadcasting them throughout the operating system.\nFor example turning on/off airplane mode will trigger such a broadcast. Those broadcasts are not automatically visible/audible, but if an application (like Automation) is interested it can hook up to them. When they occur it will get notified and can react.\n\nYou can define a broadcast event here for which the application will wait. You may enter it manually, copy &amp; paste it from somewhere or pick one from the list of suggestions. As this trigger is meant to be and remain very flexible I cannot provide you with explanations for the items.\n\nThe list of suggestions does not claim to be complete. Please visit the below URL to have a look at the Android documentation.\nAlso any app can send custom events which will not appear in the Android documentation of course.\n\nMany broadcasts require specific permissions in order to work. I try to request permissions where I know they will be required. If you think a permission is required for the action you entered, please let me know.\n\nNot received means there has not been such a broadcast ever since the service has been started. Responding to certain parameters is in development.</string>
@ -815,7 +815,7 @@
<string name="lockedWithoutSecurity">locked (swipe only, no PIN)</string> <string name="lockedWithoutSecurity">locked (swipe only, no PIN)</string>
<string name="lockedWithSecurity">locked (with PIN, etc.)</string> <string name="lockedWithSecurity">locked (with PIN, etc.)</string>
<string name="lockedCommentScreenMustBeOff">Any state of locked will only be detected if the screen is off.</string> <string name="lockedCommentScreenMustBeOff">Any state of locked will only be detected if the screen is off.</string>
<string name="emailPretext">If you have a problem, suggestions or question, please write something in the email. Do not just send me the files with the default mail body. I will ignore those unless we\'re already in a conversation.</string> <string name="emailPretext">If you have a problem, suggestions or question, please write something in the email. Do not just send me the files with the default mail body. I will ignore everything those unless we\'re already in a conversation.</string>
<string name="sendBroadcast">Send broadcast</string> <string name="sendBroadcast">Send broadcast</string>
<string name="enterBroadcast">Enter a broadcast action.</string> <string name="enterBroadcast">Enter a broadcast action.</string>
<string name="broadcastExplanation">This action allows to send a broadcast across the Android OS messaging system. This is not user-visible, but apps who listen for that specific broadcast can respond to it being sent.</string> <string name="broadcastExplanation">This action allows to send a broadcast across the Android OS messaging system. This is not user-visible, but apps who listen for that specific broadcast can respond to it being sent.</string>
@ -827,30 +827,12 @@
<string name="runAsRoot">Run as root</string> <string name="runAsRoot">Run as root</string>
<string name="selectValidExecutable">Select a valid executable file.</string> <string name="selectValidExecutable">Select a valid executable file.</string>
<string name="fileNotExecutable">The file is not executable.</string> <string name="fileNotExecutable">The file is not executable.</string>
<string name="wifiExplanation1">Apps targeting Android Q or higher cannot turn wifi on or off anymore. Please blame Google for this restriction, not me. You can bypass this restriction by rooting your device and activating the checkbox below. Alternatively download this application from F-Droid or my website as I am not forced to target the latest API level in those versions.</string> <string name="wifiExplanation1">Apps targeting Android Q or higher cannot turn wifi on or off anymore. Please blame Google for this restriction, not me.\n\nYou can bypass this restriction by rooting your device and activating the checkbox below. Alternatively download this application from F-Droid or my website as I am not forced to target the latest API level in those versions.</string>
<string name="wifiExplanation2">While airplane mode is activated, wifi can only be toggled from applications when using root permissions for that.</string> <string name="wifiExplanation2">While airplane mode is activated, wifi can only be toggled from applications when using root permissions for that.</string>
<string name="usingRoot">using root</string> <string name="usingRoot">using root</string>
<string name="runExecutableExplanation">You can select a script or an executable file here that will be executed as an action. But there are some prerequisites which you have to deal with on your own. Google has made it very hard to run anything other than regular Android applications. 1. The file must be marked as executable in the file system. On a regular Android system (without root) this is actually the hard part. 2. That also means Automation must be able to execute the file, not just the owner or the group. 3. If it is a script, a valid shell be specified in the script\'s header.</string> <string name="runExecutableExplanation">You can select a script or an executable file here that will be executed as an action.\n\nBut there are some prerequisites which you have to deal with on your own. Google has made it very hard to run anything other than regular Android applications.\n\n1.\nThe file must be marked as executable in the file system. On a regular Android system (without root) this is actually the hard part.\n\n2.\nThat also means Automation must be able to execute the file, not just the owner or the group.\n\n3.\nIf it is a script, a valid shell be specified in the script\'s header.</string>
<string name="tetheringActive">tethering is active</string> <string name="tetheringActive">tethering is active</string>
<string name="tetheringNotActive">tethering is not active</string> <string name="tetheringNotActive">tethering is not active</string>
<string name="tetheringState">Tethering state</string> <string name="tetheringState">Tethering state</string>
<string name="regularExpressionsIfEquals">If \"equals\" is selected, you may enter a regular expression.</string>
<string name="enter_a_number">Enter a number.</string> <string name="enter_a_number">Enter a number.</string>
<string name="duration">Duration [ms]</string>
<string name="keepDeviceAwake">Keep device awake</string>
<string name="wakeLockTimeout">Specify timeout</string>
<string name="wakeLockExplanation">Activate will keep the screen on while deactivate will let it turn off. For keeping it on you can either enter a duration after which it may turn off again or you can keep it on indefinitely. In the latter case you would need to create another keep-awake action (in this or another rule) in which you select deactivate.</string>
<string name="mayUseRegularExpressions">You may also enter a regular expression here.</string>
<string name="simplyDismissNotification">Simply dismiss</string>
<string name="clickNotificationButton">Click a button</string>
<string name="withButton">with button %1$s</string>
<string name="subSystemState">Subsystem state</string>
<string name="bluetooth">Bluetooth</string>
<string name="locationRequiredToDetermineWifiName">To get the wifi SSID, the app requires location permissions. Because the Google version cannot get that, you can only use this trigger if you do not specify an SSID. So it can only be used to detect if wifi is connected or not.</string>
<string name="title_activity_main_tabs">MainActivityTabs</string>
<string name="tab_text_1">Tab 1</string>
<string name="tab_text_2">Tab 2</string>
<string name="usb">USB</string>
<string name="type">Type</string>
<string name="cable">Cable</string>
</resources> </resources>

View File

@ -13,13 +13,4 @@
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item> <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. --> <!-- Customize your theme here. -->
</style> </style>
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
</resources> </resources>

View File

@ -5,7 +5,7 @@ buildscript {
jcenter() jcenter()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:7.2.2' classpath 'com.android.tools.build:gradle:7.2.1'
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files // in the individual module build.gradle files

View File

@ -54,7 +54,7 @@ Wenn Sie ein Problem mit der Anwendung haben und mich dazu kontaktieren möchten
Spenden sind sicher eine gute, aber nicht die einzige Möglichkeit mich zu motivieren :-) Spenden sind sicher eine gute, aber nicht die einzige Möglichkeit mich zu motivieren :-)
* Wer mir etwas Gutes tun will, kann die Anwendung auch im Play Store bewerten (https://play.google.com/store/apps/details?id=com.jens.automation2). * Wer mir etwas Gutes tun will, kann die Anwendung auch im Play Store bewerten (https://play.google.com/store/apps/details?id=com.jens.automation2).
* Wenn Ihnen die Anwendung gefällt, freue ich mich auch einfach nur über eine Email mit ein paar netten Worten. * Wenn Ihnen die Anwendung gefällt, freue ich mich auch einfach nur über eine Email mit ein paar netten Worten.
* Außerdem ist immer Hilfe bei der Übersetzung willkommen. Englisch, Spanisch und Deutsch kann ich selbst, Italienisch und Russisch sind bereits abgedeckt. Aber sonst ist alles gern gesehen. * Außerdem ist immer Hilfe bei der Übersetzung willkommen. Englisch, Spanisch und Deutsch kann ich selbst, Italienisch ist bereits abgedeckt. Aber sonst ist alles gern gesehen.
* Wenn Sie ein Talent/Erfahrung auf dem Gebiet Grafikdesign haben und Ideen für hübschere Symbole haben, lassen Sie es mich wissen. * Wenn Sie ein Talent/Erfahrung auf dem Gebiet Grafikdesign haben und Ideen für hübschere Symbole haben, lassen Sie es mich wissen.
* Falls Sie einen interessanten Anwendungsfall haben oder einen Weg gefunden haben, Auslöser und Aktionen so zu kombinieren, um etwas Besonderes umzusetzen und Sie denken, daß man das auf die Beispielseite (https://server47.de/automation/examples.html) setzen sollte, kontaktieren Sie mich doch. * Falls Sie einen interessanten Anwendungsfall haben oder einen Weg gefunden haben, Auslöser und Aktionen so zu kombinieren, um etwas Besonderes umzusetzen und Sie denken, daß man das auf die Beispielseite (https://server47.de/automation/examples.html) setzen sollte, kontaktieren Sie mich doch.

View File

@ -1,8 +0,0 @@
* New action: Keep phone turned on
* New: Regular expressions enabled where comparisons apply (one has to use "equals")
* New: Notification closing can now also be achieved by clicking a button of the target notification.
* New: French translation
* Fixed: Changed input type for decimal numbers when adding intent data
* Fixed: Battery level trigger not working when using direction falling-below
* New: Wifi trigger can now use Regex for SSID
* Fixed: Battery receiver would trigger at 100 if specified above 100

View File

@ -54,7 +54,7 @@ If you have a problem and think about contacting me please
Donations are certainly a good, but not the only way to motivate me :-) Donations are certainly a good, but not the only way to motivate me :-)
* If you'd like to support me, you can also leave a positive review for the app on Google Play (https://play.google.com/store/apps/details?id=com.jens.automation2). * If you'd like to support me, you can also leave a positive review for the app on Google Play (https://play.google.com/store/apps/details?id=com.jens.automation2).
* If you like the app, simply some warm words via email are always appreciated. * If you like the app, simply some warm words via email are always appreciated.
* Furthermore I can always use help in translating the app. English, German and some Spanish are among my own skills. Italiano e russo sono già coperti. But everything else is more than welcome. * Furthermore I can always use help in translating the app. English, German and some Spanish are among my own skills. Italian is covered by somebody already. But everything else is more than welcome.
* If you have a talent/experience in graphics design and have some ideas for nicer icons let me know. * If you have a talent/experience in graphics design and have some ideas for nicer icons let me know.
* If you have an interesting use-case or found a way to combine triggers and actions to achieve something intriguing and you think it's worth putting it on the examples page (https://server47.de/automation/examples.html), let me know. * If you have an interesting use-case or found a way to combine triggers and actions to achieve something intriguing and you think it's worth putting it on the examples page (https://server47.de/automation/examples.html), let me know.

View File

@ -54,7 +54,7 @@ Si tiene un problema y considera contactarme
Donaciónes seguramente son una buena, pero no la unica posibilidad de apoyarme :-) Donaciónes seguramente son una buena, pero no la unica posibilidad de apoyarme :-)
* Si quiere apoyarme puedes escribir un buena revisión en Google Play (https://play.google.com/store/apps/details?id=com.jens.automation2). * Si quiere apoyarme puedes escribir un buena revisión en Google Play (https://play.google.com/store/apps/details?id=com.jens.automation2).
* Si le gusta la aplicación, simplemente algunas palabras cálidas por correo electrónico siempre son apreciadas. * Si le gusta la aplicación, simplemente algunas palabras cálidas por correo electrónico siempre son apreciadas.
* Además siempre necesito ayuda en traduciendo la app. Ingles, Aleman y Español estan en mis habilidades. Todavia tengo ayuda con Italiono y Ruso. Per todo lo demás es bienvenido. * Además siempre necesito ayuda en traduciendo la app. Ingles, Aleman y Español estan en mis habilidades. Todavia tengo ayuda con Italiono. Per todo lo demás es bienvenido.
* Si tiene talento/experiencia en el campo del diseño gráfico y tienes ideas para crear iconos más bonitos, házmelo saber. * Si tiene talento/experiencia en el campo del diseño gráfico y tienes ideas para crear iconos más bonitos, házmelo saber.
* Si tiene un caso de uso interesante o ha encontrado una forma de combinar condiciones y acciones para lograr algo intrigante y cree que vale la pena ponerlo en la página de ejemplos (https://server47.de/automation/examples.html), házmelo saber. * Si tiene un caso de uso interesante o ha encontrado una forma de combinar condiciones y acciones para lograr algo intrigante y cree que vale la pena ponerlo en la página de ejemplos (https://server47.de/automation/examples.html), házmelo saber.

View File

@ -57,7 +57,7 @@ Als je een probleem hebt en erover denkt om contact met me op te nemen
Donaties zijn zeker een goede, maar niet de enige manier om mij te motiveren :-) Donaties zijn zeker een goede, maar niet de enige manier om mij te motiveren :-)
* Als je me wilt steunen, kun je ook een positieve review voor de app achterlaten op Google Play ( https://play.google.com/store/apps/details?id=com.jens.automation2 ). * Als je me wilt steunen, kun je ook een positieve review voor de app achterlaten op Google Play ( https://play.google.com/store/apps/details?id=com.jens.automation2 ).
* Als de app u bevalt, worden enkele warme woorden via e-mail altijd op prijs gesteld. * Als de app u bevalt, worden enkele warme woorden via e-mail altijd op prijs gesteld.
* Verder kan ik altijd hulp gebruiken bij het vertalen van de app. Engels, Duits en wat Spaans behoren tot mijn eigen vaardigheden. Italiaans en Russisch zijn al gedekt. Maar al het andere is meer dan welkom. * Verder kan ik altijd hulp gebruiken bij het vertalen van de app. Engels, Duits en wat Spaans behoren tot mijn eigen vaardigheden. Italiaans wordt al door iemand gedekt. Maar al het andere is meer dan welkom.
* Als je talent/ervaring hebt in grafische vormgeving en ideeën hebt voor mooiere iconen, laat het me weten. * Als je talent/ervaring hebt in grafische vormgeving en ideeën hebt voor mooiere iconen, laat het me weten.
* Als u een interessante use-case heeft of een manier om triggers en acties te combineren om iets intrigerends te bereiken en u denkt dat het de moeite waard is om het op de voorbeelden pagina te zetten (https://server47.de/automation/examples.html), laat het me weten. * Als u een interessante use-case heeft of een manier om triggers en acties te combineren om iets intrigerends te bereiken en u denkt dat het de moeite waard is om het op de voorbeelden pagina te zetten (https://server47.de/automation/examples.html), laat het me weten.