Compare commits
121 Commits
Author | SHA1 | Date | |
---|---|---|---|
4c66fe906e | |||
60cfa150b5 | |||
bd2231b075 | |||
158f5f2e04 | |||
f1315dc742 | |||
28aa0c3e4b | |||
6b9dbca7ab | |||
291e0c41af | |||
c9eedd5d87 | |||
2470321e15 | |||
d85a199117 | |||
b047cde4ea | |||
9a1796f2eb | |||
7e8a6b121e | |||
810c7488c4 | |||
8af24695fd | |||
533a9bf54d | |||
8653e4853b | |||
c464a9d71f | |||
26e4851c0d | |||
11f0ee25bf | |||
a76cafc6e2 | |||
bd2920e6d9 | |||
5caf33b45d | |||
6a74d070eb | |||
eba02ade08 | |||
394effea36 | |||
4d51f1890a | |||
a8b2c3bf7d | |||
d1c6abaa91 | |||
587ed5803e | |||
49d272be1e | |||
d9e54c7780 | |||
170dbbc7e8 | |||
3fc1dd1a26 | |||
0acb52099c | |||
b6015a3f2e | |||
ae1e767fa6 | |||
6e12e71133 | |||
e4e3faea06 | |||
7c42250e13 | |||
ebb0724b28 | |||
a7ae0c6588 | |||
e5433bf2ec | |||
fd8ffd4f7d | |||
f49455712a | |||
132f64114e | |||
27e9b3e0d1 | |||
a6c6dfc6ba | |||
6a7875cc61 | |||
6f80caa1c6 | |||
a9646cbf28 | |||
52edfa32df | |||
ca81e6a7bd | |||
49e4c20ab6 | |||
ab98b4d1db | |||
6b32301894 | |||
d9cdfab828 | |||
62a8723344 | |||
2b69938ad5 | |||
c42f65bd3a | |||
ad0d9962b5 | |||
58f24953f3 | |||
3d212456e6 | |||
fff0a28310 | |||
48da91cb40 | |||
98df050f42 | |||
93cb72ac2f | |||
713228c06e | |||
c868d45896 | |||
4abce042eb | |||
62034e1b10 | |||
135f4594be | |||
900aaf3c8c | |||
5baa40ed59 | |||
759e8076c3 | |||
17b9f19dc2 | |||
374a5c4263 | |||
2fd79140cb | |||
a0910e620f | |||
475c1719d7 | |||
baa39c7a77 | |||
e11cc09da2 | |||
eff04037a1 | |||
b73a45f4cd | |||
fad6050c7a | |||
8a00529991 | |||
1d7cf00b94 | |||
d74e2eae68 | |||
4f7c36c4f7 | |||
b0df3efa27 | |||
f99418fda3 | |||
e05a42f5d6 | |||
83a27dcfdb | |||
bdc89a855b | |||
7ce203a679 | |||
57bc666453 | |||
c966981eae | |||
7a05b9a95b | |||
7fdbf74906 | |||
d17e8b70fe | |||
f97bfbb732 | |||
937c6ffe1d | |||
1ecc61452f | |||
19fd2d098b | |||
d07c1a05e4 | |||
f9f9b30116 | |||
d154a3d64f | |||
eeb4f4a39e | |||
53e62068a5 | |||
922807d903 | |||
a7d294c115 | |||
2d2fd901a1 | |||
536a5e22f9 | |||
99faa2f7ef | |||
f3fac2f4e8 | |||
b3b713e454 | |||
b0d509aafe | |||
efb4919a1e | |||
7bc858fee3 | |||
647d5bd511 |
2
.gitignore
vendored
@ -145,7 +145,7 @@ fabric.properties
|
||||
|
||||
# End of https://www.toptal.com/developers/gitignore/api/androidstudio
|
||||
|
||||
|
||||
output-metadata.json
|
||||
/app/app-release.apk
|
||||
Automation_settings.xml
|
||||
/app/googlePlayFlavor/
|
||||
|
@ -11,8 +11,8 @@ android {
|
||||
compileSdkVersion 31
|
||||
buildToolsVersion '29.0.2'
|
||||
useLibrary 'org.apache.http.legacy'
|
||||
versionCode 121
|
||||
versionName "1.7.6"
|
||||
versionCode 133
|
||||
versionName "1.7.17"
|
||||
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
@ -36,9 +36,15 @@ android {
|
||||
{
|
||||
dimension "version"
|
||||
versionNameSuffix "-googlePlay"
|
||||
targetSdkVersion 30
|
||||
targetSdkVersion 31
|
||||
}
|
||||
|
||||
/*
|
||||
targetSdkVersion is kept at 28 for as long as possible.
|
||||
If raised wifi cannot be switched on or off anymore without root permissions.
|
||||
In the Google version I'm forced to raise the value regularly.
|
||||
*/
|
||||
|
||||
fdroidFlavor
|
||||
{
|
||||
dimension "version"
|
||||
@ -72,9 +78,9 @@ dependencies {
|
||||
|
||||
//implementation "androidx.security:security-crypto:1.0.0"
|
||||
//implementation "androidx.security:security-identity-credential:1.0.0-alpha02"
|
||||
implementation 'androidx.appcompat:appcompat:1.4.1'
|
||||
implementation 'com.google.android.material:material:1.3.0'
|
||||
testImplementation 'junit:junit:4.+'
|
||||
implementation 'androidx.appcompat:appcompat:1.4.2'
|
||||
implementation 'com.google.android.material:material:1.6.1'
|
||||
testImplementation 'junit:junit:4'
|
||||
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
|
||||
}
|
@ -1,20 +0,0 @@
|
||||
{
|
||||
"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"
|
||||
}
|
@ -66,6 +66,10 @@
|
||||
<uses-permission android:name="com.wireguard.android.permission.CONTROL_TUNNELS"/>
|
||||
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
|
||||
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
|
||||
<uses-permission android:name="android.permission.CALL_PHONE" />
|
||||
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" />
|
||||
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
|
||||
<uses-permission android:name="android.permission.READ_CALL_LOG" />
|
||||
|
||||
<uses-feature
|
||||
android:name="android.hardware.telephony"
|
||||
@ -169,6 +173,13 @@
|
||||
<activity android:name=".ActivityManageActionRunExecutable" />
|
||||
<activity android:name=".ActivityManageActionWifi" />
|
||||
<activity android:name=".ActivityManageTriggerTethering" />
|
||||
<activity android:name=".ActivityManageActionWakeLock" />
|
||||
<activity android:name=".ActivityManageTriggerSubSystemState" />
|
||||
<activity android:name=".ActivityManageActionMakePhoneCall" />
|
||||
<activity android:name=".ActivityManageActionSetVariable" />
|
||||
<activity android:name=".ActivityManageTriggerCheckVariable" />
|
||||
<activity android:name=".ActivityManageActionCopyToClipboard" />
|
||||
|
||||
<activity
|
||||
android:name=".ActivityMainTabLayout"
|
||||
android:launchMode="singleTask">
|
||||
|
@ -107,7 +107,7 @@ public class Rule implements Comparable<Rule>
|
||||
}
|
||||
public void setName(String name)
|
||||
{
|
||||
this.name = name;
|
||||
this.name = name.trim();
|
||||
}
|
||||
|
||||
public static void readFromFile()
|
||||
@ -347,7 +347,16 @@ public class Rule implements Comparable<Rule>
|
||||
if(oneTrigger.getTriggerType().equals(Trigger.Trigger_Enum.timeFrame))
|
||||
{
|
||||
if(oneTrigger.getTimeFrame().repetition > 0)
|
||||
return true;
|
||||
{
|
||||
if(this.getLastExecution() != null)
|
||||
{
|
||||
Calendar now = Calendar.getInstance();
|
||||
if (this.getLastExecution().getTimeInMillis() + oneTrigger.getTimeFrame().getRepetition() * 1000 <= now.getTimeInMillis())
|
||||
return true;
|
||||
}
|
||||
else
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else if(oneTrigger.getTriggerType().equals(Trigger.Trigger_Enum.broadcastReceived))
|
||||
{
|
||||
@ -396,7 +405,7 @@ public class Rule implements Comparable<Rule>
|
||||
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()), 3);
|
||||
Miscellaneous.logEvent("i", String.format(context.getResources().getString(R.string.ruleCheckOf), this.getName()), String.format(context.getResources().getString(R.string.ruleIsDeactivatedCantApply), this.getName()), 4);
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -467,7 +476,9 @@ public class Rule implements Comparable<Rule>
|
||||
{
|
||||
AutomationService service = AutomationService.getInstance();
|
||||
service.speak(messages[0], false);
|
||||
Toast.makeText(service, messages[0], Toast.LENGTH_LONG).show();
|
||||
|
||||
if(Settings.showToasts)
|
||||
Toast.makeText(service, messages[0], Toast.LENGTH_LONG).show();
|
||||
|
||||
super.onProgressUpdate(messages);
|
||||
}
|
||||
|
@ -64,6 +64,10 @@
|
||||
<uses-permission android:name="com.wireguard.android.permission.CONTROL_TUNNELS"/>
|
||||
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
|
||||
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
|
||||
<uses-permission android:name="android.permission.CALL_PHONE" />
|
||||
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" />
|
||||
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
|
||||
<uses-permission android:name="android.permission.READ_CALL_LOG" />
|
||||
|
||||
<uses-feature
|
||||
android:name="android.hardware.telephony"
|
||||
@ -167,6 +171,12 @@
|
||||
<activity android:name=".ActivityManageActionRunExecutable" />
|
||||
<activity android:name=".ActivityManageActionWifi" />
|
||||
<activity android:name=".ActivityManageTriggerTethering" />
|
||||
<activity android:name=".ActivityManageActionWakeLock" />
|
||||
<activity android:name=".ActivityManageTriggerSubSystemState" />
|
||||
<activity android:name=".ActivityManageActionMakePhoneCall" />
|
||||
<activity android:name=".ActivityManageActionSetVariable" />
|
||||
<activity android:name=".ActivityManageTriggerCheckVariable" />
|
||||
<activity android:name=".ActivityManageActionCopyToClipboard" />
|
||||
<activity
|
||||
android:name=".ActivityMainTabLayout"
|
||||
android:launchMode="singleTask">
|
||||
|
@ -104,7 +104,7 @@ public class Rule implements Comparable<Rule>
|
||||
}
|
||||
public void setName(String name)
|
||||
{
|
||||
this.name = name;
|
||||
this.name = name.trim();
|
||||
}
|
||||
|
||||
public static void readFromFile()
|
||||
@ -393,7 +393,7 @@ public class Rule implements Comparable<Rule>
|
||||
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()), 3);
|
||||
Miscellaneous.logEvent("i", String.format(context.getResources().getString(R.string.ruleCheckOf), this.getName()), String.format(context.getResources().getString(R.string.ruleIsDeactivatedCantApply), this.getName()), 4);
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -440,7 +440,9 @@ public class Rule implements Comparable<Rule>
|
||||
{
|
||||
AutomationService service = AutomationService.getInstance();
|
||||
service.speak(messages[0], false);
|
||||
Toast.makeText(service, messages[0], Toast.LENGTH_LONG).show();
|
||||
|
||||
if(Settings.showToasts)
|
||||
Toast.makeText(service, messages[0], Toast.LENGTH_LONG).show();
|
||||
|
||||
super.onProgressUpdate(messages);
|
||||
}
|
||||
|
@ -64,6 +64,8 @@
|
||||
<uses-permission android:name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"/>
|
||||
<uses-permission android:name="com.wireguard.android.permission.CONTROL_TUNNELS"/>
|
||||
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
|
||||
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
|
||||
<uses-permission android:name="android.permission.READ_CALL_LOG" />
|
||||
|
||||
<application
|
||||
android:allowBackup="true"
|
||||
@ -111,6 +113,7 @@
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
<receiver android:name=".receivers.PackageReplacedReceiver"
|
||||
android:exported="true"
|
||||
android:enabled="true">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
|
||||
@ -122,6 +125,7 @@
|
||||
|
||||
<receiver
|
||||
android:name=".DeviceAdmin"
|
||||
android:exported="true"
|
||||
android:description="@string/app_name"
|
||||
android:label="@string/app_name"
|
||||
android:permission= "android.permission.BIND_DEVICE_ADMIN" >
|
||||
@ -154,8 +158,14 @@
|
||||
<activity android:name=".ActivityManageActionRunExecutable" />
|
||||
<activity android:name=".ActivityManageActionWifi" />
|
||||
<activity android:name=".ActivityManageTriggerTethering" />
|
||||
<activity android:name=".ActivityManageActionWakeLock" />
|
||||
<activity android:name=".ActivityManageTriggerSubSystemState" />
|
||||
<activity android:name=".ActivityManageActionSetVariable" />
|
||||
<activity android:name=".ActivityManageTriggerCheckVariable" />
|
||||
<activity android:name=".ActivityManageActionCopyToClipboard" />
|
||||
<activity
|
||||
android:name=".ActivityMainTabLayout"
|
||||
android:exported="true"
|
||||
android:launchMode="singleTask">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
@ -204,6 +214,7 @@
|
||||
|
||||
<service
|
||||
android:name=".receivers.NotificationListener"
|
||||
android:exported="true"
|
||||
android:label="@string/app_name"
|
||||
android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE" >
|
||||
<intent-filter>
|
||||
|
@ -107,7 +107,7 @@ public class Rule implements Comparable<Rule>
|
||||
}
|
||||
public void setName(String name)
|
||||
{
|
||||
this.name = name;
|
||||
this.name = name.trim();
|
||||
}
|
||||
|
||||
public static void readFromFile()
|
||||
@ -396,7 +396,7 @@ public class Rule implements Comparable<Rule>
|
||||
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()), 3);
|
||||
Miscellaneous.logEvent("i", String.format(context.getResources().getString(R.string.ruleCheckOf), this.getName()), String.format(context.getResources().getString(R.string.ruleIsDeactivatedCantApply), this.getName()), 4);
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -467,7 +467,9 @@ public class Rule implements Comparable<Rule>
|
||||
{
|
||||
AutomationService service = AutomationService.getInstance();
|
||||
service.speak(messages[0], false);
|
||||
Toast.makeText(service, messages[0], Toast.LENGTH_LONG).show();
|
||||
|
||||
if(Settings.showToasts)
|
||||
Toast.makeText(service, messages[0], Toast.LENGTH_LONG).show();
|
||||
|
||||
super.onProgressUpdate(messages);
|
||||
}
|
||||
|
@ -1,6 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
|
||||
|
||||
</manifest>
|
@ -6,8 +6,6 @@ import android.os.Build;
|
||||
import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.RequiresApi;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.http.client.methods.HttpGet;
|
||||
|
||||
@ -53,6 +51,11 @@ public class Action
|
||||
closeNotification,
|
||||
sendBroadcast,
|
||||
runExecutable,
|
||||
wakelock,
|
||||
setVariable,
|
||||
startPhoneCall,
|
||||
stopPhoneCall,
|
||||
copyToClipboard,
|
||||
sendTextMessage;
|
||||
|
||||
public String getFullName(Context context)
|
||||
@ -127,6 +130,16 @@ public class Action
|
||||
return context.getResources().getString(R.string.sendBroadcast);
|
||||
case runExecutable:
|
||||
return context.getResources().getString(R.string.runExecutable);
|
||||
case wakelock:
|
||||
return context.getResources().getString(R.string.keepDeviceAwake);
|
||||
case setVariable:
|
||||
return context.getResources().getString(R.string.setVariable);
|
||||
case startPhoneCall:
|
||||
return context.getResources().getString(R.string.startPhoneCall);
|
||||
case stopPhoneCall:
|
||||
return context.getResources().getString(R.string.endPhoneCall);
|
||||
case copyToClipboard:
|
||||
return context.getResources().getString(R.string.copyTextToClipboard);
|
||||
default:
|
||||
return "Unknown";
|
||||
}
|
||||
@ -273,6 +286,27 @@ public class Action
|
||||
case runExecutable:
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.runExecutable));
|
||||
break;
|
||||
case wakelock:
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.keepDeviceAwake) + " (" + String.valueOf(getParameter1()) + ")");
|
||||
break;
|
||||
case setVariable:
|
||||
String[] variableParams = getParameter2().split(actionParameter2Split);
|
||||
String addition;
|
||||
if (variableParams.length >= 2)
|
||||
addition = " (key: " + variableParams[0] + ", value: " + variableParams[1] + ")";
|
||||
else
|
||||
addition = " (delete key: " + variableParams[0] + ")";
|
||||
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.setVariable) + addition);
|
||||
break;
|
||||
case startPhoneCall:
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.startPhoneCall));
|
||||
break;
|
||||
case stopPhoneCall:
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.endPhoneCall));
|
||||
break;
|
||||
case copyToClipboard:
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.copyTextToClipboard));
|
||||
default:
|
||||
returnString.append(action.toString());
|
||||
}
|
||||
@ -330,17 +364,25 @@ public class Action
|
||||
|
||||
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]);
|
||||
|
||||
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))
|
||||
{
|
||||
if(!StringUtils.isEmpty(this.parameter2))
|
||||
if (!StringUtils.isEmpty(this.parameter2))
|
||||
{
|
||||
boolean useRoot = Boolean.parseBoolean(this.parameter2);
|
||||
if(useRoot)
|
||||
if (useRoot)
|
||||
returnString.append(" " + Miscellaneous.getAnyContext().getResources().getString(R.string.usingRoot));
|
||||
}
|
||||
}
|
||||
else if(this.getAction().equals(Action_Enum.controlMediaPlayback))
|
||||
else if (this.getAction().equals(Action_Enum.controlMediaPlayback))
|
||||
{
|
||||
returnString.append(": ");
|
||||
|
||||
@ -368,10 +410,12 @@ public class Action
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.unknown));
|
||||
}
|
||||
}
|
||||
else if(this.getAction().equals(Action_Enum.sendBroadcast))
|
||||
else if (this.getAction().equals(Action_Enum.sendBroadcast))
|
||||
{
|
||||
returnString.append(": " + parameter2.replace(Action.actionParameter2Split, "; ").replace(Action.intentPairSeparator, "/"));
|
||||
}
|
||||
else if(this.getAction().equals(Action_Enum.setVariable) || this.getAction().equals(Action_Enum.copyToClipboard))
|
||||
; // it's completed further above already
|
||||
else if (parameter2 != null && parameter2.length() > 0)
|
||||
returnString.append(": " + parameter2.replace(Action.actionParameter2Split, "; "));
|
||||
}
|
||||
@ -485,7 +529,7 @@ public class Action
|
||||
Actions.setUsbTethering(context, getParameter1(), toggleActionIfPossible);
|
||||
break;
|
||||
case setWifi:
|
||||
Actions.WifiStuff.setWifi(context, getParameter1(), toggleActionIfPossible);
|
||||
Actions.WifiStuff.setWifi(context, getParameter1(), getParameter2(), toggleActionIfPossible);
|
||||
break;
|
||||
case setWifiTethering:
|
||||
Actions.setWifiTethering(context, getParameter1(), toggleActionIfPossible);
|
||||
@ -570,6 +614,24 @@ public class Action
|
||||
else if(execParts.length == 2)
|
||||
Actions.runExecutable(context, this.getParameter1(), execParts[0], execParts[1]);
|
||||
break;
|
||||
case wakelock:
|
||||
if(this.getParameter1())
|
||||
Actions.wakeLockStart(context, Long.parseLong(this.getParameter2()));
|
||||
else
|
||||
Actions.wakeLockStop();
|
||||
break;
|
||||
case setVariable:
|
||||
Actions.setVariable(this.getParameter2());
|
||||
break;
|
||||
case startPhoneCall:
|
||||
Actions.startPhoneCall(context, this.getParameter2());
|
||||
break;
|
||||
case stopPhoneCall:
|
||||
Actions.endPhoneCall(context);
|
||||
break;
|
||||
case copyToClipboard:
|
||||
Actions.copyToClipboard(context, Miscellaneous.replaceVariablesInText(this.getParameter2(), context));
|
||||
break;
|
||||
default:
|
||||
Miscellaneous.logEvent("w", "Action", context.getResources().getString(R.string.unknownActionSpecified), 3);
|
||||
break;
|
||||
@ -596,7 +658,7 @@ public class Action
|
||||
password = components[1];
|
||||
url = components[2];
|
||||
}
|
||||
else
|
||||
else // compatibility for very old versions which haven't upgraded, yet.
|
||||
url = components[0];
|
||||
|
||||
try
|
||||
|
@ -10,13 +10,10 @@ import android.bluetooth.BluetoothAdapter;
|
||||
import android.bluetooth.BluetoothDevice;
|
||||
import android.bluetooth.BluetoothProfile;
|
||||
import android.content.ActivityNotFoundException;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.media.AudioManager;
|
||||
import android.media.MediaPlayer;
|
||||
import android.media.session.MediaController;
|
||||
import android.media.session.MediaSessionManager;
|
||||
import android.net.ConnectivityManager;
|
||||
import android.net.Uri;
|
||||
import android.net.wifi.WifiManager;
|
||||
@ -26,8 +23,8 @@ import android.os.PowerManager.WakeLock;
|
||||
import android.os.VibrationEffect;
|
||||
import android.os.Vibrator;
|
||||
import android.provider.MediaStore;
|
||||
import android.service.notification.NotificationListenerService;
|
||||
import android.service.notification.StatusBarNotification;
|
||||
import android.telecom.TelecomManager;
|
||||
import android.telephony.SmsManager;
|
||||
import android.telephony.SubscriptionManager;
|
||||
import android.telephony.TelephonyManager;
|
||||
@ -70,6 +67,7 @@ import java.util.Collections;
|
||||
import java.util.Enumeration;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
@ -82,10 +80,6 @@ public class Actions
|
||||
public static AutomationService automationServerRef;
|
||||
public static Context context;
|
||||
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 dummyPackageString = "dummyPkg239asd";
|
||||
|
||||
@ -99,6 +93,7 @@ public class Actions
|
||||
|
||||
Miscellaneous.logEvent("w", "createNotification", "Creating notification with title " + elements[0] + " and text " + elements[1], 3);
|
||||
|
||||
// Create a new notification ID each time
|
||||
int notificationId = Math.round(Calendar.getInstance().getTimeInMillis()/1000);
|
||||
|
||||
try
|
||||
@ -117,8 +112,8 @@ public class Actions
|
||||
public static void closeNotification(Action action)
|
||||
{
|
||||
NotificationManager nm = (NotificationManager) Miscellaneous.getAnyContext().getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
for(StatusBarNotification n : nm.getActiveNotifications())
|
||||
{
|
||||
// for(StatusBarNotification n : nm.getActiveNotifications())
|
||||
// {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
|
||||
{
|
||||
String[] params = action.getParameter2().split(Action.actionParameter2Split);
|
||||
@ -127,11 +122,14 @@ public class Actions
|
||||
String myTitleDir = params[1];
|
||||
String requiredTitle = params[2];
|
||||
String myTextDir = params[3];
|
||||
String requiredText;
|
||||
if (params.length >= 5)
|
||||
String requiredText = "";
|
||||
String method = ActivityManageActionCloseNotification.dismissRegularString;
|
||||
|
||||
if(params.length >= 5)
|
||||
requiredText = params[4];
|
||||
else
|
||||
requiredText = "";
|
||||
|
||||
if(params.length >= 6 && !params[5].equals(ActivityManageActionCloseNotification.dismissRegularString))
|
||||
method = params[5];
|
||||
|
||||
for (StatusBarNotification sbn : NotificationListener.getInstance().getActiveNotifications())
|
||||
{
|
||||
@ -185,12 +183,17 @@ public class Actions
|
||||
|
||||
Miscellaneous.logEvent("i", "NotificationCloseCheck", "All criteria matches. Closing notification: " + sbn.getNotification().toString(), 3);
|
||||
if(NotificationListener.getInstance() != null)
|
||||
NotificationListener.getInstance().dismissNotification(sbn);
|
||||
{
|
||||
if(method == ActivityManageActionCloseNotification.dismissRegularString)
|
||||
NotificationListener.getInstance().dismissNotification(sbn);
|
||||
else
|
||||
NotificationListener.getInstance().clickNotificationButton(sbn, method);
|
||||
}
|
||||
else
|
||||
Miscellaneous.logEvent("i", "NotificationCloseCheck", "NotificationListener instance is null. Can\'t close notification.", 3);
|
||||
}
|
||||
}
|
||||
}
|
||||
// }
|
||||
}
|
||||
|
||||
public static void sendBroadcast(Context context, String action)
|
||||
@ -212,11 +215,50 @@ public class Actions
|
||||
context.sendBroadcast(broadcastIntent);
|
||||
}
|
||||
|
||||
public static class WifiStuff
|
||||
public static void setVariable(String parameter2)
|
||||
{
|
||||
public static Boolean setWifi(Context context, Boolean desiredState, boolean toggleActionIfPossible)
|
||||
String[] parts = parameter2.split(Action.actionParameter2Split);
|
||||
|
||||
if(AutomationService.isMyServiceRunning(Miscellaneous.getAnyContext()))
|
||||
{
|
||||
if(context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.Q)
|
||||
Map<String,String> map = AutomationService.getInstance().getVariableMap();
|
||||
|
||||
if(parts.length > 1)
|
||||
map.put(parts[0], parts[1]);
|
||||
else
|
||||
map.remove(parts[0]);
|
||||
}
|
||||
|
||||
Miscellaneous.logEvent("i", "Variable", "Checking for applicable rules after variable has been set or deleted.", 2);
|
||||
List<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger.Trigger_Enum.checkVariable);
|
||||
for(int i=0; i<ruleCandidates.size(); i++)
|
||||
{
|
||||
if(ruleCandidates.get(i).haveEnoughPermissions() && ruleCandidates.get(i).getsGreenLight(AutomationService.getInstance()))
|
||||
{
|
||||
Miscellaneous.logEvent("i", "Variable", "Rule " + ruleCandidates.get(i).getName() + " applies after variable has been set or deleted.", 2);
|
||||
ruleCandidates.get(i).activate(AutomationService.getInstance(), false);
|
||||
}
|
||||
}
|
||||
Miscellaneous.logEvent("i", "Variable", "Done checking for applicable rules after variable has been set or deleted.", 2);
|
||||
|
||||
}
|
||||
|
||||
public static class WifiStuff
|
||||
{
|
||||
public static Boolean setWifi(Context context, Boolean desiredState, String parameter2, boolean toggleActionIfPossible)
|
||||
{
|
||||
boolean forceUseRoot = false;
|
||||
|
||||
try
|
||||
{
|
||||
forceUseRoot = Boolean.parseBoolean(parameter2);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
if(context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.Q || forceUseRoot)
|
||||
return setWifiWithRoot(context, desiredState, toggleActionIfPossible);
|
||||
else
|
||||
return setWifiOldFashioned(context, desiredState, toggleActionIfPossible);
|
||||
@ -252,8 +294,15 @@ public class Actions
|
||||
{
|
||||
Miscellaneous.logEvent("i", "Wifi", "Changing wifi to " + String.valueOf(desiredState), 4);
|
||||
|
||||
if (desiredState && Settings.useWifiForPositioning)
|
||||
WifiBroadcastReceiver.startWifiReceiver(automationServerRef.getLocationProvider());
|
||||
try
|
||||
{
|
||||
if (desiredState && Settings.useWifiForPositioning)
|
||||
WifiBroadcastReceiver.startWifiReceiver(automationServerRef.getLocationProvider());
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
Miscellaneous.logEvent("w", "setWifiOldFashioned()", Log.getStackTraceString(e), 4);
|
||||
}
|
||||
|
||||
WifiManager myWifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
|
||||
|
||||
@ -1041,6 +1090,8 @@ public class Actions
|
||||
|
||||
if (params[2].equals(ActivityManageActionStartActivity.startByActivityString))
|
||||
automationServerRef.startActivity(externalActivityIntent);
|
||||
if (params[2].equals(ActivityManageActionStartActivity.startByServiceString))
|
||||
automationServerRef.startService(externalActivityIntent);
|
||||
else
|
||||
automationServerRef.sendBroadcast(externalActivityIntent);
|
||||
}
|
||||
@ -1114,21 +1165,36 @@ public class Actions
|
||||
}
|
||||
else if (singleParam[0].equals("Uri"))
|
||||
{
|
||||
if (singleParam[1].equalsIgnoreCase("IntentData"))
|
||||
try
|
||||
{
|
||||
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with value " + singleParam[2] + " as standard data parameter.", 3);
|
||||
intent.setData(Uri.parse(singleParam[2]));
|
||||
if (singleParam[1].equalsIgnoreCase("IntentData"))
|
||||
{
|
||||
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with value " + singleParam[2] + " as standard data parameter.", 3);
|
||||
intent.setData(Uri.parse(Miscellaneous.replaceVariablesInText(singleParam[2], context)));
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3);
|
||||
intent.putExtra(singleParam[1], Uri.parse(Miscellaneous.replaceVariablesInText(singleParam[2], context)));
|
||||
}
|
||||
}
|
||||
else
|
||||
catch (Exception e)
|
||||
{
|
||||
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3);
|
||||
intent.putExtra(singleParam[1], Uri.parse(singleParam[2]));
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
else if (singleParam[0].equals("String"))
|
||||
{
|
||||
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3);
|
||||
intent.putExtra(singleParam[1], singleParam[2]);
|
||||
try
|
||||
{
|
||||
intent.putExtra(singleParam[1], Miscellaneous.replaceVariablesInText(singleParam[2], context));
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
intent.putExtra(singleParam[1], singleParam[2]);
|
||||
}
|
||||
}
|
||||
else
|
||||
Miscellaneous.logEvent("w", "StartOtherApp", "Unknown type of parameter " + singleParam[0] + " found. Name " + singleParam[1] + " and value " + singleParam[2], 3);
|
||||
@ -1173,21 +1239,37 @@ public class Actions
|
||||
|
||||
public static void sendTextMessage(Context context, String[] parametersArray)
|
||||
{
|
||||
String phoneNumber, message;
|
||||
String phoneNumber, message, messageType = ActivityManageActionSendTextMessage.messageTypeSms, filePath = null;
|
||||
|
||||
phoneNumber = parametersArray[0];
|
||||
message = parametersArray[1];
|
||||
|
||||
if(parametersArray.length > 2)
|
||||
{
|
||||
messageType = parametersArray[2];
|
||||
|
||||
if(parametersArray.length > 3)
|
||||
filePath = parametersArray[3];
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
String textToSend = Miscellaneous.replaceVariablesInText(message, context);
|
||||
if(messageType.equals("sms"))
|
||||
sendSmsMessage(phoneNumber, textToSend);
|
||||
else
|
||||
sendMmsMessage(phoneNumber, textToSend, filePath);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Miscellaneous.logEvent("e", Miscellaneous.getAnyContext().getString(R.string.sendTextMessage), "Error in sendTextMessage: " + Log.getStackTraceString(e), 3);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("sms:" + phoneNumber));
|
||||
intent.putExtra("sms_body", message);
|
||||
AutomationService.getInstance().startActivity(intent);
|
||||
*/
|
||||
|
||||
private static void sendSmsMessage(String phoneNumber, String textToSend)
|
||||
{
|
||||
try
|
||||
{
|
||||
PendingIntent pi = PendingIntent.getActivity(context, 0, new Intent(context, Actions.class), 0);
|
||||
SmsManager sms = SmsManager.getDefault();
|
||||
sms.sendTextMessage(phoneNumber, null, textToSend, pi, null);
|
||||
@ -1198,6 +1280,26 @@ public class Actions
|
||||
}
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
|
||||
private static void sendMmsMessage(String phoneNumber, String textToSend, String fileToBeAttached)
|
||||
{
|
||||
try
|
||||
{
|
||||
Miscellaneous.logEvent("i", "sendMmsMessage()", "Sending MMS message...", 2);
|
||||
// Uri contentUri = Uri.fromFile(new File(fileToBeAttached));
|
||||
String str2 = "send." + String.valueOf(Math.abs(new Random().nextLong())) + ".dat";
|
||||
Uri contentUri = new Uri.Builder().authority(context.getPackageName() + ".MmsFileProvider").path(str2).scheme("content").build();
|
||||
|
||||
// Bundle a3 = C3326a.m16196a(new C8792q("enableGroupMms", true), new C8792q("maxMessageSize", Integer.valueOf(C3664a.m17428d())));
|
||||
|
||||
SmsManager.getDefault().sendMultimediaMessage(context, contentUri, phoneNumber, null, null);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Miscellaneous.logEvent("e", "sendMmsMessage()", "Error in sendMmsMessage(): " + Log.getStackTraceString(e), 3);
|
||||
}
|
||||
}
|
||||
|
||||
private static class WakeUpDeviceClass implements Runnable
|
||||
{
|
||||
private long awakeTime;
|
||||
@ -1864,6 +1966,12 @@ public class Actions
|
||||
|
||||
protected static boolean executeCommandViaSu(String[] commands)
|
||||
{
|
||||
boolean suAvailable = false;
|
||||
String suVersion = null;
|
||||
String suVersionInternal = null;
|
||||
// List<String> suResult = null;
|
||||
int suResult;
|
||||
|
||||
boolean success = false;
|
||||
|
||||
try
|
||||
@ -1873,17 +1981,30 @@ public class Actions
|
||||
{
|
||||
suVersion = Shell.SU.version(false);
|
||||
suVersionInternal = Shell.SU.version(true);
|
||||
suResult = Shell.SU.run(commands);
|
||||
|
||||
if (suResult != null)
|
||||
Miscellaneous.logEvent("i", "executeCommandViaSu()", "suVersion: " + suVersion + ", suVersionInternal: " + suVersionInternal, 5);
|
||||
|
||||
// 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;
|
||||
}
|
||||
else
|
||||
Miscellaneous.logEvent("w", "executeCommandViaSu()", "su not available.", 4);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
success = false;
|
||||
}
|
||||
|
||||
Miscellaneous.logEvent("i", "executeCommandViaSu()", "Returning " + String.valueOf(success), 4);
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
@ -2092,4 +2213,117 @@ public class Actions
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
public static void startPhoneCall(Context context, String phoneNumber)
|
||||
{
|
||||
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + Uri.encode(phoneNumber)));
|
||||
// intent.setClassName("com.android.phone","com.android.phone.OutgoingCallBroadcaster");
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
intent.addFlags(Intent.FLAG_FROM_BACKGROUND);
|
||||
context.startActivity(intent);
|
||||
}
|
||||
|
||||
public static void endPhoneCall(Context context)
|
||||
{
|
||||
if(Build.VERSION.SDK_INT < 21)
|
||||
{
|
||||
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
|
||||
try
|
||||
{
|
||||
Class c = Class.forName(tm.getClass().getName());
|
||||
Method m = c.getDeclaredMethod("getITelephony");
|
||||
m.setAccessible(true);
|
||||
Object telephonyService = m.invoke(tm);
|
||||
|
||||
c = Class.forName(telephonyService.getClass().getName());
|
||||
m = c.getDeclaredMethod("endCall");
|
||||
m.setAccessible(true);
|
||||
m.invoke(telephonyService);
|
||||
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
TelecomManager mgr = (TelecomManager) context.getSystemService(context.TELECOM_SERVICE);
|
||||
mgr.endCall();
|
||||
}
|
||||
}
|
||||
|
||||
public static void copyToClipboard(Context context, String text)
|
||||
{
|
||||
Miscellaneous.logEvent("i", "Clipboard", "Copying data to clipboard: " + text, 4);
|
||||
|
||||
if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB)
|
||||
{
|
||||
android.text.ClipboardManager clipboard = (android.text.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
|
||||
clipboard.setText(text);
|
||||
}
|
||||
else
|
||||
{
|
||||
android.content.ClipboardManager clipboard = (android.content.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
|
||||
android.content.ClipData clip = android.content.ClipData.newPlainText("Data-from-Automation", text);
|
||||
clipboard.setPrimaryClip(clip);
|
||||
}
|
||||
}
|
||||
}
|
@ -39,8 +39,10 @@ public class ActivityControlCenter extends Activity
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
setContentView(R.layout.activity_control_center);
|
||||
|
||||
|
||||
bVolumeTest = (Button) findViewById(R.id.bVolumeTest);
|
||||
bVolumeTest.setOnClickListener(new View.OnClickListener()
|
||||
{
|
||||
@ -384,6 +386,7 @@ public class ActivityControlCenter extends Activity
|
||||
protected void onResume()
|
||||
{
|
||||
super.onResume();
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
|
||||
String folder = Miscellaneous.getWriteableFolder();
|
||||
if (folder != null && folder.length() > 0)
|
||||
|
@ -21,6 +21,7 @@ public class ActivityDisplayLongMessage extends Activity
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
setContentView(R.layout.activity_display_long_message);
|
||||
|
||||
tvMessageTitle = (TextView)findViewById(R.id.tvMessageTitle);
|
||||
|
@ -13,7 +13,8 @@ public class ActivityHelp extends Activity
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(layout.help_text);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
setContentView(layout.activity_help_text);
|
||||
|
||||
TextView tvHelpTextEnergySaving = (TextView) findViewById(R.id.tvHelpTextEnergySaving);
|
||||
tvHelpTextEnergySaving.setMovementMethod(LinkMovementMethod.getInstance());
|
||||
|
@ -44,6 +44,7 @@ public class ActivityMainPoi extends ActivityGeneric
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
setContentView(R.layout.main_poi_layout);
|
||||
|
||||
instance = this;
|
||||
@ -107,6 +108,13 @@ public class ActivityMainPoi extends ActivityGeneric
|
||||
this.storeServiceReferenceInVariable();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume()
|
||||
{
|
||||
super.onResume();
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
}
|
||||
|
||||
private void buttonAddPoi()
|
||||
{
|
||||
poiToEdit = null;
|
||||
@ -190,8 +198,27 @@ public class ActivityMainPoi extends ActivityGeneric
|
||||
startActivityForResult(manageSpecificPoiIntent, 2000);
|
||||
break;
|
||||
case 1:
|
||||
if(pointOfInterest.delete(Miscellaneous.getAnyContext()))
|
||||
updateListView();
|
||||
AlertDialog.Builder deleteDialog = new AlertDialog.Builder(ActivityMainPoi.this);
|
||||
deleteDialog.setMessage(getResources().getString(R.string.areYouSure));
|
||||
deleteDialog.setPositiveButton(getResources().getString(R.string.yes), new DialogInterface.OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i)
|
||||
{
|
||||
if(pointOfInterest.delete(Miscellaneous.getAnyContext()))
|
||||
updateListView();
|
||||
}
|
||||
});
|
||||
deleteDialog.setNegativeButton(getResources().getString(R.string.no), new DialogInterface.OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i)
|
||||
{
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
deleteDialog.show();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -40,6 +40,7 @@ public class ActivityMainProfiles extends ActivityGeneric
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
setContentView(R.layout.main_profile_layout);
|
||||
|
||||
instance = this;
|
||||
@ -154,6 +155,13 @@ public class ActivityMainProfiles extends ActivityGeneric
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume()
|
||||
{
|
||||
super.onResume();
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
}
|
||||
|
||||
private AlertDialog getProfileDialog(final Profile profile)
|
||||
{
|
||||
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
|
||||
@ -187,10 +195,29 @@ public class ActivityMainProfiles extends ActivityGeneric
|
||||
Rule user = profile.isInUseByRules();
|
||||
if(user == null)
|
||||
{
|
||||
if (profile.delete(ActivityMainProfiles.this))
|
||||
updateListView();
|
||||
else
|
||||
Toast.makeText(ActivityMainProfiles.this, getResources().getString(R.string.profileCouldNotBeDeleted), Toast.LENGTH_LONG).show();
|
||||
AlertDialog.Builder deleteDialog = new AlertDialog.Builder(ActivityMainProfiles.this);
|
||||
deleteDialog.setMessage(getResources().getString(R.string.areYouSure));
|
||||
deleteDialog.setPositiveButton(getResources().getString(R.string.yes), new DialogInterface.OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i)
|
||||
{
|
||||
if (profile.delete(ActivityMainProfiles.this))
|
||||
updateListView();
|
||||
else
|
||||
Toast.makeText(ActivityMainProfiles.this, getResources().getString(R.string.profileCouldNotBeDeleted), Toast.LENGTH_LONG).show();
|
||||
}
|
||||
});
|
||||
deleteDialog.setNegativeButton(getResources().getString(R.string.no), new DialogInterface.OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i)
|
||||
{
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
deleteDialog.show();
|
||||
}
|
||||
else
|
||||
Toast.makeText(ActivityMainProfiles.this, String.format(getResources().getString(R.string.ruleXIsUsingProfileY), user.getName(), profile.getName()), Toast.LENGTH_LONG).show();
|
||||
|
@ -18,6 +18,7 @@ import android.widget.ListView;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
import com.jens.automation2.AutomationService.serviceCommands;
|
||||
import com.jens.automation2.receivers.DateTimeListener;
|
||||
|
||||
@ -46,7 +47,8 @@ public class ActivityMainRules extends ActivityGeneric
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
setContentView(R.layout.main_rule_layout);
|
||||
|
||||
instance = this;
|
||||
@ -152,6 +154,13 @@ public class ActivityMainRules extends ActivityGeneric
|
||||
return v;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume()
|
||||
{
|
||||
super.onResume();
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onActivityResult(int requestCode, int resultCode, Intent data)
|
||||
@ -213,11 +222,30 @@ public class ActivityMainRules extends ActivityGeneric
|
||||
startActivityForResult(manageSpecificRuleIntent, requestCodeChangeRule);
|
||||
break;
|
||||
case 2:
|
||||
if(ruleThisIsAbout.delete())
|
||||
AlertDialog.Builder deleteDialog = new AlertDialog.Builder(ActivityMainRules.this);
|
||||
deleteDialog.setMessage(getResources().getString(R.string.areYouSure));
|
||||
deleteDialog.setPositiveButton(getResources().getString(R.string.yes), new DialogInterface.OnClickListener()
|
||||
{
|
||||
ruleToEdit = null; //clear cache
|
||||
updateListView();
|
||||
}
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i)
|
||||
{
|
||||
if(ruleThisIsAbout.delete())
|
||||
{
|
||||
ruleToEdit = null; //clear cache
|
||||
updateListView();
|
||||
}
|
||||
}
|
||||
});
|
||||
deleteDialog.setNegativeButton(getResources().getString(R.string.no), new DialogInterface.OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i)
|
||||
{
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
deleteDialog.show();
|
||||
break;
|
||||
case 3:
|
||||
ruleToEdit = ruleThisIsAbout;
|
||||
|
@ -6,9 +6,12 @@ import android.app.AlertDialog;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.Resources;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.util.Log;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
@ -31,6 +34,7 @@ import com.jens.automation2.location.LocationProvider;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.Locale;
|
||||
|
||||
@SuppressLint("NewApi")
|
||||
public class ActivityMainScreen extends ActivityGeneric
|
||||
@ -51,6 +55,7 @@ public class ActivityMainScreen extends ActivityGeneric
|
||||
public void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
setContentView(R.layout.main_overview_layout);
|
||||
|
||||
activityMainScreenInstance = this;
|
||||
@ -270,9 +275,14 @@ public class ActivityMainScreen extends ActivityGeneric
|
||||
activityMainScreenInstance.tvMainScreenNotePermissions.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
if(Miscellaneous.restrictedFeaturesConfigured())
|
||||
if(BuildConfig.FLAVOR.equals(AutomationService.flavor_name_fdroid) && Miscellaneous.restrictedFeaturesConfiguredFdroid())
|
||||
{
|
||||
activityMainScreenInstance.tvMainScreenNoteFeaturesFromOtherFlavor.setText(R.string.settingsReferringToRestrictedFeatures);
|
||||
activityMainScreenInstance.tvMainScreenNoteFeaturesFromOtherFlavor.setText(R.string.settingsReferringToRestrictedFeaturesInFdroid);
|
||||
activityMainScreenInstance.tvMainScreenNoteFeaturesFromOtherFlavor.setVisibility(View.VISIBLE);
|
||||
}
|
||||
else if(BuildConfig.FLAVOR.equals(AutomationService.flavor_name_googleplay) && Miscellaneous.restrictedFeaturesConfiguredGoogle())
|
||||
{
|
||||
activityMainScreenInstance.tvMainScreenNoteFeaturesFromOtherFlavor.setText(R.string.settingsReferringToRestrictedFeaturesInGoogle);
|
||||
activityMainScreenInstance.tvMainScreenNoteFeaturesFromOtherFlavor.setVisibility(View.VISIBLE);
|
||||
}
|
||||
else
|
||||
@ -283,14 +293,6 @@ public class ActivityMainScreen extends ActivityGeneric
|
||||
|
||||
if(Miscellaneous.googleToBlameForLocation(true))
|
||||
{
|
||||
// Intent intent = new Intent(AutomationService.this, ActivityDisplayLongMessage.class);
|
||||
// intent.putExtra("longMessage", getResources().getString(R.string.locationEngineDisabledLong));
|
||||
// PendingIntent pi = PendingIntent.getActivity(AutomationService.this, 0, intent, 0);
|
||||
// if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1)
|
||||
// Miscellaneous.createDismissableNotificationWithDelay(2200, getResources().getString(R.string.featuresDisabled), notificationIdLocationRestriction, pi);
|
||||
// else
|
||||
// Miscellaneous.createDismissableNotification(getResources().getString(R.string.featuresDisabled), notificationIdLocationRestriction, pi);
|
||||
|
||||
activityMainScreenInstance.tvMainScreenNoteLocationImpossibleBlameGoogle.setText(R.string.locationEngineDisabledShort);
|
||||
activityMainScreenInstance.tvMainScreenNoteLocationImpossibleBlameGoogle.setVisibility(View.VISIBLE);
|
||||
activityMainScreenInstance.tvMainScreenNoteLocationImpossibleBlameGoogle.setOnClickListener(new OnClickListener()
|
||||
@ -315,8 +317,7 @@ public class ActivityMainScreen extends ActivityGeneric
|
||||
uiUpdateRunning = true;
|
||||
activityMainScreenInstance.toggleService.setChecked(true);
|
||||
uiUpdateRunning = false;
|
||||
// if(activityMainScreenInstance.hasWindowFocus())
|
||||
// {
|
||||
|
||||
try
|
||||
{
|
||||
PointOfInterest activePoi = PointOfInterest.getActivePoi();
|
||||
@ -433,7 +434,7 @@ public class ActivityMainScreen extends ActivityGeneric
|
||||
else
|
||||
activityMainScreenInstance.checkForNews();
|
||||
|
||||
if(BuildConfig.FLAVOR.equals("apkFlavor") && Settings.automaticUpdateCheck)
|
||||
if(BuildConfig.FLAVOR.equals(AutomationService.flavor_name_apk) && Settings.automaticUpdateCheck)
|
||||
{
|
||||
Calendar now = Calendar.getInstance();
|
||||
if (Settings.lastUpdateCheck == Settings.default_lastUpdateCheck || now.getTimeInMillis() >= Settings.lastUpdateCheck + (long)(Settings.updateCheckFrequencyDays * 24 * 60 * 60 * 1000))
|
||||
@ -570,6 +571,7 @@ public class ActivityMainScreen extends ActivityGeneric
|
||||
protected void onResume()
|
||||
{
|
||||
super.onResume();
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
toggleService.setChecked(AutomationService.isMyServiceRunning(this));
|
||||
ActivityMainScreen.updateMainScreen();
|
||||
|
||||
|
@ -3,12 +3,17 @@ package com.jens.automation2;
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.TabActivity;
|
||||
import android.content.Intent;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.Resources;
|
||||
import android.os.Bundle;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.widget.TabHost;
|
||||
import android.widget.TabHost.TabSpec;
|
||||
|
||||
import com.jens.automation2.receivers.NfcReceiver;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
|
||||
@SuppressLint("NewApi")
|
||||
public class ActivityMainTabLayout extends TabActivity
|
||||
@ -17,8 +22,8 @@ public class ActivityMainTabLayout extends TabActivity
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
Settings.readFromPersistentStorage(ActivityMainTabLayout.this);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
|
||||
if(Settings.tabsPlacement == 1)
|
||||
setContentView(R.layout.main_tab_layout_tabs_at_bottom);
|
||||
@ -60,6 +65,7 @@ public class ActivityMainTabLayout extends TabActivity
|
||||
protected void onResume()
|
||||
{
|
||||
super.onResume();
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
// Miscellaneous.logEvent("i", "NFC", "ActivityMainTabLayout.onResume().", 5);
|
||||
NfcReceiver.checkIntentForNFC(this, getIntent());
|
||||
// NfcReceiver.checkIntentForNFC(this, new Intent(this.getApplicationContext(), this.getClass()));
|
||||
|
@ -26,6 +26,7 @@ public class ActivityManageActionBrightnessSetting extends Activity
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState)
|
||||
{
|
||||
setContentView(R.layout.activity_manage_action_brightness_settings);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
chkAutoBrightness = (CheckBox)findViewById(R.id.chkAutoBrightness);
|
||||
|
@ -16,9 +16,12 @@ import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.Button;
|
||||
import android.widget.CompoundButton;
|
||||
import android.widget.EditText;
|
||||
import android.widget.RadioButton;
|
||||
import android.widget.Spinner;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
@ -39,13 +42,16 @@ public class ActivityManageActionCloseNotification extends Activity
|
||||
boolean edit = false;
|
||||
ProgressDialog progressDialog = null;
|
||||
|
||||
EditText etNotificationTitle, etNotificationText;
|
||||
EditText etNotificationTitle, etNotificationText, etNotificationDismissalButtonText;
|
||||
Button bSelectApp, bSaveActionCloseNotification;
|
||||
Spinner spinnerTitleDirection, spinnerTextDirection;
|
||||
TextView tvSelectedApplication;
|
||||
RadioButton rbNotificationDismissSimple, rbNotificationDismissButton;
|
||||
|
||||
private static List<PackageInfo> pInfos = null;
|
||||
|
||||
final static String dismissRegularString = "p0815DismissString";
|
||||
|
||||
private static String[] directions;
|
||||
|
||||
ArrayAdapter<String> directionSpinnerAdapter;
|
||||
@ -253,6 +259,7 @@ public class ActivityManageActionCloseNotification extends Activity
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
setContentView(R.layout.activity_manage_action_close_notification);
|
||||
|
||||
etNotificationTitle = (EditText)findViewById(R.id.etNotificationTitle);
|
||||
@ -262,6 +269,9 @@ public class ActivityManageActionCloseNotification extends Activity
|
||||
spinnerTitleDirection = (Spinner)findViewById(R.id.spinnerTitleDirection);
|
||||
spinnerTextDirection = (Spinner)findViewById(R.id.spinnerTextDirection);
|
||||
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[] {
|
||||
getResources().getString(R.string.directionStringEquals),
|
||||
@ -294,7 +304,7 @@ public class ActivityManageActionCloseNotification extends Activity
|
||||
public void onClick(View v)
|
||||
{
|
||||
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;
|
||||
else
|
||||
app = tvSelectedApplication.getText().toString();
|
||||
@ -305,34 +315,44 @@ public class ActivityManageActionCloseNotification extends Activity
|
||||
String text = etNotificationText.getText().toString();
|
||||
|
||||
Intent responseData = new Intent();
|
||||
if(edit)
|
||||
{
|
||||
// editedNotificationAction.setTriggerParameter(chkNotificationDirection.isChecked());
|
||||
responseData.putExtra(ActivityManageRule.intentNameActionParameter2, app + Action.actionParameter2Split + titleDir + Action.actionParameter2Split + title + Action.actionParameter2Split + textDir + Action.actionParameter2Split + text);
|
||||
ActivityManageActionCloseNotification.this.setResult(RESULT_OK, responseData);
|
||||
}
|
||||
|
||||
String dismissMethod;
|
||||
if (rbNotificationDismissSimple.isChecked())
|
||||
dismissMethod = dismissRegularString;
|
||||
else
|
||||
{
|
||||
// data.putExtra(intentNameNotificationDirection, chkNotificationDirection.isChecked());
|
||||
responseData.putExtra(ActivityManageRule.intentNameActionParameter2,
|
||||
app + Action.actionParameter2Split +
|
||||
titleDir + Action.actionParameter2Split +
|
||||
title + Action.actionParameter2Split +
|
||||
textDir + Action.actionParameter2Split +
|
||||
text
|
||||
);
|
||||
// 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);
|
||||
if(StringUtils.isEmpty(etNotificationDismissalButtonText.getText().toString()))
|
||||
{
|
||||
Toast.makeText(ActivityManageActionCloseNotification.this, getResources().getString(R.string.enterText), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
else
|
||||
dismissMethod = etNotificationDismissalButtonText.getText().toString();
|
||||
}
|
||||
|
||||
responseData.putExtra(ActivityManageRule.intentNameActionParameter2,
|
||||
app + Action.actionParameter2Split +
|
||||
titleDir + Action.actionParameter2Split +
|
||||
title + Action.actionParameter2Split +
|
||||
textDir + Action.actionParameter2Split +
|
||||
text + Action.actionParameter2Split +
|
||||
dismissMethod
|
||||
);
|
||||
|
||||
ActivityManageActionCloseNotification.this.setResult(RESULT_OK, responseData);
|
||||
finish();
|
||||
}
|
||||
});
|
||||
|
||||
rbNotificationDismissSimple.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
|
||||
{
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton compoundButton, boolean b)
|
||||
{
|
||||
etNotificationDismissalButtonText.setEnabled(!b);
|
||||
}
|
||||
});
|
||||
|
||||
Intent i = getIntent();
|
||||
if(!StringUtils.isBlank(i.getStringExtra(ActivityManageRule.intentNameActionParameter2)))
|
||||
{
|
||||
@ -355,6 +375,24 @@ public class ActivityManageActionCloseNotification extends Activity
|
||||
else
|
||||
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))
|
||||
tvSelectedApplication.setText(app);
|
||||
|
||||
|
@ -19,6 +19,7 @@ public class ActivityManageActionControlMedia extends Activity
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
setContentView(R.layout.activity_manage_action_control_media);
|
||||
|
||||
rbMediaPlayPause = (RadioButton)findViewById(R.id.rbMediaPlayPause);
|
||||
|
@ -0,0 +1,53 @@
|
||||
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.EditText;
|
||||
import android.widget.Toast;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
public class ActivityManageActionCopyToClipboard extends Activity
|
||||
{
|
||||
private Button bSaveCopyToClipboard;
|
||||
private EditText etCopyToClipboard;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
this.setContentView(R.layout.activity_manage_action_copy_to_clipboard);
|
||||
|
||||
bSaveCopyToClipboard = (Button) findViewById(R.id.bSaveCopyToClipboard);
|
||||
etCopyToClipboard = (EditText)findViewById(R.id.etCopyToClipboard);
|
||||
|
||||
bSaveCopyToClipboard.setOnClickListener(new View.OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
if(StringUtils.isEmpty(etCopyToClipboard.getText().toString()))
|
||||
{
|
||||
Toast.makeText(ActivityManageActionCopyToClipboard.this, getResources().getString(R.string.enterText), Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
else
|
||||
{
|
||||
Intent response = new Intent();
|
||||
response.putExtra(ActivityManageRule.intentNameActionParameter2, etCopyToClipboard.getText().toString());
|
||||
setResult(RESULT_OK, response);
|
||||
finish();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if(getIntent().hasExtra(ActivityManageRule.intentNameActionParameter2))
|
||||
{
|
||||
String text = getIntent().getStringExtra(ActivityManageRule.intentNameActionParameter2);
|
||||
etCopyToClipboard.setText(text);
|
||||
}
|
||||
}
|
||||
}
|
@ -24,6 +24,7 @@ public class ActivityManageActionCreateNotification extends Activity
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
setContentView(R.layout.activity_manage_action_create_notification);
|
||||
|
||||
etNotificationTitle = (EditText) findViewById(R.id.etNotificationTitle);
|
||||
|
@ -0,0 +1,55 @@
|
||||
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.EditText;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
public class ActivityManageActionMakePhoneCall extends Activity
|
||||
{
|
||||
EditText etTargetPhoneNumber;
|
||||
Button bActionMakePhoneCallSave;
|
||||
|
||||
@Override
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
setContentView(R.layout.activity_manage_action_make_phone_call);
|
||||
|
||||
etTargetPhoneNumber = (EditText)findViewById(R.id.etTargetPhoneNumber);
|
||||
bActionMakePhoneCallSave = (Button) findViewById(R.id.bActionMakePhoneCallSave);
|
||||
|
||||
Intent input = getIntent();
|
||||
/*if(input.hasExtra(ActivityManageRule.intentNameActionParameter1))
|
||||
rbActionWifiOn.setChecked(input.getBooleanExtra(ActivityManageRule.intentNameActionParameter1, true));
|
||||
*/
|
||||
if(input.hasExtra(ActivityManageRule.intentNameActionParameter2))
|
||||
etTargetPhoneNumber.setText(input.getStringExtra(ActivityManageRule.intentNameActionParameter2));
|
||||
|
||||
bActionMakePhoneCallSave.setOnClickListener(new View.OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View view)
|
||||
{
|
||||
if(!StringUtils.isEmpty(etTargetPhoneNumber.getText()))
|
||||
{
|
||||
Intent response = new Intent();
|
||||
response.putExtra(ActivityManageRule.intentNameActionParameter1, false);
|
||||
response.putExtra(ActivityManageRule.intentNameActionParameter2, etTargetPhoneNumber.getText().toString());
|
||||
setResult(RESULT_OK, response);
|
||||
finish();
|
||||
}
|
||||
else
|
||||
Toast.makeText(ActivityManageActionMakePhoneCall.this, getResources().getText(R.string.enterPhoneNumber), Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -26,6 +26,7 @@ public class ActivityManageActionPlaySound extends Activity
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
setContentView(R.layout.activity_manage_action_play_sound);
|
||||
|
||||
chkPlaySoundAlwaysPlay = (CheckBox)findViewById(R.id.chkPlaySoundAlwaysPlay);
|
||||
|
@ -28,6 +28,7 @@ public class ActivityManageActionRunExecutable extends Activity
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
setContentView(R.layout.activity_manage_action_run_executable);
|
||||
|
||||
chkRunExecAsRoot = (CheckBox)findViewById(R.id.chkRunExecAsRoot);
|
||||
@ -57,6 +58,15 @@ public class ActivityManageActionRunExecutable extends Activity
|
||||
saveExecSettings();
|
||||
}
|
||||
});
|
||||
|
||||
if(getIntent().hasExtra(ActivityManageRule.intentNameActionParameter2))
|
||||
{
|
||||
String[] parts = getIntent().getStringExtra(ActivityManageRule.intentNameActionParameter2).split(Action.actionParameter2Split);
|
||||
etRunExecutablePath.setText(parts[0]);
|
||||
|
||||
if(parts.length > 1)
|
||||
etRunExecutableParameters.setText(parts[1]);
|
||||
}
|
||||
}
|
||||
|
||||
void saveExecSettings()
|
||||
|
@ -37,6 +37,7 @@ public class ActivityManageActionSendBroadcast extends Activity
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
setContentView(R.layout.activity_manage_action_send_broadcast);
|
||||
|
||||
etBroadcastToSend = (EditText)findViewById(R.id.etBroadcastToSend);
|
||||
@ -172,6 +173,29 @@ public class ActivityManageActionSendBroadcast extends Activity
|
||||
return;
|
||||
}
|
||||
|
||||
switch(supportedIntentTypes[spinnerParameterType.getSelectedItemPosition()])
|
||||
{
|
||||
case "int":
|
||||
case "long":
|
||||
case "short":
|
||||
if(!Miscellaneous.isNumeric(etParameterValue.getText().toString()))
|
||||
{
|
||||
Toast.makeText(ActivityManageActionSendBroadcast.this, getResources().getString(R.string.enter_a_number), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case "double":
|
||||
case "float":
|
||||
if(!Miscellaneous.isNumericDecimal(etParameterValue.getText().toString()))
|
||||
{
|
||||
Toast.makeText(ActivityManageActionSendBroadcast.this, getResources().getString(R.string.enter_a_number), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
ActivityManageActionSendBroadcast.this.etParameterValue.setInputType(InputType.TYPE_CLASS_TEXT);
|
||||
}
|
||||
|
||||
String param = supportedIntentTypes[spinnerParameterType.getSelectedItemPosition()] + Action.intentPairSeparator + etParameterName.getText().toString() + Action.intentPairSeparator + etParameterValue.getText().toString();
|
||||
intentPairList.add(param);
|
||||
|
||||
@ -201,8 +225,10 @@ public class ActivityManageActionSendBroadcast extends Activity
|
||||
@Override
|
||||
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3)
|
||||
{
|
||||
if(supportedIntentTypes[arg2].equals("double") | supportedIntentTypes[arg2].equals("float") | supportedIntentTypes[arg2].equals("int") | supportedIntentTypes[arg2].equals("long") | supportedIntentTypes[arg2].equals("short"))
|
||||
ActivityManageActionSendBroadcast.this.etParameterValue.setInputType(InputType.TYPE_CLASS_NUMBER);
|
||||
if(supportedIntentTypes[arg2].equals("int") || supportedIntentTypes[arg2].equals("long") || supportedIntentTypes[arg2].equals("short"))
|
||||
ActivityManageActionSendBroadcast.this.etParameterValue.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED);
|
||||
else if(supportedIntentTypes[arg2].equals("double") || supportedIntentTypes[arg2].equals("float"))
|
||||
ActivityManageActionSendBroadcast.this.etParameterValue.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL);
|
||||
else
|
||||
ActivityManageActionSendBroadcast.this.etParameterValue.setInputType(InputType.TYPE_CLASS_TEXT);
|
||||
}
|
||||
|
@ -9,26 +9,37 @@ import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.provider.ContactsContract;
|
||||
import android.provider.MediaStore;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.widget.Button;
|
||||
import android.widget.CompoundButton;
|
||||
import android.widget.EditText;
|
||||
import android.widget.RadioButton;
|
||||
import android.widget.RadioGroup;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.jens.automation2.Action.Action_Enum;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
|
||||
public class ActivityManageActionSendTextMessage extends Activity
|
||||
{
|
||||
Button bSaveSendTextMessage, bImportNumberFromContacts;
|
||||
Button bSaveSendTextMessage, bImportNumberFromContacts, bMmsAttachment;
|
||||
EditText etPhoneNumber, etSendTextMessage;
|
||||
RadioButton rbMessageTypeSms, rbMessageTypeMms;
|
||||
TextView tvSendMmsFileAttachment;
|
||||
|
||||
protected final static int requestCodeForContactsPermissions = 9876;
|
||||
protected final static int requestCodeGetContact = 3235;
|
||||
|
||||
// private String existingUrl = "";
|
||||
protected final static int requestCodeGetMMSattachment = 3236;
|
||||
|
||||
public static final String messageTypeSms = "sms";
|
||||
public static final String messageTypeMms = "mms";
|
||||
|
||||
public static boolean edit = false;
|
||||
public static Action resultingAction = null;
|
||||
@ -37,12 +48,17 @@ public class ActivityManageActionSendTextMessage extends Activity
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
this.setContentView(R.layout.activity_manage_action_send_textmessage);
|
||||
|
||||
etSendTextMessage = (EditText)findViewById(R.id.etSendTextMessage);
|
||||
etPhoneNumber = (EditText)findViewById(R.id.etPhoneNumber);
|
||||
bSaveSendTextMessage = (Button)findViewById(R.id.bSaveSendTextMessage);
|
||||
bImportNumberFromContacts = (Button)findViewById(R.id.bImportNumberFromContacts);
|
||||
rbMessageTypeSms = (RadioButton)findViewById(R.id.rbMessageTypeSms);
|
||||
rbMessageTypeMms = (RadioButton) findViewById(R.id.rbMessageTypeMms);
|
||||
bMmsAttachment = (Button)findViewById(R.id.bMmsAttachment);
|
||||
tvSendMmsFileAttachment = (TextView)findViewById(R.id.tvSendMmsFileAttachment);
|
||||
|
||||
bSaveSendTextMessage.setOnClickListener(new OnClickListener()
|
||||
{
|
||||
@ -51,13 +67,29 @@ public class ActivityManageActionSendTextMessage extends Activity
|
||||
{
|
||||
if(etSendTextMessage.getText().toString().length() > 0 && etPhoneNumber.getText().toString().length() > 0)
|
||||
{
|
||||
if(resultingAction == null)
|
||||
if(rbMessageTypeMms.isChecked() && StringUtils.isEmpty(tvSendMmsFileAttachment.getText().toString()))
|
||||
Toast.makeText(getBaseContext(), getResources().getString(R.string.chooseFile), Toast.LENGTH_LONG).show();
|
||||
else
|
||||
{
|
||||
resultingAction = new Action();
|
||||
resultingAction.setAction(Action_Enum.sendTextMessage);
|
||||
resultingAction.setParameter2(etPhoneNumber.getText().toString() + Actions.smsSeparator + etSendTextMessage.getText().toString());
|
||||
if (resultingAction == null)
|
||||
{
|
||||
resultingAction = new Action();
|
||||
resultingAction.setAction(Action_Enum.sendTextMessage);
|
||||
String messageType = null;
|
||||
String path = "";
|
||||
|
||||
if(rbMessageTypeSms.isChecked())
|
||||
messageType = messageTypeSms;
|
||||
else
|
||||
{
|
||||
messageType = messageTypeMms;
|
||||
path = Actions.smsSeparator + tvSendMmsFileAttachment.getText().toString();
|
||||
}
|
||||
|
||||
resultingAction.setParameter2(etPhoneNumber.getText().toString() + Actions.smsSeparator + etSendTextMessage.getText().toString() + Actions.smsSeparator + messageType + path);
|
||||
}
|
||||
backToRuleManager();
|
||||
}
|
||||
backToRuleManager();
|
||||
}
|
||||
else
|
||||
Toast.makeText(getBaseContext(), getResources().getString(R.string.enterPhoneNumberAndText), Toast.LENGTH_LONG).show();
|
||||
@ -78,6 +110,28 @@ public class ActivityManageActionSendTextMessage extends Activity
|
||||
}
|
||||
});
|
||||
|
||||
RadioButton.OnCheckedChangeListener checkedChangedListener = new RadioButton.OnCheckedChangeListener() {
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton compoundButton, boolean b)
|
||||
{
|
||||
bMmsAttachment.setEnabled(rbMessageTypeMms.isChecked());
|
||||
}
|
||||
};
|
||||
rbMessageTypeSms.setOnCheckedChangeListener(checkedChangedListener);
|
||||
rbMessageTypeMms.setOnCheckedChangeListener(checkedChangedListener);
|
||||
|
||||
bMmsAttachment.setOnClickListener(new OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View view)
|
||||
{
|
||||
Intent chooseFileIntent = new Intent(Intent.ACTION_GET_CONTENT);
|
||||
chooseFileIntent.setType("*/*");
|
||||
chooseFileIntent = Intent.createChooser(chooseFileIntent, getResources().getString(R.string.chooseFile));
|
||||
startActivityForResult(chooseFileIntent, requestCodeGetMMSattachment);
|
||||
}
|
||||
});
|
||||
|
||||
ActivityManageActionSendTextMessage.edit = getIntent().getBooleanExtra("edit", false);
|
||||
if(edit)
|
||||
{
|
||||
@ -144,10 +198,10 @@ public class ActivityManageActionSendTextMessage extends Activity
|
||||
@Override
|
||||
protected void onActivityResult(int requestCode, int resultCode, Intent data)
|
||||
{
|
||||
if(requestCode == requestCodeGetContact)
|
||||
{
|
||||
if(resultCode == Activity.RESULT_OK)
|
||||
{
|
||||
if(resultCode == Activity.RESULT_OK)
|
||||
{
|
||||
if(requestCode == requestCodeGetContact)
|
||||
{
|
||||
String phoneNo = null;
|
||||
String name = null;
|
||||
|
||||
@ -165,6 +219,12 @@ public class ActivityManageActionSendTextMessage extends Activity
|
||||
etPhoneNumber.setText(phoneNo);
|
||||
}
|
||||
}
|
||||
else if (requestCode == requestCodeGetMMSattachment)
|
||||
{
|
||||
Uri fileUri = data.getData();
|
||||
String filePath = fileUri.getPath();
|
||||
tvSendMmsFileAttachment.setText(filePath);
|
||||
}
|
||||
}
|
||||
//super.onActivityResult(requestCode, resultCode, data);
|
||||
}
|
||||
|
@ -0,0 +1,65 @@
|
||||
package com.jens.automation2;
|
||||
|
||||
import static com.jens.automation2.ActivityManageActionTriggerUrl.edit;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.jens.automation2.Action.Action_Enum;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
public class ActivityManageActionSetVariable extends Activity
|
||||
{
|
||||
private Button bSaveVariable;
|
||||
private EditText etVariableSetKey, etVariableSetValue;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
this.setContentView(R.layout.activity_manage_action_set_variable);
|
||||
|
||||
etVariableSetKey = (EditText)findViewById(R.id.etVariableSetKey);
|
||||
etVariableSetValue = (EditText)findViewById(R.id.etVariableSetValue);
|
||||
bSaveVariable = (Button)findViewById(R.id.bSaveVariable);
|
||||
bSaveVariable.setOnClickListener(new OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
if(StringUtils.isEmpty(etVariableSetKey.getText().toString()))
|
||||
{
|
||||
Toast.makeText(ActivityManageActionSetVariable.this, getResources().getString(R.string.enterVariableKey), Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
else
|
||||
{
|
||||
Intent response = new Intent();
|
||||
|
||||
if(StringUtils.isEmpty(etVariableSetValue.getText().toString()))
|
||||
response.putExtra(ActivityManageRule.intentNameActionParameter2, etVariableSetKey.getText().toString());
|
||||
else
|
||||
response.putExtra(ActivityManageRule.intentNameActionParameter2, etVariableSetKey.getText().toString() + Action.actionParameter2Split + etVariableSetValue.getText().toString());
|
||||
|
||||
setResult(RESULT_OK, response);
|
||||
finish();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if(getIntent().hasExtra(ActivityManageRule.intentNameActionParameter2))
|
||||
{
|
||||
String[] input = getIntent().getStringExtra(ActivityManageRule.intentNameActionParameter2).split(Action.actionParameter2Split);
|
||||
etVariableSetKey.setText(input[0]);
|
||||
if(input.length > 1)
|
||||
etVariableSetValue.setText(input[1]);
|
||||
}
|
||||
}
|
||||
}
|
@ -22,6 +22,7 @@ public class ActivityManageActionSpeakText extends Activity
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
this.setContentView(R.layout.activity_manage_action_speak_text);
|
||||
|
||||
etSpeakText = (EditText)findViewById(R.id.etTextToSpeak);
|
||||
|
@ -53,11 +53,12 @@ public class ActivityManageActionStartActivity extends Activity
|
||||
Spinner spinnerParameterType;
|
||||
boolean edit = false;
|
||||
ProgressDialog progressDialog = null;
|
||||
RadioButton rbStartAppSelectByActivity, rbStartAppSelectByAction, rbStartAppByActivity, rbStartAppByBroadcast;
|
||||
RadioButton rbStartAppSelectByActivity, rbStartAppSelectByAction, rbStartAppByActivity, rbStartAppByBroadcast, rbStartAppByService;
|
||||
|
||||
final String urlShowExamples = "https://server47.de/automation/examples_startProgram.html";
|
||||
final static String startByActivityString = "0";
|
||||
final static String startByBroadcastString = "1";
|
||||
final static String startByServiceString = "2";
|
||||
|
||||
final static int requestCodeForRequestQueryAllPackagesPermission = 4711;
|
||||
|
||||
@ -65,6 +66,7 @@ public class ActivityManageActionStartActivity extends Activity
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
setContentView(R.layout.activity_manage_action_start_activity);
|
||||
|
||||
lvIntentPairs = (ListView)findViewById(R.id.lvIntentPairs);
|
||||
@ -81,6 +83,7 @@ public class ActivityManageActionStartActivity extends Activity
|
||||
showStartProgramExamples = (Button)findViewById(R.id.showStartProgramExamples);
|
||||
rbStartAppByActivity = (RadioButton)findViewById(R.id.rbStartAppByActivity);
|
||||
rbStartAppByBroadcast = (RadioButton)findViewById(R.id.rbStartAppByBroadcast);
|
||||
rbStartAppByService = (RadioButton)findViewById(R.id.rbStartAppByService);
|
||||
|
||||
intentTypeSpinnerAdapter = new ArrayAdapter<String>(this, R.layout.text_view_for_poi_listview_mediumtextsize, ActivityManageActionStartActivity.supportedIntentTypes);
|
||||
spinnerParameterType.setAdapter(intentTypeSpinnerAdapter);
|
||||
@ -153,6 +156,29 @@ public class ActivityManageActionStartActivity extends Activity
|
||||
return;
|
||||
}
|
||||
|
||||
switch(supportedIntentTypes[spinnerParameterType.getSelectedItemPosition()])
|
||||
{
|
||||
case "int":
|
||||
case "long":
|
||||
case "short":
|
||||
if(!Miscellaneous.isNumeric(etParameterValue.getText().toString()))
|
||||
{
|
||||
Toast.makeText(ActivityManageActionStartActivity.this, getResources().getString(R.string.enter_a_number), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case "double":
|
||||
case "float":
|
||||
if(!Miscellaneous.isNumericDecimal(etParameterValue.getText().toString()))
|
||||
{
|
||||
Toast.makeText(ActivityManageActionStartActivity.this, getResources().getString(R.string.enter_a_number), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
ActivityManageActionStartActivity.this.etParameterValue.setInputType(InputType.TYPE_CLASS_TEXT);
|
||||
}
|
||||
|
||||
String param = supportedIntentTypes[spinnerParameterType.getSelectedItemPosition()] + Action.intentPairSeparator + etParameterName.getText().toString() + Action.intentPairSeparator + etParameterValue.getText().toString();
|
||||
intentPairList.add(param);
|
||||
|
||||
@ -211,6 +237,8 @@ public class ActivityManageActionStartActivity extends Activity
|
||||
|
||||
if (rbStartAppByActivity.isChecked())
|
||||
parameter2 += ";" + startByActivityString;
|
||||
else if(rbStartAppByService.isChecked())
|
||||
parameter2 += ";" + startByServiceString;
|
||||
else
|
||||
parameter2 += ";" + startByBroadcastString;
|
||||
|
||||
@ -240,8 +268,10 @@ public class ActivityManageActionStartActivity extends Activity
|
||||
@Override
|
||||
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3)
|
||||
{
|
||||
if(supportedIntentTypes[arg2].equals("double") | supportedIntentTypes[arg2].equals("float") | supportedIntentTypes[arg2].equals("int") | supportedIntentTypes[arg2].equals("long") | supportedIntentTypes[arg2].equals("short"))
|
||||
ActivityManageActionStartActivity.this.etParameterValue.setInputType(InputType.TYPE_CLASS_NUMBER);
|
||||
if(supportedIntentTypes[arg2].equals("int") || supportedIntentTypes[arg2].equals("long") || supportedIntentTypes[arg2].equals("short"))
|
||||
ActivityManageActionStartActivity.this.etParameterValue.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED);
|
||||
else if(supportedIntentTypes[arg2].equals("double") || supportedIntentTypes[arg2].equals("float"))
|
||||
ActivityManageActionStartActivity.this.etParameterValue.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL);
|
||||
else
|
||||
ActivityManageActionStartActivity.this.etParameterValue.setInputType(InputType.TYPE_CLASS_TEXT);
|
||||
}
|
||||
@ -570,6 +600,7 @@ public class ActivityManageActionStartActivity extends Activity
|
||||
|
||||
rbStartAppByActivity.setChecked(params[2].equals(startByActivityString));
|
||||
rbStartAppByBroadcast.setChecked(params[2].equals(startByBroadcastString));
|
||||
rbStartAppByService.setChecked(params[2].equals(startByServiceString));
|
||||
|
||||
int startIndex = -1;
|
||||
|
||||
|
@ -39,6 +39,7 @@ public class ActivityManageActionTriggerUrl extends Activity
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
this.setContentView(R.layout.activity_manage_action_trigger_url);
|
||||
|
||||
etTriggerUrl = (EditText)findViewById(R.id.etTriggerUrl);
|
||||
|
@ -27,6 +27,7 @@ public class ActivityManageActionVibrate extends Activity
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
setContentView(R.layout.activity_manage_action_vibrate);
|
||||
|
||||
etVibratePattern = (EditText)findViewById(R.id.etVibratePattern);
|
||||
|
@ -0,0 +1,100 @@
|
||||
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);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
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();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -23,6 +23,7 @@ public class ActivityManageActionWifi extends Activity
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
setContentView(R.layout.activity_manage_action_wifi);
|
||||
|
||||
chkWifiRunAsRoot = (CheckBox)findViewById(R.id.chkWifiRunAsRoot);
|
||||
|
@ -59,6 +59,7 @@ public class ActivityManagePoi extends Activity
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
this.setContentView(R.layout.activity_manage_specific_poi);
|
||||
|
||||
myLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
|
||||
|
@ -47,37 +47,37 @@ public class ActivityManageProfile extends Activity
|
||||
|
||||
boolean guiUpdate = false;
|
||||
|
||||
File incomingCallsRingtone = null, notificationsRingtone = null;
|
||||
String incomingCallsRingtone = null, notificationsRingtone = null;
|
||||
|
||||
ArrayAdapter<String> soundModeAdapter;
|
||||
ArrayAdapter<String> dndModeAdapter;
|
||||
|
||||
public void setIncomingCallsRingtone(File incomingCallsRingtone)
|
||||
public void setIncomingCallsRingtone(String incomingCallsRingtone)
|
||||
{
|
||||
this.incomingCallsRingtone = incomingCallsRingtone;
|
||||
|
||||
if(incomingCallsRingtone != null)
|
||||
tvIncomingCallsRingtone.setText(this.incomingCallsRingtone.getAbsolutePath());
|
||||
tvIncomingCallsRingtone.setText(this.incomingCallsRingtone);
|
||||
else
|
||||
tvIncomingCallsRingtone.setText(getResources().getString(R.string.none));
|
||||
}
|
||||
|
||||
public File getIncomingCallsRingtone()
|
||||
public String getIncomingCallsRingtone()
|
||||
{
|
||||
return incomingCallsRingtone;
|
||||
}
|
||||
|
||||
public void setNotificationsRingtone(File notificationsRingtone)
|
||||
public void setNotificationsRingtone(String notificationsRingtone)
|
||||
{
|
||||
this.notificationsRingtone = notificationsRingtone;
|
||||
|
||||
if(this.notificationsRingtone != null)
|
||||
tvNotificationsRingtone.setText(this.notificationsRingtone.getAbsolutePath());
|
||||
tvNotificationsRingtone.setText(this.notificationsRingtone);
|
||||
else
|
||||
tvNotificationsRingtone.setText(getResources().getString(R.string.none));
|
||||
}
|
||||
|
||||
public File getNotificationsRingtone()
|
||||
public String getNotificationsRingtone()
|
||||
{
|
||||
return notificationsRingtone;
|
||||
}
|
||||
@ -86,6 +86,7 @@ public class ActivityManageProfile extends Activity
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
this.setContentView(R.layout.activity_manage_specific_profile);
|
||||
|
||||
checkBoxChangeSoundMode = (CheckBox)findViewById(R.id.checkBoxChangeSoundMode);
|
||||
@ -284,26 +285,26 @@ public class ActivityManageProfile extends Activity
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
try
|
||||
{
|
||||
Intent fileIntent = new Intent(Intent.ACTION_GET_CONTENT);
|
||||
fileIntent.setType("audio/*");
|
||||
startActivityForResult(Intent.createChooser(fileIntent, "Select a ringtone"), intentCodeRingtonePickerCallsFile);
|
||||
}
|
||||
catch(ActivityNotFoundException e)
|
||||
{
|
||||
// try
|
||||
// {
|
||||
// Intent fileIntent = new Intent(Intent.ACTION_GET_CONTENT);
|
||||
// fileIntent.setType("audio/*");
|
||||
// startActivityForResult(Intent.createChooser(fileIntent, "Select a ringtone"), intentCodeRingtonePickerCallsFile);
|
||||
// }
|
||||
// catch(ActivityNotFoundException e)
|
||||
// {
|
||||
// Use media browser instead
|
||||
Intent fileSelectionIntent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
|
||||
|
||||
if(ActivityMainProfiles.profileToEdit != null)
|
||||
{
|
||||
Uri currenturi = Uri.parse(ActivityMainProfiles.profileToEdit.incomingCallsRingtone.getAbsolutePath());
|
||||
Uri currenturi = Uri.parse(ActivityMainProfiles.profileToEdit.incomingCallsRingtone);
|
||||
if(ActivityMainProfiles.profileToEdit.changeIncomingCallsRingtone)
|
||||
fileSelectionIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, currenturi);
|
||||
}
|
||||
|
||||
startActivityForResult(fileSelectionIntent, intentCodeRingtonePickerCallsRingtone);
|
||||
}
|
||||
// }
|
||||
}
|
||||
});
|
||||
bChangeSoundNotifications.setOnClickListener(new OnClickListener()
|
||||
@ -324,7 +325,7 @@ public class ActivityManageProfile extends Activity
|
||||
|
||||
if(ActivityMainProfiles.profileToEdit != null)
|
||||
{
|
||||
Uri currenturi = Uri.parse(ActivityMainProfiles.profileToEdit.notificationRingtone.getAbsolutePath());
|
||||
Uri currenturi = Uri.parse(ActivityMainProfiles.profileToEdit.notificationRingtone);
|
||||
if(ActivityMainProfiles.profileToEdit.changeNotificationRingtone)
|
||||
fileSelectionIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, currenturi);
|
||||
}
|
||||
@ -495,15 +496,20 @@ public class ActivityManageProfile extends Activity
|
||||
Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
|
||||
if (uri != null)
|
||||
{
|
||||
String ringTonePath = CompensateCrappyAndroidPaths.getPath(ActivityManageProfile.this, uri);
|
||||
setIncomingCallsRingtone(new File(ringTonePath));
|
||||
// if(Build.VERSION.SDK_INT < 26)
|
||||
// {
|
||||
// String ringTonePath = CompensateCrappyAndroidPaths.getPath(ActivityManageProfile.this, uri);
|
||||
// setIncomingCallsRingtone(ringTonePath);
|
||||
// }
|
||||
// else
|
||||
setIncomingCallsRingtone(uri.toString());
|
||||
}
|
||||
break;
|
||||
}
|
||||
case intentCodeRingtonePickerCallsFile:
|
||||
{
|
||||
String ringTonePath = CompensateCrappyAndroidPaths.getPath(ActivityManageProfile.this, data.getData());
|
||||
setIncomingCallsRingtone(new File(ringTonePath));
|
||||
setIncomingCallsRingtone(ringTonePath);
|
||||
break;
|
||||
}
|
||||
case intentCodeRingtonePickerNotificationsRingtone: // notifications
|
||||
@ -511,15 +517,20 @@ public class ActivityManageProfile extends Activity
|
||||
Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
|
||||
if (uri != null)
|
||||
{
|
||||
String ringTonePath = CompensateCrappyAndroidPaths.getPath(ActivityManageProfile.this, data.getData());
|
||||
setNotificationsRingtone(new File(ringTonePath));
|
||||
// if(Build.VERSION.SDK_INT < 26)
|
||||
// {
|
||||
// String ringTonePath = CompensateCrappyAndroidPaths.getPath(ActivityManageProfile.this, uri);
|
||||
// setNotificationsRingtone(ringTonePath);
|
||||
// }
|
||||
// else
|
||||
setNotificationsRingtone(uri.toString());
|
||||
}
|
||||
break;
|
||||
}
|
||||
case intentCodeRingtonePickerNotificationsFile:
|
||||
{
|
||||
String ringTonePath = CompensateCrappyAndroidPaths.getPath(ActivityManageProfile.this, data.getData());
|
||||
setNotificationsRingtone(new File(ringTonePath));
|
||||
setNotificationsRingtone(ringTonePath);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
@ -129,6 +129,18 @@ public class ActivityManageRule extends Activity
|
||||
final static int requestCodeActionSetWifiEdit = 816;
|
||||
final static int requestCodeTriggerTetheringAdd = 817;
|
||||
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;
|
||||
final static int requestCodeActionMakePhoneCallAdd = 823;
|
||||
final static int requestCodeActionMakePhoneCallEdit = 824;
|
||||
final static int requestCodeActionSetVariableAdd = 825;
|
||||
final static int requestCodeActionSetVariableEdit = 826;
|
||||
final static int requestCodeTriggerCheckVariableAdd = 827;
|
||||
final static int requestCodeTriggerCheckVariableEdit = 828;
|
||||
final static int requestCodeActionCopyTextToClipboardAdd = 829;
|
||||
final static int requestCodeActionCopyTextToClipboardEdit = 830;
|
||||
|
||||
public static ActivityManageRule getInstance()
|
||||
{
|
||||
@ -142,6 +154,7 @@ public class ActivityManageRule extends Activity
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
setContentView(R.layout.activity_manage_specific_rule);
|
||||
|
||||
context = this;
|
||||
@ -317,8 +330,21 @@ public class ActivityManageRule extends Activity
|
||||
case tethering:
|
||||
Intent tetheringEditor = new Intent(ActivityManageRule.this, ActivityManageTriggerTethering.class);
|
||||
tetheringEditor.putExtra(intentNameTriggerParameter1, selectedTrigger.getTriggerParameter());
|
||||
tetheringEditor.putExtra(intentNameTriggerParameter2, selectedTrigger.getTriggerParameter2());
|
||||
startActivityForResult(tetheringEditor, requestCodeTriggerTetheringEdit);
|
||||
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;
|
||||
case checkVariable:
|
||||
Intent variableStateEditor = new Intent(ActivityManageRule.this, ActivityManageTriggerCheckVariable.class);
|
||||
variableStateEditor.putExtra(intentNameTriggerParameter1, selectedTrigger.getTriggerParameter());
|
||||
variableStateEditor.putExtra(intentNameTriggerParameter2, selectedTrigger.getTriggerParameter2());
|
||||
startActivityForResult(variableStateEditor, requestCodeTriggerCheckVariableEdit);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -393,12 +419,29 @@ public class ActivityManageRule extends Activity
|
||||
activityEditSendBroadcastIntent.putExtra(intentNameActionParameter2, a.getParameter2());
|
||||
startActivityForResult(activityEditSendBroadcastIntent, requestCodeActionSendBroadcastEdit);
|
||||
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:
|
||||
Intent activityEditRunExecutableIntent = new Intent(ActivityManageRule.this, ActivityManageActionRunExecutable.class);
|
||||
activityEditRunExecutableIntent.putExtra(intentNameActionParameter1, a.getParameter1());
|
||||
activityEditRunExecutableIntent.putExtra(intentNameActionParameter2, a.getParameter2());
|
||||
startActivityForResult(activityEditRunExecutableIntent, requestCodeActionRunExecutableEdit);
|
||||
break;
|
||||
case startPhoneCall:
|
||||
Intent activityEditMakePhoneCallIntent = new Intent(ActivityManageRule.this, ActivityManageActionMakePhoneCall.class);
|
||||
activityEditMakePhoneCallIntent.putExtra(intentNameActionParameter1, a.getParameter1());
|
||||
activityEditMakePhoneCallIntent.putExtra(intentNameActionParameter2, a.getParameter2());
|
||||
startActivityForResult(activityEditMakePhoneCallIntent, requestCodeActionMakePhoneCallEdit);
|
||||
break;
|
||||
case setVariable:
|
||||
Intent activityEditSetVariableIntent = new Intent(ActivityManageRule.this, ActivityManageActionSetVariable.class);
|
||||
activityEditSetVariableIntent.putExtra(intentNameActionParameter2, a.getParameter2());
|
||||
startActivityForResult(activityEditSetVariableIntent, requestCodeActionSetVariableEdit);
|
||||
break;
|
||||
case setWifi:
|
||||
Intent activityEditSetWifiIntent = new Intent(ActivityManageRule.this, ActivityManageActionWifi.class);
|
||||
activityEditSetWifiIntent.putExtra(intentNameActionParameter1, a.getParameter1());
|
||||
@ -429,6 +472,12 @@ public class ActivityManageRule extends Activity
|
||||
actionPlaySoundIntent.putExtra(intentNameActionParameter2, a.getParameter2());
|
||||
startActivityForResult(actionPlaySoundIntent, requestCodeActionPlaySoundEdit);
|
||||
break;
|
||||
case copyToClipboard:
|
||||
Intent actionCopyToClipboardIntent = new Intent(context, ActivityManageActionCopyToClipboard.class);
|
||||
actionCopyToClipboardIntent.putExtra(intentNameActionParameter1, a.getParameter1());
|
||||
actionCopyToClipboardIntent.putExtra(intentNameActionParameter2, a.getParameter2());
|
||||
startActivityForResult(actionCopyToClipboardIntent, requestCodeActionCopyTextToClipboardEdit);
|
||||
break;
|
||||
default:
|
||||
Miscellaneous.logEvent("w", "Edit action", "Editing of action type " + a.getAction().toString() + " not implemented, yet.", 4);
|
||||
break;
|
||||
@ -577,6 +626,8 @@ public class ActivityManageRule extends Activity
|
||||
items.add(new Item(typesLong[i].toString(), R.drawable.alarm));
|
||||
else if(types[i].toString().equals(Trigger_Enum.tethering.toString()))
|
||||
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
|
||||
items.add(new Item(typesLong[i].toString(), R.drawable.placeholder));
|
||||
}
|
||||
@ -749,19 +800,22 @@ public class ActivityManageRule extends Activity
|
||||
Miscellaneous.messageBox(getResources().getString(R.string.info), getResources().getString(R.string.lockedCommentScreenMustBeOff), ActivityManageRule.this).show();
|
||||
return;
|
||||
}
|
||||
else if(triggerType == Trigger_Enum.deviceStarts)
|
||||
/*else if(triggerType == Trigger_Enum.deviceStarts)
|
||||
{
|
||||
newTrigger.setTriggerType(Trigger_Enum.deviceStarts);
|
||||
ruleToEdit.getTriggerSet().add(newTrigger);
|
||||
refreshTriggerList();
|
||||
return;
|
||||
}
|
||||
else if(triggerType == Trigger_Enum.serviceStarts)
|
||||
}*/
|
||||
else if(triggerType == Trigger_Enum.deviceStarts || triggerType == Trigger_Enum.serviceStarts)
|
||||
{
|
||||
newTrigger.setTriggerType(Trigger_Enum.serviceStarts);
|
||||
ruleToEdit.getTriggerSet().add(newTrigger);
|
||||
refreshTriggerList();
|
||||
return;
|
||||
// newTrigger.setTriggerType(Trigger_Enum.serviceStarts);
|
||||
// ruleToEdit.getTriggerSet().add(newTrigger);
|
||||
|
||||
booleanChoices = new String[]{getResources().getString(R.string.yes), getResources().getString(R.string.no)};
|
||||
|
||||
// refreshTriggerList();
|
||||
// return;
|
||||
}
|
||||
else if(triggerType == Trigger_Enum.headsetPlugged)
|
||||
booleanChoices = new String[]{getResources().getString(R.string.connected), getResources().getString(R.string.disconnected)};
|
||||
@ -785,6 +839,20 @@ public class ActivityManageRule extends Activity
|
||||
startActivityForResult(tetheringTriggerEditor, requestCodeTriggerTetheringAdd);
|
||||
return;
|
||||
}
|
||||
else if(triggerType == Trigger_Enum.subSystemState)
|
||||
{
|
||||
newTrigger.setTriggerType(Trigger_Enum.subSystemState);
|
||||
Intent subSystemStateTriggerEditor = new Intent(myContext, ActivityManageTriggerSubSystemState.class);
|
||||
startActivityForResult(subSystemStateTriggerEditor, requestCodeTriggerSubSystemStateAdd);
|
||||
return;
|
||||
}
|
||||
else if(triggerType == Trigger_Enum.checkVariable)
|
||||
{
|
||||
newTrigger.setTriggerType(Trigger_Enum.checkVariable);
|
||||
Intent variableTriggerEditor = new Intent(myContext, ActivityManageTriggerCheckVariable.class);
|
||||
startActivityForResult(variableTriggerEditor, requestCodeTriggerCheckVariableAdd);
|
||||
return;
|
||||
}
|
||||
else
|
||||
getTriggerParameterDialog(context, booleanChoices).show();
|
||||
|
||||
@ -876,6 +944,7 @@ public class ActivityManageRule extends Activity
|
||||
|
||||
return alertDialog;
|
||||
}
|
||||
|
||||
private AlertDialog getTriggerBatteryDialog(final Context myContext, final String[] choices)
|
||||
{
|
||||
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
|
||||
@ -890,6 +959,7 @@ public class ActivityManageRule extends Activity
|
||||
triggerBattery = (which+1);
|
||||
newTrigger.setTriggerType(Trigger_Enum.batteryLevel);
|
||||
newTrigger.setBatteryLevel(triggerBattery);
|
||||
newTrigger.setTriggerParameter2(String.valueOf(triggerBattery));
|
||||
// Log.i("test", newTrigger.toString());
|
||||
// Log.i("test", String.valueOf(newTrigger.getBatteryLevel()));
|
||||
ruleToEdit.getTriggerSet().add(newTrigger);
|
||||
@ -1024,7 +1094,7 @@ public class ActivityManageRule extends Activity
|
||||
AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
|
||||
|
||||
alertDialog.setTitle(myContext.getResources().getString(R.string.phoneNumber));
|
||||
alertDialog.setMessage(myContext.getResources().getString(R.string.enterPhoneNumber));
|
||||
alertDialog.setMessage(myContext.getResources().getString(R.string.enterPhoneNumberBlankForAny));
|
||||
|
||||
// Set an EditText view to get user input
|
||||
final EditText input = new EditText(this);
|
||||
@ -1551,6 +1621,38 @@ public class ActivityManageRule extends Activity
|
||||
this.refreshActionList();
|
||||
}
|
||||
}
|
||||
else if(requestCode == requestCodeActionMakePhoneCallAdd)
|
||||
{
|
||||
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 == requestCodeActionSetVariableAdd)
|
||||
{
|
||||
if(resultCode == RESULT_OK)
|
||||
{
|
||||
newAction.setParentRule(ruleToEdit);
|
||||
newAction.setParameter2(data.getStringExtra(intentNameActionParameter2));
|
||||
ruleToEdit.getActionSet().add(newAction);
|
||||
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)
|
||||
{
|
||||
if(resultCode == RESULT_OK)
|
||||
@ -1620,6 +1722,21 @@ public class ActivityManageRule extends Activity
|
||||
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)
|
||||
{
|
||||
if(resultCode == RESULT_OK)
|
||||
@ -1635,6 +1752,35 @@ public class ActivityManageRule extends Activity
|
||||
this.refreshActionList();
|
||||
}
|
||||
}
|
||||
else if(requestCode == requestCodeActionMakePhoneCallEdit)
|
||||
{
|
||||
if(resultCode == RESULT_OK)
|
||||
{
|
||||
ruleToEdit.getActionSet().get(editIndex).setParentRule(ruleToEdit);
|
||||
|
||||
if(data.hasExtra(intentNameActionParameter1) && data.hasExtra(intentNameActionParameter2))
|
||||
{
|
||||
ruleToEdit.getActionSet().get(editIndex).setParameter1(data.getBooleanExtra(intentNameActionParameter1, false));
|
||||
ruleToEdit.getActionSet().get(editIndex).setParameter2(data.getStringExtra(intentNameActionParameter2));
|
||||
}
|
||||
|
||||
this.refreshActionList();
|
||||
}
|
||||
}
|
||||
else if(requestCode == requestCodeActionSetVariableEdit)
|
||||
{
|
||||
if(resultCode == RESULT_OK)
|
||||
{
|
||||
ruleToEdit.getActionSet().get(editIndex).setParentRule(ruleToEdit);
|
||||
|
||||
if(data.hasExtra(intentNameActionParameter2))
|
||||
{
|
||||
ruleToEdit.getActionSet().get(editIndex).setParameter2(data.getStringExtra(intentNameActionParameter2));
|
||||
}
|
||||
|
||||
this.refreshActionList();
|
||||
}
|
||||
}
|
||||
else if(requestCode == requestCodeActionSetWifiEdit)
|
||||
{
|
||||
if(resultCode == RESULT_OK)
|
||||
@ -1812,6 +1958,29 @@ public class ActivityManageRule extends Activity
|
||||
if(resultCode == RESULT_OK)
|
||||
{
|
||||
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);
|
||||
ruleToEdit.getTriggerSet().add(newTrigger);
|
||||
this.refreshTriggerList();
|
||||
}
|
||||
}
|
||||
else if(requestCode == requestCodeTriggerCheckVariableAdd)
|
||||
{
|
||||
if(resultCode == RESULT_OK)
|
||||
{
|
||||
newTrigger.setTriggerParameter(data.getBooleanExtra(intentNameTriggerParameter1, true));
|
||||
newTrigger.setTriggerParameter2(data.getStringExtra(intentNameTriggerParameter2));
|
||||
newTrigger.setParentRule(ruleToEdit);
|
||||
ruleToEdit.getTriggerSet().add(newTrigger);
|
||||
this.refreshTriggerList();
|
||||
@ -1824,11 +1993,63 @@ public class ActivityManageRule extends Activity
|
||||
Trigger editedTrigger = new Trigger();
|
||||
editedTrigger.setTriggerType(Trigger_Enum.tethering);
|
||||
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);
|
||||
ruleToEdit.getTriggerSet().set(editIndex, editedTrigger);
|
||||
this.refreshTriggerList();
|
||||
}
|
||||
}
|
||||
else if(requestCode == requestCodeTriggerCheckVariableEdit)
|
||||
{
|
||||
if(resultCode == RESULT_OK)
|
||||
{
|
||||
Trigger editedTrigger = new Trigger();
|
||||
editedTrigger.setTriggerType(Trigger_Enum.checkVariable);
|
||||
editedTrigger.setTriggerParameter(data.getBooleanExtra(intentNameTriggerParameter1, true));
|
||||
editedTrigger.setTriggerParameter2(data.getStringExtra(intentNameTriggerParameter2));
|
||||
editedTrigger.setParentRule(ruleToEdit);
|
||||
ruleToEdit.getTriggerSet().set(editIndex, editedTrigger);
|
||||
this.refreshTriggerList();
|
||||
}
|
||||
}
|
||||
else if(requestCode == requestCodeActionCopyTextToClipboardAdd)
|
||||
{
|
||||
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 == requestCodeActionCopyTextToClipboardEdit)
|
||||
{
|
||||
if(resultCode == RESULT_OK)
|
||||
{
|
||||
ruleToEdit.getActionSet().get(editIndex).setParentRule(ruleToEdit);
|
||||
|
||||
if(data.hasExtra(intentNameActionParameter2))
|
||||
{
|
||||
ruleToEdit.getActionSet().get(editIndex).setParameter2(data.getStringExtra(intentNameActionParameter2));
|
||||
}
|
||||
|
||||
this.refreshActionList();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected AlertDialog getActionTypeDialog()
|
||||
@ -1884,14 +2105,27 @@ public class ActivityManageRule extends Activity
|
||||
items.add(new Item(typesLong[i].toString(), R.drawable.notification));
|
||||
else if(types[i].toString().equals(Action_Enum.sendBroadcast.toString()))
|
||||
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()))
|
||||
items.add(new Item(typesLong[i].toString(), R.drawable.script));
|
||||
else if(types[i].toString().equals(Action_Enum.startPhoneCall.toString()))
|
||||
{
|
||||
if(ActivityPermissions.isPermissionDeclaratedInManifest(ActivityManageRule.this, Manifest.permission.CALL_PHONE))
|
||||
items.add(new Item(typesLong[i].toString(), R.drawable.phone));
|
||||
}
|
||||
else if(types[i].toString().equals(Action_Enum.stopPhoneCall.toString()))
|
||||
{
|
||||
if(ActivityPermissions.isPermissionDeclaratedInManifest(ActivityManageRule.this, Manifest.permission.ANSWER_PHONE_CALLS))
|
||||
items.add(new Item(typesLong[i].toString(), R.drawable.phone));
|
||||
}
|
||||
else if(types[i].toString().equals(Action_Enum.sendTextMessage.toString()))
|
||||
{
|
||||
// if(ActivityPermissions.isPermissionDeclaratedInManifest(ActivityManageSpecificRule.this, "android.permission.SEND_SMS") && !Miscellaneous.isGooglePlayInstalled(ActivityManageSpecificRule.this))
|
||||
if(ActivityPermissions.isPermissionDeclaratedInManifest(ActivityManageRule.this, Manifest.permission.SEND_SMS))
|
||||
items.add(new Item(typesLong[i].toString(), R.drawable.message));
|
||||
}
|
||||
else if(types[i].toString().equals(Action_Enum.copyToClipboard.toString()))
|
||||
items.add(new Item(typesLong[i].toString(), R.drawable.clipboard));
|
||||
else
|
||||
items.add(new Item(typesLong[i].toString(), R.drawable.placeholder));
|
||||
}
|
||||
@ -2058,6 +2292,30 @@ public class ActivityManageRule extends Activity
|
||||
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionRunExecutable.class);
|
||||
startActivityForResult(intent, requestCodeActionRunExecutableAdd);
|
||||
}
|
||||
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.startPhoneCall.toString()))
|
||||
{
|
||||
newAction.setAction(Action_Enum.startPhoneCall);
|
||||
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionMakePhoneCall.class);
|
||||
startActivityForResult(intent, requestCodeActionMakePhoneCallAdd);
|
||||
}
|
||||
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.setVariable.toString()))
|
||||
{
|
||||
newAction.setAction(Action_Enum.setVariable);
|
||||
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionSetVariable.class);
|
||||
startActivityForResult(intent, requestCodeActionSetVariableAdd);
|
||||
}
|
||||
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.stopPhoneCall.toString()))
|
||||
{
|
||||
newAction.setAction(Action_Enum.stopPhoneCall);
|
||||
ruleToEdit.getActionSet().add(newAction);
|
||||
refreshActionList();
|
||||
}
|
||||
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()))
|
||||
{
|
||||
newAction.setAction(Action_Enum.controlMediaPlayback);
|
||||
@ -2088,6 +2346,12 @@ public class ActivityManageRule extends Activity
|
||||
Intent actionPlaySoundIntent = new Intent(context, ActivityManageActionPlaySound.class);
|
||||
startActivityForResult(actionPlaySoundIntent, requestCodeActionPlaySoundAdd);
|
||||
}
|
||||
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.copyToClipboard.toString()))
|
||||
{
|
||||
newAction.setAction(Action_Enum.copyToClipboard);
|
||||
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionCopyToClipboard.class);
|
||||
startActivityForResult(intent, requestCodeActionCopyTextToClipboardAdd);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -32,6 +32,7 @@ public class ActivityManageTriggerBluetooth extends Activity
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
setContentView(R.layout.activity_manage_trigger_bluetooth);
|
||||
|
||||
radioAnyBluetoothDevice = (RadioButton)findViewById(R.id.radioAnyBluetoothDevice);
|
||||
|
@ -28,6 +28,7 @@ public class ActivityManageTriggerBroadcast extends Activity
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
setContentView(R.layout.activity_manage_trigger_broadcasts);
|
||||
|
||||
bBroadcastShowSuggestions = findViewById(R.id.bBroadcastShowSuggestions);
|
||||
|
@ -0,0 +1,57 @@
|
||||
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.EditText;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
public class ActivityManageTriggerCheckVariable extends Activity
|
||||
{
|
||||
EditText etVariableKeyTrigger, etVariableValueTrigger;
|
||||
Button bTriggerVariableSave;
|
||||
|
||||
@Override
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
setContentView(R.layout.activity_manage_trigger_check_variable);
|
||||
|
||||
etVariableKeyTrigger = (EditText) findViewById(R.id.etVariableKeyTrigger);
|
||||
etVariableValueTrigger = (EditText) findViewById(R.id.etVariableValueTrigger);
|
||||
bTriggerVariableSave = (Button) findViewById(R.id.bTriggerVariableSave);
|
||||
|
||||
Intent input = getIntent();
|
||||
if(input.hasExtra(ActivityManageRule.intentNameTriggerParameter2))
|
||||
{
|
||||
String[] conditions = input.getStringExtra(ActivityManageRule.intentNameTriggerParameter2).split(Trigger.triggerParameter2Split);
|
||||
etVariableKeyTrigger.setText(conditions[0]);
|
||||
if(conditions.length > 1)
|
||||
etVariableValueTrigger.setText(conditions[1]);
|
||||
}
|
||||
|
||||
bTriggerVariableSave.setOnClickListener(new View.OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View view)
|
||||
{
|
||||
Intent response = new Intent();
|
||||
// response.putExtra(ActivityManageRule.intentNameTriggerParameter1, rbTetheringOn.isChecked());
|
||||
|
||||
if(StringUtils.isEmpty(etVariableValueTrigger.getText().toString()))
|
||||
response.putExtra(ActivityManageRule.intentNameTriggerParameter2, etVariableKeyTrigger.getText().toString());
|
||||
else
|
||||
response.putExtra(ActivityManageRule.intentNameTriggerParameter2, etVariableKeyTrigger.getText().toString() + Trigger.triggerParameter2Split + etVariableValueTrigger.getText().toString());
|
||||
|
||||
setResult(RESULT_OK, response);
|
||||
finish();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -104,6 +104,7 @@ public class ActivityManageTriggerDeviceOrientation extends Activity
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
setContentView(R.layout.activity_manage_trigger_device_orientation);
|
||||
|
||||
currentAzimuth = (TextView) findViewById(R.id.tvCurrentAzimuth);
|
||||
|
@ -39,6 +39,7 @@ public class ActivityManageTriggerNfc extends Activity
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
setContentView(R.layout.activity_manage_trigger_nfc);
|
||||
|
||||
etNewNfcIdValue = (EditText)findViewById(R.id.etNewNfcIdValue);
|
||||
|
@ -258,6 +258,7 @@ public class ActivityManageTriggerNotification extends Activity
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
setContentView(R.layout.activity_manage_trigger_notification);
|
||||
|
||||
etNotificationTitle = (EditText)findViewById(R.id.etNotificationTitle);
|
||||
|
@ -35,6 +35,7 @@ public class ActivityManageTriggerPhoneCall extends Activity
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
setContentView(R.layout.activity_manage_trigger_phone_call);
|
||||
|
||||
etTriggerPhoneCallPhoneNumber = (EditText)findViewById(R.id.etTriggerPhoneCallPhoneNumber);
|
||||
|
@ -31,6 +31,7 @@ public class ActivityManageTriggerProfile extends Activity
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
setContentView(R.layout.activity_manage_trigger_profile);
|
||||
|
||||
bSaveTriggerProfile = (Button)findViewById(R.id.bSaveTriggerProfile);
|
||||
|
@ -0,0 +1,73 @@
|
||||
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);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
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();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -9,19 +9,33 @@ import android.widget.RadioButton;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
public class ActivityManageTriggerTethering extends Activity
|
||||
{
|
||||
RadioButton rbTetheringOn, rbTetheringOff;
|
||||
RadioButton rbTetheringOn, rbTetheringOff, rbTetheringTypeAny, rbTetheringTypeWifi, rbTetheringTypeBluetooth, rbTetheringTypeUsb, rbTetheringTypeCable;
|
||||
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
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
setContentView(R.layout.activity_manage_trigger_tethering);
|
||||
|
||||
rbTetheringOn = (RadioButton) findViewById(R.id.rbTetheringOn);
|
||||
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);
|
||||
|
||||
Intent input = getIntent();
|
||||
@ -31,6 +45,36 @@ public class ActivityManageTriggerTethering extends Activity
|
||||
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()
|
||||
{
|
||||
@Override
|
||||
@ -38,6 +82,18 @@ public class ActivityManageTriggerTethering extends Activity
|
||||
{
|
||||
Intent response = new Intent();
|
||||
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);
|
||||
finish();
|
||||
}
|
||||
|
@ -35,6 +35,7 @@ public class ActivityManageTriggerTimeFrame extends Activity
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
setContentView(R.layout.activity_manage_trigger_timeframe);
|
||||
|
||||
startPicker = (TimePicker)findViewById(R.id.tpTimeFrameStart);
|
||||
|
@ -20,15 +20,13 @@ import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
import android.widget.RadioButton;
|
||||
import android.widget.Spinner;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.core.app.ActivityCompat;
|
||||
|
||||
import com.jens.automation2.receivers.BluetoothReceiver;
|
||||
|
||||
import java.lang.reflect.Array;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
@ -41,28 +39,38 @@ public class ActivityManageTriggerWifi extends Activity
|
||||
RadioButton rbTriggerWifiConnected, rbTriggerWifiDisconnected;
|
||||
EditText etTriggerWifiName;
|
||||
Spinner spinnerWifiList;
|
||||
Button btriggerWifiSave, bLoadWifiList;
|
||||
Button bTriggerWifiSave, bLoadWifiList;
|
||||
List<String> wifiList = new ArrayList<>();
|
||||
ArrayAdapter<String> wifiSpinnerAdapter;
|
||||
private final static int requestCodeLocationPermission = 124;
|
||||
TextView tvWifiTriggerNameLocationNotice;
|
||||
|
||||
@Override
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
setContentView(R.layout.activity_manage_trigger_wifi);
|
||||
|
||||
rbTriggerWifiConnected = (RadioButton) findViewById(R.id.rbTriggerWifiConnected);
|
||||
rbTriggerWifiDisconnected = (RadioButton) findViewById(R.id.rbTriggerWifiDisconnected);
|
||||
etTriggerWifiName = (EditText) findViewById(R.id.etTriggerWifiName);
|
||||
spinnerWifiList = (Spinner) findViewById(R.id.spinnerWifiList);
|
||||
btriggerWifiSave = (Button) findViewById(R.id.btriggerWifiSave);
|
||||
bTriggerWifiSave = (Button) findViewById(R.id.bTriggerWifiSave);
|
||||
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);
|
||||
spinnerWifiList.setAdapter(wifiSpinnerAdapter);
|
||||
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"))
|
||||
{
|
||||
boolean connected = getIntent().getBooleanExtra("wifiState", false);
|
||||
@ -74,7 +82,7 @@ public class ActivityManageTriggerWifi extends Activity
|
||||
etTriggerWifiName.setText(wifiName);
|
||||
}
|
||||
|
||||
btriggerWifiSave.setOnClickListener(new View.OnClickListener()
|
||||
bTriggerWifiSave.setOnClickListener(new View.OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
|
@ -25,6 +25,8 @@ import android.widget.TextView;
|
||||
|
||||
import com.jens.automation2.receivers.NotificationListener;
|
||||
|
||||
import org.w3c.dom.DOMImplementationSource;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
@ -47,6 +49,8 @@ public class ActivityPermissions extends Activity
|
||||
private static final int requestCodeForPermissionsNotifications = 12046;
|
||||
private static final int requestCodeForPermissionsDeviceAdmin = 12047;
|
||||
private static final int requestCodeForPermissionsBatteryOptimization = 12048;
|
||||
private static final int requestCodeForPermissionNotificationAccessAndroid13 = 12049;
|
||||
private static final int requestCodeForPermissionsManageOverlay = 12050;
|
||||
protected String[] specificPermissionsToRequest = null;
|
||||
|
||||
public static String intentExtraName = "permissionsToBeRequested";
|
||||
@ -75,6 +79,7 @@ public class ActivityPermissions extends Activity
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
setContentView(R.layout.permissions_activity);
|
||||
|
||||
bCancelPermissions = (Button)findViewById(R.id.bCancelPermissions);
|
||||
@ -248,14 +253,17 @@ public class ActivityPermissions extends Activity
|
||||
if (!havePermission(s, context))
|
||||
return true;
|
||||
}
|
||||
else if((s.equalsIgnoreCase(Manifest.permission.CALL_PHONE) || s.equalsIgnoreCase(Manifest.permission.ANSWER_PHONE_CALLS)) && BuildConfig.FLAVOR.equalsIgnoreCase(AutomationService.flavor_name_googleplay))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else if(s.equalsIgnoreCase(Manifest.permission.ACTIVITY_RECOGNITION) || s.equalsIgnoreCase(permissionNameGoogleActivityDetection))
|
||||
{
|
||||
if(!BuildConfig.FLAVOR.equalsIgnoreCase(AutomationService.flavor_name_fdroid))
|
||||
if (!havePermission(s, context))
|
||||
return true;
|
||||
}
|
||||
else
|
||||
if (!havePermission(s, context))
|
||||
else if (!havePermission(s, context))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -293,6 +301,10 @@ public class ActivityPermissions extends Activity
|
||||
String packageName = context.getApplicationContext().getPackageName();
|
||||
return pm.isIgnoringBatteryOptimizations(packageName);
|
||||
}
|
||||
else if (s.equals(Manifest.permission.SYSTEM_ALERT_WINDOW))
|
||||
{
|
||||
return android.provider.Settings.canDrawOverlays(Miscellaneous.getAnyContext());
|
||||
}
|
||||
else
|
||||
{
|
||||
int res = context.checkCallingOrSelfPermission(s);
|
||||
@ -311,6 +323,11 @@ public class ActivityPermissions extends Activity
|
||||
return active;
|
||||
}
|
||||
|
||||
public static void requestOverlay()
|
||||
{
|
||||
Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
|
||||
ActivityPermissions.getInstance().startActivityForResult(intent, requestCodeForPermissionsManageOverlay);
|
||||
}
|
||||
public static void requestDeviceAdmin()
|
||||
{
|
||||
if(!haveDeviceAdmin())
|
||||
@ -469,6 +486,7 @@ public class ActivityPermissions extends Activity
|
||||
case phoneCall:
|
||||
addToArrayListUnique(Manifest.permission.READ_PHONE_STATE, requiredPermissions);
|
||||
addToArrayListUnique(Manifest.permission.PROCESS_OUTGOING_CALLS, requiredPermissions);
|
||||
addToArrayListUnique(Manifest.permission.READ_CALL_LOG, requiredPermissions);
|
||||
break;
|
||||
case pointOfInterest:
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
|
||||
@ -509,6 +527,16 @@ public class ActivityPermissions extends Activity
|
||||
case wifiConnection:
|
||||
addToArrayListUnique(Manifest.permission.ACCESS_NETWORK_STATE, requiredPermissions);
|
||||
addToArrayListUnique(Manifest.permission.ACCESS_WIFI_STATE, requiredPermissions);
|
||||
if(
|
||||
(
|
||||
Miscellaneous.getTargetSDK(Miscellaneous.getAnyContext()) >= 29
|
||||
&&
|
||||
isPermissionDeclaratedInManifest(Miscellaneous.getAnyContext(), Manifest.permission.ACCESS_BACKGROUND_LOCATION)
|
||||
)
|
||||
||
|
||||
Build.VERSION.SDK_INT >= 33
|
||||
)
|
||||
addToArrayListUnique(Manifest.permission.ACCESS_BACKGROUND_LOCATION, requiredPermissions);
|
||||
break;
|
||||
case notification:
|
||||
addToArrayListUnique(Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE, requiredPermissions);
|
||||
@ -620,6 +648,8 @@ public class ActivityPermissions extends Activity
|
||||
// action.getParameter2().contains("eu.faircode.netguard.STOP_PORT_FORWARD")
|
||||
// )
|
||||
// addToArrayListUnique("net.kollnig.missioncontrol.permission.ADMIN", requiredPermissions);
|
||||
if(Build.VERSION.SDK_INT >= 29)
|
||||
addToArrayListUnique(Manifest.permission.SYSTEM_ALERT_WINDOW, requiredPermissions);
|
||||
break;
|
||||
case triggerUrl:
|
||||
addToArrayListUnique(Manifest.permission.INTERNET, requiredPermissions);
|
||||
@ -673,6 +703,13 @@ public class ActivityPermissions extends Activity
|
||||
else
|
||||
addToArrayListUnique(Manifest.permission.BIND_DEVICE_ADMIN, requiredPermissions);
|
||||
break;
|
||||
case startPhoneCall:
|
||||
addToArrayListUnique(Manifest.permission.CALL_PHONE, requiredPermissions);
|
||||
// addToArrayListUnique(Manifest.permission.SYSTEM_ALERT_WINDOW, requiredPermissions);
|
||||
break;
|
||||
case stopPhoneCall:
|
||||
addToArrayListUnique(Manifest.permission.ANSWER_PHONE_CALLS, requiredPermissions);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -738,11 +775,10 @@ public class ActivityPermissions extends Activity
|
||||
case Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE:
|
||||
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.notification))
|
||||
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
|
||||
break;
|
||||
case permissionNameGoogleActivityDetection:
|
||||
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.activityDetection))
|
||||
for(String ruleName : getRulesUsing(Action.Action_Enum.closeNotification))
|
||||
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
|
||||
break;
|
||||
case permissionNameGoogleActivityDetection:
|
||||
case Manifest.permission.ACTIVITY_RECOGNITION:
|
||||
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.activityDetection))
|
||||
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
|
||||
@ -757,6 +793,7 @@ public class ActivityPermissions extends Activity
|
||||
break;
|
||||
case Manifest.permission.ACCESS_BACKGROUND_LOCATION:
|
||||
usingElements.add(getResources().getString(R.string.googleLocationChicanery));
|
||||
usingElements.add(getResources().getString(R.string.wifiMonitoringAlsoRequiresThis));
|
||||
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.pointOfInterest))
|
||||
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
|
||||
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.speed))
|
||||
@ -841,6 +878,7 @@ public class ActivityPermissions extends Activity
|
||||
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
|
||||
break;
|
||||
case Manifest.permission.PROCESS_OUTGOING_CALLS:
|
||||
case Manifest.permission.READ_CALL_LOG:
|
||||
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.phoneCall))
|
||||
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
|
||||
break;
|
||||
@ -864,6 +902,18 @@ public class ActivityPermissions extends Activity
|
||||
for(String ruleName : getRulesUsing(Action.Action_Enum.sendTextMessage))
|
||||
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
|
||||
break;
|
||||
case Manifest.permission.CALL_PHONE:
|
||||
for(String ruleName : getRulesUsing(Action.Action_Enum.startPhoneCall))
|
||||
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
|
||||
break;
|
||||
case Manifest.permission.SYSTEM_ALERT_WINDOW:
|
||||
for(String ruleName : getRulesUsing(Action.Action_Enum.startOtherActivity))
|
||||
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
|
||||
break;
|
||||
case Manifest.permission.ANSWER_PHONE_CALLS:
|
||||
for(String ruleName : getRulesUsing(Action.Action_Enum.stopPhoneCall))
|
||||
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
|
||||
break;
|
||||
case Manifest.permission.FOREGROUND_SERVICE:
|
||||
usingElements.add(getResources().getString(R.string.startAutomationAsService));
|
||||
break;
|
||||
@ -958,6 +1008,10 @@ public class ActivityPermissions extends Activity
|
||||
if (requestCode == requestCodeForPermissionsBatteryOptimization)
|
||||
if(havePermission(Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS, ActivityPermissions.this))
|
||||
requestPermissions(cachedPermissionsToRequest, true);
|
||||
|
||||
if (requestCode == requestCodeForPermissionsManageOverlay)
|
||||
if(havePermission(Manifest.permission.SYSTEM_ALERT_WINDOW, ActivityPermissions.this))
|
||||
requestPermissions(cachedPermissionsToRequest, true);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1008,7 +1062,7 @@ public class ActivityPermissions extends Activity
|
||||
startActivityForResult(intent, requestCodeForPermissionsWriteSettings);
|
||||
return;
|
||||
}
|
||||
if (s.equalsIgnoreCase(Manifest.permission.BIND_DEVICE_ADMIN))
|
||||
else if (s.equalsIgnoreCase(Manifest.permission.BIND_DEVICE_ADMIN))
|
||||
{
|
||||
requiredPermissions.remove(s);
|
||||
cachedPermissionsToRequest = requiredPermissions;
|
||||
@ -1023,12 +1077,46 @@ public class ActivityPermissions extends Activity
|
||||
startActivityForResult(intent, requestCodeForPermissionsNotificationPolicy);
|
||||
return;
|
||||
}
|
||||
else if (s.equalsIgnoreCase(Manifest.permission.SYSTEM_ALERT_WINDOW))
|
||||
{
|
||||
AlertDialog diag = Miscellaneous.messageBox(getResources().getString(R.string.info), getResources().getString(R.string.overlayPermissionHint), ActivityPermissions.this);
|
||||
diag.setOnDismissListener(new DialogInterface.OnDismissListener()
|
||||
{
|
||||
@Override
|
||||
public void onDismiss(DialogInterface dialogInterface)
|
||||
{
|
||||
requiredPermissions.remove(s);
|
||||
cachedPermissionsToRequest = requiredPermissions;
|
||||
requestOverlay();
|
||||
}
|
||||
});
|
||||
diag.show();
|
||||
return;
|
||||
}
|
||||
else if (s.equalsIgnoreCase(Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE))
|
||||
{
|
||||
requiredPermissions.remove(s);
|
||||
cachedPermissionsToRequest = requiredPermissions;
|
||||
Intent intent = new Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS);
|
||||
startActivityForResult(intent, requestCodeForPermissionsNotifications);
|
||||
if(Build.VERSION.SDK_INT >= 33)
|
||||
{
|
||||
AlertDialog dialog = Miscellaneous.messageBox(getResources().getString(R.string.info), getResources().getString(R.string.notificationAccessAndroid13), ActivityPermissions.this);
|
||||
dialog.setOnDismissListener(new DialogInterface.OnDismissListener()
|
||||
{
|
||||
@Override
|
||||
public void onDismiss(DialogInterface dialogInterface)
|
||||
{
|
||||
requiredPermissions.remove(s);
|
||||
cachedPermissionsToRequest = requiredPermissions;
|
||||
requestNotificationAccess();
|
||||
}
|
||||
});
|
||||
dialog.show();
|
||||
}
|
||||
else
|
||||
{
|
||||
requiredPermissions.remove(s);
|
||||
cachedPermissionsToRequest = requiredPermissions;
|
||||
requestNotificationAccess();
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
else if(s.equals(Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS))
|
||||
@ -1103,6 +1191,12 @@ public class ActivityPermissions extends Activity
|
||||
}
|
||||
}
|
||||
|
||||
void requestNotificationAccess()
|
||||
{
|
||||
Intent intent = new Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS);
|
||||
startActivityForResult(intent, requestCodeForPermissionsNotifications);
|
||||
}
|
||||
|
||||
protected void applyChanges()
|
||||
{
|
||||
AutomationService service = AutomationService.getInstance();
|
||||
|
@ -16,6 +16,7 @@ public class ActivitySettings extends PreferenceActivity
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
addPreferencesFromResource(layout.activity_settings);
|
||||
|
||||
if(BuildConfig.FLAVOR.equals(AutomationService.flavor_name_apk))
|
||||
@ -24,4 +25,11 @@ public class ActivitySettings extends PreferenceActivity
|
||||
chkPrefUpdateCheck.setEnabled(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume()
|
||||
{
|
||||
super.onResume();
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
}
|
||||
}
|
@ -30,6 +30,7 @@ public class ActivityVolumeTest extends Activity
|
||||
instance = this;
|
||||
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
setContentView(R.layout.activity_volume_calibration);
|
||||
|
||||
tvCurrentVolume = (TextView)findViewById(R.id.tvCurrentVolume);
|
||||
|
@ -4,7 +4,6 @@ import android.content.Context;
|
||||
import android.os.AsyncTask;
|
||||
import android.util.Log;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
|
||||
public class AsyncTasks
|
||||
|
@ -33,12 +33,15 @@ import com.jens.automation2.receivers.PackageReplacedReceiver;
|
||||
import com.jens.automation2.receivers.PhoneStatusListener;
|
||||
|
||||
import java.util.Calendar;
|
||||
import java.util.Set;
|
||||
import java.util.HashMap;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
|
||||
@SuppressLint("NewApi")
|
||||
public class AutomationService extends Service implements OnInitListener
|
||||
{
|
||||
protected TextToSpeech ttsEngine = null;
|
||||
protected int ttsStatus = -1;
|
||||
protected final static int notificationId = 1000;
|
||||
protected final static int notificationIdRestrictions = 1005;
|
||||
protected final static int notificationIdLocationRestriction = 1006;
|
||||
@ -63,6 +66,8 @@ public class AutomationService extends Service implements OnInitListener
|
||||
protected Calendar lockSoundChangesEnd = null;
|
||||
protected boolean isRunning;
|
||||
|
||||
Map<String,String> variableMap = new HashMap();
|
||||
|
||||
protected static AutomationService centralInstance = null;
|
||||
|
||||
public void nullLockSoundChangesEnd()
|
||||
@ -93,6 +98,11 @@ public class AutomationService extends Service implements OnInitListener
|
||||
this.lockSoundChangesEnd = lockSoundChangesEnd;
|
||||
}
|
||||
|
||||
public int getTtsStatus()
|
||||
{
|
||||
return ttsStatus;
|
||||
}
|
||||
|
||||
protected final IBinder myBinder = new LocalBinder();
|
||||
|
||||
protected LocationProvider myLocationProvider;
|
||||
@ -116,6 +126,8 @@ public class AutomationService extends Service implements OnInitListener
|
||||
|
||||
// Store a reference to myself. Other classes often need a context or something, this can provide that.
|
||||
centralInstance = this;
|
||||
|
||||
Miscellaneous.setDisplayLanguage(AutomationService.this);
|
||||
}
|
||||
|
||||
public boolean checkStartupRequirements(Context context, boolean startAtBoot)
|
||||
@ -222,7 +234,8 @@ public class AutomationService extends Service implements OnInitListener
|
||||
this.isRunning = true;
|
||||
|
||||
Miscellaneous.logEvent("i", "Service", this.getResources().getString(R.string.serviceStarted) + " VERSION_CODE: " + BuildConfig.VERSION_CODE + ", VERSION_NAME: " + BuildConfig.VERSION_NAME + ", flavor: " + BuildConfig.FLAVOR, 1);
|
||||
Toast.makeText(this, this.getResources().getString(R.string.serviceStarted), Toast.LENGTH_LONG).show();
|
||||
if(Settings.showToasts)
|
||||
Toast.makeText(this, this.getResources().getString(R.string.serviceStarted), Toast.LENGTH_LONG).show();
|
||||
|
||||
/*
|
||||
On normal phones the app is supposed to automatically restart in case of any problems.
|
||||
@ -302,7 +315,8 @@ public class AutomationService extends Service implements OnInitListener
|
||||
|
||||
stopRoutine();
|
||||
this.isRunning = false;
|
||||
Toast.makeText(this, getResources().getString(R.string.serviceStopped), Toast.LENGTH_LONG).show();
|
||||
if(Settings.showToasts)
|
||||
Toast.makeText(this, getResources().getString(R.string.serviceStopped), Toast.LENGTH_LONG).show();
|
||||
Miscellaneous.logEvent("i", "Service", getResources().getString(R.string.serviceStopped), 1);
|
||||
}
|
||||
|
||||
@ -311,8 +325,26 @@ public class AutomationService extends Service implements OnInitListener
|
||||
if (Settings.useTextToSpeechOnNormal || Settings.useTextToSpeechOnSilent || Settings.useTextToSpeechOnVibrate || Rule.isAnyRuleUsing(Action.Action_Enum.speakText))
|
||||
{
|
||||
if (ttsEngine == null)
|
||||
ttsEngine = new TextToSpeech(this, this);
|
||||
} else
|
||||
{
|
||||
ttsEngine = new TextToSpeech(this, new TextToSpeech.OnInitListener()
|
||||
{
|
||||
@Override
|
||||
public void onInit(int status)
|
||||
{
|
||||
ttsStatus = status;
|
||||
|
||||
if (status == TextToSpeech.SUCCESS)
|
||||
{
|
||||
ttsEngine.setLanguage(Locale.getDefault());
|
||||
Miscellaneous.logEvent("i", "TTS engine", "TTS engine available.", 3);
|
||||
}
|
||||
else
|
||||
Miscellaneous.logEvent("i", "TTS engine", "TTS engine not available. Status: " + String.valueOf(status), 3);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (ttsEngine != null)
|
||||
ttsEngine.shutdown();
|
||||
@ -457,6 +489,10 @@ public class AutomationService extends Service implements OnInitListener
|
||||
private void stopRoutine()
|
||||
{
|
||||
Miscellaneous.logEvent("i", "Service", "Stopping service...", 3);
|
||||
|
||||
// Clear variables for trigger/action with same name
|
||||
variableMap.clear();
|
||||
|
||||
try
|
||||
{
|
||||
myLocationProvider.stopLocationService();
|
||||
@ -473,6 +509,7 @@ public class AutomationService extends Service implements OnInitListener
|
||||
PackageReplacedReceiver.setHasServiceBeenRunning(false, this);
|
||||
|
||||
centralInstance = null;
|
||||
Settings.serviceStartDone = false;
|
||||
}
|
||||
|
||||
protected static Builder createDefaultNotificationBuilderOld()
|
||||
@ -662,25 +699,26 @@ public class AutomationService extends Service implements OnInitListener
|
||||
{
|
||||
try
|
||||
{
|
||||
for(int i = 0; i < 5; i++)
|
||||
for(int i = 0; i < 60; i++)
|
||||
{
|
||||
if(ttsEngine != null)
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
if(ttsEngine == null || ttsStatus != TextToSpeech.SUCCESS)
|
||||
{
|
||||
try
|
||||
{
|
||||
Miscellaneous.logEvent("i", "TTS", "Waiting for a moment to give the TTS service time to load...", 4);
|
||||
Thread.sleep(1000); // give the tts engine time to load
|
||||
Thread.sleep(500); // give the tts engine time to load
|
||||
}
|
||||
catch(Exception e)
|
||||
{}
|
||||
}
|
||||
else
|
||||
{
|
||||
Miscellaneous.logEvent("i", "TextToSpeech", "Speaking \"" + text + "\" in language " + ttsEngine.getLanguage().toLanguageTag(), 3);
|
||||
this.ttsEngine.speak(text, TextToSpeech.QUEUE_ADD, null);
|
||||
break;
|
||||
}
|
||||
}
|
||||
Miscellaneous.logEvent("i", "TextToSpeech", "Speaking " + text + " in language " + ttsEngine.getLanguage().toLanguageTag(), 3);
|
||||
this.ttsEngine.speak(text, TextToSpeech.QUEUE_ADD, null);
|
||||
Miscellaneous.logEvent("i", "TextToSpeech", "TTS engine not available after waiting 30 seconds, yet. Aborting.", 3);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
@ -690,14 +728,19 @@ public class AutomationService extends Service implements OnInitListener
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isMainActivityRunning(Context context)
|
||||
{
|
||||
|
||||
public Map<String, String> getVariableMap()
|
||||
{
|
||||
return variableMap;
|
||||
}
|
||||
|
||||
public static boolean isMainActivityRunning(Context context)
|
||||
{
|
||||
if(ActivityMainScreen.getActivityMainScreenInstance() == null)
|
||||
return false;
|
||||
else
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isMyServiceRunning(Context context)
|
||||
{
|
||||
|
@ -15,6 +15,7 @@ import android.content.Intent;
|
||||
import android.content.pm.PackageInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.Resources;
|
||||
import android.database.Cursor;
|
||||
import android.media.AudioAttributes;
|
||||
import android.media.RingtoneManager;
|
||||
@ -31,6 +32,7 @@ import android.provider.Settings.Secure;
|
||||
import android.telephony.PhoneNumberUtils;
|
||||
import android.telephony.TelephonyManager;
|
||||
import android.util.Base64;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
|
||||
@ -82,7 +84,6 @@ import java.security.MessageDigest;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.cert.CertificateException;
|
||||
import java.security.cert.X509Certificate;
|
||||
import java.sql.Time;
|
||||
import java.text.DateFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
@ -91,7 +92,6 @@ import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Scanner;
|
||||
import java.util.Set;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipInputStream;
|
||||
import java.util.zip.ZipOutputStream;
|
||||
@ -113,6 +113,8 @@ import androidx.documentfile.provider.DocumentFile;
|
||||
public class Miscellaneous extends Service
|
||||
{
|
||||
protected static String writeableFolderStringCache = null;
|
||||
public static Context startupContext;
|
||||
|
||||
public static final String lineSeparator = System.getProperty("line.separator");
|
||||
|
||||
public static String downloadURL(String url, String username, String password)
|
||||
@ -275,7 +277,7 @@ public class Miscellaneous extends Service
|
||||
{
|
||||
writeToLogFile(type, header, description);
|
||||
|
||||
if(!logCleanerRunning && Math.random() < 0.1) // tidy up with 10% probability
|
||||
if (!logCleanerRunning && Math.random() < 0.1) // tidy up with 10% probability
|
||||
{
|
||||
rotateLogFile(getLogFile());
|
||||
}
|
||||
@ -476,7 +478,10 @@ public class Miscellaneous extends Service
|
||||
switch(direction)
|
||||
{
|
||||
case Trigger.directionEquals:
|
||||
return haystack.equalsIgnoreCase(needle);
|
||||
if(Miscellaneous.isRegularExpression(needle))
|
||||
return haystack.matches(needle);
|
||||
else
|
||||
return haystack.equalsIgnoreCase(needle);
|
||||
case Trigger.directionNotEquals:
|
||||
return !haystack.equalsIgnoreCase(needle);
|
||||
case Trigger.directionContains:
|
||||
@ -556,7 +561,10 @@ public class Miscellaneous extends Service
|
||||
returnContext = ActivityPermissions.getInstance().getApplicationContext();
|
||||
if(returnContext != null)
|
||||
return returnContext;
|
||||
|
||||
|
||||
if(startupContext != null)
|
||||
return startupContext;
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@ -608,32 +616,89 @@ public class Miscellaneous extends Service
|
||||
}
|
||||
|
||||
if(source.contains("[serialnr]"))
|
||||
if(Build.VERSION.SDK_INT > 8)
|
||||
{
|
||||
if (Build.VERSION.SDK_INT > 8)
|
||||
source = source.replace("[serialnr]", Secure.getString(context.getContentResolver(), Build.SERIAL));
|
||||
else
|
||||
source = source.replace("[serialnr]", "serialUnknown");
|
||||
}
|
||||
|
||||
if(
|
||||
source.contains("[d]") |
|
||||
source.contains("[m]") |
|
||||
source.contains("[Y]") |
|
||||
source.contains("[h]") |
|
||||
source.contains("[H]") |
|
||||
source.contains("[i]") |
|
||||
source.contains("[s]") |
|
||||
source.contains("[d]") ||
|
||||
source.contains("[m]") ||
|
||||
source.contains("[Y]") ||
|
||||
source.contains("[h]") ||
|
||||
source.contains("[H]") ||
|
||||
source.contains("[i]") ||
|
||||
source.contains("[s]") ||
|
||||
source.contains("[ms]")
|
||||
)
|
||||
{
|
||||
Calendar cal = Calendar.getInstance();
|
||||
|
||||
source = source.replace("[d]", String.valueOf(cal.get(Calendar.DAY_OF_MONTH)));
|
||||
source = source.replace("[m]", String.valueOf(cal.get(Calendar.MONTH)));
|
||||
source = source.replace("[Y]", String.valueOf(cal.get(Calendar.YEAR)));
|
||||
source = source.replace("[h]", String.valueOf(cal.get(Calendar.HOUR)));
|
||||
source = source.replace("[H]", String.valueOf(cal.get(Calendar.HOUR_OF_DAY)));
|
||||
source = source.replace("[i]", String.valueOf(cal.get(Calendar.MINUTE)));
|
||||
source = source.replace("[s]", String.valueOf(cal.get(Calendar.SECOND)));
|
||||
source = source.replace("[ms]", String.valueOf(cal.get(Calendar.MILLISECOND)));
|
||||
if(source.contains("[d]"))
|
||||
{
|
||||
String result = String.valueOf(cal.get(Calendar.DAY_OF_MONTH));
|
||||
if(result.length() < 2)
|
||||
result = "0" + result;
|
||||
|
||||
source = source.replace("[d]", result);
|
||||
}
|
||||
|
||||
if(source.contains("[m]"))
|
||||
{
|
||||
String result = String.valueOf(cal.get(Calendar.MONTH) +1);
|
||||
if(result.length() < 2)
|
||||
result = "0" + result;
|
||||
|
||||
source = source.replace("[m]", result);
|
||||
}
|
||||
|
||||
if(source.contains("[Y]"))
|
||||
{
|
||||
source = source.replace("[Y]", String.valueOf(cal.get(Calendar.YEAR)));
|
||||
}
|
||||
|
||||
if(source.contains("[h]"))
|
||||
{
|
||||
String result = String.valueOf(cal.get(Calendar.HOUR));
|
||||
if(result.length() < 2)
|
||||
result = "0" + result;
|
||||
|
||||
source = source.replace("[h]", result);
|
||||
}
|
||||
|
||||
if(source.contains("[H]"))
|
||||
{
|
||||
String result = String.valueOf(cal.get(Calendar.HOUR_OF_DAY));
|
||||
if(result.length() < 2)
|
||||
result = "0" + result;
|
||||
|
||||
source = source.replace("[H]", result);
|
||||
}
|
||||
|
||||
if(source.contains("[i]"))
|
||||
{
|
||||
String result = String.valueOf(cal.get(Calendar.MINUTE));
|
||||
if(result.length() < 2)
|
||||
result = "0" + result;
|
||||
|
||||
source = source.replace("[i]", result);
|
||||
}
|
||||
|
||||
if(source.contains("[s]"))
|
||||
{
|
||||
String result = String.valueOf(cal.get(Calendar.SECOND));
|
||||
if(result.length() < 2)
|
||||
result = "0" + result;
|
||||
|
||||
source = source.replace("[s]", result);
|
||||
}
|
||||
|
||||
if(source.contains("[ms]"))
|
||||
{
|
||||
source = source.replace("[ms]", String.valueOf(cal.get(Calendar.MILLISECOND)));
|
||||
}
|
||||
}
|
||||
|
||||
if(source.contains("[notificationTitle]"))
|
||||
@ -677,6 +742,26 @@ public class Miscellaneous extends Service
|
||||
Miscellaneous.logEvent("w", "Variable replacement", "lastNotification was empty.", 3);
|
||||
}
|
||||
}
|
||||
|
||||
while(source.contains("[variable-"))
|
||||
{
|
||||
int pos1 = source.indexOf("[variable-");
|
||||
int pos2 = source.indexOf("]", pos1);
|
||||
|
||||
int posA = pos1 + "[variable-".length();
|
||||
int posB = source.indexOf("]", posA);
|
||||
|
||||
String variableName = source.substring(posA, posB);
|
||||
|
||||
String replacement;
|
||||
|
||||
if(AutomationService.getInstance().variableMap.containsKey(variableName))
|
||||
replacement = AutomationService.getInstance().variableMap.get(variableName);
|
||||
else
|
||||
replacement = "unknownVariable";
|
||||
|
||||
source = source.substring(0, pos1) + replacement + source.substring(pos2 +1);
|
||||
}
|
||||
|
||||
// Miscellaneous.logEvent("i", "URL after replace", source);
|
||||
|
||||
@ -788,11 +873,27 @@ public class Miscellaneous extends Service
|
||||
|
||||
return executedSuccesfully;
|
||||
}
|
||||
public static boolean isNumericDecimal(String strNum)
|
||||
{
|
||||
if (strNum == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
try
|
||||
{
|
||||
double d = Double.parseDouble(strNum);
|
||||
}
|
||||
catch (NumberFormatException nfe)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public static boolean isNumeric(String str)
|
||||
{
|
||||
return str.matches("-?\\d+(\\.\\d+)?"); //match a number with optional '-' and decimal.
|
||||
}
|
||||
public static boolean isNumeric(String str)
|
||||
{
|
||||
return str.matches("-?\\d+(\\.\\d+)?"); //match a number with optional '-' and decimal.
|
||||
}
|
||||
|
||||
/**
|
||||
* Disables the SSL certificate checking for new instances of {@link HttpsURLConnection} This has been created to
|
||||
@ -1373,7 +1474,7 @@ public class Miscellaneous extends Service
|
||||
return result;
|
||||
}
|
||||
|
||||
public static boolean restrictedFeaturesConfigured()
|
||||
public static boolean restrictedFeaturesConfiguredFdroid()
|
||||
{
|
||||
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.activityDetection))
|
||||
{
|
||||
@ -1390,6 +1491,17 @@ public class Miscellaneous extends Service
|
||||
return false;
|
||||
}
|
||||
|
||||
public static boolean restrictedFeaturesConfiguredGoogle()
|
||||
{
|
||||
if(Rule.isAnyRuleUsing(Action.Action_Enum.startPhoneCall) || Rule.isAnyRuleUsing(Action.Action_Enum.stopPhoneCall))
|
||||
{
|
||||
if(BuildConfig.FLAVOR.equals(AutomationService.flavor_name_googleplay))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public static Element getXmlTree(String inputString) throws SAXException, IOException, ParserConfigurationException
|
||||
{
|
||||
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
|
||||
@ -1753,13 +1865,12 @@ public class Miscellaneous extends Service
|
||||
|
||||
public static boolean comparePhoneNumbers(String number1, String number2)
|
||||
{
|
||||
/* To be activated when Android S SDK comes out
|
||||
if(Build.VERSION.SDK_INT > Build.VERSION_CODES.Q)
|
||||
if(Build.VERSION.SDK_INT > Build.VERSION_CODES.S)
|
||||
{
|
||||
TelephonyManager tm = (TelephonyManager)Miscellaneous.getAnyContext().getSystemService(Context.TELEPHONY_SERVICE);
|
||||
return PhoneNumberUtils.areSamePhoneNumber(number1, number2, tm.getNetworkCountryIso());
|
||||
}
|
||||
else*/
|
||||
else
|
||||
return PhoneNumberUtils.compare(number1, number2);
|
||||
}
|
||||
|
||||
@ -1893,4 +2004,34 @@ public class Miscellaneous extends Service
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public static int getTargetSDK(Context context)
|
||||
{
|
||||
return context.getApplicationContext().getApplicationInfo().targetSdkVersion;
|
||||
}
|
||||
|
||||
public static void setDisplayLanguage(Context context)
|
||||
{
|
||||
if(!Settings.displayLanguage.equals(Settings.default_displayLanguage))
|
||||
{
|
||||
Locale myLocale;
|
||||
|
||||
if(Settings.displayLanguage.contains("_"))
|
||||
{
|
||||
String[] parts = Settings.displayLanguage.split("_");
|
||||
myLocale = new Locale(parts[0], parts[1]);
|
||||
}
|
||||
else
|
||||
myLocale = new Locale(Settings.displayLanguage);
|
||||
|
||||
Resources res = context.getResources();
|
||||
DisplayMetrics dm = res.getDisplayMetrics();
|
||||
Configuration conf = res.getConfiguration();
|
||||
conf.locale = myLocale;
|
||||
res.updateConfiguration(conf, dm);
|
||||
//Intent refresh = new Intent(this, AndroidLocalize.class);
|
||||
//finish();
|
||||
//startActivity(refresh);
|
||||
}
|
||||
}
|
||||
}
|
@ -64,7 +64,7 @@ public class PointOfInterest implements Comparable<PointOfInterest>
|
||||
public void setName(String desiredName)
|
||||
{
|
||||
this.oldName = this.name;
|
||||
this.name = desiredName;
|
||||
this.name = desiredName.trim();
|
||||
}
|
||||
|
||||
public Location getLocation()
|
||||
@ -421,14 +421,18 @@ public class PointOfInterest implements Comparable<PointOfInterest>
|
||||
public boolean create(Context context)
|
||||
{
|
||||
for(PointOfInterest poi : PointOfInterest.pointOfInterestCollection)
|
||||
if(poi.getName().equals(this.getName()))
|
||||
{
|
||||
if (poi.getName().equals(this.getName()))
|
||||
{
|
||||
Toast.makeText(context, context.getResources().getString(R.string.anotherPoiByThatName), Toast.LENGTH_LONG).show();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if(plausibilityCheck())
|
||||
{
|
||||
Miscellaneous.logEvent("i", "Creating POI", this.toStringLong(), 3);
|
||||
|
||||
PointOfInterest.pointOfInterestCollection.add(this);
|
||||
PointOfInterest.writePoisToFile();
|
||||
|
||||
@ -490,8 +494,10 @@ public class PointOfInterest implements Comparable<PointOfInterest>
|
||||
Check for change of rule name END
|
||||
*/
|
||||
|
||||
if (plausibilityCheck())
|
||||
if(plausibilityCheck())
|
||||
{
|
||||
Miscellaneous.logEvent("i", "Changing POI", "Old name: " + this.oldName + ", new data: " + this.toStringLong(), 3);
|
||||
|
||||
if(PointOfInterest.writePoisToFile())
|
||||
{
|
||||
AutomationService service = AutomationService.getInstance();
|
||||
|
@ -3,6 +3,7 @@ package com.jens.automation2;
|
||||
import android.app.NotificationManager;
|
||||
import android.content.ContentValues;
|
||||
import android.content.Context;
|
||||
import android.database.Cursor;
|
||||
import android.media.AudioManager;
|
||||
import android.media.RingtoneManager;
|
||||
import android.net.Uri;
|
||||
@ -41,13 +42,13 @@ public class Profile implements Comparable<Profile>
|
||||
protected int volumeAlarms;
|
||||
|
||||
protected boolean changeIncomingCallsRingtone;
|
||||
protected File incomingCallsRingtone;
|
||||
protected String incomingCallsRingtone;
|
||||
|
||||
protected boolean changeVibrateWhenRinging;
|
||||
protected boolean vibrateWhenRinging;
|
||||
|
||||
protected boolean changeNotificationRingtone;
|
||||
protected File notificationRingtone;
|
||||
protected String notificationRingtone;
|
||||
|
||||
protected boolean changeAudibleSelection;
|
||||
protected boolean audibleSelection;
|
||||
@ -62,7 +63,7 @@ public class Profile implements Comparable<Profile>
|
||||
public void setName(String name)
|
||||
{
|
||||
this.oldName = this.name;
|
||||
this.name = name;
|
||||
this.name = name.trim();
|
||||
}
|
||||
|
||||
public String getName()
|
||||
@ -171,11 +172,11 @@ public class Profile implements Comparable<Profile>
|
||||
return changeIncomingCallsRingtone;
|
||||
}
|
||||
|
||||
public void setIncomingCallsRingtone(File incomingCallsRingtone)
|
||||
public void setIncomingCallsRingtone(String incomingCallsRingtone)
|
||||
{
|
||||
this.incomingCallsRingtone = incomingCallsRingtone;
|
||||
}
|
||||
public File getIncomingCallsRingtone()
|
||||
public String getIncomingCallsRingtone()
|
||||
{
|
||||
return incomingCallsRingtone;
|
||||
}
|
||||
@ -207,11 +208,11 @@ public class Profile implements Comparable<Profile>
|
||||
return changeNotificationRingtone;
|
||||
}
|
||||
|
||||
public void setNotificationRingtone(File notificationsRingtone)
|
||||
public void setNotificationRingtone(String notificationsRingtone)
|
||||
{
|
||||
this.notificationRingtone = notificationsRingtone;
|
||||
}
|
||||
public File getNotificationRingtone()
|
||||
public String getNotificationRingtone()
|
||||
{
|
||||
return notificationRingtone;
|
||||
}
|
||||
@ -292,53 +293,69 @@ public class Profile implements Comparable<Profile>
|
||||
return null;
|
||||
}
|
||||
|
||||
private boolean applyRingTone(File ringtoneFile, int ringtoneType, Context context)
|
||||
private boolean applyRingTone(String ringtoneFile, int ringtoneType, Context context)
|
||||
{
|
||||
Miscellaneous.logEvent("i", "Profile", "Request to set ringtone to " + ringtoneFile.getAbsolutePath(), 3);
|
||||
Miscellaneous.logEvent("i", "Profile", "Request to set ringtone to " + ringtoneFile, 3);
|
||||
|
||||
if(!ringtoneFile.exists() || !ringtoneFile.canRead())
|
||||
// if(!ringtoneFile.exists() || !ringtoneFile.canRead())
|
||||
// {
|
||||
// String message = "Ringtone file does not exist or cannot read it: " + ringtoneFile.getAbsolutePath();
|
||||
// Miscellaneous.logEvent("i", "Profile", message, 3);
|
||||
// Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
|
||||
// return false;
|
||||
// }
|
||||
|
||||
// Set by URI
|
||||
if(ringtoneFile.contains("//"))
|
||||
{
|
||||
String message = "Ringtone file does not exist or cannot read it: " + ringtoneFile.getAbsolutePath();
|
||||
Miscellaneous.logEvent("i", "Profile", message, 3);
|
||||
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
|
||||
return false;
|
||||
}
|
||||
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(MediaStore.MediaColumns.DATA, ringtoneFile.getAbsolutePath());
|
||||
values.put(MediaStore.MediaColumns.TITLE, ringtoneFile.getName());
|
||||
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");
|
||||
values.put(MediaStore.MediaColumns.SIZE, ringtoneFile.length());
|
||||
values.put(MediaStore.Audio.Media.IS_RINGTONE, ringtoneType == RingtoneManager.TYPE_RINGTONE);
|
||||
values.put(MediaStore.Audio.Media.IS_NOTIFICATION, ringtoneType == RingtoneManager.TYPE_NOTIFICATION);
|
||||
values.put(MediaStore.Audio.Media.IS_ALARM, false);
|
||||
values.put(MediaStore.Audio.Media.IS_MUSIC, false);
|
||||
|
||||
try
|
||||
Uri target = Uri.parse(ringtoneFile);
|
||||
RingtoneManager.setActualDefaultRingtoneUri(context, ringtoneType, target);
|
||||
Miscellaneous.logEvent("i", "Profile", "Ringtone set to: " + ringtoneFile, 1);
|
||||
return true;
|
||||
} // Set by filepath
|
||||
else
|
||||
{
|
||||
Uri newRingTone = null;
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(MediaStore.MediaColumns.DATA, ringtoneFile);
|
||||
values.put(MediaStore.MediaColumns.TITLE, ringtoneFile);
|
||||
//values.put(MediaStore.MediaColumns.TITLE, ringtoneFile.getName());
|
||||
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");
|
||||
values.put(MediaStore.MediaColumns.SIZE, ringtoneFile.length());
|
||||
values.put(MediaStore.Audio.Media.IS_RINGTONE, ringtoneType == RingtoneManager.TYPE_RINGTONE);
|
||||
values.put(MediaStore.Audio.Media.IS_NOTIFICATION, ringtoneType == RingtoneManager.TYPE_NOTIFICATION);
|
||||
values.put(MediaStore.Audio.Media.IS_ALARM, false);
|
||||
values.put(MediaStore.Audio.Media.IS_MUSIC, false);
|
||||
|
||||
//TODO: This part needs to be made compatible with Android 11 and above.
|
||||
if(Build.VERSION.SDK_INT > 30)
|
||||
try
|
||||
{
|
||||
Uri existingRingTone = MediaStore.Audio.Media.getContentUriForPath(ringtoneFile.getAbsolutePath());
|
||||
Uri newRingTone = null;
|
||||
|
||||
if (existingRingTone != null)
|
||||
context.getContentResolver().delete(existingRingTone, MediaStore.MediaColumns.DATA + "=\"" + ringtoneFile.getAbsolutePath() + "\"", null);
|
||||
Uri existingRingTone = MediaStore.Audio.Media.getContentUriForPath(ringtoneFile);
|
||||
|
||||
try
|
||||
{
|
||||
if (existingRingTone != null)
|
||||
context.getContentResolver().delete(existingRingTone, MediaStore.MediaColumns.DATA + "=\"" + ringtoneFile + "\"", null);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
Miscellaneous.logEvent("w","Delete file from ringtones", "Deleting ringtone from library failed: " + Log.getStackTraceString(e), 2);
|
||||
}
|
||||
|
||||
newRingTone = context.getContentResolver().insert(existingRingTone, values);
|
||||
}
|
||||
|
||||
RingtoneManager.setActualDefaultRingtoneUri(context, ringtoneType, newRingTone);
|
||||
Miscellaneous.logEvent("i", "Profile", "Ringtone set to: " + newRingTone.toString(), 1);
|
||||
return true;
|
||||
RingtoneManager.setActualDefaultRingtoneUri(context, ringtoneType, newRingTone);
|
||||
|
||||
Miscellaneous.logEvent("i", "Profile", "Ringtone set to: " + newRingTone.toString(), 1);
|
||||
return true;
|
||||
}
|
||||
catch (Throwable t)
|
||||
{
|
||||
String message = "Error setting ringtone: " + Log.getStackTraceString(t);
|
||||
Miscellaneous.logEvent("e", "Profile", message, 1);
|
||||
}
|
||||
}
|
||||
catch (Throwable t)
|
||||
{
|
||||
String message = "Error setting ringtone: " + Log.getStackTraceString(t);
|
||||
Miscellaneous.logEvent("e", "Profile", message, 1);
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -568,17 +585,17 @@ public class Profile implements Comparable<Profile>
|
||||
}
|
||||
finally
|
||||
{
|
||||
Miscellaneous.logEvent("i", "POI", "Checking for applicable rule after profile " + this.getName() + " has been activated.", 2);
|
||||
Miscellaneous.logEvent("i", "Profile", "Checking for applicable rules after profile " + this.getName() + " has been activated.", 2);
|
||||
List<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger.Trigger_Enum.profileActive);
|
||||
for(int i=0; i<ruleCandidates.size(); i++)
|
||||
{
|
||||
if(ruleCandidates.get(i).haveEnoughPermissions() && ruleCandidates.get(i).getsGreenLight(AutomationService.getInstance()))
|
||||
{
|
||||
Miscellaneous.logEvent("i", "POI", "Rule " + ruleCandidates.get(i).getName() + " applies after " + this.getName() + " has been activated.", 2);
|
||||
Miscellaneous.logEvent("i", "Profile", "Rule " + ruleCandidates.get(i).getName() + " applies after " + this.getName() + " has been activated.", 2);
|
||||
ruleCandidates.get(i).activate(AutomationService.getInstance(), false);
|
||||
}
|
||||
}
|
||||
Miscellaneous.logEvent("i", "POI", "Done checking for applicable rule after profile " + this.getName() + " has been activated.", 2);
|
||||
Miscellaneous.logEvent("i", "Profile", "Done checking for applicable rules after profile " + this.getName() + " has been activated.", 2);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -18,6 +18,7 @@ import com.jens.automation2.receivers.NoiseListener;
|
||||
import com.jens.automation2.receivers.PhoneStatusListener;
|
||||
import com.jens.automation2.receivers.ProcessListener;
|
||||
import com.jens.automation2.receivers.ScreenStateReceiver;
|
||||
import com.jens.automation2.receivers.SubSystemStateReceiver;
|
||||
import com.jens.automation2.receivers.TetheringReceiver;
|
||||
import com.jens.automation2.receivers.TimeZoneListener;
|
||||
|
||||
@ -182,6 +183,9 @@ public class ReceiverCoordinator
|
||||
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.tethering))
|
||||
TetheringReceiver.getInstance().startListener(AutomationService.getInstance());
|
||||
|
||||
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.subSystemState))
|
||||
SubSystemStateReceiver.getInstance().startListener(AutomationService.getInstance());
|
||||
|
||||
try
|
||||
{
|
||||
Class testClass = Class.forName(ActivityManageRule.activityDetectionClassPath);
|
||||
@ -223,6 +227,7 @@ public class ReceiverCoordinator
|
||||
MediaPlayerListener.getInstance().stopListener(AutomationService.getInstance());
|
||||
DeviceOrientationListener.getInstance().stopListener(AutomationService.getInstance());
|
||||
TetheringReceiver.getInstance().stopListener(AutomationService.getInstance());
|
||||
SubSystemStateReceiver.getInstance().stopListener(AutomationService.getInstance());
|
||||
|
||||
try
|
||||
{
|
||||
@ -440,6 +445,24 @@ 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();
|
||||
}
|
||||
}
|
||||
|
@ -65,8 +65,10 @@ public class Settings implements SharedPreferences
|
||||
public static int tabsPlacement;
|
||||
public static boolean executeRulesAndProfilesWithSingleClick;
|
||||
public static boolean displayNewsOnMainScreen;
|
||||
public static boolean showToasts;
|
||||
public static boolean automaticUpdateCheck;
|
||||
public static long musicCheckFrequency;
|
||||
public static String displayLanguage;
|
||||
|
||||
public static boolean lockSoundChanges;
|
||||
public static boolean noticeAndroid9MicrophoneShown;
|
||||
@ -130,11 +132,14 @@ public class Settings implements SharedPreferences
|
||||
public static final int default_tabsPlacement = 0;
|
||||
public static final boolean default_executeRulesAndProfilesWithSingleClick = false;
|
||||
public static final boolean default_displayNewsOnMainScreen = false;
|
||||
|
||||
public static final boolean default_showToasts = true;
|
||||
public static final boolean default_automaticUpdateCheck = false;
|
||||
public static final boolean default_lockSoundChanges = false;
|
||||
public static final long default_lastNewsPolltime = -1;
|
||||
public static final long default_lastUpdateCheck = -1;
|
||||
public static final long default_musicCheckFrequency = 2500;
|
||||
public static final String default_displayLanguage = "systemDefaultLanguage";
|
||||
|
||||
@Override
|
||||
public boolean contains(String arg0)
|
||||
@ -270,6 +275,7 @@ public class Settings implements SharedPreferences
|
||||
tabsPlacement = Integer.parseInt(prefs.getString("tabsPlacement", String.valueOf(default_tabsPlacement)));
|
||||
|
||||
musicCheckFrequency = Long.parseLong(prefs.getString("musicCheckFrequency", String.valueOf(default_musicCheckFrequency)));
|
||||
displayLanguage = prefs.getString("displayLanguage", default_displayLanguage);
|
||||
|
||||
if(Settings.musicCheckFrequency == 0)
|
||||
Settings.musicCheckFrequency = Settings.default_musicCheckFrequency;
|
||||
@ -277,6 +283,7 @@ public class Settings implements SharedPreferences
|
||||
executeRulesAndProfilesWithSingleClick = prefs.getBoolean("executeRulesAndProfilesWithSingleClick", default_executeRulesAndProfilesWithSingleClick);
|
||||
automaticUpdateCheck = prefs.getBoolean("automaticUpdateCheck", default_automaticUpdateCheck);
|
||||
displayNewsOnMainScreen = prefs.getBoolean("displayNewsOnMainScreen", default_displayNewsOnMainScreen);
|
||||
showToasts = prefs.getBoolean("showToasts", default_showToasts);
|
||||
|
||||
lockSoundChanges = prefs.getBoolean("lockSoundChanges", default_lockSoundChanges);
|
||||
noticeAndroid9MicrophoneShown = prefs.getBoolean("noticeAndroid9MicrophoneShown", false);
|
||||
@ -472,9 +479,15 @@ public class Settings implements SharedPreferences
|
||||
if(!prefs.contains("displayNewsOnMainScreen") || force)
|
||||
editor.putBoolean("displayNewsOnMainScreen", default_displayNewsOnMainScreen);
|
||||
|
||||
if(!prefs.contains("showToasts") || force)
|
||||
editor.putBoolean("showToasts", default_showToasts);
|
||||
|
||||
if(!prefs.contains("musicCheckFrequency") || force)
|
||||
editor.putLong("musicCheckFrequency", default_musicCheckFrequency);
|
||||
|
||||
if(!prefs.contains("displayLanguage") || force)
|
||||
editor.putString("displayLanguage", default_displayLanguage);
|
||||
|
||||
if(!prefs.contains("lockSoundChanges") || force)
|
||||
editor.putBoolean("lockSoundChanges", default_lockSoundChanges);
|
||||
|
||||
@ -555,11 +568,14 @@ public class Settings implements SharedPreferences
|
||||
editor.putBoolean("executeRulesAndProfilesWithSingleClick", executeRulesAndProfilesWithSingleClick);
|
||||
editor.putBoolean("automaticUpdateCheck", automaticUpdateCheck);
|
||||
editor.putBoolean("displayNewsOnMainScreen", displayNewsOnMainScreen);
|
||||
editor.putBoolean("showToasts", showToasts);
|
||||
|
||||
if(Settings.musicCheckFrequency == 0)
|
||||
Settings.musicCheckFrequency = Settings.default_musicCheckFrequency;
|
||||
editor.putString("musicCheckFrequency", String.valueOf(musicCheckFrequency));
|
||||
|
||||
editor.putString("displayLanguage", displayLanguage);
|
||||
|
||||
editor.putBoolean("lockSoundChanges", lockSoundChanges);
|
||||
editor.putBoolean("noticeAndroid9MicrophoneShown", noticeAndroid9MicrophoneShown);
|
||||
editor.putBoolean("noticeAndroid10WifiShown", noticeAndroid10WifiShown);
|
||||
|
@ -31,6 +31,7 @@ import org.apache.commons.lang3.StringUtils;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.Map;
|
||||
|
||||
public class Trigger
|
||||
{
|
||||
@ -60,6 +61,8 @@ public class Trigger
|
||||
serviceStarts,
|
||||
broadcastReceived,
|
||||
tethering,
|
||||
subSystemState,
|
||||
checkVariable,
|
||||
phoneCall; //phoneCall always needs to be at the very end because of Google's shitty so called privacy
|
||||
|
||||
public String getFullName(Context context)
|
||||
@ -116,12 +119,18 @@ public class Trigger
|
||||
return context.getResources().getString(R.string.broadcastReceivedTitle);
|
||||
case tethering:
|
||||
return context.getResources().getString(R.string.tetheringState);
|
||||
case subSystemState:
|
||||
return context.getResources().getString(R.string.subSystemState);
|
||||
case checkVariable:
|
||||
return context.getResources().getString(R.string.checkVariable);
|
||||
default:
|
||||
return "Unknown";
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
public static enum subSystemStates { wifi, bluetooth };
|
||||
|
||||
Rule parentRule = null;
|
||||
Calendar lastTimeNotApplied = null;
|
||||
|
||||
@ -235,6 +244,14 @@ public class Trigger
|
||||
if(!checkTetheringActive())
|
||||
result = false;
|
||||
break;
|
||||
case subSystemState:
|
||||
if(!checkSubSystemState())
|
||||
result = false;
|
||||
break;
|
||||
case checkVariable:
|
||||
if(!checkVariable())
|
||||
result = false;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -402,12 +419,17 @@ public class Trigger
|
||||
|
||||
boolean checkDeviceStarts()
|
||||
{
|
||||
return checkServiceStarts() && !Settings.deviceStartDone;
|
||||
if(triggerParameter && checkServiceStarts() && !Settings.deviceStartDone)
|
||||
return true;
|
||||
else if(!triggerParameter && !checkServiceStarts() && Settings.deviceStartDone)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean checkServiceStarts()
|
||||
{
|
||||
return !Settings.serviceStartDone;
|
||||
return !Settings.serviceStartDone == getTriggerParameter();
|
||||
}
|
||||
|
||||
boolean checkProfileActive()
|
||||
@ -535,6 +557,58 @@ public class Trigger
|
||||
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 checkVariable()
|
||||
{
|
||||
try
|
||||
{
|
||||
Map<String,String> map = AutomationService.getInstance().getVariableMap();
|
||||
|
||||
String[] conditions = this.getTriggerParameter2().split(Trigger.triggerParameter2Split);
|
||||
|
||||
if(conditions.length == 1) // no real condition
|
||||
return true;
|
||||
else
|
||||
{
|
||||
if (map.containsKey(conditions[0]))
|
||||
{
|
||||
if (map.get(conditions[0]).equals(conditions[1]))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
Miscellaneous.logEvent("e", "checkVariable()", Log.getStackTraceString(e), 1);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean checkBluetooth()
|
||||
{
|
||||
Miscellaneous.logEvent("i", Miscellaneous.getAnyContext().getResources().getString(R.string.ruleCheckOf), String.format("Checking for bluetooth...", this.getParentRule().getName()), 4);
|
||||
@ -728,7 +802,8 @@ public class Trigger
|
||||
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);
|
||||
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);
|
||||
return false;
|
||||
@ -794,9 +869,21 @@ public class Trigger
|
||||
|
||||
boolean checkBatteryLevel()
|
||||
{
|
||||
/*
|
||||
-1 means value is not known, yet.
|
||||
*/
|
||||
if(BatteryReceiver.getBatteryLevel() == -1)
|
||||
return false;
|
||||
|
||||
if(this.getTriggerParameter())
|
||||
{
|
||||
if(BatteryReceiver.getBatteryLevel() <= this.getBatteryLevel())
|
||||
if(this.getBatteryLevel() == 100)
|
||||
{
|
||||
Miscellaneous.logEvent("i", Miscellaneous.getAnyContext().getResources().getString(R.string.ruleCheckOf), "Rule " + this.getParentRule().getName() + " doesn't apply. Can never exceed 100%.", 3);
|
||||
return false;
|
||||
}
|
||||
|
||||
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);
|
||||
return false;
|
||||
@ -804,7 +891,16 @@ public class Trigger
|
||||
}
|
||||
else
|
||||
{
|
||||
if(this.getBatteryLevel() >= this.getBatteryLevel())
|
||||
if(this.getBatteryLevel() == 0)
|
||||
{
|
||||
Miscellaneous.logEvent("i", Miscellaneous.getAnyContext().getResources().getString(R.string.ruleCheckOf), "Rule " + this.getParentRule().getName() + " doesn't apply. Can never drop below 0%.", 3);
|
||||
return false;
|
||||
}
|
||||
|
||||
if(BatteryReceiver.getBatteryLevel() < 100 && BatteryReceiver.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);
|
||||
return false;
|
||||
@ -928,7 +1024,24 @@ public class Trigger
|
||||
|
||||
boolean checkTetheringActive()
|
||||
{
|
||||
return TetheringReceiver.isTetheringActive() == triggerParameter;
|
||||
if(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)
|
||||
@ -1317,7 +1430,7 @@ public class Trigger
|
||||
|
||||
public void setTriggerParameter2(String triggerParameter2)
|
||||
{
|
||||
this.triggerParameter2 = triggerParameter2;
|
||||
this.triggerParameter2 = triggerParameter2.trim();
|
||||
}
|
||||
|
||||
public TimeFrame getTimeFrame()
|
||||
@ -1340,7 +1453,7 @@ public class Trigger
|
||||
switch(this.getTriggerType())
|
||||
{
|
||||
case charging:
|
||||
if(getTriggerParameter())
|
||||
if (getTriggerParameter())
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.starting) + " ");
|
||||
else
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.stopping) + " ");
|
||||
@ -1348,14 +1461,14 @@ public class Trigger
|
||||
break;
|
||||
case batteryLevel:
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.batteryLevel));
|
||||
if(getTriggerParameter())
|
||||
if (getTriggerParameter())
|
||||
returnString.append(" " + Miscellaneous.getAnyContext().getResources().getString(R.string.exceeds) + " ");
|
||||
else
|
||||
returnString.append(" " + Miscellaneous.getAnyContext().getResources().getString(R.string.dropsBelow) + " ");
|
||||
returnString.append(String.valueOf(this.getBatteryLevel()) + " %");
|
||||
break;
|
||||
case usb_host_connection:
|
||||
if(getTriggerParameter())
|
||||
if (getTriggerParameter())
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.connecting) + " ");
|
||||
else
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.disconnecting) + " ");
|
||||
@ -1363,9 +1476,9 @@ public class Trigger
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.triggerUsb_host_connection));
|
||||
break;
|
||||
case pointOfInterest:
|
||||
if(this.getPointOfInterest() != null)
|
||||
if (this.getPointOfInterest() != null)
|
||||
{
|
||||
if(getTriggerParameter())
|
||||
if (getTriggerParameter())
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.entering) + " ");
|
||||
else
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.leaving) + " ");
|
||||
@ -1374,33 +1487,33 @@ public class Trigger
|
||||
}
|
||||
else
|
||||
{
|
||||
if(getTriggerParameter())
|
||||
if (getTriggerParameter())
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.leaving) + " " + Miscellaneous.getAnyContext().getResources().getString(R.string.anyLocation));
|
||||
else
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.entering) + " " + Miscellaneous.getAnyContext().getResources().getString(R.string.anyLocation));
|
||||
}
|
||||
break;
|
||||
case timeFrame:
|
||||
if(getTriggerParameter())
|
||||
if (getTriggerParameter())
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.entering) + " ");
|
||||
else
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.leaving) + " ");
|
||||
|
||||
String repeat = ", " + Miscellaneous.getAnyContext().getResources().getString(R.string.noRepetition);
|
||||
if(this.getTimeFrame().getRepetition() > 0)
|
||||
if (this.getTimeFrame().getRepetition() > 0)
|
||||
repeat = ", " + String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.repeatEveryXsecondsWithVariable), String.valueOf(this.getTimeFrame().getRepetition()));
|
||||
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.triggerTimeFrame) + ": " + this.getTimeFrame().getTriggerTimeStart().toString() + " " + Miscellaneous.getAnyContext().getResources().getString(R.string.until) + " " + this.getTimeFrame().getTriggerTimeStop().toString() + " " + Miscellaneous.getAnyContext().getResources().getString(R.string.onDays) + " " + this.getTimeFrame().getDayList().toString() + repeat);
|
||||
break;
|
||||
case speed:
|
||||
if(getTriggerParameter())
|
||||
if (getTriggerParameter())
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.exceeding) + " ");
|
||||
else
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.droppingBelow) + " ");
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.triggerSpeed) + ": " + String.valueOf(this.getSpeed()) + " km/h");
|
||||
break;
|
||||
case noiseLevel:
|
||||
if(getTriggerParameter())
|
||||
if (getTriggerParameter())
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.exceeding) + " ");
|
||||
else
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.droppingBelow) + " ");
|
||||
@ -1408,27 +1521,27 @@ public class Trigger
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.triggerNoiseLevel) + ": " + String.valueOf(this.getNoiseLevelDb()) + " dB");
|
||||
break;
|
||||
case wifiConnection:
|
||||
String wifiDisplayName = "";
|
||||
if(this.getTriggerParameter2().length() == 0)
|
||||
String wifiDisplayName = "";
|
||||
if (this.getTriggerParameter2().length() == 0)
|
||||
wifiDisplayName += Miscellaneous.getAnyContext().getResources().getString(R.string.anyWifi);
|
||||
else
|
||||
wifiDisplayName += this.getTriggerParameter2();
|
||||
|
||||
if(getTriggerParameter())
|
||||
|
||||
if (getTriggerParameter())
|
||||
returnString.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.connectedToWifi), wifiDisplayName));
|
||||
else
|
||||
returnString.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.disconnectedFromWifi), wifiDisplayName));
|
||||
|
||||
|
||||
break;
|
||||
case process_started_stopped:
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.application) + " " + this.getProcessName() + " " + Miscellaneous.getAnyContext().getResources().getString(R.string.is) + " ");
|
||||
if(this.triggerParameter)
|
||||
if (this.triggerParameter)
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.started));
|
||||
else
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.stopped));
|
||||
break;
|
||||
case airplaneMode:
|
||||
if(getTriggerParameter())
|
||||
if (getTriggerParameter())
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.activated) + " ");
|
||||
else
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.deactivated) + " ");
|
||||
@ -1436,7 +1549,7 @@ public class Trigger
|
||||
break;
|
||||
case roaming:
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.roaming));
|
||||
if(getTriggerParameter())
|
||||
if (getTriggerParameter())
|
||||
returnString.append(" " + Miscellaneous.getAnyContext().getResources().getString(R.string.activated));
|
||||
else
|
||||
returnString.append(" " + Miscellaneous.getAnyContext().getResources().getString(R.string.deactivated));
|
||||
@ -1448,27 +1561,27 @@ public class Trigger
|
||||
|
||||
returnString.append(" ");
|
||||
|
||||
if(elements[1].equals(triggerPhoneCallDirectionAny))
|
||||
if (elements[1].equals(triggerPhoneCallDirectionAny))
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.with));
|
||||
else if(elements[1].equals(triggerPhoneCallDirectionIncoming))
|
||||
else if (elements[1].equals(triggerPhoneCallDirectionIncoming))
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.from));
|
||||
else if(elements[1].equals(triggerPhoneCallDirectionOutgoing))
|
||||
else if (elements[1].equals(triggerPhoneCallDirectionOutgoing))
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.to));
|
||||
|
||||
returnString.append(" ");
|
||||
|
||||
if(elements[2].equals(Trigger.triggerPhoneCallNumberAny))
|
||||
if (elements[2].equals(Trigger.triggerPhoneCallNumberAny))
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.any) + " " + Miscellaneous.getAnyContext().getResources().getString(R.string.number));
|
||||
else
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.number) + " " + Miscellaneous.getAnyContext().getResources().getString(R.string.matching) + " " + elements[2]);
|
||||
|
||||
returnString.append(" ");
|
||||
|
||||
if(elements[0].equals(Trigger.triggerPhoneCallStateRinging))
|
||||
if (elements[0].equals(Trigger.triggerPhoneCallStateRinging))
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.ringing));
|
||||
else if(elements[0].equals(Trigger.triggerPhoneCallStateStarted))
|
||||
else if (elements[0].equals(Trigger.triggerPhoneCallStateStarted))
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.started));
|
||||
else if(elements[0].equals(Trigger.triggerPhoneCallStateStopped))
|
||||
else if (elements[0].equals(Trigger.triggerPhoneCallStateStopped))
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.stopped));
|
||||
|
||||
break;
|
||||
@ -1488,18 +1601,18 @@ public class Trigger
|
||||
else
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.featureNotInFdroidVersion));
|
||||
}
|
||||
catch(ClassNotFoundException e)
|
||||
catch (ClassNotFoundException e)
|
||||
{
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.featureNotInFdroidVersion));
|
||||
}
|
||||
break;
|
||||
case bluetoothConnection:
|
||||
String device = Miscellaneous.getAnyContext().getResources().getString(R.string.anyDevice);
|
||||
if(bluetoothDeviceAddress.equals("<any>"))
|
||||
if (bluetoothDeviceAddress.equals("<any>"))
|
||||
{
|
||||
device = Miscellaneous.getAnyContext().getResources().getString(R.string.any);
|
||||
}
|
||||
else if(bluetoothDeviceAddress.equals("<none>"))
|
||||
else if (bluetoothDeviceAddress.equals("<none>"))
|
||||
{
|
||||
device = Miscellaneous.getAnyContext().getResources().getString(R.string.noDevice);
|
||||
}
|
||||
@ -1509,21 +1622,21 @@ public class Trigger
|
||||
{
|
||||
device = BluetoothReceiver.getDeviceByAddress(bluetoothDeviceAddress).getName() + " (" + this.bluetoothDeviceAddress + ")";
|
||||
}
|
||||
catch(NullPointerException e)
|
||||
catch (NullPointerException e)
|
||||
{
|
||||
device = Miscellaneous.getAnyContext().getResources().getString(R.string.invalidDevice) + ": " + this.bluetoothDeviceAddress;
|
||||
Miscellaneous.logEvent("w", "Trigger", device, 3);
|
||||
}
|
||||
}
|
||||
|
||||
if(bluetoothEvent.equals(BluetoothDevice.ACTION_ACL_CONNECTED) || bluetoothEvent.equals(BluetoothDevice.ACTION_ACL_DISCONNECTED))
|
||||
if (bluetoothEvent.equals(BluetoothDevice.ACTION_ACL_CONNECTED) || bluetoothEvent.equals(BluetoothDevice.ACTION_ACL_DISCONNECTED))
|
||||
{
|
||||
if (this.triggerParameter)
|
||||
returnString.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.bluetoothConnectionTo), device));
|
||||
else
|
||||
returnString.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.bluetoothDisconnectFrom), device));
|
||||
}
|
||||
else if(bluetoothEvent.equals(BluetoothDevice.ACTION_FOUND))
|
||||
else if (bluetoothEvent.equals(BluetoothDevice.ACTION_FOUND))
|
||||
{
|
||||
if (this.triggerParameter)
|
||||
returnString.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.bluetoothDeviceInRange), device));
|
||||
@ -1533,7 +1646,7 @@ public class Trigger
|
||||
break;
|
||||
case headsetPlugged:
|
||||
String type;
|
||||
switch(headphoneType)
|
||||
switch (headphoneType)
|
||||
{
|
||||
case 0:
|
||||
type = Miscellaneous.getAnyContext().getResources().getString(R.string.headphoneSimple);
|
||||
@ -1548,13 +1661,13 @@ public class Trigger
|
||||
type = Miscellaneous.getAnyContext().getResources().getString(R.string.notSet);
|
||||
break;
|
||||
}
|
||||
if(getTriggerParameter())
|
||||
if (getTriggerParameter())
|
||||
returnString.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.headsetConnected), type));
|
||||
else
|
||||
returnString.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.headsetDisconnected), type));
|
||||
break;
|
||||
case notification:
|
||||
if(this.getTriggerParameter2().contains(triggerParameter2Split))
|
||||
if (this.getTriggerParameter2().contains(triggerParameter2Split))
|
||||
{
|
||||
String[] params = getTriggerParameter2().split(triggerParameter2Split);
|
||||
|
||||
@ -1575,7 +1688,7 @@ public class Trigger
|
||||
else
|
||||
appString = "app " + app;
|
||||
|
||||
if(triggerParameter)
|
||||
if (triggerParameter)
|
||||
triggerBuilder.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.postsNotification), appString));
|
||||
else
|
||||
triggerBuilder.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.removedNotification), appString));
|
||||
@ -1597,26 +1710,26 @@ public class Trigger
|
||||
returnString.append(Miscellaneous.getAnyContext().getString(R.string.deviceIsInCertainOrientation));
|
||||
break;
|
||||
case profileActive:
|
||||
if(triggerParameter)
|
||||
if (triggerParameter)
|
||||
returnString.append(String.format(Miscellaneous.getAnyContext().getString(R.string.profileActive), getTriggerParameter2().split(Trigger.triggerParameter2Split)[0]));
|
||||
else
|
||||
returnString.append(String.format(Miscellaneous.getAnyContext().getString(R.string.profileNotActive), getTriggerParameter2().split(Trigger.triggerParameter2Split)[0]));
|
||||
break;
|
||||
case musicPlaying:
|
||||
if(triggerParameter)
|
||||
if (triggerParameter)
|
||||
returnString.append(Miscellaneous.getAnyContext().getString(R.string.musicIsPlaying));
|
||||
else
|
||||
returnString.append(Miscellaneous.getAnyContext().getString(R.string.musicIsNotPlaying));
|
||||
break;
|
||||
case screenState:
|
||||
String state;
|
||||
switch(triggerParameter2)
|
||||
switch (triggerParameter2)
|
||||
{
|
||||
case "0":
|
||||
state = Miscellaneous.getAnyContext().getString(R.string.off);
|
||||
break;
|
||||
case "1":
|
||||
state = Miscellaneous.getAnyContext().getString(R.string.on);
|
||||
state = Miscellaneous.getAnyContext().getString(R.string.on);
|
||||
break;
|
||||
case "2":
|
||||
state = Miscellaneous.getAnyContext().getString(R.string.unlocked);
|
||||
@ -1634,14 +1747,14 @@ public class Trigger
|
||||
break;
|
||||
case deviceStarts:
|
||||
// This type doesn't have an activate/deactivate equivalent
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.deviceHasJustStarted));
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.deviceIsStarting) + ": " + String.valueOf(triggerParameter));
|
||||
break;
|
||||
case serviceStarts:
|
||||
// This type doesn't have an activate/deactivate equivalent
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.serviceHasJustStarted));
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.serviceIsStarting) + ": " + String.valueOf(triggerParameter));
|
||||
break;
|
||||
case broadcastReceived:
|
||||
if(triggerParameter)
|
||||
if (triggerParameter)
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.broadcastReceived));
|
||||
else
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.broadcastNotReceived));
|
||||
@ -1649,10 +1762,40 @@ public class Trigger
|
||||
returnString.append(": " + triggerParameter2);
|
||||
break;
|
||||
case tethering:
|
||||
if(triggerParameter)
|
||||
if (triggerParameter)
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.tetheringActive));
|
||||
else
|
||||
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;
|
||||
case checkVariable:
|
||||
if (triggerParameter2.contains(triggerParameter2Split))
|
||||
{
|
||||
String[] parts = triggerParameter2.split(triggerParameter2Split);
|
||||
returnString.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.variableCheckString), parts[0], parts[1]));
|
||||
}
|
||||
else
|
||||
returnString.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.variableCheckStringDeleted), triggerParameter2));
|
||||
break;
|
||||
default:
|
||||
returnString.append("error");
|
||||
|
@ -160,9 +160,9 @@ public class XmlFileInterface
|
||||
serializer.text(String.valueOf(Profile.getProfileCollection().get(i).getChangeIncomingCallsRingtone()));
|
||||
serializer.endTag(null, "changeIncomingCallsRingtone");//
|
||||
serializer.startTag(null, "incomingCallsRingtone");
|
||||
File incomingFile = Profile.getProfileCollection().get(i).getIncomingCallsRingtone();
|
||||
String incomingFile = Profile.getProfileCollection().get(i).getIncomingCallsRingtone();
|
||||
if(incomingFile != null)
|
||||
serializer.text(String.valueOf(Profile.getProfileCollection().get(i).getIncomingCallsRingtone().getPath()));
|
||||
serializer.text(String.valueOf(Profile.getProfileCollection().get(i).getIncomingCallsRingtone()));
|
||||
else
|
||||
serializer.text("null");
|
||||
serializer.endTag(null, "incomingCallsRingtone");
|
||||
@ -178,9 +178,9 @@ public class XmlFileInterface
|
||||
serializer.text(String.valueOf(Profile.getProfileCollection().get(i).getChangeNotificationRingtone()));
|
||||
serializer.endTag(null, "changeNotificationRingtone");//
|
||||
serializer.startTag(null, "notificationRingtone");
|
||||
File notificationFile = Profile.getProfileCollection().get(i).getNotificationRingtone();
|
||||
String notificationFile = Profile.getProfileCollection().get(i).getNotificationRingtone();
|
||||
if(notificationFile != null)
|
||||
serializer.text(String.valueOf(Profile.getProfileCollection().get(i).getNotificationRingtone().getPath()));
|
||||
serializer.text(String.valueOf(Profile.getProfileCollection().get(i).getNotificationRingtone()));
|
||||
else
|
||||
serializer.text("null");
|
||||
serializer.endTag(null, "notificationRingtone");
|
||||
@ -631,7 +631,7 @@ public class XmlFileInterface
|
||||
{
|
||||
String path = readTag(parser, "incomingCallsRingtone");
|
||||
if(!path.equals("null"))
|
||||
newProfile.setIncomingCallsRingtone(new File(path));
|
||||
newProfile.setIncomingCallsRingtone(path);
|
||||
else
|
||||
newProfile.setIncomingCallsRingtone(null);
|
||||
}
|
||||
@ -643,7 +643,7 @@ public class XmlFileInterface
|
||||
{
|
||||
String path = readTag(parser, "notificationRingtone");
|
||||
if(!path.equals("null"))
|
||||
newProfile.setNotificationRingtone(new File(path));
|
||||
newProfile.setNotificationRingtone(path);
|
||||
else
|
||||
newProfile.setNotificationRingtone(null);
|
||||
}
|
||||
|
@ -63,7 +63,7 @@ public class WifiBroadcastReceiver extends BroadcastReceiver
|
||||
// int state = -1;
|
||||
NetworkInfo myWifi = null;
|
||||
|
||||
if(intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) //gefeuert bei Trennung
|
||||
if(intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) // fired upon disconnection
|
||||
{
|
||||
// state = intent.getIntExtra(WifiManager.NETWORK_STATE_CHANGED_ACTION, -1);
|
||||
// Miscellaneous.logEvent("i", "WifiReceiver", "NETWORK_STATE_CHANGED_ACTION: " + String.valueOf(state));
|
||||
|
@ -19,14 +19,13 @@ import java.util.ArrayList;
|
||||
|
||||
public class BatteryReceiver extends BroadcastReceiver implements AutomationListenerInterface
|
||||
{
|
||||
private static int batteryLevel = -1; // initialize with a better value than this
|
||||
public static AutomationService automationServiceRef = null;
|
||||
private static boolean usbHostConnected = false;
|
||||
|
||||
private static boolean batteryReceiverActive = false;
|
||||
private static IntentFilter batteryIntentFilter = null;
|
||||
private static Intent batteryStatus = null;
|
||||
private static BroadcastReceiver batteryInfoReceiverInstance = null;
|
||||
static int batteryLevel = -1; // initialize with a better value than this
|
||||
static boolean usbHostConnected = false;
|
||||
static boolean batteryReceiverActive = false;
|
||||
static IntentFilter batteryIntentFilter = null;
|
||||
static Intent batteryStatus = null;
|
||||
static BroadcastReceiver batteryInfoReceiverInstance = null;
|
||||
|
||||
public static void startBatteryReceiver(final AutomationService automationServiceRef)
|
||||
{
|
||||
@ -90,7 +89,7 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent)
|
||||
{
|
||||
// Log.i("Battery", "Some battery event");
|
||||
Miscellaneous.logEvent("i", "BatteryReceiver", "Received event " + intent.getAction(), 5);
|
||||
|
||||
if (intent == null)
|
||||
return;
|
||||
@ -133,6 +132,7 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList
|
||||
|
||||
switch(status)
|
||||
{
|
||||
case BatteryManager.BATTERY_STATUS_CHARGING:
|
||||
case BatteryManager.BATTERY_STATUS_FULL:
|
||||
Miscellaneous.logEvent("i", "BatteryReceiver", "Device has been fully charged.", 5);
|
||||
this.actionCharging(context);
|
||||
@ -225,7 +225,7 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList
|
||||
{
|
||||
usbHostConnected = true;
|
||||
Miscellaneous.logEvent("i", "BatteryReceiver", "Connected to computer.", 3);
|
||||
Toast.makeText(context, "Connected to computer.", Toast.LENGTH_LONG).show();
|
||||
// Toast.makeText(context, "Connected to computer.", Toast.LENGTH_LONG).show();
|
||||
|
||||
ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.usb_host_connection);
|
||||
// ArrayList<Rule> ruleCandidates = Rule.findRuleCandidatesByUsbHost(true);
|
||||
@ -247,7 +247,7 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList
|
||||
{
|
||||
usbHostConnected = false;
|
||||
Miscellaneous.logEvent("i", "BatteryReceiver", "Disconnected from computer.", 3);
|
||||
Toast.makeText(context, "Disconnected from computer.", Toast.LENGTH_LONG).show();
|
||||
// Toast.makeText(context, "Disconnected from computer.", Toast.LENGTH_LONG).show();
|
||||
|
||||
ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.usb_host_connection);
|
||||
// ArrayList<Rule> ruleCandidates = Rule.findRuleCandidatesByUsbHost(false);
|
||||
|
@ -300,4 +300,16 @@ public class BluetoothReceiver extends BroadcastReceiver implements AutomationLi
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
@ -76,7 +76,6 @@ public class HeadphoneJackListener extends BroadcastReceiver implements Automati
|
||||
}
|
||||
|
||||
ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.headsetPlugged);
|
||||
// ArrayList<Rule> ruleCandidates = Rule.findRuleCandidatesByHeadphoneJack(isHeadsetConnected());
|
||||
for(int i=0; i<ruleCandidates.size(); i++)
|
||||
{
|
||||
if(ruleCandidates.get(i).getsGreenLight(context))
|
||||
@ -104,7 +103,6 @@ public class HeadphoneJackListener extends BroadcastReceiver implements Automati
|
||||
{
|
||||
Miscellaneous.logEvent("i", "HeadsetJackListener", "Starting HeadsetJackListener", 4);
|
||||
headphoneJackListenerActive = true;
|
||||
// getInstance().startHeadphoneJackListener(AutomationService.getInstance(), headphoneJackListenerIntentFilter);
|
||||
automationService.registerReceiver(this, headphoneJackListenerIntentFilter);
|
||||
}
|
||||
}
|
||||
@ -122,7 +120,6 @@ public class HeadphoneJackListener extends BroadcastReceiver implements Automati
|
||||
if(headphoneJackListenerActive)
|
||||
{
|
||||
Miscellaneous.logEvent("i", "HeadsetJackListener", "Stopping HeadsetJackListener", 4);
|
||||
// getInstance().stopHeadphoneJackListener(AutomationService.getInstance());
|
||||
automationService.unregisterReceiver(this);
|
||||
headphoneJackListenerActive = false;
|
||||
}
|
||||
@ -150,5 +147,4 @@ public class HeadphoneJackListener extends BroadcastReceiver implements Automati
|
||||
{
|
||||
return new Trigger_Enum[] { Trigger_Enum.headsetPlugged };
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -2,11 +2,10 @@ package com.jens.automation2.receivers;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.Notification;
|
||||
import android.bluetooth.BluetoothDevice;
|
||||
import android.app.PendingIntent;
|
||||
import android.content.IntentFilter;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.Parcelable;
|
||||
import android.service.notification.NotificationListenerService;
|
||||
import android.service.notification.StatusBarNotification;
|
||||
import android.util.Log;
|
||||
@ -149,51 +148,6 @@ public class NotificationListener extends NotificationListenerService// implemen
|
||||
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
|
||||
{
|
||||
boolean created;
|
||||
@ -283,4 +237,35 @@ public class NotificationListener extends NotificationListenerService// implemen
|
||||
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);
|
||||
}
|
||||
}
|
@ -6,10 +6,15 @@ import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.net.ConnectivityManager;
|
||||
import android.os.Build;
|
||||
import android.telephony.PhoneStateListener;
|
||||
import android.telephony.TelephonyCallback;
|
||||
import android.telephony.TelephonyManager;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.RequiresApi;
|
||||
|
||||
import com.jens.automation2.ActivityPermissions;
|
||||
import com.jens.automation2.AutomationService;
|
||||
import com.jens.automation2.Miscellaneous;
|
||||
@ -22,8 +27,7 @@ import java.util.ArrayList;
|
||||
|
||||
public class PhoneStatusListener implements AutomationListenerInterface
|
||||
{
|
||||
// protected static int currentStateIncoming = -1;
|
||||
// protected static int currentStateOutgoing = -1;
|
||||
static int problematicAndroidLevel = 29;
|
||||
protected static String lastPhoneNumber="";
|
||||
protected static int lastPhoneDirection = -1; //0=incoming, 1=outgoing
|
||||
protected static int currentState = -1;
|
||||
@ -72,7 +76,76 @@ public class PhoneStatusListener implements AutomationListenerInterface
|
||||
return currentState;
|
||||
}
|
||||
|
||||
public static class IncomingCallsReceiver extends PhoneStateListener
|
||||
public static interface IncomingCallsReceiver
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
protected static void workWithIncomingCallData(int state, String incomingNumber)
|
||||
{
|
||||
if(lastPhoneDirection == 2 && currentState != TelephonyManager.CALL_STATE_IDLE)
|
||||
{
|
||||
// This status update is actually for an outgoing call
|
||||
setCurrentState(state);
|
||||
|
||||
if(incomingNumber != null && incomingNumber.length() > 0) // check for null in case call comes in with suppressed number.
|
||||
setLastPhoneNumber(incomingNumber);
|
||||
|
||||
switch(state)
|
||||
{
|
||||
case TelephonyManager.CALL_STATE_IDLE:
|
||||
Miscellaneous.logEvent("i", "Call state", "New call state: CALL_STATE_IDLE", 4);
|
||||
break;
|
||||
case TelephonyManager.CALL_STATE_OFFHOOK:
|
||||
Miscellaneous.logEvent("i", "Call state", "New call state: CALL_STATE_OFFHOOK", 4);
|
||||
break;
|
||||
case TelephonyManager.CALL_STATE_RINGING:
|
||||
Miscellaneous.logEvent("i", "Call state", String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.outgoingCallTo), incomingNumber), 4);
|
||||
break;
|
||||
}
|
||||
|
||||
ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.phoneCall);
|
||||
for(int i=0; i<ruleCandidates.size(); i++)
|
||||
{
|
||||
AutomationService asInstance = AutomationService.getInstance();
|
||||
if(asInstance != null)
|
||||
if(ruleCandidates.get(i).getsGreenLight(asInstance))
|
||||
ruleCandidates.get(i).activate(asInstance, false);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
setCurrentState(state);
|
||||
setLastPhoneDirection(1);
|
||||
|
||||
if (incomingNumber != null && incomingNumber.length() > 0) // check for null in case call comes in with suppressed number.
|
||||
setLastPhoneNumber(incomingNumber);
|
||||
|
||||
switch (state)
|
||||
{
|
||||
case TelephonyManager.CALL_STATE_IDLE:
|
||||
Miscellaneous.logEvent("i", "Call state", "New call state: CALL_STATE_IDLE", 4);
|
||||
break;
|
||||
case TelephonyManager.CALL_STATE_OFFHOOK:
|
||||
Miscellaneous.logEvent("i", "Call state", "New call state: CALL_STATE_OFFHOOK", 4);
|
||||
break;
|
||||
case TelephonyManager.CALL_STATE_RINGING:
|
||||
Miscellaneous.logEvent("i", "Call state", String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.incomingCallFrom), incomingNumber), 4);
|
||||
break;
|
||||
}
|
||||
|
||||
ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.phoneCall);
|
||||
for (int i = 0; i < ruleCandidates.size(); i++)
|
||||
{
|
||||
AutomationService asInstance = AutomationService.getInstance();
|
||||
if (asInstance != null)
|
||||
if (ruleCandidates.get(i).getsGreenLight(asInstance))
|
||||
ruleCandidates.get(i).activate(asInstance, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class IncomingCallsReceiverOld extends PhoneStateListener implements IncomingCallsReceiver
|
||||
{
|
||||
@Override
|
||||
public void onCallStateChanged(int state, String incomingNumber)
|
||||
@ -88,67 +161,42 @@ public class PhoneStatusListener implements AutomationListenerInterface
|
||||
If the last call was outgoing the state has not changed to idle this is kind of a fake alert.
|
||||
*/
|
||||
|
||||
if(lastPhoneDirection == 2 && currentState != TelephonyManager.CALL_STATE_IDLE)
|
||||
workWithIncomingCallData(state, incomingNumber);
|
||||
}
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.S)
|
||||
public static class IncomingCallsReceiverNew extends BroadcastReceiver implements IncomingCallsReceiver
|
||||
{
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent)
|
||||
{
|
||||
/*
|
||||
this code detects both incoming and outgoing,
|
||||
if the state changes idle => ringing you know it's an incoming call,
|
||||
if the state changes idle => offhook, you know it's an outgoing call
|
||||
*/
|
||||
|
||||
if (!intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL))
|
||||
{
|
||||
// This status update is actually for an outgoing call
|
||||
setCurrentState(state);
|
||||
String stateStr = intent.getExtras().getString(TelephonyManager.EXTRA_STATE);
|
||||
int state = 99;
|
||||
|
||||
if(incomingNumber != null && incomingNumber.length() > 0) // check for null in case call comes in with suppressed number.
|
||||
setLastPhoneNumber(incomingNumber);
|
||||
|
||||
switch(state)
|
||||
switch(stateStr)
|
||||
{
|
||||
case TelephonyManager.CALL_STATE_IDLE:
|
||||
Miscellaneous.logEvent("i", "Call state", "New call state: CALL_STATE_IDLE", 4);
|
||||
case "RINGING":
|
||||
state = TelephonyManager.CALL_STATE_RINGING;
|
||||
break;
|
||||
case TelephonyManager.CALL_STATE_OFFHOOK:
|
||||
Miscellaneous.logEvent("i", "Call state", "New call state: CALL_STATE_OFFHOOK", 4);
|
||||
case "IDLE":
|
||||
state = TelephonyManager.CALL_STATE_IDLE;
|
||||
break;
|
||||
case TelephonyManager.CALL_STATE_RINGING:
|
||||
Miscellaneous.logEvent("i", "Call state", String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.outgoingCallTo), incomingNumber), 4);
|
||||
case "OFFHOOK":
|
||||
state = TelephonyManager.CALL_STATE_OFFHOOK;
|
||||
break;
|
||||
}
|
||||
|
||||
ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.phoneCall);
|
||||
for(int i=0; i<ruleCandidates.size(); i++)
|
||||
{
|
||||
AutomationService asInstance = AutomationService.getInstance();
|
||||
if(asInstance != null)
|
||||
if(ruleCandidates.get(i).getsGreenLight(asInstance))
|
||||
ruleCandidates.get(i).activate(asInstance, false);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// state != TelephonyManager.CALL_STATE_IDLE &&
|
||||
|
||||
setCurrentState(state);
|
||||
setLastPhoneDirection(1);
|
||||
|
||||
if (incomingNumber != null && incomingNumber.length() > 0) // check for null in case call comes in with suppressed number.
|
||||
setLastPhoneNumber(incomingNumber);
|
||||
|
||||
switch (state)
|
||||
{
|
||||
case TelephonyManager.CALL_STATE_IDLE:
|
||||
Miscellaneous.logEvent("i", "Call state", "New call state: CALL_STATE_IDLE", 4);
|
||||
break;
|
||||
case TelephonyManager.CALL_STATE_OFFHOOK:
|
||||
Miscellaneous.logEvent("i", "Call state", "New call state: CALL_STATE_OFFHOOK", 4);
|
||||
break;
|
||||
case TelephonyManager.CALL_STATE_RINGING:
|
||||
Miscellaneous.logEvent("i", "Call state", String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.incomingCallFrom), incomingNumber), 4);
|
||||
break;
|
||||
}
|
||||
|
||||
ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.phoneCall);
|
||||
for (int i = 0; i < ruleCandidates.size(); i++)
|
||||
{
|
||||
AutomationService asInstance = AutomationService.getInstance();
|
||||
if (asInstance != null)
|
||||
if (ruleCandidates.get(i).getsGreenLight(asInstance))
|
||||
ruleCandidates.get(i).activate(asInstance, false);
|
||||
}
|
||||
String number = intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
|
||||
Log.i("test", "test");
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -175,12 +223,12 @@ public class PhoneStatusListener implements AutomationListenerInterface
|
||||
Miscellaneous.logEvent("i", "Call state", String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.outgoingCallTo), getLastPhoneNumber()), 4);
|
||||
|
||||
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();
|
||||
if(asInstance != null)
|
||||
if(ruleCandidates.get(i).getsGreenLight(asInstance))
|
||||
ruleCandidates.get(i).activate(asInstance, false);
|
||||
ruleCandidates.get(i).activate(asInstance, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -205,7 +253,12 @@ public class PhoneStatusListener implements AutomationListenerInterface
|
||||
}
|
||||
|
||||
if(incomingCallsReceiverInstance == null)
|
||||
incomingCallsReceiverInstance = new IncomingCallsReceiver();
|
||||
{
|
||||
// if(Build.VERSION.SDK_INT >= 31)
|
||||
// incomingCallsReceiverInstance = new IncomingCallsReceiverNew();
|
||||
// else
|
||||
incomingCallsReceiverInstance = new IncomingCallsReceiverOld();
|
||||
}
|
||||
|
||||
if(outgoingCallsReceiverInstance == null)
|
||||
outgoingCallsReceiverInstance = new OutgoingCallsReceiver();
|
||||
@ -215,8 +268,17 @@ public class PhoneStatusListener implements AutomationListenerInterface
|
||||
if(!incomingCallsReceiverActive)
|
||||
{
|
||||
Miscellaneous.logEvent("i", "PhoneStatusListener", "Starting PhoneStatusListener->incomingCallsReceiver", 4);
|
||||
TelephonyManager tm = (TelephonyManager)automationService.getSystemService(Context.TELEPHONY_SERVICE);
|
||||
tm.listen(incomingCallsReceiverInstance, PhoneStateListener.LISTEN_CALL_STATE);
|
||||
// if(Build.VERSION.SDK_INT >= problematicAndroidLevel)
|
||||
// {
|
||||
// IntentFilter callsFilter = new IntentFilter();
|
||||
// callsFilter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
|
||||
// automationService.registerReceiver((IncomingCallsReceiverNew)incomingCallsReceiverInstance, callsFilter);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
TelephonyManager tm = (TelephonyManager) automationService.getSystemService(Context.TELEPHONY_SERVICE);
|
||||
tm.listen((IncomingCallsReceiverOld)incomingCallsReceiverInstance, PhoneStateListener.LISTEN_CALL_STATE);
|
||||
// }
|
||||
incomingCallsReceiverActive = true;
|
||||
}
|
||||
|
||||
@ -240,8 +302,15 @@ public class PhoneStatusListener implements AutomationListenerInterface
|
||||
if(incomingCallsReceiverActive)
|
||||
{
|
||||
Miscellaneous.logEvent("i", "PhoneStatusListener", "Stopping phoneStatusListener", 4);
|
||||
TelephonyManager tm = (TelephonyManager)automationService.getSystemService(Context.TELEPHONY_SERVICE);
|
||||
tm.listen(incomingCallsReceiverInstance, PhoneStateListener.LISTEN_NONE);
|
||||
// if(Build.VERSION.SDK_INT >= 31)
|
||||
// {
|
||||
// automationService.unregisterReceiver((IncomingCallsReceiverNew)incomingCallsReceiverInstance);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
TelephonyManager tm = (TelephonyManager) automationService.getSystemService(Context.TELEPHONY_SERVICE);
|
||||
tm.listen((IncomingCallsReceiverOld)incomingCallsReceiverInstance, PhoneStateListener.LISTEN_NONE);
|
||||
// }
|
||||
incomingCallsReceiverActive = false;
|
||||
}
|
||||
|
||||
@ -289,4 +358,4 @@ public class PhoneStatusListener implements AutomationListenerInterface
|
||||
{
|
||||
return new Trigger_Enum[] { Trigger_Enum.phoneCall };
|
||||
}
|
||||
}
|
||||
}
|
@ -11,12 +11,13 @@ import com.jens.automation2.Settings;
|
||||
|
||||
public class StartupIntentReceiver extends BroadcastReceiver
|
||||
{
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent)
|
||||
{
|
||||
Settings.readFromPersistentStorage(context);
|
||||
|
||||
Miscellaneous.startupContext = context;
|
||||
|
||||
// Miscellaneous.logEvent("i", "Boot event", "Received event: " + intent.getAction(), 5);
|
||||
|
||||
if(Settings.startServiceAtSystemBoot)
|
||||
|
@ -0,0 +1,151 @@
|
||||
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};
|
||||
}
|
||||
}
|
@ -6,12 +6,17 @@ import android.content.IntentFilter;
|
||||
import android.os.Build;
|
||||
import android.util.Log;
|
||||
|
||||
import com.jens.automation2.ActivityManageTriggerTethering;
|
||||
import com.jens.automation2.AutomationService;
|
||||
import com.jens.automation2.Miscellaneous;
|
||||
import com.jens.automation2.Rule;
|
||||
import com.jens.automation2.Trigger;
|
||||
|
||||
import java.net.InetAddress;
|
||||
import java.net.NetworkInterface;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Enumeration;
|
||||
import java.util.List;
|
||||
|
||||
public class TetheringReceiver extends android.content.BroadcastReceiver implements AutomationListenerInterface
|
||||
{
|
||||
@ -20,8 +25,14 @@ public class TetheringReceiver extends android.content.BroadcastReceiver impleme
|
||||
private static TetheringReceiver receiverInstance = null;
|
||||
private static IntentFilter intentFilter = null;
|
||||
|
||||
private static List<String> lastTetheringTypes = null;
|
||||
private static boolean tetheringActive = false;
|
||||
|
||||
public static List<String> getLastTetheringTypes()
|
||||
{
|
||||
return lastTetheringTypes;
|
||||
}
|
||||
|
||||
public static TetheringReceiver getInstance()
|
||||
{
|
||||
if(receiverInstance == null)
|
||||
@ -38,28 +49,91 @@ public class TetheringReceiver extends android.content.BroadcastReceiver impleme
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent)
|
||||
{
|
||||
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);
|
||||
Object ob = intent.getExtras().get(key);
|
||||
Miscellaneous.logEvent("i", "TetheringReceiver", "Received " + intent.getAction(), 5);
|
||||
|
||||
String target = null;
|
||||
/*
|
||||
DETECT BY DATA DELIVERED IN INTENT
|
||||
*/
|
||||
|
||||
if(Build.VERSION.SDK_INT >= 26)
|
||||
target = "tetherArray";
|
||||
// if(intent.getAction().equals("android.net.conn.TETHER_STATE_CHANGED"))
|
||||
// {
|
||||
String searchArray = null;
|
||||
|
||||
if (Build.VERSION.SDK_INT >= 26)
|
||||
searchArray = "tetherArray";
|
||||
else
|
||||
target = "activeArray";
|
||||
searchArray = "activeArray";
|
||||
|
||||
if(key.equals(target) && ob instanceof ArrayList)
|
||||
for (String key : intent.getExtras().keySet())
|
||||
{
|
||||
if(((ArrayList<String>)ob).size() > 0)
|
||||
tetheringActive = true;
|
||||
else
|
||||
tetheringActive = false;
|
||||
}
|
||||
// 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);
|
||||
|
||||
if (key.equals(searchArray) && ob instanceof ArrayList)
|
||||
{
|
||||
if (((ArrayList<String>) ob).size() > 0)
|
||||
{
|
||||
tetheringActive = true;
|
||||
if (lastTetheringTypes == null)
|
||||
lastTetheringTypes = new ArrayList<>();
|
||||
else
|
||||
lastTetheringTypes.clear();
|
||||
|
||||
for (String adapterName : (ArrayList<String>) ob)
|
||||
{
|
||||
if (adapterName.contains("wlan"))
|
||||
lastTetheringTypes.add(ActivityManageTriggerTethering.tetheringTypeWifi);
|
||||
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
|
||||
tetheringActive = false;
|
||||
}
|
||||
|
||||
// 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);
|
||||
for(int i=0; i<ruleCandidates.size(); i++)
|
||||
@ -83,6 +157,7 @@ public class TetheringReceiver extends android.content.BroadcastReceiver impleme
|
||||
{
|
||||
intentFilter = new IntentFilter();
|
||||
intentFilter.addAction("android.net.conn.TETHER_STATE_CHANGED");
|
||||
// intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
|
||||
}
|
||||
|
||||
try
|
||||
|
BIN
app/src/main/res/drawable-hdpi/clipboard.png
Normal file
After Width: | Height: | Size: 2.6 KiB |
BIN
app/src/main/res/drawable-hdpi/coffee.png
Normal file
After Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 679 B After Width: | Height: | Size: 679 B |
BIN
app/src/main/res/drawable-hdpi/subsystemstate.png
Normal file
After Width: | Height: | Size: 2.0 KiB |
@ -100,6 +100,7 @@
|
||||
android:id="@+id/bSendEmailToDev"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="@dimen/default_margin"
|
||||
android:text="@string/sendEmailToDev" />
|
||||
|
||||
<TextView
|
||||
|
@ -37,6 +37,7 @@
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/generalText" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
@ -76,6 +76,14 @@
|
||||
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
|
||||
android:layout_marginBottom="@dimen/activity_vertical_margin">
|
||||
|
||||
@ -111,6 +119,22 @@
|
||||
android:layout_margin="10dp"
|
||||
android:layout_marginVertical="@dimen/default_margin"
|
||||
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
|
||||
android:layout_marginBottom="@dimen/activity_vertical_margin">
|
||||
@ -141,6 +165,69 @@
|
||||
|
||||
</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>
|
||||
|
||||
<Button
|
||||
|
@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="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:text="@string/textToCopy" />
|
||||
|
||||
<EditText
|
||||
android:id="@+id/etCopyToClipboard"
|
||||
android:layout_marginBottom="10dp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:ems="10"
|
||||
android:inputType="textShortMessage|textMultiLine" >
|
||||
</EditText>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvTextMessageAnnotations"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dip"
|
||||
android:text="@string/textMessageAnnotations" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvLegend"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/urlLegend" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/bSaveCopyToClipboard"
|
||||
android:layout_marginTop="15dp"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/save" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</ScrollView>
|
@ -0,0 +1,64 @@
|
||||
<?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:orientation="vertical"
|
||||
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/startPhoneCall"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvMakePhoneCallExplanation1"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/makePhoneCallExplanation1" />
|
||||
|
||||
<TableLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/default_margin"
|
||||
android:stretchColumns="1"
|
||||
android:shrinkColumns="1" >
|
||||
|
||||
<TableRow
|
||||
android:layout_marginTop="@dimen/default_margin">
|
||||
|
||||
<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/phoneNumber" />
|
||||
|
||||
<EditText
|
||||
android:id="@+id/etTargetPhoneNumber"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:inputType="phone"/>
|
||||
|
||||
</TableRow>
|
||||
|
||||
</TableLayout>
|
||||
|
||||
<Button
|
||||
android:id="@+id/bActionMakePhoneCallSave"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/default_margin"
|
||||
android:text="@string/save" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</ScrollView>
|
@ -41,6 +41,32 @@
|
||||
<requestFocus />
|
||||
</EditText>
|
||||
|
||||
<TextView
|
||||
android:visibility="gone"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/messageType" />
|
||||
|
||||
<RadioGroup
|
||||
android:visibility="gone"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content" >
|
||||
|
||||
<RadioButton
|
||||
android:id="@+id/rbMessageTypeSms"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:checked="true"
|
||||
android:text="@string/sms" />
|
||||
|
||||
<RadioButton
|
||||
android:id="@+id/rbMessageTypeMms"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/mms" />
|
||||
|
||||
</RadioGroup>
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
@ -67,6 +93,23 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/urlLegend" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/attachment" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvSendMmsFileAttachment"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/bMmsAttachment"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:enabled="false"
|
||||
android:text="@string/chooseFile" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/bSaveSendTextMessage"
|
||||
android:layout_marginTop="15dp"
|
||||
|
@ -0,0 +1,73 @@
|
||||
<?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="wrap_content"
|
||||
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:text="@string/setVariable"
|
||||
android:textSize="25dp"
|
||||
android:layout_marginBottom="@dimen/default_margin" />
|
||||
|
||||
<TableLayout
|
||||
android:layout_marginLeft="@dimen/default_margin"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:shrinkColumns="1"
|
||||
android:stretchColumns="1" >
|
||||
|
||||
<TableRow>
|
||||
|
||||
<TextView
|
||||
android:text="@string/VariableKey"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
<EditText
|
||||
android:id="@+id/etVariableSetKey"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:inputType="text" />
|
||||
|
||||
</TableRow>
|
||||
|
||||
<TableRow>
|
||||
|
||||
<TextView
|
||||
android:text="@string/variableValue"
|
||||
android:layout_marginRight="@dimen/default_margin"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
<EditText
|
||||
android:id="@+id/etVariableSetValue"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
</TableRow>
|
||||
|
||||
</TableLayout>
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginVertical="@dimen/default_margin"
|
||||
android:text="@string/setVariableExplanation" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/bSaveVariable"
|
||||
android:layout_marginTop="@dimen/default_margin"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/save" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</ScrollView>
|
@ -129,6 +129,12 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/startAppBySendBroadcast" />
|
||||
|
||||
<RadioButton
|
||||
android:id="@+id/rbStartAppByService"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/startAppByStartService" />
|
||||
|
||||
</RadioGroup>
|
||||
|
||||
</TableRow>
|
||||
@ -298,6 +304,24 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/addIntentValue" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginVertical="@dimen/default_margin"
|
||||
android:text="@string/intentParametersHint" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="25dp"
|
||||
android:text="@string/variablesOnlyForTypes" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvLegend"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/urlLegend" />
|
||||
|
||||
<ImageView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1dp"
|
||||
|
100
app/src/main/res/layout/activity_manage_action_wakelock.xml
Normal file
@ -0,0 +1,100 @@
|
||||
<?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>
|
@ -0,0 +1,80 @@
|
||||
<?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:orientation="vertical"
|
||||
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/checkVariable"/>
|
||||
|
||||
<TableLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/default_margin"
|
||||
android:stretchColumns="1"
|
||||
android:shrinkColumns="1" >
|
||||
|
||||
<TableRow
|
||||
android:layout_marginTop="@dimen/default_margin">
|
||||
|
||||
<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/VariableKey" />
|
||||
|
||||
<EditText
|
||||
android:id="@+id/etVariableKeyTrigger"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
</TableRow>
|
||||
|
||||
<TableRow
|
||||
android:layout_marginTop="@dimen/default_margin">
|
||||
|
||||
<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/variableValue" />
|
||||
|
||||
<EditText
|
||||
android:id="@+id/etVariableValueTrigger"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
</TableRow>
|
||||
|
||||
</TableLayout>
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/default_margin"
|
||||
android:text="@string/checkVariableExplanation" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/bTriggerVariableSave"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/default_margin"
|
||||
android:text="@string/save" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</ScrollView>
|
@ -96,6 +96,7 @@
|
||||
android:layout_margin="10dp"
|
||||
android:layout_marginVertical="@dimen/default_margin"
|
||||
android:background="#aa000000" />
|
||||
|
||||
<TextView
|
||||
android:gravity="center"
|
||||
android:layout_width="match_parent"
|
||||
@ -104,6 +105,14 @@
|
||||
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
|
||||
android:layout_marginBottom="@dimen/activity_vertical_margin">
|
||||
|
||||
|
@ -0,0 +1,75 @@
|
||||
<?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>
|
@ -58,8 +58,68 @@
|
||||
|
||||
</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>
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textColor="@color/red"
|
||||
android:layout_marginTop="@dimen/default_margin"
|
||||
android:text="@string/tetheringBluetoothNotPossible" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/bTriggerTetheringSave"
|
||||
android:layout_width="wrap_content"
|
||||
|
@ -47,6 +47,19 @@
|
||||
|
||||
</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>
|
||||
|
||||
<TextView
|
||||
@ -62,6 +75,16 @@
|
||||
|
||||
</TableRow>
|
||||
|
||||
<TableRow>
|
||||
|
||||
<TextView />
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/mayUseRegularExpressions"/>
|
||||
|
||||
</TableRow>
|
||||
|
||||
<TableRow>
|
||||
|
||||
<Button
|
||||
@ -81,7 +104,7 @@
|
||||
</TableLayout>
|
||||
|
||||
<Button
|
||||
android:id="@+id/btriggerWifiSave"
|
||||
android:id="@+id/bTriggerWifiSave"
|
||||
android:layout_marginTop="@dimen/default_margin"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
|
@ -59,6 +59,13 @@
|
||||
android:entries="@array/tabsPlacementOptions"
|
||||
android:entryValues="@array/tabsPlacementOptionsValues" />
|
||||
|
||||
<ListPreference
|
||||
android:key="displayLanguage"
|
||||
android:title="@string/displayLanguage"
|
||||
android:summary="@string/displayLanguageSummary"
|
||||
android:entries="@array/displayLanguageOptions"
|
||||
android:entryValues="@array/displayLanguageValues" />
|
||||
|
||||
<CheckBoxPreference
|
||||
android:key="executeRulesAndProfilesWithSingleClick"
|
||||
android:title="@string/executeRulesAndProfilesWithSingleClickTitle" />
|
||||
@ -74,7 +81,12 @@
|
||||
android:title="@string/displayNewsOnMainScreen"
|
||||
android:summary="@string/displayNewsOnMainScreenDescription" />
|
||||
|
||||
</PreferenceCategory>
|
||||
<CheckBoxPreference
|
||||
android:key="showToasts"
|
||||
android:title="@string/showToastsForEvents"
|
||||
android:summary="@string/showToastsForEventsSummary" />
|
||||
|
||||
</PreferenceCategory>
|
||||
|
||||
<PreferenceCategory
|
||||
android:summary="@string/soundSettings"
|
||||
|
@ -1,5 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="languageSystemDefault">System Standard</string>
|
||||
<string name="languageEnglish">Englisch</string>
|
||||
<string name="languageGerman">Deutsch</string>
|
||||
<string name="languageItalian">Italienisch</string>
|
||||
<string name="languageSpanish">Spanisch</string>
|
||||
<string name="languageDutch">Niederländisch</string>
|
||||
<string name="languageRussian">Russisch</string>
|
||||
<string name="languageFrench">Französisch</string>
|
||||
<string name="ruleActivate">Aktiviere Regel %1$s</string>
|
||||
<string name="profileActivate">Aktiviere Profil %1$s</string>
|
||||
<string name="ruleActivateToggle">Aktiviere Regel %1$s im Umkehrmodus</string>
|
||||
@ -57,7 +65,7 @@
|
||||
<string name="end">Ende</string>
|
||||
<string name="save">Speichern</string>
|
||||
<string name="urlToTrigger">URL, die ausgelöst werden soll:</string>
|
||||
<string name="urlLegend">Variablen:\nSie können die folgenden Variablen verwenden. Vor dem Auslösen werden sie mit dem entsprechenden Wert Ihres Geräts ersetzt. Die Klammern müssen in den Text mit aufgenommen werden.\n\n[uniqueid] - Die Unique ID Ihres Geräts\n[serialnr] - Die Seriennummer Ihres Geräts (< Android 9)\n[latitude] - Ihr gegenwärtiger Breitengrad\n[longitude] - Ihr gegenwärtiger Längengrad\n[phonenr] - Nummer des letzten ein- oder ausgehenden Anrufs\n[d] - Tag des Monats, 2-stellig mit führender Null\n[m] - Monat als Zahl, mit führenden Nullen\n[Y] - Vierstellige Jahreszahl\n[h] - Stunde im 12-Stunden-Format, mit führenden Nullen\n[H] - Stunde im 24-Stunden-Format, mit führenden Nullen\n[i] - Minuten, mit führenden Nullen\n[s] - Sekunden, mit führenden Nullen\n[ms] - milliseconds\n[notificationTitle] - Titel der letzten Benachrichtigung\n[notificationText] - Text der letzten Benachrichtigung</string>
|
||||
<string name="urlLegend">Variablen:\nSie können die folgenden Variablen verwenden. Vor dem Auslösen werden sie mit dem entsprechenden Wert Ihres Geräts ersetzt. Die Klammern müssen in den Text mit aufgenommen werden.\n\n[uniqueid] - Die Unique ID Ihres Geräts\n[serialnr] - Die Seriennummer Ihres Geräts (< Android 9)\n[latitude] - Ihr gegenwärtiger Breitengrad\n[longitude] - Ihr gegenwärtiger Längengrad\n[phonenr] - Nummer des letzten ein- oder ausgehenden Anrufs\n[d] - Tag des Monats, 2-stellig mit führender Null\n[m] - Monat als Zahl, mit führenden Nullen\n[Y] - Vierstellige Jahreszahl\n[h] - Stunde im 12-Stunden-Format, mit führenden Nullen\n[H] - Stunde im 24-Stunden-Format, mit führenden Nullen\n[i] - Minuten, mit führenden Nullen\n[s] - Sekunden, mit führenden Nullen\n[ms] - milliseconds\n[notificationTitle] - Titel der letzten Benachrichtigung\n[notificationText] - Text der letzten Benachrichtigung\n[variable-VARIABLENAME] - Der Wert Ihrer selbst definitierten Variable</string>
|
||||
<string name="wifi">WLAN</string>
|
||||
<string name="activating">Aktiviere</string>
|
||||
<string name="deactivating">Deaktiviere</string>
|
||||
@ -112,7 +120,7 @@
|
||||
<string name="soundSettings">Ton Einstellungen</string>
|
||||
<string name="showHelp">Hilfe</string>
|
||||
<string name="rules">Regeln</string>
|
||||
<string name="helpTextRules">Alle Auslöser sind UND-verknüpft. D.h. die Regel wird nur zutreffen, wenn alle Bedingungen erfüllt sind. Wenn Sie eine ODER-Verknüpfung möchten, müssen Sie eine weitere Regel erstellen.</string>
|
||||
<string name="helpTextRules">Alle Auslöser sind UND-verknüpft. D.h. die Regel wird nur zutreffen, wenn alle Bedingungen erfüllt sind. Wenn Sie eine ODER-Verknüpfung möchten, müssen Sie eine weitere Regel erstellen.\nDie Begriffe Auslöser und Bedingung werden synonym verwendet. Alle von ihnen sind Bedingungen, aber die letzte, die ihren erforderlichen Wert erfüllt, könnte als Auslöser bezeichnet werden, da sie das letzte Teil des Puzzles ist, um eine Regel auszuführen.</string>
|
||||
<string name="timeframes">Zeiträume</string>
|
||||
<string name="helpTextTimeFrame">Wenn Sie eine Regel mit einem Zeitraum erstellen, haben Sie zwei Möglichkeiten. Sie können wählen, ob der Auslöser besagt, daß der Zeitraum entweder verlassen ODER betreten wird. In jedem Fall wird die Regel nur einmal ausgelöst. Wenn eine Regel z.B. besagt \"betrete timeframe xyz\" und das Klingeltonprofil in Vibration ändert, bedeutet das NICHT, daß das Gerät hinterher automatisch wieder zum normalen Klingelprofil zurückschaltet. Wenn das erwünscht ist, muß eine weitere Regel mit einem Folgezeitraum erstellen werden.</string>
|
||||
<string name="helpTextSound">Auf dem Hauptbildschirm können Sie die Funktion Tonänderunugen sperren benutzen, um vorrübergehend regelbasierte Tonänderungen zu deaktivieren. Z.B. könnten Sie in einer Situation oder an einem Ort sein, wo Klingeltöne normalerweise in Ordnung sind, aber dieses eine Mal würde es stören. Die Funktion wird automatisch wieder deaktiviert nachdem die eingestellte Zeit abgelaufen ist. Klicken Sie den + Knopf, um die angezeigte Zeit zur Frist hinzuzufügen. Sobald es aktiv ist, können Sie es mit dem Schalter rechts wieder abschalten (und so regelbasierte Tonänderungen wieder ermöglichen).</string>
|
||||
@ -270,7 +278,8 @@
|
||||
<string name="phoneCall">Telefongespräch</string>
|
||||
<string name="with">mit</string>
|
||||
<string name="phoneNumber">Telefonnummer</string>
|
||||
<string name="enterPhoneNumber">Geben Sie eine Telefonnummer ein. Leer lassen für irgendeine Nummer.</string>
|
||||
<string name="enterPhoneNumberBlankForAny">Geben Sie eine Telefonnummer ein. Leer lassen für irgendeine Nummer.</string>
|
||||
<string name="enterPhoneNumber">Geben Sie eine Telefonnummer ein.</string>
|
||||
<string name="phoneDirection">Wählen Sie die\nGesprächsrichtung</string>
|
||||
<string name="any">egal</string>
|
||||
<string name="incoming">eingehend</string>
|
||||
@ -511,7 +520,7 @@
|
||||
<string name="googleLocationChicaneryOld">Diese Anwendung sammelt Positionsdaten, um festzustellen, ob Sie sich gerade an einem der Orte aufhalten, die Sie definiert haben. Außerdem wird es benutzt, um Ihre Geschwindigkeit zu ermitteln, falls Sie diese in Regeln verwenden. Das wird auch dann gemacht, wenn das Programm nicht im Vordergrund ist (aber nur, wenn der Dienst aktiv ist).</string>
|
||||
<string name="error">Fehler</string>
|
||||
<string name="featureNotInFdroidVersion">Diese Funktion basiert auf nicht-freier Software (Google Bibliotheken). Daher ist sie in der F-Droid Version nicht verfügbar.</string>
|
||||
<string name="settingsReferringToRestrictedFeatures">Ihre Einstellungen und Regeln verwenden derzeit nicht-freie Funktionen (Google Bibliotheken). Diese sind in der F-Droid Version nicht funktionsfähig. Das schließt die Erkennung Ihrer gegenwärtigen körperlichen Aktivität ein.</string>
|
||||
<string name="settingsReferringToRestrictedFeaturesInFdroid">Ihre Einstellungen und Regeln verwenden derzeit nicht-freie Funktionen (Google Bibliotheken). Diese sind in der F-Droid Version nicht funktionsfähig. Das schließt die Erkennung Ihrer gegenwärtigen körperlichen Aktivität ein.</string>
|
||||
<string name="displayNewsOnMainScreen">Nachrichten auf dem Hauptbildschirm anzeigen</string>
|
||||
<string name="displayNewsOnMainScreenDescription">Nachrichten ausschließlich über diese Anwendung, wir sprechen von 1-2 pro Jahr, nicht mehr.</string>
|
||||
<string name="newsOptIn">Möchten Sie wichtige Nachrichten über diese Anwendung auf dem Hauptbildschirm angezeigt bekommen? Diese werden von der Webseite des Entwicklers heruntergeladen. Es gibt keine aufdringliche Benachrichtigung, etc., lediglich eine stille Anzeige auf dem Hauptbildschirm.</string>
|
||||
@ -519,7 +528,7 @@
|
||||
<string name="notification">Benachrichtigung</string>
|
||||
<string name="title">Titel</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="removedNotification">Benachrichtigung von %1$s wurde entfernt</string>
|
||||
<string name="notificationAppears">Benachrichtigung wird angezeigt</string>
|
||||
@ -593,7 +602,7 @@
|
||||
<string name="tabsPlacement">Position der Tableiste</string>
|
||||
<string name="top">Oben</string>
|
||||
<string name="bottom">Unten</string>
|
||||
<string name="tabsPlacementSummary">Wol soll die Taskleiste angezeigt werden?</string>
|
||||
<string name="tabsPlacementSummary">Wo soll die Taskleiste angezeigt werden?</string>
|
||||
<string name="tones">Klingeltöne</string>
|
||||
<string name="miscellaneous">Verschiedenes</string>
|
||||
<string name="dnd">Nicht stören</string>
|
||||
@ -688,7 +697,7 @@
|
||||
<string name="screenIs">Bildschirm ist %1$s</string>
|
||||
<string name="sendEmailToDev">Email an Entwickler schicken</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.</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="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="selectParameters">Wählen Sie die Parameter</string>
|
||||
@ -706,8 +715,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="serviceStarts">Dienst startet</string>
|
||||
<string name="deviceStarts">Gerät startet</string>
|
||||
<string name="deviceHasJustStarted">Gerät ist gerade gestartet</string>
|
||||
<string name="serviceHasJustStarted">Dienst ist gerade gestartet</string>
|
||||
<string name="deviceIsStarting">Gerät startet gerade</string>
|
||||
<string name="serviceIsStarting">Dienst startet gerade</string>
|
||||
<string name="broadcastReceived">Broadcast empfangen</string>
|
||||
<string name="broadcastNotReceived">Broadcast nicht empfangen</string>
|
||||
<string name="broadcastReceivedTitle">Broadcast empfangen</string>
|
||||
@ -721,7 +730,7 @@
|
||||
<string name="enterBroadcast">Geben Sie eine Aktion für den Broadcast ein.</string>
|
||||
<string name="broadcastExplanation">Diese Aktion erlaubt es, einen Broadcast über das Nachrichtensystem von Android zu verschicken. Das ist für den Benutzer nicht sichtbar, aber Anwendungen, die sich für bestimmte Broadcasts registriert haben, können darauf reagieren.</string>
|
||||
<string name="explanationBroadcastTrigger">La mayoría de los eventos en su teléfono se \"publicado\" transmitiéndolos a través del sistema operativo.\nPor ejemplo, activar / desactivar el modo avión activará dicha transmisión. Esas transmisiones no son automáticamente visibles / audibles, pero si una aplicación (como Automatización) está interesada, puede conectarse a ellas. Cuando ocurran, se le notificará y podrá reaccionar.\n\nPuede definir aquí un evento de difusión para el que la aplicación esperará. Puede ingresarlo manualmente, copiarlo y pegarlo desde algún lugar o elegir uno de la lista de sugerencias. Como este desencadenante está destinado a ser y seguir siendo muy flexible, no puedo proporcionarle explicaciones para los elementos.\n\nLa lista de sugerencias no pretende estar completa. Visite la siguiente URL para echar un vistazo a la documentación de Android.\nTambién cualquier aplicación puede enviar eventos personalizados que no aparecerán en la documentación de Android, por supuesto.\n\nMuchas transmisiones requieren permisos específicos para funcionar. Intento solicitar permisos donde sé que serán necesarios. Si cree que se requiere un permiso para la acción que ingresó, hágamelo saber.\n\nNo recibido significa que no ha habido tal transmisión desde que se inició el servicio. Responder a ciertos parámetros está en desarrollo.</string>
|
||||
<string name="logsExplanation">Um eine unnötige Abnutzung Ihres Speichers zu vermeiden, werden Protokolle standardmäßig nicht gespeichert. Wenn Sie also ein Problem haben, aktivieren Sie bitte zuerst die Anmeldeeinstellungen und setzen Sie den Protokollpegel auf 5. Reproduzieren Sie dann das Problem. Erst dann können Protokolle angehängt werden.</string>
|
||||
<string name="logsExplanation">Um eine unnötige Abnutzung Ihres Speichers zu vermeiden, werden Protokolle standardmäßig nicht gespeichert. Wenn Sie also ein Problem haben, aktivieren Sie bitte zuerst die Protokollierungseinstellungen und setzen Sie den Protokollpegel auf 5. Reproduzieren Sie dann das Problem. Erst dann können Protokolle angehängt werden.</string>
|
||||
<string name="directionStringDoesNotContain">enthält nicht</string>
|
||||
<string name="path">Pfad</string>
|
||||
<string name="runExecutable">Programm/Script ausführen</string>
|
||||
@ -736,5 +745,58 @@
|
||||
<string name="tetheringState">Tethering Status</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="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 hier ein Skript oder eine ausführbare Datei auswählen, die als Aktion ausgeführt wird.\n\nEs gibt aber einige Voraussetzungen, mit denen Sie sich selbst auseinandersetzen müssen. Google hat es sehr schwierig gemacht, etwas anderes als normale Android-Anwendungen auszuführen.\n\n1. Das Skript muss als ausführbar markiert sein. Auf einem normalen Android-System (ohne root) ist dies eigentlich der schwierige Teil.\n\n2. Das bedeutet auch, dass Automation in der Lage sein muß, die Datei auszuführen, nicht nur der Besitzer oder die Gruppe.\n\n3. Falls es sich um ein Skript handelt, muß im Header des Scripts eine gültige Shell angegeben sein.\n\nFalls Sie die oben genannten Anforderungen nicht erfüllen können, können Sie alternativ versuchen, eine Shell als tatsächliche ausführbare Datei (z. B. /system/bin/sh) und Ihr Skript als Parameter anzugeben. Das hat für mindestens einen Benutzer funktioniert.</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="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>
|
||||
<string name="usb">USB</string>
|
||||
<string name="cable">Kabel</string>
|
||||
<string name="tetheringBluetoothNotPossible">Bluetooth tethering kann gegenwärtig nicht detektiert werden. Nur die anderen Verbindungsarten werden diesen Auslöser aktivieren.</string>
|
||||
<string name="type">Art</string>
|
||||
<string name="startPhoneCall">Telefonnummer anrufen</string>
|
||||
<string name="android.permission.CALL_PHONE">Telefonnummer anrufen</string>
|
||||
<string name="makePhoneCallExplanation1">Hier können Sie eine Telefonnummer eingeben, die ohne weitere Aufforderung angerufen wird. Sie können dies verwenden, um Einstellungen vorzunehmen, z. B. Anpassungen an der Anrufweiterleitung usw. vorzunehmen. Bitte suchen Sie selbst nach den dafür benötigten Codes.</string>
|
||||
<string name="endPhoneCall">Telefonanruf beenden</string>
|
||||
<string name="android.permission.ANSWER_PHONE_CALLS">Telefonanruf beenden</string>
|
||||
<string name="settingsReferringToRestrictedFeaturesInGoogle">Ihre Einstellungen und/oder Regeln verweisen derzeit auf Funktionen, die in der Google Play-Version nicht bereitgestellt werden können. Dazu gehört unter anderem alles, was mit Telefonaten und Textnachrichten zu tun hat.</string>
|
||||
<string name="setVariable">Variable festlegen</string>
|
||||
<string name="deleteVariable">Variable löschen</string>
|
||||
<string name="VariableKey">Variablenname</string>
|
||||
<string name="variableValue">Variablenwert</string>
|
||||
<string name="setVariableExplanation">Wenn Sie für eine Variable einen leeren Wert angeben, wird sie gelöscht.</string>
|
||||
<string name="enterVariableKey">Geben Sie einen Namen für die Variable an.</string>
|
||||
<string name="checkVariable">Variable prüfen</string>
|
||||
<string name="checkVariableExplanation">Wenn Sie den Wert der Variablen leer lassen, darf sie nicht gesetzt sein, damit die Bedingung als erfüllt gilt.</string>
|
||||
<string name="variableCheckString">wenn Variable %1$s den Wert %2$s hat</string>
|
||||
<string name="variableCheckStringDeleted">wenn Variable %1$s nicht gesetzt ist</string>
|
||||
<string name="messageType">Nachrichtentyp</string>
|
||||
<string name="sms">SMS</string>
|
||||
<string name="mms">MMS</string>
|
||||
<string name="attachment">Dateianhang</string>
|
||||
<string name="chooseFile">Datei wählen</string>
|
||||
<string name="startAppByStartService">via startService()</string>
|
||||
<string name="showToastsForEvents">Toasts anzeigen</string>
|
||||
<string name="showToastsForEventsSummary">Popups anzeigen, wenn Ereignisse wie Regelausführungen auftreten</string>
|
||||
<string name="notificationAccessAndroid13">Nachdem Sie auf OK geklickt haben, wählen Sie Automatisierung, dann \"Benachrichtigungszugriff zulassen\", dann \"Zulassen\".\n\nAuf einigen Systemen ist diese Einstellung ausgegraut. In diesen Fällen müssen Sie zu \"settings\" -> \"apps\" -> \"Automation\" -> 3-Punkte-Menü -> Gehen Sie diese Einschränkungen auf. Danach kehren Sie hierher zurück.</string>
|
||||
<string name="displayLanguage">Anzeigesprache</string>
|
||||
<string name="displayLanguageSummary">Bestimmte Anzeigesprache wählen</string>
|
||||
<string name="wifiMonitoringAlsoRequiresThis">Diese Berechtigung wird auch benötigt, wenn man die aktuelle WLAN Verbindung auslesen möchte.</string>
|
||||
<string name="copyTextToClipboard">Text in die Zwischenablage kopieren</string>
|
||||
<string name="textToCopy">Text, der kopiert werden soll</string>
|
||||
<string name="android.permission.SYSTEM_ALERT_WINDOW">Über anderen Anwendungen anzeigen</string>
|
||||
<string name="overlayPermissionHint">Nachdem Sie auf OK geklickt haben, werden Sie zu einem Systemdialog weitergeleitet. Bitte wählen Sie dort Automation aus und erlauben Sie die Anzeige über anderen Apps.</string>
|
||||
<string name="variablesOnlyForTypes">Variablen sind nur für die Parametertypen String und URI verfügbar</string>
|
||||
<string name="intentParametersHint">Wenn Sie einen Parameter angeben möchten, müssen Sie auch auf \"Intent-Paar hinzufügen\" klicken. Andernfalls werden Ihre Änderungen nicht gespeichert.</string>
|
||||
<string name="languagePolish">Polnisch</string>
|
||||
<string name="languageChineseChina">Chinesisch (China)</string>
|
||||
</resources>
|
@ -1,5 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="languageSystemDefault">Predeterminado</string>
|
||||
<string name="languageEnglish">Inglés</string>
|
||||
<string name="languageGerman">Alemán</string>
|
||||
<string name="languageItalian">Italiano</string>
|
||||
<string name="languageSpanish">Español</string>
|
||||
<string name="languageDutch">Holandés</string>
|
||||
<string name="languageRussian">Ruso</string>
|
||||
<string name="languageFrench">Francés</string>
|
||||
<string name="ruleActivate">Estoy activando regla %1$s</string>
|
||||
<string name="profileActivate">Estoy activando perfil %1$s</string>
|
||||
<string name="ruleActivateToggle">Estoy activando regla %1$s en el modo de invertir</string>
|
||||
@ -117,7 +125,7 @@
|
||||
<string name="actionSetUsbTethering">Enrutador USB</string>
|
||||
<string name="actionTurnBluetoothOn">encender Bluetooth</string>
|
||||
<string name="actionTurnWifiOn">encender wifi</string>
|
||||
<string name="actionTurnWifiOff">desactivar Bluetooth</string>
|
||||
<string name="actionTurnWifiOff">desactivar wifi</string>
|
||||
<string name="actionTurnBluetoothOff">desactivar Bluetooth</string>
|
||||
<string name="actionTriggerUrl">Abrir URL en antecedentes</string>
|
||||
<string name="actionChangeSoundProfile">Cambiar perfil sonido</string>
|
||||
@ -254,7 +262,8 @@
|
||||
<string name="headsetDisconnected">Auriculares (tipo: %1$s) desconectados</string>
|
||||
<string name="phoneCall">Llamada</string>
|
||||
<string name="phoneNumber">Número de teléfono</string>
|
||||
<string name="enterPhoneNumber">Inserte numero de teléfono. Vacio para algún número.</string>
|
||||
<string name="enterPhoneNumberBlankForAny">Inserte numero de teléfono. Vacio para algún número.</string>
|
||||
<string name="enterPhoneNumber">Inserte numero de teléfono.</string>
|
||||
<string name="phoneDirection">Elija llamada\nentrante o saliente</string>
|
||||
<string name="headphoneSimple">Auriculares</string>
|
||||
<string name="headphoneSelectType">Elija tipo de auriculares</string>
|
||||
@ -358,14 +367,14 @@
|
||||
<string name="networkAccuracy">Red exactitud [m]</string>
|
||||
<string name="minimumTimeForLocationUpdates">Tiempo mínimo para cambio en milisegundos para actualizar posición</string>
|
||||
<string name="timeForUpdate">Tiempo para actualizar [milisegundos]</string>
|
||||
<string name="urlLegend">Variables: Puede usar esas variables. Mientras ejecuta van a sustituir con los valores correspondientes en su dispositivo. Incluya las paréntecis en su texto.\n\n[uniqueid] - el número único de su dispositivo\n[serialnr] - el número de serie de su dispositivo (< Android 9)\n[latitude] - su latitud\n[longitude] - su longitud\n[phonenr] - Ùltimo número de llamada realizada tanto de salida como entrante\n[d] - Dia del mes, 2 digitos con cero al comienzo\n[m] - número del mes, 2 digitos con cero al comienzo\n[Y] - Número del año, 4 digitos\n[h] - Hora, formato 12 horas con cero al comienzo\n[H] - Hora, formato 24 horas con cero al comienzo\n[i] - Minutos con cero al comienzo\n[s] - Segundos con cero al comienzo\n[ms] - milisegundos\n[notificationTitle] - Título de la última notificación\n[notificationText] - Texto de la última notificación</string>
|
||||
<string name="urlLegend">Variables: Puede usar esas variables. Mientras ejecuta van a sustituir con los valores correspondientes en su dispositivo. Incluya las paréntecis en su texto.\n\n[uniqueid] - el número único de su dispositivo\n[serialnr] - el número de serie de su dispositivo (< Android 9)\n[latitude] - su latitud\n[longitude] - su longitud\n[phonenr] - Ùltimo número de llamada realizada tanto de salida como entrante\n[d] - Dia del mes, 2 digitos con cero al comienzo\n[m] - número del mes, 2 digitos con cero al comienzo\n[Y] - Número del año, 4 digitos\n[h] - Hora, formato 12 horas con cero al comienzo\n[H] - Hora, formato 24 horas con cero al comienzo\n[i] - Minutos con cero al comienzo\n[s] - Segundos con cero al comienzo\n[ms] - milisegundos\n[notificationTitle] - Título de la última notificación\n[notificationText] - Texto de la última notificación\n[variable-VARIABLENAME] - El valor de la variable definida personalizada</string>
|
||||
<string name="screenRotationAlreadyEnabled">Rotación del monitor todavia esta activado.</string>
|
||||
<string name="screenRotationAlreadyDisabled">Rotación del monitor todavia esta desactivado.</string>
|
||||
<string name="needLocationPermForWifiList">Se puede usar la lista de wifis conocidos para determinar los sitios en los cuales estuvo. Por eso el permiso de localización es necesario para cargar la lista de wifis. Si quiere elegir uno de la lista tiene que conceder el permiso. En caso contrario todavia puede introducir un nombre wifi manualmente.</string>
|
||||
<string name="com.wireguard.android.permission.CONTROL_TUNNELS">Controlar conexiones de la app Wireguard</string>
|
||||
<string name="shareConfigAndLogFilesWithDev">Adjuntar configuración y procotolo.</string>
|
||||
<string name="rootExplanation">Necesita permiso root para esta función. Después encienda la función \"ejecutar regla manualmente\" para presentar el permiso superuser dialogo. Es necesario elegir \"siempre permitir root para esta app\". En caso contrario la regla no puede funcionar en segundo plano.</string>
|
||||
<string name="helpTextRules">Todas las condiciones están \"Y\"-conectadas. La regla solo va a aplicarse cuando todas las condiciones se aplican. Si quiere \"O\", cree otra regla.</string>
|
||||
<string name="helpTextRules">Todas las condiciones están \"Y\"-conectadas. La regla solo va a aplicarse cuando todas las condiciones se aplican. Si quiere \"O\", cree otra regla.\nLos términos desencadenante y condición se utilizan como sinónimos. Todas ellas son condiciones, pero la última en cumplir con su valor requerido podría llamarse disparador porque es la pieza final del rompecabezas para hacer que se ejecute una regla.</string>
|
||||
<string name="timeBetweenNoiseLevelMeasurementsSummary">Segundos entre dos ensayos de nivel de ruido</string>
|
||||
<string name="timeBetweenNoiseLevelMeasurementsTitle">Segundos entre dos ensayos de nivel de ruido</string>
|
||||
<string name="lengthOfNoiseLevelMeasurementsSummary">Duración en segundos para una prueba de nivel de ruido</string>
|
||||
@ -575,7 +584,7 @@
|
||||
<string name="screenLockSoundNotice">Sonidos de bloqueo de pantalla no seran mas cambiados en dispositivos que usan Android 6 o mas nuevos. Cualquier ajuste aqui no va a funcionar en cualquier dirección.</string>
|
||||
<string name="googleLocationChicanery">Este app almacena datos de posición para activar reglas que necesitan la posición o la velocidad - incluso cuando la app esta cerrada o no en uso.</string>
|
||||
<string name="googleLocationChicaneryOld">Este app almacena datos de posición para determinar si actualmente esta en uno de los sitios que creó. Además estan usados para determinar su actual velocidad (si usa esta condición en reglas). Incluso cuando la app esta cerrada o no en uso (pero solo cuando el servicio esta iniciado).</string>
|
||||
<string name="settingsReferringToRestrictedFeatures">Su configuración y/o reglas actualmente referencian caracteristicas no-libres no seran proveidas en la versión F-Droid. Esto incluye determinar su actual actividad fisica.</string>
|
||||
<string name="settingsReferringToRestrictedFeaturesInFdroid">Su configuración y/o reglas actualmente referencian caracteristicas no-libres no seran proveidas en la versión F-Droid. Esto incluye determinar su actual actividad fisica.</string>
|
||||
<string name="filesHaveBeenMovedTo">Automation ahora usa otra ruta para guardar sus archivos. Todos sus archivos de Automation fueron desplazados aqui: \"%s\". El permiso del almacenamiento externo todavia no es necesario; puede revocarlo. Sera eliminado en una futura versión.</string>
|
||||
<string name="newsOptIn">Quiere recibir noticias (solo importantes) en la pantalla principal? Estas serán descargadas de la pagina del desarollador. No habrán notificaciones inoportunas, solo un texto en la pantalla principal cuando abra la app.</string>
|
||||
<string name="filesStoredAt">Config y archivos de log seran guardados en el directorio %1$s. Cliquee en este texto para abrir un administrador de archivos. Desafortunadamente solo funciona en un dispositivo rooted.\n\nPARA OTROS DISP.: Simplemente use el boton para crear un backup.</string>
|
||||
@ -687,7 +696,7 @@
|
||||
<string name="screenIs">pantalla esta %1$s</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="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="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="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="selectParameters">Elije parametros</string>
|
||||
@ -705,8 +714,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="deviceStarts">Dispositivo esta enciendo</string>
|
||||
<string name="serviceStarts">Servicio esta enciendo</string>
|
||||
<string name="deviceHasJustStarted">el dispositivo justamente ha encendido</string>
|
||||
<string name="serviceHasJustStarted">el servicio justamente ha encendido</string>
|
||||
<string name="deviceIsStarting">el dispositivo justamente esta encendido</string>
|
||||
<string name="serviceIsStarting">el servicio justamente esta 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="lockedCommentScreenMustBeOff">Cualquier estado de bloqueo solo se detectará si la pantalla está apagada.</string>
|
||||
<string name="lockedWithSecurity">bloqueado (con PIN, etc.)</string>
|
||||
@ -722,4 +731,71 @@
|
||||
<string name="explanationBroadcastTrigger">La mayoría de los eventos en su teléfono se \"publicado\" transmitiéndolos a través del sistema operativo.\nPor ejemplo, activar / desactivar el modo avión activará dicha transmisión. Esas transmisiones no son automáticamente visibles / audibles, pero si una aplicación (como Automatización) está interesada, puede conectarse a ellas. Cuando ocurran, se le notificará y podrá reaccionar.\n\nPuede definir aquí un evento de difusión para el que la aplicación esperará. Puede ingresarlo manualmente, copiarlo y pegarlo desde algún lugar o elegir uno de la lista de sugerencias. Como este desencadenante está destinado a ser y seguir siendo muy flexible, no puedo proporcionarle explicaciones para los elementos.\n\nLa lista de sugerencias no pretende estar completa. Visite la siguiente URL para echar un vistazo a la documentación de Android.\nTambién cualquier aplicación puede enviar eventos personalizados que no aparecerán en la documentación de Android, por supuesto.\n\nMuchas transmisiones requieren permisos específicos para funcionar. Intento solicitar permisos donde sé que serán necesarios. Si cree que se requiere un permiso para la acción que ingresó, hágamelo saber.\n\nNo recibido significa que no ha habido tal transmisión desde que se inició el servicio. Responder a ciertos parámetros está en desarrollo.</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="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.\n\nPero hay algunos requisitos previos con los que debe lidiar por su cuenta. Google ha hecho que sea muy difícil ejecutar cualquier cosa que no sean aplicaciones normales de Android.\n\n1. El script debe marcarse como ejecutable. En un sistema Android normal (sin root) esta es en realidad la parte difícil.\n\n2. Eso también significa que Automation debe poder ejecutar el archivo, no solo el propietario o el grupo.\n\n3. Si se trata de un script, se especificará un shell válido en el encabezado del script\'s.\n\nSi no puede cumplir con los requisitos anteriores, también puede intentar especificar un shell como el ejecutable real (como /system/bin/sh) y su script como parámetro. Eso ha funcionado para al menos un usuario.</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>
|
||||
<string name="usb">USB</string>
|
||||
<string name="cable">Cable</string>
|
||||
<string name="tetheringBluetoothNotPossible">Actualmente no se puede detectar Bluetooth tethering. Solo los otros tipos de connection van a activar este condición.</string>
|
||||
<string name="type">Tipo</string>
|
||||
<string name="startPhoneCall">Llamar al número de teléfono</string>
|
||||
<string name="android.permission.CALL_PHONE">Llamar al número de teléfono</string>
|
||||
<string name="makePhoneCallExplanation1">Aquí puede ingresar un número de teléfono al que se llamará sin más indicaciones. Puede usar esto para realizar configuraciones como realizar ajustes en el enrutamiento de llamadas, etc. Por favor, busque los códigos necesarios para esto por su cuenta.</string>
|
||||
<string name="endPhoneCall">Terminar llamda de teléfono</string>
|
||||
<string name="android.permission.ANSWER_PHONE_CALLS">Terminar llamda de teléfono</string>
|
||||
<string name="settingsReferringToRestrictedFeaturesInGoogle">La configuración y/o las reglas hacen referencia a funciones que no se pueden proporcionar en la versión de Google Play. Entre otras cosas que incluye todo lo relacionado con llamadas telefónicas y mensajes de texto.</string>
|
||||
<string name="variableCheckStringDeleted">Si la variable %1$s no está establecida</string>
|
||||
<string name="variableCheckString">Si la variable %1$s es %2$s</string>
|
||||
<string name="checkVariableExplanation">Si deja el valor vacío, no se debe establecer la variable para que la condición devuelva true.</string>
|
||||
<string name="checkVariable">Comprobar variable</string>
|
||||
<string name="enterVariableKey">Introduzca una clave para la variable.</string>
|
||||
<string name="setVariableExplanation">Si establece una variable en un valor vacío, se eliminará.</string>
|
||||
<string name="variableValue">Valor variable</string>
|
||||
<string name="VariableKey">Clave variable</string>
|
||||
<string name="deleteVariable">Eliminar variable</string>
|
||||
<string name="setVariable">Establecer una variable</string>
|
||||
<string name="messageType">Tipo de mensaje</string>
|
||||
<string name="sms">SMS</string>
|
||||
<string name="mms">MMS</string>
|
||||
<string name="attachment">Archivo adjunto</string>
|
||||
<string name="chooseFile">elegir archivo</string>
|
||||
<string name="startAppByStartService">via startService()</string>
|
||||
<string name="showToastsForEvents">Mostrar toasts</string>
|
||||
<string name="showToastsForEventsSummary">Mostrar notificaciones del sistema cuando se producen eventos como ejecuciones de reglas</string>
|
||||
<string name="notificationAccessAndroid13">Después de cliquear en Aceptar, seleccione Automatización y, a continuación, seleccione \"Permitir acceso a notificaciones\", luego \"permitir\".\n\nEn algunos sistemas, esta configuración está atenuada. En esos casos, debe ir a \"configuración\" -> \"aplicaciones\" -> \"Automatización\" -> menú de 3 puntos -> Levante estas restricciones. Luego regreso aquí.</string>
|
||||
<string name="displayLanguage">Idioma de visualización</string>
|
||||
<string name="displayLanguageSummary">Establecer un idioma personalizado para la aplicación</string>
|
||||
<string name="wifiMonitoringAlsoRequiresThis">Este permiso también es necesario si el disparador está utilizando la conexión wifi actual.</string>
|
||||
<string name="copyTextToClipboard">Copiar texto al portapapeles</string>
|
||||
<string name="textToCopy">Texto para copiar</string>
|
||||
<string name="android.permission.SYSTEM_ALERT_WINDOW">Dibujar encima otras aplicaciones</string>
|
||||
<string name="overlayPermissionHint">Después de hacer cliquear en Aceptar, se le enviará a un cuadro de diálogo del sistema. Seleccione Automation allí y permita dibujar encima otras aplicaciones.</string>
|
||||
<string name="variablesOnlyForTypes">Las variables solo están disponibles para los tipos de parámetro String y URI</string>
|
||||
<string name="intentParametersHint">Si desea especificar un parámetro, también debe hacer clic en \"Agregar par de intención\". De lo contrario, los cambios no se guardarán.</string>
|
||||
<string name="languagePolish">Polaco</string>
|
||||
<string name="languageChineseChina">Chino (China)</string>
|
||||
</resources>
|
801
app/src/main/res/values-fr/strings.xml
Normal file
@ -0,0 +1,801 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="languageSystemDefault">Valeur par défaut du système</string>
|
||||
<string name="languageEnglish">Anglais</string>
|
||||
<string name="languageGerman">Allemand</string>
|
||||
<string name="languageItalian">Italien</string>
|
||||
<string name="languageSpanish">Espagnol</string>
|
||||
<string name="languageDutch">Néerlandais</string>
|
||||
<string name="languageRussian">Russe</string>
|
||||
<string name="languageFrench">Français</string>
|
||||
<string name="ruleActivate">Activation de la règle %1$s</string>
|
||||
<string name="profileActivate">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 localisations :</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éclencheur.</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="distanceBetween">La distance entre la position GPS et la position du réseau est de %1$d mètres. Cette valeur + 1 m est le rayon absolu minimal.</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="yes">Oui</string>
|
||||
<string name="no">Non</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="whatToDoWithRule">Que faire avec la règle ?</string>
|
||||
<string name="whatToDoWithPoi">Que faire avec la géolocalisation ?</string>
|
||||
<string name="whatToDoWithProfile">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 position 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">(éxécution 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 appareil (< Android 9)\n[latitude] - Latitude de votre appraeil\n[longitude] - Longitude de votre appraeil\n[phonenr] - Numéro des derniers appels entrants ou sortants\n[d] - Jour du mois, @ chiffres commençant par 0\n[m] - Valeur numérique du mois, avec @ chiffres\n[Y] - Valeur numérique de 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 millisecondes\n[notificationTitle] - titre de la dernière notification\n[notificationText] - texte de la dernière notification\n[variable-VARIABLENAME] - Valeur de votre variable définie personnalisée</string>
|
||||
<string name="wifi">wifi</string>
|
||||
<string name="activating">Allumer</string>
|
||||
<string name="deactivating">Éteindre</string>
|
||||
<string name="bluetoothFailed">Échec de l’activation du Bluetooth. Votre appareil a-t-il cette fonction ?</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">entrant</string>
|
||||
<string name="leaving">sortant</string>
|
||||
<string name="noPoisSpecified">Vous n’avez pas précisé de position. 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 position</string>
|
||||
<string name="selectTypeOfAction">Sélectionnez une action</string>
|
||||
<string name="selectSoundProfile">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">Certaines règles se réfèrent toujours à cette position (%1$s). Impossible de la supprimer.</string>
|
||||
<string name="generalSettings">Paramètres généraux</string>
|
||||
<string name="startAtSystemBoot">Lancement au démarrage du système</string>
|
||||
<string name="onOff">Marche/Arrêt</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 silencieux</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 silencieux</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 mouvements 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 cellulaire</string>
|
||||
<string name="cellMastIdleTime">Temps d’inactivité de la tour cellulaire</string>
|
||||
<string name="accelerometerThresholdDescription">Sensibilité pour les mouvement de l’accé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 via GPS [m]</string>
|
||||
<string name="minimumDistanceChangeForNetworkLocationUpdates">Changement de distance minimum pour les mises à jour de la localisation via réseau cellulaire</string>
|
||||
<string name="distanceForNetworkUpdate">Distance pour la mise à jour via 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. Pour un lien logique OU, créez une autre règle.\nLes termes déclencheur et condition sont utilisés comme synonymes. Toutes sont des conditions, mais la dernière à atteindre sa valeur requise pourrait être appelée déclencheur car c\'est la dernière pièce du puzzle pour provoquer l\'exécution d\'une 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 avec pour déclencheur \« dans la période xyz \» qui modifie votre profil audio en le passant en mode vibreur cela ne signifie pas que votre téléphone repassera automatiquement en mode sonnerie à la fin de la période. Si vous souhaitez le faire vous devez définir une autre règle avec une autre période.</string>
|
||||
<string name="helpTextSound">Sur l’écran principal vous pouvez utiliser le verrouillage des modifications audio pour temporairement ne pas utiliser les règles de changement des paramètres audio. Par exemple vous pouvez êtes dans un lieu où à un moment où les sonneries peuvent être dérangeantes. Cette fonctionnalité se désactivera automatiquement une fois le temps configuré écoulé. Appuyez sur le bouton + 15 min pour ajouter la durée souhaitée. Une fois activé vous pouvez le désactiver en appuyant sur le bouton \« OUI \» (la règle de gestion des paramètres audio sera de nouveau active).</string>
|
||||
<string name="toggableRules">Inverser la règle</string>
|
||||
<string name="helpTextToggable">Les règles ont une option appelée \« Inversion \». Si une règle est exécutée et que les mêmes déclencheurs s’appliquent à nouveau, la règle sera exécutée dans le sens opposé. Pour l’instant, cela n’est possible qu\'avec les étiquettes NFC : si vous les touchez deux fois et que l’option est activée, cela fera l’inverse des actions demandées. 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). Cela 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 marques d’appareils Android essaient d’économiser en limitant les activités des applications en arrière-plan. Malheureusement cela signifie souvent ques ces applications ne fonctionnent pas correctement, Automation en fait partie. Consultez cette <a href="https://dontkillmyapp.com/">page web</a> pour savoir comment exclure Automation de ces restrictions.</string>
|
||||
<string name="speedMaximumTimeBetweenLocations">Durée maximale entre 2 positions pour la 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 verbosité (1 = minimum, 5 = maximum)</string>
|
||||
<string name="logLevelTitle">Niveau de log</string>
|
||||
<string name="ruleActive">Règle active</string>
|
||||
<string name="triggerPointOfInterest">Position</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">éteindre le Wifi</string>
|
||||
<string name="actionTurnBluetoothOn">allumer le Bluetooth</string>
|
||||
<string name="actionTurnBluetoothOff">éteindre le Bluetooth</string>
|
||||
<string name="actionTriggerUrl">Atteindre une URL</string>
|
||||
<string name="actionChangeSoundProfile">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">Position active :</string>
|
||||
<string name="closestPoi">Position la plus proche :</string>
|
||||
<string name="overview">Aperçu</string>
|
||||
<string name="poi">Position</string>
|
||||
<string name="pois">Positions</string>
|
||||
<string name="helpTextPoi">Une position est définie par des coordonnées GPS et un rayon. La géolocalisation par les antennes relais téléphoniques est plutôt imprécise (mais rapide et peu gourmande en données) ne définissez pas un rayon trop petit. L’application vous indiquera un rayon minimal lors de la création d’une position.</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 basées sur des déclencheurs, par exemple si vous êtes dans un endroit précis ou à une certaine heure. Une fois cela fait, cliquez sur le bouton Marche/Arrêt de l’écran principal.</string>
|
||||
<string name="failedToTriggerBluetooth">Impossible de lancer le Bluetooth. Votre appareil a-t’il le Bluetooth ?</string>
|
||||
<string name="startServiceAfterAppUpdate">Redémarrer le service après une mise à jour si l’application était en fonctionnement.</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="starting">démarrer</string>
|
||||
<string name="stopping">arrêter</string>
|
||||
<string name="connecting">connexion</string>
|
||||
<string name="disconnecting">déconnexion</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">Accepter tous les certificats</string>
|
||||
<string name="httpAcceptAllCertificatesSummary">Ignorer le contrôle de validité des certificats SSL (non recommandé)</string>
|
||||
<string name="httpAttemptsSummary">Nombre d’essais si problèmes de connectivité des requêtes HTTP</string>
|
||||
<string name="httpAttemptsTitle">Nombre d’essais HTTP</string>
|
||||
<string name="httpAttemptsTimeoutSummary">Délai d’expiration des requêtes HTTP</string>
|
||||
<string name="httpAttemptsTimeoutTitle">Délai d’expiration [sec]</string>
|
||||
<string name="httpAttemptGapSummary">Délai avant le prochain essai [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="timeoutForGpsComparisonsTitle">Délai d’expiration GPS [sec]</string>
|
||||
<string name="timeoutForGpsComparisonsSummary">Durée maximale en secondes de comparaison des positions GPS. Si le délai est dépassé, la dernière position connue sera utilisée.</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 position 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">Sélectionnez une application</string>
|
||||
<string name="selectPackageOfApplication">Sélectionnez le paquet de l’application</string>
|
||||
<string name="selectActivityToBeStarted">Sélectionnez 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="processes">Processus</string>
|
||||
<string name="processMonitoring">Surveillance des processus</string>
|
||||
<string name="settings">Réglages</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="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 positive sans décimale.</string>
|
||||
<string name="moveUp">Monter</string>
|
||||
<string name="moveDown">Déscendre</string>
|
||||
<string name="cantMoveUp">Impossible de déplacer l’élément en haut. Il est déjà tout en haut.</string>
|
||||
<string name="cantMoveDown">Impossible de déplacer l’élément en bas. Il est déjà tout en bas.</string>
|
||||
<string name="airplaneMode">Mode avion</string>
|
||||
<string name="activate">Activation</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="addIntentValue">Ajouter un Intent pair</string>
|
||||
<string name="parameterName">Nom du paramètre</string>
|
||||
<string name="parameterValue">Valeur du paramètre</string>
|
||||
<string name="parameterType">Type de paramètre</string>
|
||||
<string name="selectTypeOfIntentPair">Sélectionner le type d’intent pair.</string>
|
||||
<string name="enterNameForIntentPair">Saisissez un nom pour l’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 la liste des applications...</string>
|
||||
<string name="timeFrameWhichDays">Quels jours ?</string>
|
||||
<string name="insideOrOutsideTimeFrames">Dans ou hors du délai ?</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">activée</string>
|
||||
<string name="deactivated">désactivée</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="enterPhoneNumberBlankForAny">Saisissez un numéro de téléphone. Laissez vide pour n’importe quel numéro.</string>
|
||||
<string name="enterPhoneNumber">Entrez le numéro de téléphone.</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 appareil n’ai pas de NFC.</string>
|
||||
<string name="nfcReadTag">Lire l’identité depuis le étiquette</string>
|
||||
<string name="nfcWriteTag">Écrire l’étiquette</string>
|
||||
<string name="nfcEnterValidIdentifier">Saisissez un identifiant valide pour l’étiquette (comme \« Porte d’entrée \»).</string>
|
||||
<string name="nfcTagWrittenSuccessfully">Succès d’écriture d’étiquette.</string>
|
||||
<string name="nfcTagWriteError">Erreur d’écriture de l’étiquette. Est-elle à portée ?</string>
|
||||
<string name="nfcTagDiscovered">Étiquette trouvée.</string>
|
||||
<string name="nfcBringTagIntoRange">Étiquette NFC à portée.</string>
|
||||
<string name="nfcTagFoundWithText">Étiquette trouvée :</string>
|
||||
<string name="nfcUnsupportedEncoding">Codage non pris en charge :</string>
|
||||
<string name="nfcNoNdefIntentBut">Aucun NFC NDEF atteint, mais</string>
|
||||
<string name="nfcNotSupportedInThisAndroidVersionYet">NFC non pris en charge dans cette version Android.</string>
|
||||
<string name="cantRunRule">Impossible d’éxécuter les règles.</string>
|
||||
<string name="nfcApplyTagToRule">Affecter l’étiquette à la règle</string>
|
||||
<string name="nfcTagReadSuccessfully">Succès de lecture de l’étiquette.</string>
|
||||
<string name="nfcValueNotSuitable">Valeur stockée erronée.</string>
|
||||
<string name="nfcNoTag">Aucune étiquette présente.</string>
|
||||
<string name="newNfcId">Écriture d’une nouvelle identité NFC</string>
|
||||
<string name="useExistingTag">Utilisation d’une étiquette NFC existante</string>
|
||||
<string name="newId">Nouvelle identité :</string>
|
||||
<string name="currentId">Identité actuelle :</string>
|
||||
<string name="nfcTagDataNotUsable">Données de l’étiquette inutilisable, écrivez en une nouvelle.</string>
|
||||
<string name="nfcBringTagIntoRangeToRead">Approcher une étiquette pour la lire.</string>
|
||||
<string name="toggleRule">Changer de règle</string>
|
||||
<string name="toggling">Changement</string>
|
||||
<string name="toggle">changer</string>
|
||||
<string name="overlapBetweenPois">Chevauchement avec position %1$s de %2$s mètres. Réduisez le rayon.</string>
|
||||
<string name="none">aucun</string>
|
||||
<string name="anyLocation">n’importe quelle position</string>
|
||||
<string name="invalidPoiName">Nom invalide pour une position.</string>
|
||||
<string name="eraseSettings">Effacer les réglages</string>
|
||||
<string name="defaultSettings">Réglages par défaut</string>
|
||||
<string name="areYouSure">Confirmez-vous cette action ?</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 habitacle</string>
|
||||
<string name="detectedActivityOnBicycle">À 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="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 prises en compte.</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ées sur un déclencheur NFC.</string>
|
||||
<string name="errorReadingPoisAndRulesFromFile">Erreur de lecture des positions et règles depuis le fichier.</string>
|
||||
<string name="noDataChangedReadingAnyway">Les modifications n’ont pas éte enregistrées. Cependant, il peut y avoir eu des changements dans la mémoire qui doit être rechargée. 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="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="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="whatsThis">Qu’est ce que c’est ?</string>
|
||||
<string name="privacyLocationingTitle">Géolocalisation privée uniquement</string>
|
||||
<string name="privacyLocationingSummary">Empêcher les méthodes de géolocalisation de transmettre 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="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 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="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="addProfile">Ajouter un profil</string>
|
||||
<string name="profile">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 et 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 verouillage/déverrouillage de l’écran</string>
|
||||
<string name="vibrateWhenRinging">Sonnerie et vibration</string>
|
||||
<string name="profiles">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="noChangeSelectedProfileDoesntMakeSense">Pas de changement sélectionné. Le profil n’a pas de sens.</string>
|
||||
<string name="noProfilesCreateOneFirst">Aucun profil audio dans votre configuration. Créez en un.</string>
|
||||
<string name="errorActivatingProfile">Erreur d’activation du profil:</string>
|
||||
<string name="anotherProfileByThatName">Un profil portant le même nom existe déjà.</string>
|
||||
<string name="invalidProfileName">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’Android 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 pour 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="noProfileChangeSoundLocked">Le profil ne sera pas activé. Le dernier profil actif est verrouillé.</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 (Voir 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="rootExplanation">Vous devez rooter 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. Pour 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 \», pour 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 \« continuer \» 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ègles.</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="logFileMaxSizeSummary">Taille maximum du journal en Mégabyte.</string>
|
||||
<string name="logFileMaxSizeTitle">Taille maximum du journal [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="profileXrequiresThis">Le profil \« %1$s \» requiert.</string>
|
||||
<string name="helpTextActivityDetection">Cette fonctionnalité peut détecter si vous êtes actuellement en déplacement, à 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 votre téléphone est rooté cela fonctionnera toujours. Sinon, j’ai bien peur que cela n’ai plus d’effet.</string>
|
||||
<string name="messageNotShownAgain">Ce message ne sera plus affiché.</string>
|
||||
<string name="chooseActivityHint">Dans cette dernière fenêtre 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">Modifier</string>
|
||||
<string name="clickAndHoldForOptions">Cliquez et maintenez un élément pour les options.</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, ainsi que les 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">Active la luminosité automatique</string>
|
||||
<string name="apply">appliquer</string>
|
||||
<string name="brightnessAuto">luminosité automatique</string>
|
||||
<string name="brightnessManual">luminosité manuelle</string>
|
||||
<string name="autoBrightnessNotice">Si la luminosité automatique est activée, la valeur ci-dessous aura peu d’importance.</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="executeRulesAndProfilesWithSingleClickTitle">Lancer les règles/profils d’un seul clic.</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 trouver dans un lieu que vous avez enregistré. 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 positions</string>
|
||||
<string name="error">Erreur</string>
|
||||
<string name="featureNotInFdroidVersion">Cette fonctionnalité est basée sur un logiciel non libre, elle n’est donc pas disponible dans la version F-Droid.</string>
|
||||
<string name="settingsReferringToRestrictedFeaturesInFdroid">Vos réglages et/ou règles font référence à des fonctionnalités non libres 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éplacés ici : \« %s \». L’autorisation d’accès au stockage externe n’est plus requise; vous pouvez la révoquer. Elle sera supprimée 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. cľ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 le développement ne le sont pas. \\n\\nLorsque vous développez une application, vous pouvez essayer d’obtenir l’autorisation à 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 contrairement à ce qu’affirme le support de développement merdique de Google. Après leur avoir donné la preuve que je l’avais fait, j’ai reçu une réponse du type : \« 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 est disponible sur F-Droid. C’est un magasin d’applications qui se soucie vraiment de votre vie privée – plutôt que de simplement se promouvoir 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. À défaut, 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 sensible à 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. De même, 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’installé.</string>
|
||||
<string name="shareConfigAndLogFilesWithDev">Joindre les fichiers de configuration et les journaux.</string>
|
||||
<string name="shareConfigAndLogExplanation">Cela enverra email avec votre configuration et les fichiers journaux attachés en fichier zip. Il ne sera pas envoyé automatiquement, vous devrez 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 est 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, je recommande 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 positions ont été importées avec succès.</string>
|
||||
<string name="rulesImportError">Une erreur est survenue lors de l’import des règles et positions.</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="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">Position trouvée. Le rayon minimum suggéré pour cette position 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 permettre à Automation d’accéder à votre position en arrière-plan.</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 ajouter 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 la précède.</string>
|
||||
<string name="pleaseEnterValidVibrationPattern">Veuillez entrer un rythme 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 le mode 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, sans 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">éteindre 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 à 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="profileActive">le profil %1$s est actif</string>
|
||||
<string name="profileNotActive">le profil %1$s n’est plus actif</string>
|
||||
<string name="profileTriggerCheckSettings">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="ruleXIsUsingProfileY">Impossible de supprimer ce profil. La règle %1$s fait référence au profil %2$s.</string>
|
||||
<string name="profileCouldNotBeDeleted">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="profileWasNotFound">Le profil utilisé 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="profileWarning">Les paramètres que vous pouvez régler ici affectent 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. Des questions multiples peuvent ne 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 musique 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és d’Android 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="lastProfile">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 & 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 se veut pas exhaustive, 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="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">verrouiller (balayez l’écran, pas de code PIN)</string>
|
||||
<string name="lockedWithSecurity">verrouiller (avec un code PIN, etc.)</string>
|
||||
<string name="lockedCommentScreenMustBeOff">Les états de verrouillage ne sont détectés que si l’écran est éteint.</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.\n\nMais il existe certaines conditions préalables que vous devez gérer vous-même. Google a rendu très difficile l’exécution d’autres éléments que des applications Android ordinaires.\n\n1. Le script doit être marqué comme exécutable. Sur un système Android normal (sans root), c’est en fait la partie la plus difficile.\n\n2. Cela signifie également qu’Automation doit être en mesure d’exécuter le fichier, pas seulement le propriétaire ou le groupe. Pour un script, un shell valide doit être spécifié dans l’en-tête du script..\n\nSi vous ne pouvez pas répondre aux exigences ci-dessus, vous pouvez également essayer de spécifier un shell comme exécutable réel (comme /system/bin/sh) et votre script comme paramètre. Cela a fonctionné pour au moins un utilisateur.</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="usb">USB</string>
|
||||
<string name="type">Type</string>
|
||||
<string name="cable">Cable</string>
|
||||
<string name="tetheringBluetoothNotPossible">Le partage de connexion Bluetooth ne peut actuellement pas être détecté. Seuls les autres moyens de connexion activeront ce déclencheur.</string>
|
||||
<string name="startPhoneCall">Numéro de téléphone d’appel</string>
|
||||
<string name="android.permission.CALL_PHONE">Numéro de téléphone d’appel</string>
|
||||
<string name="makePhoneCallExplanation1">Ici, vous pouvez entrer un numéro de téléphone qui sera appelé sans autres commandes. Vous pouvez l’utiliser pour effectuer des réglages tels que des ajustements au routage des appels, etc… Veuillez rechercher vous-même les codes requis pour cela.</string>
|
||||
<string name="endPhoneCall">Mettre fin à l’appel téléphonique</string>
|
||||
<string name="android.permission.ANSWER_PHONE_CALLS">Mettre fin à l’appel téléphonique</string>
|
||||
<string name="settingsReferringToRestrictedFeaturesInGoogle">Vos paramètres et/ou règles font actuellement référence à des fonctionnalités qui ne peuvent pas être fournies dans la version Google Play. Cela inclut, entre autres, tout ce qui concerne les appels téléphoniques et les messages textuels.</string>
|
||||
<string name="variableCheckStringDeleted">si la variable %1$s n’est pas définie</string>
|
||||
<string name="variableCheckString">si la variable %1$s est %2$s</string>
|
||||
<string name="checkVariableExplanation">Si vous laissez la valeur vide, la variable ne doit pas être définie pour que la condition renvoie la valeur true.</string>
|
||||
<string name="checkVariable">Vérifier la variable</string>
|
||||
<string name="enterVariableKey">Entrez une clé pour la variable.</string>
|
||||
<string name="setVariableExplanation">Si vous définissez une variable sur une valeur vide, elle sera supprimée.</string>
|
||||
<string name="variableValue">Valeur variable</string>
|
||||
<string name="VariableKey">Clé variable</string>
|
||||
<string name="deleteVariable">Supprimer la variable</string>
|
||||
<string name="setVariable">Définir une variable</string>
|
||||
<string name="messageType">Type de message</string>
|
||||
<string name="sms">SMS</string>
|
||||
<string name="mms">MMS</string>
|
||||
<string name="attachment">Attachement</string>
|
||||
<string name="chooseFile">Choisissez un fichier</string>
|
||||
<string name="startAppByStartService">via startService()</string>
|
||||
<string name="showToastsForEvents">Afficher les toasts</string>
|
||||
<string name="showToastsForEventsSummary">Afficher les toasts lorsque des événements tels que des exécutions de règles se produisent</string>
|
||||
<string name="notificationAccessAndroid13">Après avoir cliqué sur OK, sélectionnez Automatisation, puis sélectionnez \"Autoriser l\'accès aux notifications\ », puis \"Autoriser\ ».\n\nSur certains systèmes, ce paramètre est grisé. Dans ces cas, vous devez aller dans \"settings\ » -> \"apps\ » -> \"Automation\ » -> 3-dots-menu -> Levez ces restrictions. Ensuite, revenez ici.</string>
|
||||
<string name="displayLanguage">Langue d\'affichage</string>
|
||||
<string name="displayLanguageSummary">Définir une langue personnalisée pour l\'application</string>
|
||||
<string name="wifiMonitoringAlsoRequiresThis">Cette autorisation est également requise si le déclencheur utilise la connexion wifi actuelle.</string>
|
||||
<string name="copyTextToClipboard">Copier du texte dans le presse-papiers</string>
|
||||
<string name="textToCopy">Texte à copier</string>
|
||||
<string name="android.permission.SYSTEM_ALERT_WINDOW">Dessiner sur d\'autres applications</string>
|
||||
<string name="overlayPermissionHint">Après avoir cliqué sur OK, vous serez redirigé vers une boîte de dialogue système. Veuillez sélectionner Automatisation et autoriser le tirage sur d\'autres applications.</string>
|
||||
<string name="variablesOnlyForTypes">Les variables ne sont disponibles que pour les types de paramètres String et URI</string>
|
||||
<string name="intentParametersHint">Si vous souhaitez spécifier un paramètre, vous devez également cliquer sur « Ajouter une paire d\'intentions ». Sinon, vos modifications ne seront pas enregistrées.</string>
|
||||
<string name="languagePolish">Polonais</string>
|
||||
<string name="languageChineseChina">Chinois (Chine)</string>
|
||||
</resources>
|
@ -90,7 +90,7 @@
|
||||
<string name="anotherProfileByThatName">Nome già usato per un altro profilo.</string>
|
||||
<string name="anotherRuleByThatName">Nome già usato per un\'altra regola.</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="anyLocation">qualsiasi posizione</string>
|
||||
<string name="anyNumber">qualsiasi numero</string>
|
||||
@ -179,7 +179,8 @@
|
||||
<string name="enterAname">Inserisci un nome.</string>
|
||||
<string name="enterNameForIntentPair">Definisci un nome per la coppia dell\'Intent</string>
|
||||
<string name="enterPackageName">Inserisci un nome di pacchetto che sia valido.</string>
|
||||
<string name="enterPhoneNumber">Inserisci un numero di telefono. Lascia vuoto per accettare qualsiasi numero.</string>
|
||||
<string name="enterPhoneNumberBlankForAny">Inserisci un numero di telefono. Lascia vuoto per accettare qualsiasi numero.</string>
|
||||
<string name="enterPhoneNumber">Inserisci un numero di telefono.</string>
|
||||
<string name="enterValidAction">Inserisci una azione valida</string>
|
||||
<string name="enterValidReferenceValue">Inserisci un valore di riferimento valido.</string>
|
||||
<string name="enterValueForIntentPair">Definisci un valore per la coppia dell\'Intent.</string>
|
||||
@ -227,7 +228,7 @@
|
||||
<string name="helpTextEnergySaving">Molti produttori di dispositive Android cercano di salvare energia limitando le attività di applicazioni eseguite in secondo piano. Sfortunatamente, questo spesso fa che tali applicazioni non funzionino correttamente e Automation è fra queste. Puoi leggere questa <a href="https://dontkillmyapp.com/">pagina web</a> per scoprire come escludere Automation da queste funzioni di risparmio energetico.</string>
|
||||
<string name="helpTextPoi">Una posizione è composta da coordinate GPS ed un raggio d\'azione. Dato che il posizionamento realizzato tramite i ripetitori del tuo gestore è piuttosto impreciso (ma veloce e consuma poca batteria), è bene non specificare un raggio troppo piccolo. L\'applicazione suggerisce un raggio minimo quando si crea una nuova posizione.</string>
|
||||
<string name="helpTextProcessMonitoring">Se si specifica una regola che controlli l\'esecuzione di un processo, Automation eseguirà la verifica ogni x secondi (con x selezionabile nelle impostazioni). Bisogna considerare che un monitoraggio costante provocherebbe un rapido esaurimento della batteria e non esistono notifiche di questo tipo di attività proviste dal sistema operativo.</string>
|
||||
<string name="helpTextRules">Gli eventi di attivazione sono in AND logico. La regola sarà eseguita solo se tutti gli eventi sono soddisfatti. Per l\'OR logico basta creare un\'altra regola.</string>
|
||||
<string name="helpTextRules">Gli eventi di attivazione sono in AND logico. La regola sarà eseguita solo se tutti gli eventi sono soddisfatti. Per l\'OR logico basta creare un\'altra regola.\nI termini trigger e condizione vengono utilizzati come sinonimi. Tutte sono condizioni, ma l\'ultima a soddisfare il valore richiesto potrebbe essere chiamata trigger perché è il pezzo finale del puzzle per causare l\'esecuzione di una regola.</string>
|
||||
<string name="helpTextSound">Nello schermo principale puoi bloccare temporaneamente i cambi ai suoni per evitare l\'esecuzione di regole che facciano cambi alle attività sonore. Per esempio, potresti essere in una situatione o in un luogo dove normalmente ascoltare il suono di una suoneria è ok, ma in questa occasione bisognerebbe evitarlo. Questa funzione si disattiverà automaticamente non appena sia trascorso il tempo selezionato. Fai Click sul bottone + per raggiungere la quantità di tempo desiderata. Una volta attiva, questa si può disattivare nuovamente usando il pulsante di attivazione (e in questo modo, si riattiveranno le regole basate su cambi sonori).</string>
|
||||
<string name="helpTextTimeFrame">Se si specifica una regola con un intervallo temporale si hanno due scelte. È possibile scegliere se si desidera attivare la regola all\'interno o all\'esterno dell\'intervallo di tempo. In entrambi i casi l\'azione verrà eseguita una sola volta. Quindi, se si crea una regola che imposta il profilo su vibrazione nell\'intervallo temporale xyz, il telefono, passato allo stato vibrazione, rimarrà definitivamente in tale stato anche dopo lo scadere dell\'intervallo di tempo. Se si desidera che ciò avvenga è necessario specificare un\'altra regola con un altro periodo di tempo.</string>
|
||||
<string name="helpTextToggable">Le regole hanno un segno di spunta chiamato "Reversibile". Ciò significa che, se una regola viene eseguita al verificarsi di un evento e poi quest\'ultimo si verifica una seconda volta, il comando della regola verrà eseguito una ulteriore volta in modalità inversa, se possibile. Attualmente questo avverrà solo in combinazione con etichette NFC. Se le si tocca due volte la regola associata invertirà la situazione attuale. Per esempio una regola “Reversibile” può disattivare il WiFi se attivo e viceversa attivarlo se non attivo.</string>
|
||||
@ -395,6 +396,14 @@
|
||||
<string name="roaming">Roaming</string>
|
||||
<string name="rootExplanation">È necessario avere i permessi di root per utilizzare questa funzione. Una volta abilitato l\'accesso root, dovrai \"eseguire la regola manualmente\" per attivare la richiesta di autorizzazione come superuser. Nella finestra di popup di superuser, bisognerà consentire sempre l\'esecuzione dell\'applicazione con questi permessi. In caso contrario, la regola non potrà funzionare quando il telefono è inattivo.</string>
|
||||
<string name="rule">Regola</string>
|
||||
<string name="languageSystemDefault">Impostazione predefinita del sistema</string>
|
||||
<string name="languageEnglish">Inglese</string>
|
||||
<string name="languageGerman">Tedesco</string>
|
||||
<string name="languageItalian">Italiano</string>
|
||||
<string name="languageSpanish">Spagnolo</string>
|
||||
<string name="languageDutch">Olandese</string>
|
||||
<string name="languageRussian">Russo</string>
|
||||
<string name="languageFrench">Francese</string>
|
||||
<string name="ruleActivate">Attivando la regola %1$s</string>
|
||||
<string name="ruleActivateToggle">Attivando la regola %1$s in modalità reversibile</string>
|
||||
<string name="ruleActive">Regola attiva</string>
|
||||
@ -452,7 +461,7 @@
|
||||
<string name="settingsCategoryNoiseLevelMeasurements">Misura del livello di rumore</string>
|
||||
<string name="settingsCategoryProcessMonitoring">Monitoraggio del processo</string>
|
||||
<string name="settingsErased">Impostazioni cancellate.</string>
|
||||
<string name="settingsReferringToRestrictedFeatures">Le tue impostazioni e/o regole si riferiscono attualmente a funzioni non coperte da una licenza aperta e che pertanto non possono essere fornite nella versione F-Droid. Questo include il rilevamento della tua attuale attività fisica.</string>
|
||||
<string name="settingsReferringToRestrictedFeaturesInFdroid">Le tue impostazioni e/o regole si riferiscono attualmente a funzioni non coperte da una licenza aperta e che pertanto non possono essere fornite nella versione F-Droid. Questo include il rilevamento della tua attuale attività fisica.</string>
|
||||
<string name="settingsSetToDefault">Impostazioni predefinite ripristinate.</string>
|
||||
<string name="settingsWillTakeTime">Alcune impostazioni non saranno applicate prima che alcune impostazioni contestuali cambino o che il servizio venga riavviato.</string>
|
||||
<string name="shareConfigAndLogExplanation">Questo creerà una email con la tua configurazione e i file di log allegati come file zip. Non sarà inviata automaticamente, dovrai premere \"invia\". Puoi anche cambiare il destinatario con te stesso, per esempio.</string>
|
||||
@ -533,7 +542,7 @@
|
||||
<string name="tuesday">Martedì</string>
|
||||
<string name="unknownError">Errore indeterminato.</string>
|
||||
<string name="until">finchè</string>
|
||||
<string name="urlLegend">Variabili:\n È possibile utilizzare le seguenti variabili. Quando attivate, saranno sostituite con il valore corrispondente sul tuo dispositivo. Includi le parentesi nel tuo testo.\n\n[uniqueid] - L\'ID unico del tuo dispositivo\n[serialnr] - Il numero di serie del tuo dispositivio (< Android 9)\n[latitude] - La latitudine del tuo dispositivo\n[longitude] - La longitudine del tuo dispositivo\n[phonenr] - Numero dell\'ultima chiamata (entrante o uscente)\n[d] - Il giorno del mese, sempre 2 cifre con zero iniziale \n[m] - Mese in formato numerico, sempre 2 cifre con zero iniziale \n[Y] - L\’anno, sempre con 4 cifre\n[h] - Ore in formato 12 ore, sempre 2 cifre con due punti\n[H] - Ore in formato 24 ore, sempre 2 cifre con due punti\n[i] - Minuti, sempre 2 cifre\n[s] - Secondi, sempre 2 cifre\n[ms] - millisecondi, sempre 3 cifre\n[notificationTitle] - titolo dell\'ultima notifica\n[notificationText] - testo dell\'ultima notifica</string>
|
||||
<string name="urlLegend">Variabili:\n È possibile utilizzare le seguenti variabili. Quando attivate, saranno sostituite con il valore corrispondente sul tuo dispositivo. Includi le parentesi nel tuo testo.\n\n[uniqueid] - L\'ID unico del tuo dispositivo\n[serialnr] - Il numero di serie del tuo dispositivio (< Android 9)\n[latitude] - La latitudine del tuo dispositivo\n[longitude] - La longitudine del tuo dispositivo\n[phonenr] - Numero dell\'ultima chiamata (entrante o uscente)\n[d] - Il giorno del mese, sempre 2 cifre con zero iniziale \n[m] - Mese in formato numerico, sempre 2 cifre con zero iniziale \n[Y] - L\’anno, sempre con 4 cifre\n[h] - Ore in formato 12 ore, sempre 2 cifre con due punti\n[H] - Ore in formato 24 ore, sempre 2 cifre con due punti\n[i] - Minuti, sempre 2 cifre\n[s] - Secondi, sempre 2 cifre\n[ms] - millisecondi, sempre 3 cifre\n[notificationTitle] - titolo dell\'ultima notifica\n[notificationText] - testo dell\'ultima notifica\n[variable-VARIABLENAME] - Il valore della variabile definita in modo personalizzato</string>
|
||||
<string name="urlToTrigger">URL da caricare:</string>
|
||||
<string name="urlTooShort">L\'url deve avere almeno 10 caratteri.</string>
|
||||
<string name="usbTetheringFailForAboveGingerbread">Questo molto probabilmente non funzionerà dato che sei su una versione superiore ad Android 2.3. Tuttavia è possibile utilizzare la connessione wifi tethering per attivare la regola.</string>
|
||||
@ -689,7 +698,7 @@
|
||||
<string name="screenIs">lo schermo è %1$s</string>
|
||||
<string name="sendEmailToDev">Invia email allo sviluppatore</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ù.</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="musicPlaying">La musica è in riproduzione</string>
|
||||
<string name="musicIsPlaying">la musica è in riproduzione</string>
|
||||
<string name="musicIsNotPlaying">la musica non viene riprodotta</string>
|
||||
@ -706,8 +715,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="deviceStarts">Device starts</string>
|
||||
<string name="serviceStarts">Avvio del servizio</string>
|
||||
<string name="deviceHasJustStarted">il dispositivo è appena stato avviato</string>
|
||||
<string name="serviceHasJustStarted">il servizio è appena stato avviato</string>
|
||||
<string name="deviceIsStarting">Il dispositivo si sta avviando</string>
|
||||
<string name="serviceIsStarting">il servizio è in fase di avvio</string>
|
||||
<string name="broadcastReceived">broadcast ricevuto</string>
|
||||
<string name="broadcastNotReceived">broadcast non ricevuto</string>
|
||||
<string name="broadcastReceivedTitle">Broadcast ricevuto</string>
|
||||
@ -736,5 +745,58 @@
|
||||
<string name="tetheringState">Stato del tethering</string>
|
||||
<string name="wifiExplanation2">Quando la modalità aereo è attiva, lo stato del wifi può essere commutato soltanto da applicazioni che usano i permessi di root.</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">È possibile selezionare uno script o un file eseguibile qui che verrà eseguito come azione.\n\nMa ci sono alcuni prerequisiti che è necessario gestire da soli. Google ha reso molto difficile l\'esecuzione di qualcosa di diverso dalle normali applicazioni Android.\n\n1. Lo script deve essere contrassegnato come eseguibile. Su un normale sistema Android (senza root) questa è in realtà la parte difficile.\n\n2. Ciò significa anche che Automation deve essere in grado di eseguire il file, non solo il proprietario o il gruppo.\n\n3. Se si tratta di uno script, è possibile specificare una shell valida nell\'intestazione dello script.\n\nSe non è possibile soddisfare i requisiti di cui sopra, in alternativa si può provare a specificare una shell come eseguibile effettivo (come /system/bin/sh) e lo script come parametro. Questo ha funzionato per almeno un utente.</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>
|
||||
<string name="usb">USB</string>
|
||||
<string name="cable">Cavo</string>
|
||||
<string name="tetheringBluetoothNotPossible">Il tethering Bluetooth al momento non può essere rilevato. Solo gli altri mezzi di connessione attiveranno questo trigger.</string>
|
||||
<string name="type">Digitare</string>
|
||||
<string name="startPhoneCall">Chiama il numero di telefono</string>
|
||||
<string name="android.permission.CALL_PHONE">Chiama il numero di telefono</string>
|
||||
<string name="makePhoneCallExplanation1">Qui è possibile inserire un numero di telefono che verrà chiamato senza ulteriori richieste. È possibile utilizzarlo per effettuare impostazioni come apportare modifiche al routing delle chiamate, ecc. Si prega di cercare i codici richiesti per questo da soli.</string>
|
||||
<string name="android.permission.ANSWER_PHONE_CALLS">Termina telefonata</string>
|
||||
<string name="endPhoneCall">Termina telefonata</string>
|
||||
<string name="settingsReferringToRestrictedFeaturesInGoogle">Le tue impostazioni e/o regole fanno attualmente riferimento a funzioni che non possono essere fornite nella versione di Google Play. Tra le altre cose che include tutto ciò che riguarda le telefonate e i messaggi di testo.</string>
|
||||
<string name="setVariable">Impostare una variabile</string>
|
||||
<string name="deleteVariable">Elimina variabile</string>
|
||||
<string name="VariableKey">Chiave variabile</string>
|
||||
<string name="variableValue">Valore variabile</string>
|
||||
<string name="setVariableExplanation">Se si imposta una variabile su un valore vuoto, questa verrà eliminata.</string>
|
||||
<string name="enterVariableKey">Immettere una chiave per la variabile.</string>
|
||||
<string name="checkVariable">Controlla variabile</string>
|
||||
<string name="checkVariableExplanation">Se si lascia vuoto il valore, la variabile non deve essere impostata affinché la condizione restituisca true.</string>
|
||||
<string name="variableCheckString">Se la variabile %1$s è %2$s</string>
|
||||
<string name="variableCheckStringDeleted">Se la variabile %1$s non è impostata</string>
|
||||
<string name="messageType">Tipo di messaggio</string>
|
||||
<string name="sms">SMS</string>
|
||||
<string name="mms">MMS</string>
|
||||
<string name="attachment">Allegato</string>
|
||||
<string name="chooseFile">Scegli file</string>
|
||||
<string name="startAppByStartService">tramite startService()</string>
|
||||
<string name="showToastsForEvents">Mostra toast</string>
|
||||
<string name="showToastsForEventsSummary">Mostrare gli avvisi popup quando si verificano eventi come le esecuzioni di regole</string>
|
||||
<string name="notificationAccessAndroid13">Dopo aver fatto clic su OK, selezionare Automazione, quindi selezionare \"Consenti accesso notifiche\", quindi \"consentire\".\n\nSu alcuni sistemi questa impostazione è disattivata. In questi casi è necessario andare su \"impostazioni\" -> \"app\" -> \"Automazione\" -> menu a 3 punti -> Revoca queste restrizioni. Successivamente ritorno qui.</string>
|
||||
<string name="displayLanguage">Lingua di visualizzazione</string>
|
||||
<string name="displayLanguageSummary">Set a custom language for the application</string>
|
||||
<string name="wifiMonitoringAlsoRequiresThis">Questa autorizzazione è necessaria anche se il trigger utilizza la connessione wifi corrente.</string>
|
||||
<string name="copyTextToClipboard">Copiare testo negli appunti</string>
|
||||
<string name="textToCopy">Testo da copiare</string>
|
||||
<string name="android.permission.SYSTEM_ALERT_WINDOW">Disegna su altre app</string>
|
||||
<string name="overlayPermissionHint">Dopo aver fatto clic su OK, verrai indirizzato a una finestra di dialogo di sistema. Seleziona Automazione lì e consenti il disegno su altre app.</string>
|
||||
<string name="variablesOnlyForTypes">Le variabili sono disponibili solo per i tipi di parametro String e URI</string>
|
||||
<string name="intentParametersHint">Se si desidera specificare un parametro è necessario fare clic anche su \"Aggiungi coppia intento\". In caso contrario, le modifiche non verranno salvate.</string>
|
||||
<string name="languagePolish">Polacco</string>
|
||||
<string name="languageChineseChina">Cinese (Cina)</string>
|
||||
</resources>
|
||||
|
3
app/src/main/res/values-land/dimens.xml
Normal file
@ -0,0 +1,3 @@
|
||||
<resources>
|
||||
<dimen name="fab_margin">48dp</dimen>
|
||||
</resources>
|
@ -1,4 +1,12 @@
|
||||
<resources>
|
||||
<string name="languageSystemDefault">Systeemstandaard</string>
|
||||
<string name="languageEnglish">Engels</string>
|
||||
<string name="languageGerman">Duits</string>
|
||||
<string name="languageItalian">Italiaans</string>
|
||||
<string name="languageSpanish">Spaans</string>
|
||||
<string name="languageDutch">Nederlands</string>
|
||||
<string name="languageRussian">Russisch</string>
|
||||
<string name="languageFrench">Frans</string>
|
||||
<string name="ruleActivate">Activering regel %1$s</string>
|
||||
<string name="profileActivate">Activeren profiel %1$s</string>
|
||||
<string name="ruleActivateToggle">Activeren regel %1$s in Togglemode</string>
|
||||
@ -56,7 +64,7 @@
|
||||
<string name="end">Einde</string>
|
||||
<string name="save">Opslaan</string>
|
||||
<string name="urlToTrigger">URL om te activeren:</string>
|
||||
<string name="urlLegend">Variabelen:U kunt de volgende variabelen gebruiken. Bij het triggeren zullen ze worden vervangen door de corresponderende waarde op je apparaat. Zet de haakjes in uw tekst. \n[uniqueid] - Het unieke id van uw apparaat[serialnr] - Het serienummer van uw apparaat (< Android 9)[latitude] - De breedtegraad van uw apparaat[longitude] - De lengtegraad van uw apparaat[phonenr] - Nummer van het laatste inkomende of uitgaande gesprek[d] - Dag van de maand, 2 cijfers met voorloopnullen[m] - Numerieke weergave van een maand, met voorloopnullen[Y] - een volledige numerieke weergave van een jaar, 4 cijfers[h] - 12-uurs indeling van een uur, met voorloopnullen[H] - 24-uurs indeling van een uur, met voorloopnullen[i] - minuten, met voorloopnullen[s] - seconden, met voorloopnullen[ms] - milliseconden[notificationTitle] - titel van de laatste melding[notificationText] - tekst van de laatste melding</string>
|
||||
<string name="urlLegend">Variabelen:U kunt de volgende variabelen gebruiken. Bij het triggeren zullen ze worden vervangen door de corresponderende waarde op je apparaat. Zet de haakjes in uw tekst. \n[uniqueid] - Het unieke id van uw apparaat[serialnr] - Het serienummer van uw apparaat (< Android 9)[latitude] - De breedtegraad van uw apparaat[longitude] - De lengtegraad van uw apparaat[phonenr] - Nummer van het laatste inkomende of uitgaande gesprek[d] - Dag van de maand, 2 cijfers met voorloopnullen[m] - Numerieke weergave van een maand, met voorloopnullen[Y] - een volledige numerieke weergave van een jaar, 4 cijfers[h] - 12-uurs indeling van een uur, met voorloopnullen[H] - 24-uurs indeling van een uur, met voorloopnullen[i] - minuten, met voorloopnullen[s] - seconden, met voorloopnullen[ms] - milliseconden[notificationTitle] - titel van de laatste melding[notificationText] - tekst van de laatste melding\n[variable-VARIABLENAME] - De waarde van uw aangepaste gedefinieerde variabele</string>
|
||||
<string name="wifi">wifi</string>
|
||||
<string name="activating">Activeren</string>
|
||||
<string name="deactivating">Deactiveren</string>
|
||||
@ -110,7 +118,7 @@
|
||||
<string name="soundSettings">Geluidsinstellingen</string>
|
||||
<string name="showHelp">Toon help</string>
|
||||
<string name="rules">Regels</string>
|
||||
<string name="helpTextRules">Alle triggers in een regel zijn EN-verbonden (AND). De regel zal alleen worden toegepast als aan alle triggers is voldaan. Als je OR wilt, maak dan een andere regel.</string>
|
||||
<string name="helpTextRules">Alle triggers in een regel zijn EN-verbonden (AND). De regel zal alleen worden toegepast als aan alle triggers is voldaan. Als je OR wilt, maak dan een andere regel.\nDe termen trigger en condition worden als synoniem gebruikt. Het zijn allemaal voorwaarden, maar de laatste die aan de vereiste waarde voldoet, kan trigger worden genoemd omdat het het laatste stukje van de puzzel is om een regel uit te voeren.</string>
|
||||
<string name="timeframes">Tijdsbestek</string>
|
||||
<string name="helpTextTimeFrame">Als je een regel opgeeft met een tijdsbestek heb je twee keuzes. Je kunt kiezen tussen het binnengaan OF het verlaten van een tijdframe. In beide gevallen wordt een regel slechts eenmaal getriggerd. Dus als je een regel maakt met als trigger "ingaan tijdvak xyz" en je laat je geluidsprofiel veranderen in trillen dan betekent dat niet dat de telefoon automatisch gaat rinkelen als het tijdvak voorbij is. Als je dat wilt moet je een andere regel specificeren met een ander tijdsbestek.</string>
|
||||
<string name="helpTextSound">Op het hoofdscherm kunt u vergrendelingsgeluiden gebruiken om op regels gebaseerde geluidsveranderingen tijdelijk te vermijden. U kunt bijvoorbeeld in een situatie of plaats zijn waar ringtones normaal gesproken ok zijn, maar deze ene keer zou het storend zijn. De functie zal automatisch worden uitgeschakeld zodra de ingestelde tijd is verstreken. Klik op de + knop om de ingestelde tijd toe te voegen. Zodra het actief is kunt u het weer deactiveren met de toggle knop (en op die manier op regels gebaseerde geluidsveranderingen weer inschakelen).</string>
|
||||
@ -268,7 +276,8 @@
|
||||
<string name="phoneCall">Telefoongesprek</string>
|
||||
<string name="with">met</string>
|
||||
<string name="phoneNumber">Telefoonnummer</string>
|
||||
<string name="enterPhoneNumber">Voer telefoonnummer in. Laat leeg voor een willekeurig nummer.</string>
|
||||
<string name="enterPhoneNumberBlankForAny">Voer telefoonnummer in. Laat leeg voor een willekeurig nummer.</string>
|
||||
<string name="enterPhoneNumber">Voer telefoonnummer in.</string>
|
||||
<string name="phoneDirection">Selecteer gespreksrichting</string>
|
||||
<string name="any">een willekeurig</string>
|
||||
<string name="incoming">binnenkomend</string>
|
||||
@ -499,7 +508,7 @@
|
||||
<string name="manageLocations">Locaties maken of bewerken</string>
|
||||
<string name="error">Fout</string>
|
||||
<string name="featureNotInFdroidVersion">Deze functie is gebaseerd op niet-vrije software. Daarom is is niet beschikbaar in de F-Droid versie.</string>
|
||||
<string name="settingsReferringToRestrictedFeatures">Uw instellingen en of regels verwijzen momenteel naar niet-vrije functies die niet kunnen worden geleverd in de F-Droid versie. Dat omvat het detecteren van uw huidige fysieke activiteit.</string>
|
||||
<string name="settingsReferringToRestrictedFeaturesInFdroid">Uw instellingen en of regels verwijzen momenteel naar niet-vrije functies die niet kunnen worden geleverd in de F-Droid versie. Dat omvat het detecteren van uw huidige fysieke activiteit.</string>
|
||||
<string name="publishedOn">gepubliceerd op</string>
|
||||
<string name="displayNewsOnMainScreen">Toepassingsnieuws weergeven op hoofdscherm</string>
|
||||
<string name="displayNewsOnMainScreenDescription">Aankondigingen over deze app alleen, we hebben het waarschijnlijk over 1-2 per jaar, niet meer.</string>
|
||||
@ -516,7 +525,7 @@
|
||||
<string name="directionStringStartsWith">begint met</string>
|
||||
<string name="directionStringEndsWith">eindigt met</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="postsNotification">%1$s berichten notificatie</string>
|
||||
<string name="removedNotification">kennisgeving van %1$s verwijderd</string>
|
||||
@ -667,7 +676,7 @@
|
||||
<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="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.</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="controlCenter">Controlecentrum</string>
|
||||
<string name="sendEmailToDev">Stuur een e-mail naar de ontwikkelaar</string>
|
||||
<string name="screenIs">scherm is %1$s</string>
|
||||
@ -702,8 +711,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="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="deviceHasJustStarted">apparaat is net gestart</string>
|
||||
<string name="serviceHasJustStarted">service is net begonnen</string>
|
||||
<string name="deviceIsStarting">apparaat start</string>
|
||||
<string name="serviceIsStarting">service wordt gestart</string>
|
||||
<string name="serviceStarts">Service 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>
|
||||
@ -731,9 +740,62 @@
|
||||
<string name="wifiExplanation1">Apps voor Android Q of hoger kunnen helaas WIFI niet meer aan- of uitzetten. Dat is niet mijn schuld, het was een beslissing van Google om dit te beperken. U kunt deze beperking omzeilen door uw apparaat te rooten en het onderstaande selectievakje te activeren. Als alternatief kunt u deze applicatie downloaden van F-Droid of mijn website, omdat ik niet gedwongen ben om de nieuwste API-niveau in die versies te richten.</string>
|
||||
<string name="wifiExplanation2">Wanneer vliegtuigmodus is geactiveerd, kan wifi alleen worden omgeschakeld vanuit toepassingen wanneer u root-permissies voor that.</string>
|
||||
<string name="usingRoot">gebruik Root</string>
|
||||
<string name="runExecutableExplanation">Je kunt hier een script of programma selecteren dat als actie wordt uitgevoerd.\n\nMaar er zijn wel een aantal vereisten waar je zelf mee aan de slag moet. Google heeft het erg moeilijk gemaakt om iets anders dan gewone Android applicaties uit te voeren.\n1.\nHet bestand moet in het bestandssysteem gemarkeerd zijn als uitvoerbaar. Op een gewoon Android systeem (zonder root) is dit eigenlijk het moeilijkste.\n2.\nDat betekent ook dat Automation het bestand moet kunnen uitvoeren, niet alleen de eigenaar of de groep.\n3.\nAls het een script is, moet een geldige shell worden opgegeven in de header van het script.</string>
|
||||
<string name="runExecutableExplanation">U kunt hier een script of een uitvoerbaar bestand selecteren dat als een actie wordt uitgevoerd.\n\nMaar er zijn enkele vereisten waarmee u zelf te maken krijgt. Google heeft het erg moeilijk gemaakt om iets anders dan gewone Android-applicaties uit te voeren.\n\n1. Het script moet worden gemarkeerd als uitvoerbaar. Op een gewoon Android-systeem (zonder root) is dit eigenlijk het moeilijke deel.\n\n2. Dat betekent ook dat Automation het bestand moet kunnen uitvoeren, niet alleen de eigenaar of de groep.\n\n3. Als het een script is, moet een geldige shell worden opgegeven in de header van het script.\n\nAls u niet aan de bovenstaande vereisten kunt voldoen, kunt u ook proberen een shell op te geven als het eigenlijke uitvoerbare bestand (zoals /system/bin/sh) en uw script als parameter. Dat heeft voor minstens één gebruiker gewerkt.</string>
|
||||
<string name="tetheringActive">tethering is actief</string>
|
||||
<string name="tetheringNotActive">tethering is niet actief</string>
|
||||
<string name="tetheringState">Tethering-status</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>
|
||||
<string name="usb">USB</string>
|
||||
<string name="cable">Kabel</string>
|
||||
<string name="tetheringBluetoothNotPossible">Bluetooth-tethering kan momenteel niet worden gedetecteerd. Alleen de andere verbindingsmiddelen activeren deze trigger.</string>
|
||||
<string name="type">Type</string>
|
||||
<string name="startPhoneCall">Telefoonnummer bellen</string>
|
||||
<string name="android.permission.CALL_PHONE">Telefoonnummer bellen</string>
|
||||
<string name="makePhoneCallExplanation1">Hier kunt u een telefoonnummer invoeren dat zonder verdere prompts wordt gebeld. U kunt dit gebruiken om instellingen aan te brengen, zoals het aanpassen van de gespreksroutering, enz.. Zoek zelf naar de codes die hiervoor nodig zijn.</string>
|
||||
<string name="android.permission.ANSWER_PHONE_CALLS">Telefoongesprek beëindigen</string>
|
||||
<string name="endPhoneCall">Telefoongesprek beëindigen</string>
|
||||
<string name="settingsReferringToRestrictedFeaturesInGoogle">Uw instellingen en/of regels verwijzen momenteel naar functies die niet kunnen worden geleverd in de Google Play-versie. Dat omvat onder andere alles wat te maken heeft met telefoontjes en sms-berichten.</string>
|
||||
<string name="setVariable">Een variabele instellen</string>
|
||||
<string name="deleteVariable">Variabele verwijderen</string>
|
||||
<string name="VariableKey">Variabele sleutel</string>
|
||||
<string name="variableValue">Variabele waarde</string>
|
||||
<string name="setVariableExplanation">Als u een variabele instelt op een lege waarde, wordt deze verwijderd.</string>
|
||||
<string name="enterVariableKey">Voer een sleutel in voor de variabele.</string>
|
||||
<string name="checkVariable">Variabele controleren</string>
|
||||
<string name="checkVariableExplanation">Als u de waarde leeg laat, mag de variabele niet worden ingesteld om de voorwaarde true te laten retourneren.</string>
|
||||
<string name="variableCheckString">als variabele %1$s %2$s is</string>
|
||||
<string name="variableCheckStringDeleted">als variabele %1$s niet is ingesteld</string>
|
||||
<string name="messageType">Type bericht</string>
|
||||
<string name="sms">SMS</string>
|
||||
<string name="mms">MMS</string>
|
||||
<string name="attachment">Bijlage</string>
|
||||
<string name="chooseFile">kies bestand</string>
|
||||
<string name="startAppByStartService">via startService()</string>
|
||||
<string name="showToastsForEvents">Toon toasts</string>
|
||||
<string name="showToastsForEventsSummary">Pop-ups weergeven wanneer gebeurtenissen zoals regeluitvoeringen plaatsvinden</string>
|
||||
<string name="notificationAccessAndroid13">Nadat u op OK hebt geklikt, selecteert u Automatisering, selecteert u vervolgens \"Toegang tot meldingen toestaan\" en vervolgens \"toestaan\".</string>
|
||||
<string name="displayLanguage">Taal weergeven</string>
|
||||
<string name="displayLanguageSummary">Een aangepaste taal instellen voor de toepassing</string>
|
||||
<string name="wifiMonitoringAlsoRequiresThis">Deze toestemming is ook vereist als de trigger de huidige wifi-verbinding gebruikt.</string>
|
||||
<string name="copyTextToClipboard">Tekst naar klembord kopiëren</string>
|
||||
<string name="textToCopy">Tekst om te kopiëren</string>
|
||||
<string name="android.permission.SYSTEM_ALERT_WINDOW">Tekenen over andere apps</string>
|
||||
<string name="overlayPermissionHint">Nadat u op OK hebt geklikt, wordt u naar een systeemdialoogvenster gestuurd. Selecteer daar Automatisering en sta tekenen toe over andere apps.</string>
|
||||
<string name="variablesOnlyForTypes">Variabelen zijn alleen beschikbaar voor parametertypen Tekenreeks en URI</string>
|
||||
<string name="intentParametersHint">Als u een parameter wilt opgeven, moet u ook op \"Intentiepaar toevoegen\" klikken. Anders worden uw wijzigingen niet opgeslagen.</string>
|
||||
<string name="languagePolish">Pools</string>
|
||||
<string name="languageChineseChina">Chinees (China)</string>
|
||||
|
||||
</resources>
|
||||
|
899
app/src/main/res/values-pl/strings.xml
Normal file
@ -0,0 +1,899 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name" translatable="false">Automation</string>
|
||||
<string name="ruleActivate">Aktywowanie reguły %1$s</string>
|
||||
<string name="profileActivate">Aktywowanie profilu %1$s</string>
|
||||
<string name="ruleActivateToggle">Aktywowanie reguły %1$s w trybie naprzemiennym</string>
|
||||
<string name="addPoi">Dodaj lokalizację</string>
|
||||
<string name="addRule">Dodaj regułę</string>
|
||||
<string name="poiList">Lista lokalizacji:</string>
|
||||
<string name="ruleList">Lista reguł:</string>
|
||||
<string name="pleaseEnterValidName">Wpisz poprawną nazwę.</string>
|
||||
<string name="pleaseSpecifiyTrigger">Określ co najmniej jeden wyzwalacz.</string>
|
||||
<string name="pleaseSpecifiyAction">Określ co najmniej jedną akcję.</string>
|
||||
<string name="serviceWontStart">Nie zdefiniowano reguł. Automatyzacja nie wystartuje.</string>
|
||||
<string name="serviceStarted">Serwis automatyzacji uruchomiony.</string>
|
||||
<string name="version">Wersja %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">Odległość między lokalizacją GPS a lokalizacją w sieci wynosi %1$d metrów. Ten +1m powinien być absolutnym minimalnym promieniem.</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">Jeśli znajdujesz się w budynku, zdecydowanie zaleca się umieszczenie urządzenia obok okna, aż do znalezienia odpowiedniej pozycji. W przeciwnym razie znalezienie go może zająć bardzo dużo czasu.</string>
|
||||
<string name="gettingPosition">Ustalanie pozycji. Czekaj...</string>
|
||||
<string name="logGettingPositionWithProvider" translatable="false">Requesting location using provider:</string>
|
||||
<string name="yes">Tak</string>
|
||||
<string name="no">Nie</string>
|
||||
<string name="logGotGpsUpdate" translatable="false">Got GPS update. Accuracy:</string>
|
||||
<string name="logGotNetworkUpdate" translatable="false">Got network update. Accuracy:</string>
|
||||
<string name="pleaseEnterValidLatitude">Wpisz prawidłową szerokość geograficzą.</string>
|
||||
<string name="pleaseEnterValidLongitude">Wpisz prawidłową długość geograficzną</string>
|
||||
<string name="pleaseEnterValidRadius">Wprowadź poprawny dodatni promień.</string>
|
||||
<string name="selectOneDay">Wybierz co najmniej jeden dzień.</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">Co zrobić z regułą?</string>
|
||||
<string name="whatToDoWithPoi">Co zrobić z lokalizacją?</string>
|
||||
<string name="whatToDoWithProfile">Co zrobić z profilem?</string>
|
||||
<string name="delete">usuńe</string>
|
||||
<string name="deleteCapital">Usuń</string>
|
||||
<string name="serviceStopped">Automatyzacja zatrzymana..</string>
|
||||
<string name="logServiceStopping">Zatrzymywanie automatyzacji.</string>
|
||||
<string name="stillGettingPosition">Wciąż zajmuje pozycję</string>
|
||||
<string name="lastRule">Ostatnia reguła:</string>
|
||||
<string name="at">Na</string>
|
||||
<string name="service">Serwis:</string>
|
||||
<string name="getCurrentPosition">Uzyskaj obecną lokalizację</string>
|
||||
<string name="savePoi">Zapisz lokalizację</string>
|
||||
<string name="deletePoi">Usuń lokalizację</string>
|
||||
<string name="latitude">Szerokość geograficzna</string>
|
||||
<string name="longitude">Długość geograficzna</string>
|
||||
<string name="ruleName">Nazwa reguły</string>
|
||||
<string name="triggers">Wyzwalacz(e)</string>
|
||||
<string name="triggersComment">i połączone (wszystkie muszą obowiązywać w tym samym czasie)</string>
|
||||
<string name="addTrigger">Dodaj wyzwalacz(e)</string>
|
||||
<string name="actions">Akcja(e)</string>
|
||||
<string name="actionsComment">(zostanie wykonany w tej kolejności)</string>
|
||||
<string name="addAction">Dodaj akcję</string>
|
||||
<string name="saveRule">Zapisz regułę</string>
|
||||
<string name="monday">Poniedziałek</string>
|
||||
<string name="tuesday">Wtorek</string>
|
||||
<string name="wednesday">Środa</string>
|
||||
<string name="thursday">Czwartek</string>
|
||||
<string name="friday">Piątek</string>
|
||||
<string name="saturday">Sobtoa</string>
|
||||
<string name="sunday">Niedziela</string>
|
||||
<string name="start">Start</string>
|
||||
<string name="end">Koniec</string>
|
||||
<string name="save">Zapisz</string>
|
||||
<string name="urlToTrigger">Adres URL do uruchomienia:</string>
|
||||
<string name="urlLegend">Zmienne:\nMożesz użyć następujących zmiennych. Po uruchomieniu zostaną one zastąpione odpowiednią wartością na Twoim urządzeniu. Umieść nawiasy w tekście.\n\n[uniqueid] – unikalny identyfikator Twojego urządzenia\n[serialnr] – numer seryjny Twojego urządzenia (< Android 9)\n[latitude] – Twoje urządzenie\ szerokość geograficzna użytkownika\n[longitude] – długość geograficzna Twojego urządzenia\n[phonenr] – numer ostatniego połączenia przychodzącego lub wychodzącego\n[d] – dzień miesiąca, 2 cyfry z zerami na początku\n[m] – Numeryczna reprezentacja miesiąca z zerami na początku\n[Y] — pełna cyfrowa reprezentacja roku, 4 cyfry\n[h] — godzina w formacie 12-godzinnym z zerami na początku\n[H] — format 24-godzinny format godziny z wiodącymi zerami\n[i] - minuty z wiodącymi zerami\n[s] - sekundy z wiodącymi zerami\n[ms] - milisekundy\n[notificationTitle] - tytuł ostatniego powiadomienia\n[notificationText] - tekst ostatniego powiadomienia\n[variable-VARIABLENAME] - Wartość niestandardowej zmiennej zdefiniowanej przez Ciebie</string>
|
||||
<string name="wifi">wifi</string>
|
||||
<string name="activating">Aktywowanie</string>
|
||||
<string name="deactivating">Dezaktywowanie</string>
|
||||
<string name="bluetoothFailed">Nie udało się uruchomić Bluetooth. Czy to urządzenie ma Bluetooth?</string>
|
||||
<string name="urlTooShort">Adres URL musi mieć co najmniej 10 znaków.</string>
|
||||
<string name="enterPhoneNumberAndText">Podaj numer i tekst.</string>
|
||||
<string name="selectTypeOfTrigger">Wybierz typ wyzwalacza</string>
|
||||
<string name="entering">wchodzenie</string>
|
||||
<string name="leaving">opuszczanie</string>
|
||||
<string name="noPoisSpecified">Nie określiłeś żadnych lokalizacji. Zrób to najpierw.</string>
|
||||
<string name="started">uruchomiony</string>
|
||||
<string name="stopped">zatrzymany</string>
|
||||
<string name="connected">połączony</string>
|
||||
<string name="disconnected">rozłączony</string>
|
||||
<string name="selectPoi">Wybierz lokalizację</string>
|
||||
<string name="selectTypeOfAction">Wybierz typ akcji</string>
|
||||
<string name="selectSoundProfile">Wybierz dźwięk profilu</string>
|
||||
<string name="whatToDoWithTrigger">Co zrobić z wyzwalaczem?</string>
|
||||
<string name="whatToDoWithAction">Co zrobić z akcją??</string>
|
||||
<string name="radiusHasToBePositive">Promień musi być liczbą dodatnią.</string>
|
||||
<string name="poiStillReferenced">Nadal istnieją reguły odnoszące się do tej lokalizacji (%1$s). Nie mogę go jeszcze usunąć.</string>
|
||||
<string name="generalSettings">Główne ustawienia</string>
|
||||
<string name="startAtSystemBoot">Uruchom przy starcie systemu</string>
|
||||
<string name="onOff">On/Off</string>
|
||||
<string name="writeLogFile">Zapisz plik dziennika</string>
|
||||
<string name="useTextToSpeechOnNormalSummary">Użyj TTS w trybie normalnym</string>
|
||||
<string name="useTextToSpeechOnVibrateSummary">Użyj TTS w trybie wibrajcji</string>
|
||||
<string name="useTextToSpeechOnSilentSummary">Użyj TTS w trybie cichym</string>
|
||||
<string name="useTextToSpeechOnNormalTitle">TTS w trybie normalnym</string>
|
||||
<string name="useTextToSpeechOnVibrateTitle">TTS w trybie wibracji</string>
|
||||
<string name="useTextToSpeechOnSilentTitle">TTS w trybie cichym</string>
|
||||
<string name="positioningSettings">Ustawienia pozycjonowania</string>
|
||||
<string name="listenToWifiState">Słuchaj zmian stanu Wi-Fi, jeśli to możliwe</string>
|
||||
<string name="wifiState">Stan WiFi</string>
|
||||
<string name="listenToAccelerometerState">Obserwuj ruch urządzenia tam, gdzie Wi-Fi nie jest dostępne</string>
|
||||
<string name="accelerometer">Akcelerometr</string>
|
||||
<string name="accelerometerTimer">Użyj akcelerometru po x minutach bez zmiany masztu wieży</string>
|
||||
<string name="cellMastIdleTime">Czas bezczynności wieży komórkowej</string>
|
||||
<string name="accelerometerThresholdDescription">Próg ruchów akcelerometru</string>
|
||||
<string name="accelerometerThreshold">Próg akcelerometru</string>
|
||||
<string name="positioningThresholds">Progi pozycjonowania</string>
|
||||
<string name="minimumDistanceChangeForGpsLocationUpdates">Minimalna zmiana odległości dla aktualizacji lokalizacji GPS</string>
|
||||
<string name="distanceForGpsUpdate">Dystans do aktualizacji GPS [m]</string>
|
||||
<string name="minimumDistanceChangeForNetworkLocationUpdates">Zmiana minimalnej odległości dla aktualizacji lokalizacji sieciowej</string>
|
||||
<string name="distanceForNetworkUpdate">Dystans do aktualizacji sieci [m]</string>
|
||||
<string name="satisfactoryAccuracyGps">Zadowalająca dokładność podczas uzyskiwania lokalizacji za pomocą GPS w metrach</string>
|
||||
<string name="gpsAccuracy">Dokładność GPS [m]</string>
|
||||
<string name="satisfactoryAccuracyNetwork">Zadowalająca dokładność uzyskiwania lokalizacji za pośrednictwem masztów komórkowych w metrach</string>
|
||||
<string name="networkAccuracy">Dokładność sieci [m]</string>
|
||||
<string name="minimumTimeForLocationUpdates">Minimalna zmiana czasu w milisekundach dla aktualizacji lokalizacji</string>
|
||||
<string name="timeForUpdate">Czas do aktualizacji [milliseconds]</string>
|
||||
<string name="soundSettings">Ustawienia dźwięku</string>
|
||||
<string name="showHelp">Pokaż pomoc</string>
|
||||
<string name="rules">Reguły</string>
|
||||
<string name="helpTextRules">Wszystkie wyzwalacze w regule są połączone operatorem AND. Reguła zostanie zastosowana tylko wtedy, gdy zostaną spełnione wszystkie warunki wyzwalające. Jeśli chcesz LUB, utwórz inną regułę.\nWyzwalacz i warunek są używane zamiennie. Wszystkie z nich są warunkami, ale ostatni, który spełnia wymaganą wartość, można nazwać wyzwalaczem, ponieważ jest to ostatni element układanki, który powoduje wykonanie reguły.</string>
|
||||
<string name="timeframes">Ramy czasowe</string>
|
||||
<string name="helpTextTimeFrame">Jeśli określisz regułę z przedziałem czasowym, masz dwie możliwości. Możesz wybrać między wprowadzeniem LUB opuszczeniem przedziału czasowego. Tak czy inaczej reguła jest uruchamiana tylko raz. Więc jeśli utworzysz regułę, która jako wyzwalacz ma „wprowadzanie przedziału czasowego xyz” i pozwolisz jej zmienić profil dźwiękowy na wibracje, nie oznacza to, że telefon automatycznie zadzwoni, gdy przedział czasowy się skończy. Jeśli chcesz, musisz określić inną regułę z innym przedziałem czasowym.</string>
|
||||
<string name="helpTextSound">On the main screen you can use lock sound changes to temporarily avoid rule based sound changes. E.g. you may be in a situation or place where usually ringtones are ok, but this one time it would be disturbing. The feature will automatically deactivate once the configured time has elapsed. Click the + button to add the given amount of time. Once it is active you may deactivate it again using the toggle button (and that way enable rule based sound changes again).</string>
|
||||
<string name="toggableRules">Zasady naprzemienności</string>
|
||||
<string name="helpTextToggable">Reguły mają flagę o nazwie \"Toggable\". Oznacza to, że jeśli reguła zostanie wykonana, a następnie ponownie zostaną zastosowane te same wyzwalacze, reguła zostanie wykonana w odwrotnym trybie, jeśli ma to zastosowanie. Obecnie będzie to miało miejsce tylko w połączeniu z tagami NFC. Jeśli stukniesz je dwukrotnie i jest z nimi powiązana reguła, którą można przełączać, zrobi to odwrotnie niż w obecnej sytuacji, np. dezaktywuj Wi-Fi, jeśli jest aktualnie włączone.</string>
|
||||
<string name="helpTextProcessMonitoring">Jeśli określisz regułę za pomocą monitora procesu, aplikacja będzie sprawdzać ten proces co x sekund (możesz to zmienić w ustawieniach). Wiem, że może to być trochę powolne, ale ciągłe monitorowanie spowodowałoby zbyt szybkie wyczerpanie baterii. I nie ma transmisji z systemu operacyjnego dla tego wydarzenia.</string>
|
||||
<string name="helpTitleEnergySaving">Oszczędzanie energii</string>
|
||||
<string name="helpTextEnergySaving">Wielu producentów urządzeń z systemem Android stara się oszczędzać energię, ograniczając działanie uruchomionych aplikacji w tle. Niestety często powoduje to, że te aplikacje nie działają poprawnie, wśród nich jest Automation. Zobacz tę <a href="https://dontkillmyapp.com/">webpage</a>, aby dowiedzieć się, jak wykluczyć automatyzację z tych środków.</string>
|
||||
<string name="speedMaximumTimeBetweenLocations">Maksymalny czas między 2 lokalizacjami dla określenia prędkości.</string>
|
||||
<string name="speedMaximumTime">Czas w minutach</string>
|
||||
<string name="exceeds">przekracza</string>
|
||||
<string name="dropsBelow">spada poniżej</string>
|
||||
<string name="settingsCategoryNoiseLevelMeasurements">Pomiar poziomu hałasu</string>
|
||||
<string name="timeBetweenNoiseLevelMeasurementsSummary">Sekundy między pomiarami poziomu hałasu</string>
|
||||
<string name="timeBetweenNoiseLevelMeasurementsTitle">Sekundy między pomiarami poziomu hałasu</string>
|
||||
<string name="lengthOfNoiseLevelMeasurementsSummary">Długość w sekundach dla każdego pomiaru poziomu hałasu</string>
|
||||
<string name="lengthOfNoiseLevelMeasurementsTitle">Długość każdego pomiaru poziomu hałasu</string>
|
||||
<string name="referenceValueForNoiseLevelMeasurementsSummary">Fizyczna wartość odniesienia dla pomiaru poziomu hałasu</string>
|
||||
<string name="referenceValueForNoiseLevelMeasurementsTitle">Odniesienie do pomiaru hałasu</string>
|
||||
<string name="logLevelSummary">Poziom rejestrowania (1=minimalny, 5=maksymalny)</string>
|
||||
<string name="logLevelTitle">Poziom rejestrowania</string>
|
||||
<string name="ruleActive">Reguła aktywna</string>
|
||||
<string name="triggerPointOfInterest">Lokalizacja</string>
|
||||
<string name="triggerTimeFrame">Ramy czasowe</string>
|
||||
<string name="triggerCharging">Ładowanie baterii</string>
|
||||
<string name="triggerUsb_host_connection">Połączenie USB z komputerem</string>
|
||||
<string name="triggerSpeed">Prędkość</string>
|
||||
<string name="triggerNoiseLevel">Poziom hałasu w tle</string>
|
||||
<string name="actionSetWifi">Wifi</string>
|
||||
<string name="actionSetBluetooth">Bluetooth</string>
|
||||
<string name="actionSetUsbTethering">USB Tethering</string>
|
||||
<string name="actionSetWifiTethering">Wifi Tethering</string>
|
||||
<string name="actionSetBluetoothTethering">Bluetooth Tethering</string>
|
||||
<string name="actionSetDisplayRotation">Obrót wyświetlacza</string>
|
||||
<string name="actionTurnWifiOn">włącz WiFi</string>
|
||||
<string name="actionTurnWifiOff">wyłącz WiFi</string>
|
||||
<string name="actionTurnBluetoothOn">włącz Bluetooth</string>
|
||||
<string name="actionTurnBluetoothOff">wyłącz Bluetooth</string>
|
||||
<string name="actionTriggerUrl">Uruchom URL</string>
|
||||
<string name="actionChangeSoundProfile">Zmień profil dźwięku</string>
|
||||
<string name="actionTurnUsbTetheringOn">włącz USB Tethering</string>
|
||||
<string name="actionTurnUsbTetheringOff">wyłącz USB Tethering</string>
|
||||
<string name="actionTurnWifiTetheringOn">włącz Wifi Tethering</string>
|
||||
<string name="actionTurnWifiTetheringOff">wyłącz Wifi Tethering</string>
|
||||
<string name="actionTurnBluetoothTetheringOn">włącz Bluetooth Tethering</string>
|
||||
<string name="actionTurnBluetoothTetheringOff">wyłącz Bluetooth Tethering</string>
|
||||
<string name="actionTurnAirplaneModeOn">włącz tryb samolotowy</string>
|
||||
<string name="actionTurnAirplaneModeOff">wyłącz tryb samolotowy</string>
|
||||
<string name="actionEnableScreenRotation">włączyć obracanie ekranu</string>
|
||||
<string name="actionDisableScreenRotation">wyłączyć obracanie ekranu</string>
|
||||
<string name="screenRotationEnabled">Obracanie ekranu włączone.</string>
|
||||
<string name="screenRotationDisabled">Obracanieekranu wyłączone.</string>
|
||||
<string name="screenRotationAlreadyEnabled">Obracanie ekranu jest już włączone.</string>
|
||||
<string name="screenRotationAlreadyDisabled">Obracanie ekranu jest już wyłączone.</string>
|
||||
<string name="noPoisDefinedShort">Brak zdefiniowanych lokalizacji.</string>
|
||||
<string name="activePoi">Aktywna lokalizacja:</string>
|
||||
<string name="closestPoi">Najbliższa lokalizacja:</string>
|
||||
<string name="overview">Przegląd</string>
|
||||
<string name="poi">Lokalizacja</string>
|
||||
<string name="pois">Lokalizacje</string>
|
||||
<string name="helpTextPoi">Lokalizacja składa się ze współrzędnych GPS i promienia. Ponieważ pozycjonowanie za pomocą masztów komórkowych jest raczej nieprecyzyjne (ale szybkie i tanie), nie należy określać zbyt małego promienia. Aplikacja zaproponuje Ci minimalny promień podczas tworzenia nowej lokalizacji.</string>
|
||||
<string name="serviceNotRunning">Usługa nie działa.</string>
|
||||
<string name="general">Ogólne</string>
|
||||
<string name="generalText">Aby korzystać z tego programu, musisz skonfigurować reguły. Zawierają wyzwalacze, np. jeśli dotrzesz do określonego obszaru lub wejdziesz w określony czas. Po zakończeniu kliknij przycisk włączania/wyłączania na ekranie głównym.</string>
|
||||
<string name="unknownActionSpecified" translatable="false">Unknown action specified</string>
|
||||
<string name="logErrorTriggeringUrl" translatable="false">Error triggering URL</string>
|
||||
<string name="errorChangingScreenRotation" translatable="false">Error changing screen rotation</string>
|
||||
<string name="errorDeterminingWifiApState" translatable="false">Error determining wifiAp state</string>
|
||||
<string name="errorActivatingWifiAp" translatable="false">Error activating wifiAp</string>
|
||||
<string name="failedToTriggerBluetooth">Nie udało się uruchomić Bluetooth. Czy to urządzenie ma Bluetooth?</string>
|
||||
<string name="logAttemptingDownloadOf" translatable="false">attempting download of</string>
|
||||
<string name="logErrorGettingConnectionManagerService" translatable="false">Error getting connectionManager service. Not doing anything to UsbTethering.</string>
|
||||
<string name="logErrorDeterminingCurrentUsbTetheringState" translatable="false">Error determining current UsbTethering state.</string>
|
||||
<string name="logDetectingTetherableUsbInterface" translatable="false">Detecting tetherable usb interface.</string>
|
||||
<string name="logClearingBothLocationListeners" translatable="false">Clearing both location listeners.</string>
|
||||
<string name="logStartingServiceAfterAppUpdate" translatable="false">Starting service after app update.</string>
|
||||
<string name="logNotStartingServiceAfterAppUpdate" translatable="false">Not starting service after app update.</string>
|
||||
<string name="logStartingServiceAtPhoneBoot" translatable="false">Starting service at phone boot.</string>
|
||||
<string name="logNotStartingServiceAtPhoneBoot" translatable="false">Not starting service at phone boot.</string>
|
||||
<string name="applicationHasBeenUpdated" translatable="false">Application has been updated.</string>
|
||||
<string name="startServiceAfterAppUpdate">Uruchom usługę automatycznie po aktualizacji aplikacji, jeśli była wcześniej uruchomiona.</string>
|
||||
<string name="startServiceAfterAppUpdateShort">Uruchom usługę po aktualizacji.</string>
|
||||
<string name="wifiConnection">Połączenie WiFi</string>
|
||||
<string name="wifiName">Nazwa WiFi</string>
|
||||
<string name="enterWifiName">Wprowadź nazwę Wi-Fi. Pozostaw puste dla dowolnej sieci Wi-Fi.</string>
|
||||
<string name="cancel">Anuluj</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">uruchamianie</string>
|
||||
<string name="stopping">wyłączanie</string>
|
||||
<string name="connecting">łączenie</string>
|
||||
<string name="disconnecting">rozłączanie</string>
|
||||
<string name="exceeding">nadzwyczajny</string>
|
||||
<string name="droppingBelow">spadając poniżej</string>
|
||||
<string name="connectedToWifi">Połączony do wifi \"%1$s\"</string>
|
||||
<string name="disconnectedFromWifi">rozłączony z wifi \"%1$s\"</string>
|
||||
<string name="anyWifi">dowlona wifi</string>
|
||||
<string name="cantStopIt">Nie mogę tego zatrzymać.</string>
|
||||
<string name="settingsCategoryHttp">Żądanie HTTPs</string>
|
||||
<string name="httpAcceptAllCertificatesTitle">Akceptuj wszystkie certyfikaty</string>
|
||||
<string name="httpAcceptAllCertificatesSummary">Pomiń sprawdzanie ważności certyfikatów SSL (aktywowanie tego jest odradzane)</string>
|
||||
<string name="httpAttemptsSummary">Liczba prób w przypadku niepowodzenia żądań HTTP z powodu łączności</string>
|
||||
<string name="httpAttemptsTitle">Liczba prób HTTP</string>
|
||||
<string name="httpAttemptsTimeoutSummary">Limit czasu dla żądań HTTP [sekundy]</string>
|
||||
<string name="httpAttemptsTimeoutTitle">Limit czasu [sec]</string>
|
||||
<string name="httpAttemptGapSummary">Pauza przed kolejną próbą [sekundy]</string>
|
||||
<string name="httpAttemptGapTitle">Pauza [sec]</string>
|
||||
<string name="runManually">Uruchom ręcznie</string>
|
||||
<string name="serviceHasToRunForThat">W tym celu usługa musi działać.</string>
|
||||
<string name="gpsComparison">Porównanie GPS</string>
|
||||
<string name="gpsComparisonTimeoutStop" translatable="false">Stopping comparison GPS measurement due to timeout.</string>
|
||||
<string name="timeoutForGpsComparisonsTitle">Przekroczenie czasu GPS [sec]</string>
|
||||
<string name="timeoutForGpsComparisonsSummary">Maksymalny czas w sekundach do próby uzyskania lokalizacji GPS do porównania. Jeśli zostanie zastosowana ostatnia znana lokalizacja.</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">Jeśli jesteś w miejscu, uruchom ponownie urządzenie lub aplikację i opuść lokalizację, aplikacja uruchomi reguły związane z opuszczeniem lokalizacji przy następnym uruchomieniu.</string>
|
||||
<string name="rememberLastActivePoiTitle">Zapamiętaj ostatnią aktywną lokalizację</string>
|
||||
<string name="muteTextToSpeechDuringCallsTitle">Wycisz podczas połączeń</string>
|
||||
<string name="muteTextToSpeechDuringCallsSummary">Wycisz funkcję TextToSpeech podczas połączeń</string>
|
||||
<string name="anotherPoiByThatName">Istnieje już inna lokalizacja o tej nazwie.</string>
|
||||
<string name="anotherRuleByThatName">Istnieje już inna reguła o tej nazwie.</string>
|
||||
<string name="startOtherActivity">Uruchom inny program</string>
|
||||
<string name="selectApplication">Wybierz apkę</string>
|
||||
<string name="selectPackageOfApplication">Wybierz pakiet aplikacji</string>
|
||||
<string name="selectActivityToBeStarted">Wybierz aktywność wybranego pakietu</string>
|
||||
<string name="errorStartingOtherActivity">Błąd podczas uruchamiania innej czynności</string>
|
||||
<string name="anotherAppIsRunning">Inna aplikacja jest uruchamiana/zatrzymywana</string>
|
||||
<string name="settingsCategoryProcessMonitoring">Monitorowanie procesu</string>
|
||||
<string name="timeBetweenProcessMonitoringsTitle">Sekundy między monitorowaniem procesu</string>
|
||||
<string name="timeBetweenProcessMonitoringsSummary">Im niższe, tym większe zużycie baterii</string>
|
||||
<string name="refreshingProcessList" translatable="false">Refreshing process list.</string>
|
||||
<string name="processes">Processes</string>
|
||||
<string name="startingPeriodicProcessMonitoringEngine" translatable="false">Starting periodic process monitoring engine.</string>
|
||||
<string name="processMonitoring">Monitorowanie procesu</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">Settings</string>
|
||||
<string name="writingSettingsToPersistentMemory" translatable="false">Writing settings to persistent memory.</string>
|
||||
<string name="refreshingSettingsFromFileToMemory" translatable="false">Refreshing settings from file to memory.</string>
|
||||
<string name="errorReadingSettings" translatable="false">Error reading settings.</string>
|
||||
<string name="invalidStuffStoredInSettingsErasing" translatable="false">Invalid stuff stored in settings. Erasing settings...</string>
|
||||
<string name="initializingSettingsToPersistentMemory" translatable="false">Initializing settings to persistent memory.</string>
|
||||
<string name="errorInitializingSettingsToPersistentMemory" translatable="false">Error initializing settings to persistent memory.</string>
|
||||
<string name="settingsErased">Ustawienia usunięte.</string>
|
||||
<string name="settingsSetToDefault">Ustawienia ustawione na domyślne.</string>
|
||||
<string name="batteryLevel">Poziom baterii</string>
|
||||
<string name="selectSpeed">Wybierz prędkość</string>
|
||||
<string name="selectBattery">Wybierz poziom naładowania baterii</string>
|
||||
<string name="applyingSettingsAndRules" translatable="false">Applying settings, rules and locations.</string>
|
||||
<string name="privacy">Polityka prywatności</string>
|
||||
<string name="privacyConfirmationText">Przeglądarka otworzy się teraz na Twoim urządzeniu i załaduje politykę prywatności ze strony dewelopera.</string>
|
||||
<string name="waitBeforeNextAction">Poczekaj przed następną czynnością</string>
|
||||
<string name="wakeupDevice">Wybudź urządzenie</string>
|
||||
<string name="waitBeforeNextActionEnterValue">Wprowadź wartość w milisekundach, jak długo należy czekać przed następną akcją.</string>
|
||||
<string name="wakeupDeviceValue">Wprowadź wartość w milisekundach, jak długo urządzenie powinno pozostawać w stanie czuwania. 0 dla wartości domyślnych.</string>
|
||||
<string name="enterAPositiveValidNonDecimalNumber">wprowadź prawidłową dodatnią liczbę inną niż dziesiętna.</string>
|
||||
<string name="moveUp">Do góry</string>
|
||||
<string name="moveDown">Do dołu</string>
|
||||
<string name="cantMoveUp">Nie można przenieść elementu w górę. Jest już na szczycie.</string>
|
||||
<string name="cantMoveDown">Nie można przenieść elementu w dół. Jest już na dnie.</string>
|
||||
<string name="wifiNameSpecifiedCheckingThat" translatable="false">Wifi name specified, checking that.</string>
|
||||
<string name="wifiNameMatchesRuleWillApply" translatable="false">Wifi name matches. Rule will apply.</string>
|
||||
<string name="noWifiNameSpecifiedAnyWillDo" translatable="false">No wifi name specified, any will do.</string>
|
||||
<string name="ruleCheckOf" translatable="false">RuleCheck of %1$s</string>
|
||||
<string name="airplaneMode">Tryb samolotowy</string>
|
||||
<string name="activate">Aktywowany</string>
|
||||
<string name="deactivate">Dezaktywowany</string>
|
||||
<string name="airplaneModeSdk17Warning">Począwszy od wersji Androida 4.2 ta funkcja działa tylko wtedy, gdy urządzenie jest zrootowane.</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">Dodaj parę intencji</string>
|
||||
<string name="parameterName">Parameter nazwa</string>
|
||||
<string name="parameterValue">Parameter wartość</string>
|
||||
<string name="parameterType">Parameter typ</string>
|
||||
<string name="selectTypeOfIntentPair">Wybierz typ dla pary intencji.</string>
|
||||
<string name="enterNameForIntentPair">Wprowadź nazwę pary intencji.</string>
|
||||
<string name="enterValueForIntentPair">Wprowadź wartość dla pary intencji.</string>
|
||||
<string name="whatToDoWithIntentPair">Co zrobić z parą?</string>
|
||||
<string name="gettingListOfInstalledApplications">Pobieranie listy zainstalowanych aplikacji...</string>
|
||||
<string name="timeFrameWhichDays">W które dni?</string>
|
||||
<string name="insideOrOutsideTimeFrames">Wewnątrz lub poza tymi ramami czasowymi?</string>
|
||||
<string name="selectToggleDirection">Włączyć czy wyłączyć?</string>
|
||||
<string name="name">Nazwa</string>
|
||||
<string name="radiusWithUnit">Promień [m]</string>
|
||||
<string name="status">Status</string>
|
||||
<string name="actionDataConnection">Dane mobilne</string>
|
||||
<string name="actionSetDataConnectionOn">włącz komórkową transmisję danych</string>
|
||||
<string name="actionSetDataConnectionOff">wyłącz komórkową transmisję danych</string>
|
||||
<string name="roaming">Roaming</string>
|
||||
<string name="activated">aktywowany</string>
|
||||
<string name="deactivated">dezaktywowany</string>
|
||||
<string name="until">dopóki</string>
|
||||
<string name="application">Aplikacja</string>
|
||||
<string name="is">jest</string>
|
||||
<string name="phoneCall">Połączenie telefonicznel</string>
|
||||
<string name="with">z</string>
|
||||
<string name="phoneNumber">Numer</string>
|
||||
<string name="enterPhoneNumberBlankForAny">Wpisz numer telefonu. Pozostaw puste dla dowolnej numeru.</string>
|
||||
<string name="enterPhoneNumber">Podaj numer.</string>
|
||||
<string name="phoneDirection">Wybierz\nkierunek połączenia</string>
|
||||
<string name="any">dowolny</string>
|
||||
<string name="incoming">przychodzące</string>
|
||||
<string name="outgoing">wychodzące</string>
|
||||
<string name="incomingAdjective">przychodzące</string>
|
||||
<string name="outgoingAdjective">wychodzące</string>
|
||||
<string name="anyNumber">dowolny numer</string>
|
||||
<string name="number">number</string>
|
||||
<string name="nfcTag">NFC tag</string>
|
||||
<string name="closeTo">blisko</string>
|
||||
<string name="withLabel">z etykietą</string>
|
||||
<string name="deviceDoesNotHaveNfc">Wygląda na to, że to urządzenie nie ma NFC.</string>
|
||||
<string name="nfcReadTag">Odczytaj identyfikator z tagu</string>
|
||||
<string name="nfcWriteTag">Zapisz tag</string>
|
||||
<string name="nfcEnterValidIdentifier">Wpisz prawidłowy identyfikator tagu (np. \"Drzwi wejściowe do domu\").</string>
|
||||
<string name="nfcTagWrittenSuccessfully">Tag zapisany.</string>
|
||||
<string name="nfcTagWriteError">Błąd podczas zapisania tagu. Czy jest w zasięgu?</string>
|
||||
<string name="nfcTagDiscovered">Odkryto tag.</string>
|
||||
<string name="nfcBringTagIntoRange">Umieść tag NFC w zasięgu.</string>
|
||||
<string name="nfcTagFoundWithText">Znaleziono tag z tekstem:</string>
|
||||
<string name="nfcUnsupportedEncoding">Nieobsługiwane kodowanie:</string>
|
||||
<string name="nfcNoNdefIntentBut"> Brak intencji NFC NDEF, ale</string>
|
||||
<string name="nfcNotSupportedInThisAndroidVersionYet">NFC nie jest jeszcze obsługiwane w tej wersji Androida.</string>
|
||||
<string name="cantRunRule">Nie można uruchomić reguł.</string>
|
||||
<string name="cantDownloadTooFewRequestsInSettings" translatable="false">Can\'t download anything. Amount of http requests in settings is lower than 1.</string>
|
||||
<string name="nfcApplyTagToRule">Zastosuj tag do reguły</string>
|
||||
<string name="nfcTagReadSuccessfully">Tag odczytany pomyślnie.</string>
|
||||
<string name="nfcValueNotSuitable">Zapisana wartość nie jest odpowiednia.</string>
|
||||
<string name="nfcNoTag">Brak tagu.</string>
|
||||
<string name="newNfcId">Wpisz nowy identyfikator NFC</string>
|
||||
<string name="useExistingTag">Użyj istniejącego tagu NFC</string>
|
||||
<string name="newId">Nowy ID:</string>
|
||||
<string name="currentId">Obecny ID:</string>
|
||||
<string name="nfcTagDataNotUsable">Dane tagu nie nadają się do użytku, napisz od nowa.</string>
|
||||
<string name="nfcBringTagIntoRangeToRead">Umieść znacznik w zasięgu do odczytania.</string>
|
||||
<string name="toggleRule">Przełącz regułę</string>
|
||||
<string name="toggling">Przełączanie</string>
|
||||
<string name="toggle">przełącznik</string>
|
||||
<string name="overlapBetweenPois">Wykryto nakładanie się do lokalizacji %1$s z %2$s metrów. Zmniejsz promień przynajmniej o tyle.</string>
|
||||
<string name="noOverLap" translatable="false">No overlap to other locations detected.</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">nic</string>
|
||||
<string name="anyLocation">dowolna lokalizacjan</string>
|
||||
<string name="invalidPoiName">Błędna nazwadla lokalizacji.</string>
|
||||
<string name="eraseSettings">Usuń ustawienia</string>
|
||||
<string name="defaultSettings">Domyślne ustawienia</string>
|
||||
<string name="areYouSure">Jesteś pewny?</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">Wykrywanie aktywności</string>
|
||||
<string name="android.permission.ACTIVITY_RECOGNITION">Wykrywanie aktywności</string>
|
||||
<string name="detectedActivity">Wykryta aktywność:</string>
|
||||
<string name="detectedActivityInVehicle">W pojeździe (samochód/autobus)</string>
|
||||
<string name="detectedActivityOnBicycle">Na rowerze</string>
|
||||
<string name="detectedActivityOnFoot">Z buta</string>
|
||||
<string name="detectedActivityStill">Ndal</string>
|
||||
<string name="detectedActivityUnknown">niezanane</string>
|
||||
<string name="detectedActivityTilting">Pochylanie</string>
|
||||
<string name="detectedActivityWalking">Spacer</string>
|
||||
<string name="detectedActivityRunning">Bieganie</string>
|
||||
<string name="detectedActivityInvalidStatus">Nieprawidłowa aktywność</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">Wybierz rodzaj aktywności</string>
|
||||
<string name="triggerOnlyAvailableIfPlayServicesInstalled">Ten wyzwalacz jest dostępny tylko wtedy, gdy są zainstalowane Usługi Google Play.</string>
|
||||
<string name="activityDetectionFrequencyTitle">Częstotliwość wykrywania aktywności [sec]</string>
|
||||
<string name="activityDetectionFrequencySummary">Sekundy między próbami wykrycia aktywności.</string>
|
||||
<string name="activityDetectionRequiredProbabilityTitle">Prawdopodobieństwo wykrycia aktywności</string>
|
||||
<string name="activityDetectionRequiredProbabilitySummary">Pewność, z której czynności są akceptowane jako fakt.</string>
|
||||
<string name="incomingCallFrom">Przychodzące połączenie telefoniczne od %1$s.</string>
|
||||
<string name="outgoingCallTo">Wychodzące połączenie telefoniczne do %1$s.</string>
|
||||
<string name="actionSpeakText">Mówienie tekstu</string>
|
||||
<string name="textToSpeak">Tekst do mówienia</string>
|
||||
<string name="toggleNotAllowed">Przełączanie jest obecnie dozwolone tylko w przypadku reguł, których wyzwalaczem są tagi NFC. Więcej informacji można znaleźć w pomocy.</string>
|
||||
<string name="errorReadingPoisAndRulesFromFile">Błąd odczytu lokalizacji i reguł z pliku.</string>
|
||||
<string name="noDataChangedReadingAnyway">Wygląda na to, że nie zapisano żadnych zmian danych. Mogły jednak wystąpić zmiany w pamięci, które należy cofnąć. Ponowne czytanie pliku.</string>
|
||||
<string name="bluetoothConnection">Połączenie Bluetooth</string>
|
||||
<string name="bluetoothConnectionTo">Połączenie Bluetooth do %1$s</string>
|
||||
<string name="bluetoothDisconnectFrom">Połączenie Bluetooth z %1$s utracone</string>
|
||||
<string name="bluetoothDeviceInRange">Bluetooth device %1$s in range.</string>
|
||||
<string name="bluetoothDeviceOutOfRange">Urządzenie Bluetooth %1$s w zasięgu.</string>
|
||||
<string name="anyDevice">dowolne urządzenie</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">bez urządzenia</string>
|
||||
<string name="selectDeviceFromList">jedne z listy</string>
|
||||
<string name="connectionToDevice">połączenie z urządzeniem</string>
|
||||
<string name="disconnectionFromDevice">rozłączenie z urządzeniem</string>
|
||||
<string name="deviceInRange">urządzenie w zasięgu</string>
|
||||
<string name="deviceOutOfRange">urządzenie poza zasięgiem</string>
|
||||
<string name="selectDeviceOption">Wybierz opcję urządzenia.</string>
|
||||
<string name="selectConnectionOption">Wybierz opcję połączenia.</string>
|
||||
<string name="ruleDoesntApplyDeviceInRangeButShouldNotBe" translatable="false">Rule %1$s doesn\'t apply. Device is in range, but should not be.</string>
|
||||
<string name="ruleDoesntApplyStateNotCorrect" translatable="false">Rule %1$s doesn\'t apply. Wrong state.</string>
|
||||
<string name="triggerHeadsetPlugged">Połączenie zestawu słuchawkowego</string>
|
||||
<string name="actionPlayMusic">Otwórz odtwarzacz muzyki</string>
|
||||
<string name="headsetConnected">Zestaw słuchawkowy (typ: %1$s) podłączony</string>
|
||||
<string name="headsetDisconnected">Zestaw słuchawkowy (typ: %1$s) rozłączony</string>
|
||||
<string name="headphoneSimple">Słuchawki</string>
|
||||
<string name="headphoneMicrophone">Mikrofon</string>
|
||||
<string name="headphoneAny">Albo</string>
|
||||
<string name="headphoneSelectType">Wybierz typ słuchawek</string>
|
||||
<string name="ruleDoesntApplyWrongHeadphoneType" translatable="false">Rule %1$s doesn\'t apply. Wrong headphone type.</string>
|
||||
<string name="ignoringActivityDetectionUpdateTooSoon" translatable="false">Ignoring activity detection update. Came in sooner that %1$s seconds.</string>
|
||||
<string name="whatsThis">Co to jest?</string>
|
||||
<string name="atLeastRuleXisUsingY" translatable="false">At least rule \"%1$s\" is using a trigger of type \"%2$s\".</string>
|
||||
<string name="privacyLocationingTitle">Tylko lokalizacja prywatna</string>
|
||||
<string name="privacyLocationingSummary">Unikaj metod lokalizacji, które mogą wysyłać Twoją lokalizację do dostawcy, np. Google. Spowoduje to użycie tylko GPS i dlatego może być powolne lub nie działać niezawodnie.</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">Jeśli uważasz, że wykrywanie hałasu nie działa poprawnie (w zależności od podanej wartości), pamiętaj, że każdy telefon jest inny. Dlatego możesz zmienić \"Odniesienie do pomiaru hałasu\" w ustawieniach. Zobacz http://en.wikipedia.org/wiki/Decibel, aby uzyskać więcej informacji. Do kalibracji urządzenia można użyć kalibratora głośności z ekranu głównego.</string>
|
||||
<string name="hint">Wskazówka</string>
|
||||
<string name="selectNoiseLevel">Wybierz poziom hałasu</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">Pokaż na mapie</string>
|
||||
<string name="noMapsApplicationFound">Nie znaleziono aplikacji map na Twoim urządzeniu.</string>
|
||||
<string name="locationEngineNotActive">Sensor lokalizacji nie jest aktywny.</string>
|
||||
<string name="addProfile">Dodaj profil</string>
|
||||
<string name="profile">Profil</string>
|
||||
<string name="soundMode">Tryb dźwięku</string>
|
||||
<string name="volumes">Głośność</string>
|
||||
<string name="incomingCallsRingtone">Ton dla połączeń przychodzących</string>
|
||||
<string name="notificationRingtone">Ton dla powiadomień</string>
|
||||
<string name="hapticFeedback">Haptyczne sprzężenie zwrotne (wibracje podczas dotykania ekranu)</string>
|
||||
<string name="volumeMusicVideoGameMedia">Muzyka, wideo, gry i inne media</string>
|
||||
<string name="volumeRingtoneNotifications">Dzwonek i powiadomienia</string>
|
||||
<string name="volumeAlarms">Alarmy</string>
|
||||
<string name="change">Zmiana</string>
|
||||
<string name="audibleSelection">Wybór dźwiękowy (dźwięk podczas wybierania ekranu)</string>
|
||||
<string name="screenLockUnlockSound">Dźwięk blokady ekranu/odblokowania</string>
|
||||
<string name="vibrateWhenRinging">Wibracje podczas dzwonienia</string>
|
||||
<string name="profiles">Profile</string>
|
||||
<string name="soundModeNormal">Normaly</string>
|
||||
<string name="soundModeVibrate">Wibracje</string>
|
||||
<string name="soundModeSilent">Cichy</string>
|
||||
<string name="enterAname">Wpisz nazwę.</string>
|
||||
<string name="noChangeSelectedProfileDoesntMakeSense">Nie wybrano zmiany. Profil nie ma sensu.</string>
|
||||
<string name="noProfilesCreateOneFirst">Brak profili w Twojej konfiguracji. Najpierw utwórz jeden.</string>
|
||||
<string name="errorActivatingProfile">Błąd aktywacji profilu:</string>
|
||||
<string name="anotherProfileByThatName">Istnieje już inny profil o tej nazwie.</string>
|
||||
<string name="invalidProfileName">Nieprawidłowa nazwa profilu.</string>
|
||||
<string name="errorWritingFile">Błąd podczas zapisywania pliku ustawień.</string>
|
||||
<string name="unknownError">Nieznany błąd.</string>
|
||||
<string name="noWritableFolderFound">Nie znaleziono folderu z możliwością zapisu do przechowywania pliku konfiguracyjnego.</string>
|
||||
<string name="usbTetheringFailForAboveGingerbread">To najprawdopodobniej nie zadziała, ponieważ korzystasz z Androida powyżej 2.3. Zamiast tego możesz użyć tetheringu przez Wi-Fi.</string>
|
||||
<string name="usingNewThreadForRuleExecution">Używanie nowego wątku do aktywacji reguły.</string>
|
||||
<string name="startNewThreadForRuleExecution">Rozpocznij nowy wątek w celu aktywacji reguły.</string>
|
||||
<string name="newThreadRules">Nowy wątek</string>
|
||||
<string name="showIcon">Pokaż ikonę</string>
|
||||
<string name="showIconWhenServiceIsRunning">Pokaż ikonę, gdy usługa jest uruchomiona (ukrywanie działa tylko pod Androidem 7). Jeśli korzystasz z wyższej wersji, przejdź do ustawień systemu, następnie Automatyzacja, następnie powiadomienia i wyłącz \"Powiadomienie o usłudze\".</string>
|
||||
<string name="ruleHistory">Historia reguł (od najnowszych):</string>
|
||||
<string name="someOptionsNotAvailableYet">Niektóre opcje są wyłączone, ponieważ nie można ich jeszcze używać. Zostaną one wprowadzone w późniejszej wersji programu.</string>
|
||||
<string name="lockSoundChanges">Zmiana dźwięku blokady</string>
|
||||
<string name="noProfileChangeSoundLocked">Profil nie zostanie aktywowany. Ostatnio aktywowany profil został zablokowany.</string>
|
||||
<string name="currentVolume">Obecna głośność</string>
|
||||
<string name="enterValidReferenceValue">Wprowadź prawidłową wartość referencyjną.</string>
|
||||
<string name="volumeTest">Kalibracja głośności</string>
|
||||
<string name="volumeCalibrationExplanation">TAby obliczyć wartość dB dla monitorowania hałasu, należy określić tak zwaną fizyczną wartość odniesienia. Proszę przeczytać Wikipedię, aby uzyskać więcej informacji. Ta wartość jest najprawdopodobniej inna dla każdego telefonu. Przeciągnij pasek wyszukiwania, aby zmienić zdefiniowaną fizyczną wartość odniesienia. Im wyższa wartość odniesienia, tym niższa będzie wartość dB. Stałe pomiary będą wykonywane co %1$s sekund, a wyniki zostaną wyświetlone poniżej. Naciśnij wstecz, gdy znajdziesz odpowiednią wartość.</string>
|
||||
<string name="settingsWillTakeTime">Niektóre ustawienia nie zostaną zastosowane przed zmianą niektórych ustawień środowiska lub ponownym uruchomieniem usługi.</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 connection was successfully changed using superuser permissions.</string>
|
||||
<string name="dataConWithRootFail" translatable="false">Data could not be changed using superuser permissions.</string>
|
||||
<string name="rootExplanation">Aby ta funkcja działała, musisz zrootować telefon. Następnie musisz \"uruchomić regułę ręcznie\", aby wyświetlić pytanie o uprawnienia administratora. Gdy pojawią się wyskakujące okienka administratora, zawsze musisz zezwolić aplikacji na zrobienie tego. W przeciwnym razie reguła nie może działać, gdy telefon jest bez nadzoru.</string>
|
||||
<string name="errorWritingConfig">Błąd podczas zapisywania konfiguracji. Czy masz zapisywalną pamięć?</string>
|
||||
<string name="phoneNrReplacementError">Nie mogłem wstawić ostatniego numeru telefonu do zmiennej. nie mam go.</string>
|
||||
<string name="username">Nazwa</string>
|
||||
<string name="password">Hasło</string>
|
||||
<string name="useAuthentication">Użyj uwierzytelniania</string>
|
||||
<string name="permissionsTitle">Wymagane uprawnienia</string>
|
||||
<string name="permissionsExplanation">Wyjaśnienie wymaganych uprawnień</string>
|
||||
<string name="ok">Ok</string>
|
||||
<string name="disabledFeatures">Wyłączone funkcje</string>
|
||||
<string name="theFollowingPermissionsHaveBeenDenied">Następujące uprawnienia zostały odrzucone:</string>
|
||||
<string name="permissionsExplanationGeneric">Aplikacja działa obecnie w trybie ograniczonym i dezaktywowała niektóre funkcje. Aby w pełni funkcjonować, wymaga uprawnień. Jeśli chcesz korzystać ze wszystkich funkcji, musisz przyznać uprawnienia w następujących oknach dialogowych uprawnień. Jeśli tego nie zrobisz, niektóre zasady nie mogą zostać wykonane. Poniżej znajduje się wyjaśnienie żądanych uprawnień. Kliknij „kontynuuj”, gdy będziesz gotowy, aby kontynuować.</string>
|
||||
<string name="permissionsExplanationSmall">Aby włączyć funkcję, której właśnie próbowałeś użyć, wymagane są dodatkowe uprawnienia. Kliknij przycisk Kontynuuj, aby o nie poprosić.</string>
|
||||
<string name="continueText">kontynuuj</string>
|
||||
<string name="rule">Reguła</string>
|
||||
<string name="storeSettings">Odczytywanie i zapisywanie ustawień</string>
|
||||
<string name="featuresDisabled">OSTRZEŻENIE: Funkcje są wyłączone, automatyzacja działa w trybie ograniczonym. Kliknij tutaj po więcej informacji.</string>
|
||||
<string name="ruleLegend">Zielony = włączony, czerwony = wyłączony, żółty = za mało uprawnień</string>
|
||||
<string name="systemSettingsNote1">Wymagana jest zgoda na zmianę niektórych ustawień systemu operacyjnego (nawet prostych rzeczy, takich jak włączenie Bluetooth lub Wi-Fi). Po kliknięciu „kontynuuj” pojawi się okno, w którym musisz włączyć tę opcję dla automatyzacji. Następnie naciśnij klawisz „wstecz”.</string>
|
||||
<string name="systemSettingsNote2">Później w drugim oknie dialogowym pojawi się prośba o dalsze uprawnienia.</string>
|
||||
<string name="appRequiresPermissiontoAccessExternalStorage">Automatyzacja wymaga dostępu do pamięci zewnętrznej w celu odczytania jej ustawień i reguł.</string>
|
||||
<string name="mainScreenPermissionNote">Automatyzacja wymaga więcej uprawnień do pełnego działania. Kliknij ten tekst, aby dowiedzieć się więcej i poprosić o nie.</string>
|
||||
<string name="invalidDevice">Nieprawidłowe urządzenie</string>
|
||||
<string name="google_app_id" translatable="false">your app id</string>
|
||||
<string name="logFileMaxSizeSummary">Maksymalny rozmiar pliku dziennika w megabajtach. Zostanie obrócony, jeśli będzie większy.</string>
|
||||
<string name="logFileMaxSizeTitle">Maksymalny rozmiar pliku dziennika [Mb]</string>
|
||||
<string name="android.permission.READ_CALL_LOG">Przeczytaj dziennik telefonu</string>
|
||||
<string name="android.permission.READ_CALENDAR">Przeczytaj wpisy w kalendarzu</string>
|
||||
<string name="android.permission.ACCESS_FINE_LOCATION">Przeczytaj dokładną lokalizację</string>
|
||||
<string name="android.permission.ACCESS_COARSE_LOCATION">Przeczytaj zgrubną lokalizację</string>
|
||||
<string name="readLocation">Przeczytaj lokalizację</string>
|
||||
<string name="android.permission.INTERNET">Wysyłaj dane przez połączenie sieciowe</string>
|
||||
<string name="android.permission.ACCESS_NETWORK_STATE">Odczytaj stan sieci urządzenia</string>
|
||||
<string name="android.permission.ACCESS_WIFI_STATE">Przeczytaj stan Wi-Fi urządzenia</string>
|
||||
<string name="android.permission.BLUETOOTH">Zmień ustawienia Bluetootha</string>
|
||||
<string name="android.permission.BLUETOOTH_ADMIN">Zmień ustawienia Bluetootha</string>
|
||||
<string name="android.permission.NFC">Użyj modułu NFC</string>
|
||||
<string name="android.permission.VIBRATE">Niech telefon wibruje</string>
|
||||
<string name="android.permission.WAKE_LOCK">Nie wyłączaj telefonu</string>
|
||||
<string name="android.permission.MODIFY_AUDIO_SETTINGS">Zmień ustawienia dźwięku</string>
|
||||
<string name="android.permission.RECORD_AUDIO">Nagraj dźwięk</string>
|
||||
<string name="android.permission.PROCESS_OUTGOING_CALLS">Wykrywaj połączenia wychodzące</string>
|
||||
<string name="android.permission.MODIFY_PHONE_STATE">Zmień ustawienia urządzenia</string>
|
||||
<string name="android.permission.READ_PHONE_STATE">Wykryj stan telefonu</string>
|
||||
<string name="android.permission.READ_EXTERNAL_STORAGE">Odczyt pamięci</string>
|
||||
<string name="android.permission.WRITE_EXTERNAL_STORAGE">Pamięć zapisu</string>
|
||||
<string name="android.permission.GET_TASKS">Wykrywaj uruchomione procesy</string>
|
||||
<string name="android.permission.WRITE_SETTINGS">Zmień ustawienia urządzenia</string>
|
||||
<string name="android.permission.RECEIVE_BOOT_COMPLETED">Wykryj ponowne uruchomienie urządzenia</string>
|
||||
<string name="android.permission.WRITE_SECURE_SETTINGS">Zmień ustawienia urządzenia</string>
|
||||
<string name="android.permission.BATTERY_STATS">Odczytaj stan baterii</string>
|
||||
<string name="android.permission.CHANGE_BACKGROUND_DATA_SETTING">Zmień połączenie transmisji danych</string>
|
||||
<string name="android.permission.SEND_SMS">Wyśli wiadomości tekstowe</string>
|
||||
<string name="android.permission.READ_CONTACTS">Odczytaj dane kontaktowe</string>
|
||||
<string name="android.permission.ACCESS_NOTIFICATION_POLICY">Zastąp zasady nie przeszkadzać</string>
|
||||
<string name="theseAreThePermissionsRequired">To są wymagane uprawnienia:</string>
|
||||
<string name="ruleXrequiresThis">Wymaga tego reguła \"%1$s\".</string>
|
||||
<string name="profileXrequiresThis">Profil \"%1$s\" tego wymaga.</string>
|
||||
<string name="helpTextActivityDetection">Ta funkcja może wykrywać, czy aktualnie jesteś w ruchu i czy poruszasz się pieszo lub jakim typem pojazdu (do pewnego stopnia). Ta funkcja nie jest w pełni wbudowana w Automation, ale jest dostarczana przez Usługi Google Play. Technicznie rzecz biorąc, nie daje wyniku tak/nie, ale zwraca procent, do którego poziomu jest pewna, że wykryła twój status. Możesz ustawić wartość procentową, od której Automation zaakceptuje wynik. Dwie uwagi: 1) W tym samym czasie może wystąpić więcej niż 1 stan. Na przykład możesz CHODZIĆ wewnątrz jadącego autobusu. 2) Ten czujnik jest stosunkowo prądożerny. Jeśli to możliwe, możesz rozważyć użycie alternatyw, np. wymagają podłączenia samochodowego zestawu głośnomówiącego, aby wykryć, że prowadzisz.</string>
|
||||
<string name="sendTextMessage">Wyślij wiadomość tekstową</string>
|
||||
<string name="textToSend">Tekst do wysłania</string>
|
||||
<string name="textMessageAnnotations">Możesz bezpośrednio wprowadzić numer telefonu. Alternatywnie użyj opcji kontaktów, aby wybrać jeden. Ale pamiętaj: tutaj zostanie zapisany numer, a nie kontakt. Jeśli zmienisz numer telefonu wybranego kontaktu, musisz zaktualizować tę regułę. Sama tego nie robi.</string>
|
||||
<string name="importNumberFromContacts">Importuj numer z kontaktów</string>
|
||||
<string name="android9RecordAudioNotice">Jeśli używasz wyzwalacza poziomu hałasu: Niestety, począwszy od Androida 9 (Pie), Google postanowił uniemożliwić aplikacjom działającym w tle korzystanie z mikrofonu. Więc ten wyzwalacz nie ma już żadnego efektu i niczego nie uruchomi.</string>
|
||||
<string name="android10WifiToggleNotice">Niestety Google zdecydowało się usunąć tę funkcję w Androidzie 10. Zwykłe aplikacje nie mogą już włączać ani wyłączać Wi-Fi. Tylko jeśli twoje urządzenie jest zrootowane, powinno to nadal działać. Jeśli nie, chyba nic już z tym nie zrobimy</string>
|
||||
<string name="messageNotShownAgain">Ta wiadomość nie zostanie ponownie wyświetlona.</string>
|
||||
<string name="chooseActivityHint">W tym wyskakującym okienku ostatecznego wyboru musisz wybrać określoną czynność. Uproszczone jest to jak okno żądanej aplikacji. Jeśli nie wiesz, który z nich to generalnie dobry pomysł, wybierz taki który ma w nazwie \"main\" lub \"launcher\".</string>
|
||||
<string name="edit">Edit</string>
|
||||
<string name="clickAndHoldForOptions">Kliknij i przytrzymaj element, aby wyświetlić opcje.</string>
|
||||
<string name="ruleActivationComplete" translatable="false">Rule \"%1$s\" finished.</string>
|
||||
<string name="positioningEngine">Silnik pozycjonowania</string>
|
||||
<string name="googleSarcasm">Dzięki nieskończonej mądrości Google i nieustannemu dążeniu do ochrony prywatności wszystkich użytkowników, wszystkie reguły, które mogą służyć do wysyłania smsów lub odczytywania stanu telefonu, zostały pozbawione wszystkich wyzwalaczy i działań, które Google uważa za ryzykowne.</string>
|
||||
<string name="startAutomationAsService">Uruchom automatyzację jako usługę</string>
|
||||
<string name="setScreenBrightness">Ustaw jasność ekranu</string>
|
||||
<string name="setScreenBrightnessEnterValue">Wprowadź żądaną jasność (od 0 do 100).</string>
|
||||
<string name="autoBrightness">Włącz automatyczną jasność</string>
|
||||
<string name="apply">akceptuj</string>
|
||||
<string name="brightnessAuto">automatyczna jasność</string>
|
||||
<string name="brightnessManual">manualna jasność</string>
|
||||
<string name="autoBrightnessNotice">Jeśli użyjesz automatycznej jasności, wartość jasności, której użyjesz poniżej, prawdopodobnie nie będzie długo używana.</string>
|
||||
<string name="screenLockSoundNotice">Dźwięków blokady ekranu nie można już automatycznie zmieniać na urządzeniach z systemem Android w wersji 6.0 lub nowszej. Cokolwiek tu ustawisz, nie zadziała w żadną stronę.</string>
|
||||
<string name="startScreen">Ekran startowy</string>
|
||||
<string name="startScreenSummary">Wybierz ekran, na którym aplikacje otwierają się przy starcie.</string>
|
||||
<string name="executeRulesAndProfilesWithSingleClickTitle">Uruchom reguły/profile jednym kliknięciem.</string>
|
||||
<string name="googleLocationChicanery">Ta aplikacja zbiera dane o lokalizacji, aby włączyć reguły oparte na lokalizacji i wykrywaniu prędkości, nawet gdy aplikacja jest zamknięta lub nie jest używana.</string>
|
||||
<string name="googleLocationChicaneryOld">Ta aplikacja zbiera dane o lokalizacji, aby określić, czy aktualnie znajdujesz się w jednej z utworzonych przez siebie lokalizacji. Ponadto służy do określenia aktualnej prędkości, jeśli używasz tego wyzwalacza w regułach. Dzieje się tak nawet wtedy, gdy aplikacja jest zamknięta lub nie jest używana (ale tylko wtedy, gdy usługa jest aktywna).</string>
|
||||
<string name="android.permission.ACCESS_BACKGROUND_LOCATION">Odczytaj lokalizację w tle.</string>
|
||||
<string name="deviceDoesNotHaveBluetooth">Wygląda na to, że to urządzenie nie ma Bluetootha. Nadal możesz kontynuować konfigurowanie tego, ale najprawdopodobniej nie będzie to działało.</string>
|
||||
<string name="manageLocations">Twórz lub edytuj lokalizacje</string>
|
||||
<string name="error">Błąd</string>
|
||||
<string name="featureNotInFdroidVersion">Ta funkcja jest oparta na niewolnym oprogramowaniu. Dlatego nie jest dostępna w wersji F-Droid.</string>
|
||||
<string name="settingsReferringToRestrictedFeaturesInFdroid">Twoje ustawienia i/lub reguły odnoszą się obecnie do niewolnych funkcji, których nie można zapewnić w wersji F-Droid. Obejmuje to wykrywanie bieżącej aktywności fizycznej.</string>
|
||||
<string name="settingsReferringToRestrictedFeaturesInGoogle">Twoje ustawienia i/lub reguły odnoszą się obecnie do funkcji, których nie można zapewnić w wersji Google Play. Między innymi obejmuje wszystko, co dotyczy połączeń telefonicznych i wiadomości tekstowych.</string>
|
||||
<string name="publishedOn">opublikowane w dniu</string>
|
||||
<string name="displayNewsOnMainScreen">Wyświetlanie wiadomości o aplikacji na ekranie głównym</string>
|
||||
<string name="displayNewsOnMainScreenDescription">Ogłoszenia tylko o tej aplikacji, prawdopodobnie mówimy o 1-2 rocznie, nie więcej.</string>
|
||||
<string name="filesHaveBeenMovedTo">Automation używa teraz innej ścieżki do przechowywania plików. Wszystkie Twoje pliki Automation zostały przeniesione tutaj: \"%s\". Pozwolenie na przechowywanie zewnętrzne nie jest już wymagane; możesz to odwołać. Zostanie usunięte w przyszłej wersji.</string>
|
||||
<string name="locationDisabled">Lokalizacja wyłączona</string>
|
||||
<string name="locationEngineDisabledShort">Nie można już określić lokalizacji w tle. Kliknij tutaj, aby dowiedzieć się dlaczego.</string>
|
||||
<string name="locationEngineDisabledLong">Niestety nie można już określić Twojej lokalizacji. Mamy dług wdzięczności wobec Google za jego nieskończoną mądrość i uprzejmość.\\n\\nPozwól, że wyjaśnię to dokładniej. Począwszy od Androida 10 wprowadzono nowe uprawnienie, które jest potrzebne do określenia Twojej lokalizacji w tle (co oczywiście jest wymagane w przypadku takiej aplikacji). Chociaż ogólnie uważam, że to dobry pomysł, to szykanowanie, jakie wiąże się z tym dla programistów, nie jest.\\n\\nTworząc aplikację, możesz spróbować zakwalifikować się do tego pozwolenia, przestrzegając katalogu wymagań. Niestety nowe wersje mojej aplikacji były odrzucane przez okres trzech miesięcy. Spełniłem wszystkie te wymagania, gówniane wsparcie programistyczne Google twierdziło, że nie. Po przedstawieniu im dowodu, że jednak to zrobiłem - otrzymałem odpowiedź w stylu \"Nie mogę ci już pomóc\". W końcu się poddałem. \\n\\nW rezultacie wersja Google Play NIE może już używać Twojej lokalizacji jako wyzwalacza. Moją jedyną alternatywną opcją byłoby całkowite usunięcie tej aplikacji ze sklepu.\\n\\nBardzo mi przykro z tego powodu, ale starałem się jak mogłem kłócąc się z \"wsparciem\", które wielokrotnie kończyło się niepowodzeniem aby zdać test Turinga.\\n\\nDobra wiadomość: nadal możesz mieć to wszystko!\\n\\nAutomation jest teraz open source i można go znaleźć w F-Droid. To jest sklep z aplikacjami, który naprawdę dba o twoją prywatność - zamiast po prostu tak się zachowywać. Po prostu wykonaj kopię zapasową pliku konfiguracyjnego, odinstaluj tę aplikację, zainstaluj ją ponownie z F-Droid, przywróć plik konfiguracyjny - gotowe.\\n\\nKliknij tutaj, aby dowiedzieć się więcej:</string>
|
||||
<string name="filesStoredAt">Pliki konfiguracji i dziennika są przechowywane w folderze %1$s. Kliknij ten tekst, aby otworzyć eksplorator plików. Niestety będzie to działać tylko na zrootowanym urządzeniu. DLA WSZYSTKICH INNYCH URZĄDZEŃ: Po prostu użyj przycisku eksportu, aby wykonać kopię zapasową.</string>
|
||||
<string name="notification">Powiadomienie</string>
|
||||
<string name="title">Tytuł</string>
|
||||
<string name="text">Tekst</string>
|
||||
<string name="directionStringEquals">równa się</string>
|
||||
<string name="directionStringContains">zawiera</string>
|
||||
<string name="directionStringStartsWith">zacznij z</string>
|
||||
<string name="directionStringEndsWith">skończ z</string>
|
||||
<string name="directionStringNotEquals">nie równa się</string>
|
||||
<string name="anyApp">dowolna app</string>
|
||||
<string name="notificationTriggerExplanation">Ten wyzwalacz będzie reagował na powiadomienia o otwieraniu innych aplikacji w obszarze powiadomień (lub ich zamykaniu). Możesz określić inną aplikację, z której ma pochodzić powiadomienie. Jeśli tego nie zrobisz, powiadomienia z dowolnej innej aplikacji będą się liczyć. Możesz także określić ciągi, które muszą lub nie mogą znajdować się w ich tytule lub treści powiadomienia. Porównanie odbywa się bez uwzględniania wielkości liter.</string>
|
||||
<string name="postsNotification">%1$s powiadomień o postach</string>
|
||||
<string name="removedNotification">powiadomienie od %1$s zostało usunięte</string>
|
||||
<string name="notificationAppears">Pojawi się powiadomienie</string>
|
||||
<string name="notificationDisappears">Powiadomienie znika</string>
|
||||
<string name="direction">Kierunek</string>
|
||||
<string name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">Czytaj powiadomienia systemowe</string>
|
||||
<string name="playSound">Odtwórz dźwięk</string>
|
||||
<string name="alwaysPlay">zawsze odtwórz</string>
|
||||
<string name="alwaysPlayExplanation">Jeśli to ustawienie jest aktywne, dźwięk będzie zawsze odtwarzany. Jeśli jest dezaktywowany, będzie odtwarzany tylko wtedy, gdy telefon nie jest wyciszony ani wibruje. Jednak jeśli jest aktywny, nie będzie miał wpływu na głośność. Więc jeśli twój telefon jest w trybie dzwonka, na przykład nie zwiększy głośności multimediów. Więc jeśli głośność multimediów jest wyciszona, też nic nie usłyszysz.</string>
|
||||
<string name="selectSoundFile">Wybierz plik dźwiękowy</string>
|
||||
<string name="fileDoesNotExist">Plik nie istnieje.</string>
|
||||
<string name="noFileManageInstalled">Brak zainstalowanego menedżera plików.</string>
|
||||
<string name="shareConfigAndLogFilesWithDev">Dołącz pliki konfiguracyjne i dzienniki.</string>
|
||||
<string name="shareConfigAndLogExplanation">Spowoduje to rozpoczęcie nowej wiadomości e-mail z plikami konfiguracji i dziennikem załączonymi jako plik zip. Nie zostanie wysłany automatycznie, nadal musisz nacisnąć \"wyślij\". Możesz też zmienić odbiorcę na np. siebie.</string>
|
||||
<string name="startAppChoiceNote">Tutaj masz 2 ogólne opcje:\n\n1. Program można uruchomić, wybierając czynność. Wyobraź sobie, że jest to preselekcja określonego ekranu/okna aplikacji. Pamiętaj, że to nie zawsze może działać. Dzieje się tak, ponieważ okna aplikacji mogą wchodzić ze sobą w interakcje, np. przekazać parametry. Gdy bez ogródek uruchamia się określony ekran, ta interakcja nie nastąpiła, a okno może się natychmiast zamknąć (dlatego tak naprawdę nigdy nie jest pokazane). Mimo to spróbuj! Ścieżkę aktywności można wprowadzić ręcznie, ale zaleca się użycie przycisku „Wybierz”. Jeśli zdecydujesz się wprowadzić go ręcznie, w górnym polu wpisz nazwę pakietu aplikacji, a w dolnym pełną ścieżkę działania.\n\n2. Wybór za pomocą akcji w przeciwieństwie do wybierania określonego okna, możesz także uruchomić program za pomocą akcji. To tak, jakby wykrzyczeć „Chciałbym xyz” i jeśli jest zainstalowana aplikacja, która może ci w tym pomóc, zostanie uruchomiona. Dobrym przykładem może być uruchomienie przeglądarki - możesz nawet mieć kilka zainstalowanych (zwykle jedena jest domyślna). Musisz wprowadzić to ręcznie, nazwa_pakietu jest tutaj opcjonalna. Pamiętaj, że żadne zmienne nie zostaną rozwiązane. Jeśli chcesz uruchomić kamerę, na przykład za pomocą \"MediaStore.ACTION_IMAGE_CAPTURE\" nie będzie działać. Musisz zajrzeć do dokumentacji Androida i zamiast tego użyć rzeczywistej wartości tej zmiennej, która w tym przykładzie byłaby \"android.media.action.IMAGE_CAPTURE\".</string>
|
||||
<string name="errorRunningRule">Podczas uruchamiania reguły wystąpił błąd.</string>
|
||||
<string name="cantFindSoundFile">Nie można znaleźć pliku dźwiękowego %1$s i dlatego nie można go odtworzyć.</string>
|
||||
<string name="addParameters">Dodaj parametry</string>
|
||||
<string name="com.wireguard.android.permission.CONTROL_TUNNELS">Tunele kontrolne aplikacji Wireguard</string>
|
||||
<string name="startAppSelectionType">Metoda\nwyboru aplikacji</string>
|
||||
<string name="startAppByActivity">według aktywności</string>
|
||||
<string name="startAppByAction">według działania</string>
|
||||
<string name="enterValidAction">Wprowadź prawidłowe działanie</string>
|
||||
<string name="enterPackageName">Wprowadź prawidłową nazwę pakietu.</string>
|
||||
<string name="state">Państwo</string>
|
||||
<string name="phoneNumberExplanation">Możesz wprowadzić konkretny zdalny numer telefonu, ale nie musisz. Jeśli chcesz określić jeden, możesz wybrać go z książki adresowej lub wprowadzić go ręcznie. Dodatkowo możesz używać wyrażeń regularnych. Aby przetestować wyrażenie regularne, podoba mi się ta strona:</string>
|
||||
<string name="importConfiguration">Import konfiguracji</string>
|
||||
<string name="exportConfiguration">Eksport konfiguracji</string>
|
||||
<string name="moreSettings">Więcej ustawień</string>
|
||||
<string name="configurationExportedSuccessfully">Pomyślnie wyeksportowano konfigurację.</string>
|
||||
<string name="ConfigurationExportError">Wystąpił błąd podczas eksportowania konfiguracji.</string>
|
||||
<string name="rulesImportedSuccessfully">Reguły i lokalizacje zostały pomyślnie zaimportowane.</string>
|
||||
<string name="rulesImportError">Podczas importowania reguł i lokalizacji wystąpił błąd.</string>
|
||||
<string name="configurationImportedSuccessfully">Pomyślnie zaimportowano konfigurację.</string>
|
||||
<string name="prefsImportError">Podczas importowania preferencji wystąpił błąd.</string>
|
||||
<string name="noApplicableFilesFoundInDirectory">W tym katalogu nie znaleziono odpowiednich plików.</string>
|
||||
<string name="noFilesImported">Nie można zaimportować żadnego pliku.</string>
|
||||
<string name="notAllFilesImported">Nie wszystkie odpowiednie pliki mogły zostać zaimportowane.</string>
|
||||
<string name="importExportExplanation">Klikając przycisk importuj lub eksportuj, wybierasz katalog, z którego pliki są importowane lub eksportowane. Podczas eksportowania istniejące pliki mogą zostać nadpisane.</string>
|
||||
<string name="intentDataComment">Jeśli twój parametr jest typu Uri ORAZ podasz \"IntentData\" jako nazwę (małe/duże litery nie są ważne), parametr nie zostanie dodany jako normalny parametr z putExtra(), ale zamiast tego zostanie dodany do intencji z setData().</string>
|
||||
<string name="stringNotAllowed">Ciąg %1$s jest niedozwolony.</string>
|
||||
<string name="startAppStartType">Wybierz typ startu</string>
|
||||
<string name="startAppByStartActivity">przez startActivity()</string>
|
||||
<string name="startAppBySendBroadcast">przez sendBroadcast()</string>
|
||||
<string name="openExamplesPage">Otwórz stronę internetową z przykładami</string>
|
||||
<string name="packageName">Nazwa paketu</string>
|
||||
<string name="activityOrActionName">Nazwa czynności/akcji</string>
|
||||
<string name="warning">Ostrzeżenie</string>
|
||||
<string name="ringing">dzwonienie</string>
|
||||
<string name="from">z</string>
|
||||
<string name="to">do</string>
|
||||
<string name="matching">dopasowanie</string>
|
||||
<string name="urlRegex" translatable="false">https://regex101.com/</string>
|
||||
<string name="loadWifiList">Załaduj listę Wi-Fi</string>
|
||||
<string name="needLocationPermForWifiList">Lista sieci Wi-Fi, z którymi łączyło się Twoje urządzenie, może zostać wykorzystana do określenia miejsc, w których byłeś. Dlatego do załadowania listy Wi-Fi wymagane jest zezwolenie na lokalizację. Jeśli chcesz mieć możliwość wybrania jedną z listy, musisz udzielić tego pozwolenia. Jeśli tego nie chcesz, nadal możesz ręcznie wprowadzić nazwę Wi-Fi.</string>
|
||||
<string name="noKnownWifis">Na Twoim urządzeniu nie ma żadnych znanych sieci Wi-Fi.</string>
|
||||
<string name="urlToTriggerExplanation">Ta funkcja NIE otwiera przeglądarki, ale uruchamia adres URL w tle. Możesz to wykorzystać np. do wysyłania poleceń do automatyki domowej.</string>
|
||||
<string name="automaticUpdateCheck">Sprawdzanie aktualizacji</string>
|
||||
<string name="automaticUpdateCheckSummary">Dotyczy tylko wersji APK.</string>
|
||||
<string name="updateAvailable">Dostępna jest nowa aktualizacja. Czy chcesz otworzyć przeglądarkę, aby ją pobrać?</string>
|
||||
<string name="locationFound">Znaleziono lokalizację. Sugerowany minimalny promień lokalizacji to %1$d m.</string>
|
||||
<string name="locationFoundInaccurate">Można było znaleźć tylko lokalizację z ograniczoną dokładnością. Może nie działać niezawodnie. Sugerowany minimalny promień lokalizacji to %1$d."</string>
|
||||
<string name="clone">Klonuj</string>
|
||||
<string name="noLocationCouldBeFound">Nie znaleziono pozycji po przekroczeniu limitu czasu wynoszącego %1$s sekund.</string>
|
||||
<string name="pleaseGiveBgLocation">Na następnym ekranie przejdź do uprawnień, a następnie lokalizacji. Tam wybierz \"Zezwalaj cały czas\", aby Automation mógł określić Twoją lokalizację w tle.</string>
|
||||
<string name="vibrate">Wibracje</string>
|
||||
<string name="test">Wyróbuj</string>
|
||||
<string name="VibrateExplanation">Wprowadź czas trwania wibracji, po którym następuje przecinek, a następnie czas trwania pauzy. Możesz połączyć tyle wibracji, ile chcesz. Oddziel je ponownie przecinkami. Np. wzór 100,500,500,1000,100 wibruje 100, czeka 500, wibruje 500, czeka 1000, wibruje 100 ms. Jeśli uważasz, że wibracje są przerywane, spróbuj wydłużyć pauzę przed nimi.</string>
|
||||
<string name="pleaseEnterValidVibrationPattern">Wprowadź prawidłowy wzorzec wibracji.</string>
|
||||
<string name="newsOptIn">Czy chcesz otrzymywać (tylko ważne) wiadomości o tej aplikacji na głównym ekranie? Są one pobierane ze strony dewelopera. Nie będzie żadnych natrętnych powiadomień, tylko tekst na ekranie głównym po otwarciu aplikacji.</string>
|
||||
<string name="top">Góra</string>
|
||||
<string name="bottom">Dół</string>
|
||||
<string name="tabsPlacement">Położenie paska kart</string>
|
||||
<string name="tabsPlacementSummary">Wybierz miejsce umieszczenia paska kart.</string>
|
||||
<string name="wifiApi30">Ponieważ Google schrzanił kolejną część Androida, począwszy od API 30, można wyświetlać tylko aktualnie widoczne Wi-Fi, a nie wszystkie, z którymi łączyło się już Twoje urządzenie.</string>
|
||||
<string name="silentTriggersDnd">UWAGA: Tryb cichy często uruchamia tryb Nie przeszkadzać na nowszych urządzeniach. Jeśli tak się stanie na twoim urządzeniu, zalecam zamiast tego użycie trybu normalnego i obniżenie wszystkich głośności do zera.</string>
|
||||
<string name="tones">Tony</string>
|
||||
<string name="miscellaneous">Różnorodności</string>
|
||||
<string name="dnd">Nie przeszkadzać</string>
|
||||
<string name="dndOff">DND off</string>
|
||||
<string name="dndPriority">Przepuszczaj powiadomienia priorytetowe</string>
|
||||
<string name="dndAlarms">Przepuść alarmy</string>
|
||||
<string name="dndNothing">Nic nie przepuszczaj</string>
|
||||
<string name="dndRemarks">Precyzyjne dostrajanie (takie jak zezwalanie na połączenia telefoniczne, wybieranie określonych numerów itp.) można wykonać tylko z poziomu ustawień systemu.</string>
|
||||
<string name="automationNotificationsIgnored">Jeśli nie wybierzesz konkretnej aplikacji, ale wybierzesz \"Dowolna aplikacja\", powiadomienia z Automation będą ignorowane, aby uniknąć zapętleń.</string>
|
||||
<string name="repeatEveryXseconds">Powtarzaj co x sekund</string>
|
||||
<string name="repeatEveryXsecondsWithVariable">powtarzaj co %1$s sekund</string>
|
||||
<string name="enterRepetitionTime">Musisz wprowadzić dodatnią wartość inną niż dziesiętna dla czasu powtarzania.</string>
|
||||
<string name="elementSkipped">Nie można odczytać elementu pliku konfiguracyjnego. Plik mógł zostać utworzony przez nowszą wersję programu.</string>
|
||||
<string name="donate">Wspomóż</string>
|
||||
<string name="btTetheringNotice">Potwierdzono, że ta funkcja działa do wersji Android 8.0. Od jakiejś wyższej wersji wzwyż przestaje działać, ale z powodu braku fizycznych urządzeń nie jestem w stanie stwierdzić, które to. Na Androidzie 11 zdecydowanie już nie działa. Jeśli masz wersję pośrednią, daj mi znać, czy działa, czy nie.</string>
|
||||
<string name="notice">Wzmianka</string>
|
||||
<string name="deviceOrientation">Orientacja urządzenia</string>
|
||||
<string name="tolerance">Tolerancja (0-180)</string>
|
||||
<string name="orientationAzimuth">Azymut:</string>
|
||||
<string name="orientationPitch">Poziom:</string>
|
||||
<string name="orientationRoll">Rolka:</string>
|
||||
<string name="enterValidNumbersIntoAllFields">Wprowadź prawidłowe liczby we wszystkich polach.</string>
|
||||
<string name="deviceOrientationExplanation">Gdy przeniesiesz urządzenie, poniższe numery zostaną zaktualizowane. To, co możesz tam zobaczyć, to aktualna orientacja twojego urządzenia mierzona w stopniach. Jeśli jest w żądanej orientacji, kliknij przycisk Zastosuj, aby skopiować bieżące wartości do żądanych pól. Ponieważ ponowne osiągnięcie tej dokładnej orientacji jest bardzo mało prawdopodobne, należy również wprowadzić tolerancję. Jest to liczba stopni, o jaką orientacja może odchylić się w dowolnym kierunku. 15° da całkowity kąt 30°, 15° w każdym kierunku. Jeśli zależy Ci tylko na jednej konkretnej osi, określ tolerancję 180° dla dwóch pozostałych.</string>
|
||||
<string name="wouldCurrentlyApply">Czy obecnie miałby zastosowanie?</string>
|
||||
<string name="deviceIsInCertainOrientation">urządzenie znajduje się w określonej orientacji</string>
|
||||
<string name="toleranceOf180OnlyAllowedIn2Fields">Tolerancja 180 jest dozwolona tylko dla 2 pól tolerancji, a nie dla wszystkich 3. W przeciwnym razie wyzwalacz ZAWSZE miałby zastosowanie.</string>
|
||||
<string name="unknown">nieznany</string>
|
||||
<string name="orientation">Orientacja</string>
|
||||
<string name="triggerWrong">Coś jest nie tak z tym wyzwalaczem. Nie można go poprawnie załadować.</string>
|
||||
<string name="turnScreenOnOrOff">Włącz lub wyłącz ekran</string>
|
||||
<string name="turnScreenOn">włącz ekran</string>
|
||||
<string name="turnScreenOff">wyłącz ekran</string>
|
||||
<string name="mustApply">Należy zastosować</string>
|
||||
<string name="deviceOrientationTimeAcceptIntervalTitle">Częstotliwość sygnału</string>
|
||||
<string name="deviceOrientationTimeAcceptIntervalSummary">Akceptuj nowe sygnały ruchu co x milisekund</string>
|
||||
<string name="deviceOrientationSettings">Ustawienia orientacji urządzenia</string>
|
||||
<string name="android.permission.BIND_DEVICE_ADMIN">Administrator urządzenia</string>
|
||||
<string name="deviceAdminNote">Co najmniej 1 utworzona przez Ciebie reguła wymaga uprawnień administratora urządzenia.</string>
|
||||
<string name="explanationDeviceOrientationDirection">Jeśli pole wyboru jest zaznaczone, oznacza to, że urządzenie musi znajdować się w określonej orientacji. Jeśli nie jest zaznaczone, odpowiednia będzie każda orientacja, która NIE spełnia Twoich kryteriów.</string>
|
||||
<string name="permissionsRequiredNotAvailable">Twoje reguły wymagały uprawnień, których nie można uzyskać w tej zainstalowanej odmianie Automation.</string>
|
||||
<string name="smsDialogNotice">Jeśli wcześniej nie korzystałeś z akcji wyślij sms w tym programie, Android może wyświetlić dodatkowe okno dialogowe z prośbą o zezwolenie na wysyłanie wiadomości. Musisz zaznaczyć pole wyboru \"zawsze zezwalaj\" i potwierdzić, czy chcesz, aby ta akcja działała w tle. Zaleca się jednorazowe uruchomienie tej reguły ręcznie, aby wyświetlić okno dialogowe potwierdzenia.</string>
|
||||
<string name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS">Wyklucz z optymalizacji baterii</string>
|
||||
<string name="recommendedForBetterReliability">Zalecane dla lepszej niezawodności</string>
|
||||
<string name="needsToBeActive">Musi być aktywny</string>
|
||||
<string name="checkSettings">Sprawdź ustwienia</string>
|
||||
<string name="profileActive">profil %1$s jest aktywny</string>
|
||||
<string name="profileNotActive">profil %1$s nie jest aktywny</string>
|
||||
<string name="profileTriggerCheckSettings">Jeśli to pole wyboru nie jest wyłączone, zostanie zaznaczone tylko wtedy, gdy wybrany profil był aktywowany jako ostatni. Nie ma znaczenia, czy jakiekolwiek ustawienia związane z dźwiękiem zostały zmienione z zewnątrz. Jeśli jednak pole wyboru jest zaznaczone, bieżące ustawienia audio naprawdę muszą być takie, jak określono w profilu. UWAGA: Sprawdzanie pliku dzwonka nie jest jeszcze obsługiwane.</string>
|
||||
<string name="ruleXIsUsingProfileY">Nie można usunąć tego profilu. Reguła %1$s odwołuje się do profilu %2$s.</string>
|
||||
<string name="profileCouldNotBeDeleted">Nie można usunąć profilu.</string>
|
||||
<string name="noRepetition">bez powtórzeń</string>
|
||||
<string name="usingAuthentication">za pomocą uwierzytelniania</string>
|
||||
<string name="toNumber">na numer</string>
|
||||
<string name="message">wiadomość</string>
|
||||
<string name="onDays">w dni</string>
|
||||
<string name="notSet">nie ustawiony</string>
|
||||
<string name="takeLauncherActivity">Znajdź automatyczne</string>
|
||||
<string name="pickActivityManually">Wybierz manualnie</string>
|
||||
<string name="launcherOrManualExplanation">Tryb łatwy: automatyzacja może próbować automatycznie zidentyfikować aktywność programu uruchamiającego żądany program. Alternatywnie możesz także ręcznie wybrać jedną z czynności aplikacji. Co byś chciał?</string>
|
||||
<string name="launcherNotFound">Nie można zidentyfikować działania programu uruchamiającego tej aplikacji. Będziesz musiał wybrać jeden ręcznie.</string>
|
||||
<string name="createNotification">Utwórz powiadomienie</string>
|
||||
<string name="enterTitle">Wpisz tytuł.</string>
|
||||
<string name="enterText">Wpisz tekst.</string>
|
||||
<string name="info">Info</string>
|
||||
<string name="profileWasNotFound">Wygląda na to, że profil użyty w tej regule już nie istnieje. Wybrano pierwszy w kolejności alfabetycznej.</string>
|
||||
<string name="notificationCloseActionExplanation">Jeśli nie określisz żadnych kryteriów, ta czynność spowoduje zamknięcie WSZYSTKICH powiadomień. Dlatego zaleca się przynajmniej określenie kryteriów dla co najmniej 1 aplikacji, tytułu lub tekstu.</string>
|
||||
<string name="closeNotifications">Zamknij powiadomienie(a)</string>
|
||||
<string name="comparisonCaseInsensitive">Porównania nie uwzględniają wielkości liter</string>
|
||||
<string name="profileWarning">Ustawienia, które możesz tutaj dostosować, mogą sprawić, że nie będziesz już zauważać pewnych rzeczy w swoim telefonie. Mogą nawet wyciszyć budzik. Więc cokolwiek robisz - zdecydowanie zalecamy przetestowanie tego - także po aktualizacjach Androida.</string>
|
||||
<string name="ifString">jeśli</string>
|
||||
<string name="emailContactNotice">E-mail to moja preferowana metoda kontaktu w celu zgłaszania błędów, zadawania pytań lub składania propozycji. Przejdź do centrum sterowania, aby dowiedzieć się więcej.\nNa wiele pytań nie można odpowiedzieć od razu, ale wymagają one pewnych działań technicznych. Prosimy więc o odrobinę cierpliwości.</string>
|
||||
<string name="controlCenter">Centrum kontroli</string>
|
||||
<string name="sendEmailToDev">Wyślij wiadomość e-mail do programisty</string>
|
||||
<string name="screenIs">ekran to %1$s</string>
|
||||
<string name="on">włączony</string>
|
||||
<string name="off">wyłączony</string>
|
||||
<string name="unlocked">odblokowany</string>
|
||||
<string name="selectDesiredState">Wybierz żądany stan</string>
|
||||
<string name="screenState">Stan ekranu</string>
|
||||
<string name="featureCeasedToWorkLastWorkingAndroidVersion">Dzięki nieskończonej mądrości Google\'a ostatnią wersją Androida, na której działa ta funkcja, jest %1$s. Możesz to skonfigurować, ale prawdopodobnie nie przyniesie to żadnego efektu.</string>
|
||||
<string name="actionMediaControl">Steruj odtwarzaniem multimediów</string>
|
||||
<string name="selectCommand">Wybierz komendę</string>
|
||||
<string name="playPause">przełączanie odtwarzania/pauzy</string>
|
||||
<string name="play">odtwarzaj</string>
|
||||
<string name="pause">pauza</string>
|
||||
<string name="previous">poprzedni</string>
|
||||
<string name="next">następny</string>
|
||||
<string name="android.permission.MEDIA_CONTENT_CONTROL">Steruj odtwarzaniem multimediów</string>
|
||||
<string name="stop">stop</string>
|
||||
<string name="pleaseSelectActionValue">Wybierz działanie!</string>
|
||||
<string name="actionMediaControlNotice">Pamiętaj, że ta czynność może nie działać w przypadku WSZYSTKICH graczy. A nawet jeśli tak, nie każdy przycisk może działać.</string>
|
||||
<string name="musicPlaying">Odtwarzanie muzyki</string>
|
||||
<string name="selectParameters">Wybierz parametry</string>
|
||||
<string name="musicIsPlaying">muzyka jest odtwarzana</string>
|
||||
<string name="musicIsNotPlaying">muzyka nie jest odtwarzana</string>
|
||||
<string name="musicPlayingDetection">Wykrywanie odtwarzania muzyki</string>
|
||||
<string name="musicCheckFrequencyTitle">Sprawdź częstotliwość [ms]</string>
|
||||
<string name="musicCheckFrequencySummary">Milisekundy między kontrolami</string>
|
||||
<string name="locationNotWorkingOn12">Wygląda na to, że obecnie pobieranie lokalizacji nie działa na urządzeniach z Androidem 12. Jeśli to nie działa, przepraszam. Spróbuję to naprawić, gdy tylko poznam przyczynę. Więc jeśli pączek nie przestaje się obracać, wiesz dlaczego.</string>
|
||||
<string name="lastProfile">Ostatni profil:</string>
|
||||
<string name="queryAllPackages">Pobierz listę zainstalowanych aplikacji</string>
|
||||
<string name="timeFrameDaysHint">Jeśli używasz przedziału czasowego, który rozciąga się na północ, musisz wybrać również następny dzień, jeśli chcesz, aby wyzwalacz obowiązywał po północy.</string>
|
||||
<string name="featureNotInGooglePlayVersion">Ta funkcja nie jest już dostępna w wersji Google Play.\n\nCo jakiś czas Google dręczy programistów. Jeśli chcesz nadal korzystać z niektórych funkcji, musisz złożyć dokumenty. Niestety istnieje 99% szans, że dokumenty zostaną odrzucone. To prawie jak w komiksie/filmie Asterix.\n\nSpędziłem tygodnie kłócąc się z nimi o podobne sprawy w przeszłości, ale ciągle dostawałem odmowy – albo przez boty, albo przez ludzi, którzy są mniej więcej tak samo inteligentni jako boty. Mogę zdecydować, czy aplikacja ma zostać całkowicie usunięta ze Sklepu Play, czy usunąć tę funkcję.\nJeśli potrzebujesz tych funkcji, rozważ użycie wersji APK z mojej witryny lub wersji F-Droid.</string>
|
||||
<string name="startActivityInsertManually">To ograniczenie dotyczy tylko wyboru aplikacji, a nie samego uruchomienia. Więc nadal możesz ręcznie wprowadzić nazwę aplikacji, jeśli ją znasz.</string>
|
||||
<string name="deviceStarts">Uruchomienie urządzenias</string>
|
||||
<string name="serviceStarts">Uruchomienie usługi</string>
|
||||
<string name="deviceIsStarting">urządzenie się uruchamia</string>
|
||||
<string name="serviceIsStarting">usługa się uruchamia</string>
|
||||
<string name="broadcastReceived">odebrana transmisja</string>
|
||||
<string name="broadcastNotReceived">transmisja nie została odebrana</string>
|
||||
<string name="explanationBroadcastTrigger">Większość zdarzeń w telefonie zostanie \"opublikowana\" poprzez rozgłaszanie ich w całym systemie operacyjnym.\nNa przykład włączenie/wyłączenie trybu samolotowego uruchomi taką transmisję. Te transmisje nie są automatycznie widoczne/słyszalne, ale jeśli aplikacja (np. Automation) jest zainteresowana, może się z nimi połączyć. Kiedy wystąpią, zostanie o tym powiadomiony i może zareagować.\n\nMożesz tutaj zdefiniować zdarzenie rozgłoszeniowe, na które aplikacja będzie czekać. Możesz wprowadzić je ręcznie, skopiować & wklej je skądś lub wybierz jedną z listy sugestii. Ponieważ ten wyzwalacz ma być i pozostanie bardzo elastyczny, nie mogę podać wyjaśnień dotyczących elementów.\n\nLista sugestii nie jest kompletna. Odwiedź poniższy adres URL, aby zapoznać się z dokumentacją Androida.\nPonadto każda aplikacja może wysyłać niestandardowe zdarzenia, które oczywiście nie pojawią się w dokumentacji Androida.\n\nWiele transmisji wymaga określonych uprawnień do działania. Staram się prosić o uprawnienia tam, gdzie wiem, że będą wymagane. Jeśli uważasz, że wymagana jest zgoda dla wprowadzonej czynności, daj mi znać.\n\nNie otrzymano oznacza, że nie było takiej transmisji od momentu uruchomienia usługi. Reagowanie na określone parametry jest w fazie rozwoju.</string>
|
||||
<string name="broadcastListUrl" translatable="false">https://developer.android.com/reference/android/content/Intent.html</string>
|
||||
<string name="broadcastReceivedTitle">Odebrano transmisję</string>
|
||||
<string name="logsExplanation">Aby uniknąć niepotrzebnego zużywania pamięci, logi nie są domyślnie zapisywane. Więc jeśli masz problem, najpierw aktywuj ustawienia logowania i ustaw poziom logowania na 5. Następnie odtwórz problem. Dopiero wtedy można dołączyć logi.</string>
|
||||
<string name="broadcastsShowSuggestions">Pokaż sugestie</string>
|
||||
<string name="selectBroadcast">Wybierz transmisję</string>
|
||||
<string name="lockedWithoutSecurity">zablokowany (tylko przesunięcie palcem, bez kodu PIN)</string>
|
||||
<string name="lockedWithSecurity">zablokowany (z PINem itp.)</string>
|
||||
<string name="lockedCommentScreenMustBeOff">Każdy stan zablokowania zostanie wykryty tylko wtedy, gdy ekran jest wyłączony.</string>
|
||||
<string name="emailPretext">Jeśli masz problem, sugestie lub pytanie, napisz coś w mailu. Nie wysyłaj mi tylko plików z domyślną treścią wiadomości. Zignoruję je, chyba że prowadzimy już rozmowę.</string>
|
||||
<string name="sendBroadcast">Wyślij transmisję</string>
|
||||
<string name="enterBroadcast">Wprowadź akcję rozgłaszania.</string>
|
||||
<string name="broadcastExplanation">Ta czynność umożliwia wysłanie rozgłoszenia przez system przesyłania wiadomości Android OS. Nie jest to widoczne dla użytkownika, ale aplikacje, które nasłuchują tej konkretnej transmisji, mogą odpowiedzieć na jej wysłanie.</string>
|
||||
<string name="directionStringDoesNotContain">nie zawiera</string>
|
||||
<string name="runExecutable">Uruchom skrypt lub plik wykonywalny</string>
|
||||
<string name="path">Ścieżka</string>
|
||||
<string name="parameters">Parametry</string>
|
||||
<string name="chooseExecutable">Wybierz plik wykonywalny</string>
|
||||
<string name="runAsRoot">Uruchom jako root</string>
|
||||
<string name="selectValidExecutable">Wybierz prawidłowy plik wykonywalny.</string>
|
||||
<string name="fileNotExecutable">Plik nie jest wykonywalny.</string>
|
||||
<string name="wifiExplanation1">Aplikacje kierowane na system Android Q lub nowszy nie mogą już włączać ani wyłączać Wi-Fi. Obwiniaj Google za to ograniczenie, nie mnie. Możesz ominąć to ograniczenie, rootując urządzenie i zaznaczając pole wyboru poniżej. Alternatywnie pobierz tę aplikację z F-Droid lub mojej strony internetowej, ponieważ nie jestem zmuszony celować w najnowszy poziom API w tych wersjach.</string>
|
||||
<string name="wifiExplanation2">Gdy tryb samolotowy jest włączony, Wi-Fi można przełączać z aplikacji tylko wtedy, gdy używasz do tego uprawnień roota.</string>
|
||||
<string name="usingRoot">używając roota</string>
|
||||
<string name="runExecutableExplanation">Możesz tutaj wybrać skrypt lub plik wykonywalny, który zostanie wykonany jako akcja.\n\nAle są pewne warunki wstępne, z którymi musisz sobie poradzić samodzielnie. Google bardzo utrudnił uruchamianie czegokolwiek poza zwykłymi aplikacjami na Androida.\n\n1. Skrypt musi być oznaczony jako wykonywalny. W zwykłym systemie Android (bez roota) jest to właściwie najtrudniejsza część.\n\n2. Oznacza to również, że Automation musi być w stanie wykonać plik, a nie tylko właściciel lub grupa.\n\n3. Jeśli jest to skrypt, w nagłówku skryptu należy określić poprawną powłokę.\n\nJeśli nie możesz spełnić powyższych wymagań, możesz alternatywnie spróbować określić powłokę jako plik wykonywalny (jak /system/bin/sh ) i twój skrypt jako parametr. To zadziałało dla co najmniej jednego użytkownika.</string>
|
||||
<string name="tetheringActive">tethering jest aktywny</string>
|
||||
<string name="tetheringNotActive">tethering nie jest aktywnye</string>
|
||||
<string name="tetheringState">Stan tetheringu</string>
|
||||
<string name="regularExpressionsIfEquals">Jeśli wybrano opcję \"równa się\", można wprowadzić wyrażenie regularne.</string>
|
||||
<string name="enter_a_number">Wpisz numer.</string>
|
||||
<string name="duration">Czas trwania [ms]</string>
|
||||
<string name="keepDeviceAwake">Utrzymuj urządzenie w stanie uśpienia</string>
|
||||
<string name="wakeLockTimeout">Określ limit czasu</string>
|
||||
<string name="wakeLockExplanation">Aktywuj spowoduje, że ekran będzie włączony, a dezaktywacja pozwoli mu się wyłączyć. Aby utrzymać go włączonym, możesz wprowadzić czas, po którym może się ponownie wyłączyć lub możesz ją włączyć na czas nieokreślony. W tym drugim przypadku musiałbyś utworzyć kolejną akcję ostrzegającą (w tej lub innej regule), w której wybierasz dezaktywuj.</string>
|
||||
<string name="mayUseRegularExpressions">Możesz również wprowadzić tutaj wyrażenie regularne.</string>
|
||||
<string name="simplyDismissNotification">Po prostu odrzuć</string>
|
||||
<string name="clickNotificationButton">Kliknij przycisk</string>
|
||||
<string name="withButton">za pomocą przycisku %1$s</string>
|
||||
<string name="subSystemState">Stan podsystemu</string>
|
||||
<string name="bluetooth">Bluetooth</string>
|
||||
<string name="locationRequiredToDetermineWifiName">Aby uzyskać identyfikator SSID Wi-Fi, aplikacja wymaga uprawnień do lokalizacji. Ponieważ wersja Google nie może tego uzyskać, możesz użyć tego wyzwalacza tylko wtedy, gdy nie określisz identyfikatora SSID. Można go więc używać tylko do wykrywania, czy Wi-Fi jest podłączone, czy nie.</string>
|
||||
<string name="usb">USB</string>
|
||||
<string name="type">Typ</string>
|
||||
<string name="cable">Kabel</string>
|
||||
<string name="tetheringBluetoothNotPossible">Obecnie nie można wykryć tetheringu przez Bluetooth. Tylko inne sposoby połączenia aktywują ten wyzwalacz.</string>
|
||||
<string name="startPhoneCall">Zadzwoń pod numer telefonu</string>
|
||||
<string name="android.permission.CALL_PHONE">Zadzwoń pod numer telefonu</string>
|
||||
<string name="makePhoneCallExplanation1">Tutaj możesz wprowadzić numer telefonu, pod który zadzwonisz bez dalszych monitów. Możesz użyć tego do wprowadzania ustawień, takich jak dostosowywanie tras połączeń itp. Proszę samodzielnie wyszukać wymagane do tego kody.</string>
|
||||
<string name="endPhoneCall">Zakończ połączenie</string>
|
||||
<string name="android.permission.ANSWER_PHONE_CALLS">Zakończ połączenie</string>
|
||||
<string name="setVariable">Ustaw zmienną</string>
|
||||
<string name="deleteVariable">Uuń zmienną</string>
|
||||
<string name="VariableKey">Klucz zmiennej</string>
|
||||
<string name="variableValue">Wartość zmiennej</string>
|
||||
<string name="setVariableExplanation">Jeśli ustawisz zmienną na pustą wartość, zostanie ona usunięta.</string>
|
||||
<string name="enterVariableKey">Wprowadź klucz dla zmiennej.</string>
|
||||
<string name="checkVariable">Sprawdź zmienną</string>
|
||||
<string name="checkVariableExplanation">Jeśli pozostawisz wartość pustą, zmienna nie może być ustawiona, aby warunek zwrócił wartość true.</string>
|
||||
<string name="variableCheckString">jeśli zmienna %1$s to %2$s</string>
|
||||
<string name="variableCheckStringDeleted">jeśli zmienna %1$s nie jest ustawiona</string>
|
||||
<string name="messageType">Typ wiadomości</string>
|
||||
<string name="sms">SMS</string>
|
||||
<string name="mms">MMS</string>
|
||||
<string name="attachment">Załącznik</string>
|
||||
<string name="chooseFile">wybierz plik</string>
|
||||
<string name="startAppByStartService">przez startService()</string>
|
||||
<string name="showToastsForEvents">Pokaż toasty</string>
|
||||
<string name="showToastsForEventsSummary">Pokazuj toasty, gdy wystąpią zdarzenia takie jak wykonanie reguły</string>
|
||||
<string name="notificationAccessAndroid13">Po kliknięciu ok, wybierz Automation, następnie \"Zezwól na dostęp do powiadomień\", a następnie \"zezwól\".\n\nW niektórych systemach to ustawienie jest wyszarzone. W takich przypadkach należy przejść do \"ustawienia\" -> \"aplikacje\" -> \"Automatyzacja\" -> menu z trzema kropkami -> Znieś te ograniczenia. Następnie wróć tutaj.</string>
|
||||
<string name="displayLanguage">Wyświetl język</string>
|
||||
<string name="displayLanguageSummary">Ustaw niestandardowy język dla aplikacji</string>
|
||||
<string name="wifiMonitoringAlsoRequiresThis">To uprawnienie jest również wymagane, jeśli wyzwalacz korzysta z bieżącego połączenia Wi-Fi.</string>
|
||||
<string name="copyTextToClipboard">Kopiuj tekst do schowka</string>
|
||||
<string name="textToCopy">Tekst do skopiowania</string>
|
||||
<string name="android.permission.SYSTEM_ALERT_WINDOW">Wyświetlaj nad innymi aplikacjami</string>
|
||||
<string name="overlayPermissionHint">Po kliknięciu OK zostaniesz przekierowany do systemowego okna dialogowego. Wybierz tam Automation i zezwól na „wyświetlaniee nad innymi aplikacjami”.</string>
|
||||
<string name="variablesOnlyForTypes">Zmienne są dostępne tylko dla typów parametrów String i URI</string>
|
||||
<string name="intentParametersHint">Jeśli chcesz określić parametr, musisz również kliknąć \"Dodaj parę intencji\". W przeciwnym razie zmiany nie zostaną zapisane.</string>
|
||||
<string name="languageSystemDefault">Domyślne ustawienia systemowe</string>
|
||||
<string name="languageEnglish">Angielski</string>
|
||||
<string name="languageGerman">Niemiecki</string>
|
||||
<string name="languageItalian">Włoski</string>
|
||||
<string name="languageSpanish">Hiszpański</string>
|
||||
<string name="languageDutch">Holenderski</string>
|
||||
<string name="languageRussian">Rosyjski</string>
|
||||
<string name="languageFrench">Francuski</string>
|
||||
<string name="languagePolish">Polski</string>
|
||||
<string name="languageChineseChina">Chiński (Chiny)</string>
|
||||
</resources>
|