forked from jens/Automation
Compare commits
133 Commits
Author | SHA1 | Date | |
---|---|---|---|
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 | |||
f1f3be56cb | |||
5856c93fc8 | |||
8201b1d4e4 | |||
ce9480d188 | |||
a69bbb1e05 | |||
16817e6f53 | |||
26ed906521 | |||
d1ca9ab56b | |||
9c76340f24 | |||
aca5572f40 | |||
944e165dd0 | |||
7f2fc4b5de | |||
cd163afc47 | |||
6179f0e9ae | |||
581cdafb87 | |||
9162bcb451 | |||
5272b56032 | |||
2361c758c9 | |||
f738e02b72 | |||
f5a3636222 | |||
bb1b3b0149 | |||
b35208b7aa | |||
b3ad72cc50 | |||
92e58149a7 | |||
c1809bd23c | |||
88a3ab8241 | |||
00f296d2d1 | |||
e84842361c | |||
efaf0ed270 | |||
7167f0c03d | |||
a9673e65b9 | |||
592abe5b0d | |||
dd7c3cb1d6 | |||
38665ccd92 | |||
c60347b990 | |||
1e7ccf5200 | |||
9b84b8dad7 | |||
a19c84ea51 | |||
3a14a56fd0 | |||
2dfc538343 | |||
67a58077cc | |||
df68f7ca5c | |||
ad18313284 | |||
29a93e0e43 | |||
a5d54c18d8 | |||
62f5ad0005 | |||
4eb7133d9d | |||
343cbba8f8 | |||
51caae0794 | |||
e39a2411ba | |||
98b49036a7 | |||
a7c4cc0965 | |||
5d67452486 | |||
7e12a0f3e5 | |||
5786c1bfd4 | |||
cf500c740e | |||
41efa7c11b | |||
965bf55811 | |||
13fd4c2aae | |||
195a60cfe0 | |||
76563eb89b | |||
7733d57435 | |||
481e4d1896 | |||
5af59e1754 | |||
619f348a28 | |||
9bf353ea3a | |||
af90b566c8 | |||
0e51c577d5 |
2
.gitignore
vendored
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 119
|
||||
versionName "1.7.5"
|
||||
versionCode 123
|
||||
versionName "1.7.8"
|
||||
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
@ -28,7 +28,6 @@ android {
|
||||
targetCompatibility JavaVersion.VERSION_1_8
|
||||
}
|
||||
|
||||
|
||||
flavorDimensions "version"
|
||||
|
||||
productFlavors
|
||||
@ -57,6 +56,7 @@ android {
|
||||
abortOnError false
|
||||
checkReleaseBuilds false
|
||||
}
|
||||
namespace 'com.jens.automation2'
|
||||
}
|
||||
|
||||
dependencies {
|
||||
@ -72,9 +72,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": 119,
|
||||
"versionName": "1.7.5-googlePlay",
|
||||
"outputFile": "app-googlePlayFlavor-release.apk"
|
||||
}
|
||||
],
|
||||
"elementType": "File"
|
||||
}
|
@ -1,6 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.jens.automation2">
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<supports-screens
|
||||
android:anyDensity="true"
|
||||
@ -67,6 +66,8 @@
|
||||
<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-feature
|
||||
android:name="android.hardware.telephony"
|
||||
@ -159,12 +160,23 @@
|
||||
<activity android:name=".ActivityManageTriggerTimeFrame" />
|
||||
<activity android:name=".ActivityControlCenter" />
|
||||
<activity android:name=".ActivityManageTriggerPhoneCall" />
|
||||
<activity android:name=".ActivityManageTriggerBroadcast" />
|
||||
<activity android:name=".ActivityManageActionBrightnessSetting" />
|
||||
<activity android:name=".ActivityManageActionCreateNotification" />
|
||||
<activity android:name=".ActivityManageTriggerDeviceOrientation" />
|
||||
<activity android:name=".ActivityHelp" />
|
||||
<activity android:name=".ActivityManageActionVibrate" />
|
||||
<activity android:name=".ActivityManageActionControlMedia" />
|
||||
<activity android:name=".ActivityManageActionSendBroadcast" />
|
||||
<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=".ActivityMainTabLayout"
|
||||
android:launchMode="singleTask">
|
||||
|
@ -12,6 +12,7 @@ import android.widget.Toast;
|
||||
|
||||
import com.google.android.gms.location.DetectedActivity;
|
||||
import com.jens.automation2.receivers.ActivityDetectionReceiver;
|
||||
import com.jens.automation2.receivers.BroadcastListener;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
@ -106,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()
|
||||
@ -348,6 +349,10 @@ public class Rule implements Comparable<Rule>
|
||||
if(oneTrigger.getTimeFrame().repetition > 0)
|
||||
return true;
|
||||
}
|
||||
else if(oneTrigger.getTriggerType().equals(Trigger.Trigger_Enum.broadcastReceived))
|
||||
{
|
||||
return oneTrigger.getTriggerParameter() == BroadcastListener.getInstance().hasBroadcastOccurredSince(oneTrigger.getTriggerParameter2(), getLastExecution());
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
@ -386,11 +391,12 @@ public class Rule implements Comparable<Rule>
|
||||
if (!oneTrigger.applies(null, context))
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
Miscellaneous.logEvent("i", String.format(context.getResources().getString(R.string.ruleCheckOf), this.getName()), String.format("Rule %1$s generally applies currently. Checking if it's really due, yet will be done separately.", this.getName()), 3);
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.jens.automation2">
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<supports-screens
|
||||
android:anyDensity="true"
|
||||
@ -65,6 +64,8 @@
|
||||
<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-feature
|
||||
android:name="android.hardware.telephony"
|
||||
@ -157,12 +158,22 @@
|
||||
<activity android:name=".ActivityManageTriggerTimeFrame" />
|
||||
<activity android:name=".ActivityControlCenter" />
|
||||
<activity android:name=".ActivityManageTriggerPhoneCall" />
|
||||
<activity android:name=".ActivityManageTriggerBroadcast" />
|
||||
<activity android:name=".ActivityManageActionBrightnessSetting" />
|
||||
<activity android:name=".ActivityManageActionCreateNotification" />
|
||||
<activity android:name=".ActivityManageTriggerDeviceOrientation" />
|
||||
<activity android:name=".ActivityHelp" />
|
||||
<activity android:name=".ActivityManageActionVibrate" />
|
||||
<activity android:name=".ActivityManageActionControlMedia" />
|
||||
<activity android:name=".ActivityManageActionSendBroadcast" />
|
||||
<activity android:name=".ActivityManageActionRunExecutable" />
|
||||
<activity android:name=".ActivityManageActionWifi" />
|
||||
<activity android:name=".ActivityManageTriggerTethering" />
|
||||
<activity android:name=".ActivityManageActionWakeLock" />
|
||||
<activity android:name=".ActivityManageTriggerSubSystemState" />
|
||||
<activity android:name=".ActivityManageMakePhoneCall" />
|
||||
<activity android:name=".ActivityManageActionSetVariable" />
|
||||
<activity android:name=".ActivityManageTriggerCheckVariable" />
|
||||
<activity
|
||||
android:name=".ActivityMainTabLayout"
|
||||
android:launchMode="singleTask">
|
||||
|
@ -10,6 +10,7 @@ import android.os.Looper;
|
||||
import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.jens.automation2.receivers.BroadcastListener;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
@ -103,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()
|
||||
@ -345,6 +346,10 @@ public class Rule implements Comparable<Rule>
|
||||
if(oneTrigger.getTimeFrame().repetition > 0)
|
||||
return true;
|
||||
}
|
||||
else if(oneTrigger.getTriggerType().equals(Trigger.Trigger_Enum.broadcastReceived))
|
||||
{
|
||||
return oneTrigger.getTriggerParameter() == BroadcastListener.getInstance().hasBroadcastOccurredSince(oneTrigger.getTriggerParameter2(), getLastExecution());
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
@ -383,11 +388,12 @@ public class Rule implements Comparable<Rule>
|
||||
if (!oneTrigger.applies(null, context))
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
Miscellaneous.logEvent("i", String.format(context.getResources().getString(R.string.ruleCheckOf), this.getName()), String.format("Rule %1$s generally applies currently. Checking if it's really due, yet will be done separately.", this.getName()), 3);
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.jens.automation2">
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<supports-screens
|
||||
android:anyDensity="true"
|
||||
@ -65,7 +64,6 @@
|
||||
<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.QUERY_ALL_PACKAGES"/>
|
||||
|
||||
<application
|
||||
android:allowBackup="true"
|
||||
@ -145,12 +143,21 @@
|
||||
<activity android:name=".ActivityManageTriggerTimeFrame" />
|
||||
<activity android:name=".ActivityControlCenter" />
|
||||
<activity android:name=".ActivityManageTriggerPhoneCall" />
|
||||
<activity android:name=".ActivityManageTriggerBroadcast" />
|
||||
<activity android:name=".ActivityManageActionBrightnessSetting" />
|
||||
<activity android:name=".ActivityManageActionCreateNotification" />
|
||||
<activity android:name=".ActivityManageTriggerDeviceOrientation" />
|
||||
<activity android:name=".ActivityHelp" />
|
||||
<activity android:name=".ActivityManageActionVibrate" />
|
||||
<activity android:name=".ActivityManageActionControlMedia" />
|
||||
<activity android:name=".ActivityManageActionSendBroadcast" />
|
||||
<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=".ActivityMainTabLayout"
|
||||
android:launchMode="singleTask">
|
||||
|
@ -12,6 +12,7 @@ import android.widget.Toast;
|
||||
|
||||
import com.google.android.gms.location.DetectedActivity;
|
||||
import com.jens.automation2.receivers.ActivityDetectionReceiver;
|
||||
import com.jens.automation2.receivers.BroadcastListener;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
@ -106,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()
|
||||
@ -348,6 +349,10 @@ public class Rule implements Comparable<Rule>
|
||||
if(oneTrigger.getTimeFrame().repetition > 0)
|
||||
return true;
|
||||
}
|
||||
else if(oneTrigger.getTriggerType().equals(Trigger.Trigger_Enum.broadcastReceived))
|
||||
{
|
||||
return oneTrigger.getTriggerParameter() == BroadcastListener.getInstance().hasBroadcastOccurredSince(oneTrigger.getTriggerParameter2(), getLastExecution());
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
@ -386,11 +391,12 @@ public class Rule implements Comparable<Rule>
|
||||
if (!oneTrigger.applies(null, context))
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
Miscellaneous.logEvent("i", String.format(context.getResources().getString(R.string.ruleCheckOf), this.getName()), String.format("Rule %1$s generally applies currently. Checking if it's really due, yet will be done separately.", this.getName()), 3);
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.jens.automation2">
|
||||
|
||||
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
</manifest>
|
@ -21,108 +21,127 @@ public class Action
|
||||
public static final String intentPairSeparator = "intPairSplit";
|
||||
public static final String vibrateSeparator = ",";
|
||||
|
||||
public enum Action_Enum {
|
||||
setWifi,
|
||||
setBluetooth,
|
||||
setUsbTethering,
|
||||
setWifiTethering,
|
||||
setBluetoothTethering,
|
||||
setDisplayRotation,
|
||||
turnWifiOn,turnWifiOff,
|
||||
turnBluetoothOn,turnBluetoothOff,
|
||||
triggerUrl,
|
||||
changeSoundProfile,
|
||||
turnUsbTetheringOn,turnUsbTetheringOff,
|
||||
turnWifiTetheringOn,turnWifiTetheringOff,
|
||||
enableScreenRotation,disableScreenRotation,
|
||||
startOtherActivity,
|
||||
waitBeforeNextAction,
|
||||
turnScreenOnOrOff,
|
||||
setAirplaneMode,
|
||||
setDataConnection,
|
||||
speakText,
|
||||
playMusic,
|
||||
controlMediaPlayback,
|
||||
setScreenBrightness,
|
||||
playSound,
|
||||
vibrate,
|
||||
createNotification,
|
||||
closeNotification,
|
||||
sendTextMessage;
|
||||
|
||||
public String getFullName(Context context)
|
||||
{
|
||||
switch(this)
|
||||
{
|
||||
case setWifi:
|
||||
return context.getResources().getString(R.string.actionSetWifi);
|
||||
case setBluetooth:
|
||||
return context.getResources().getString(R.string.actionSetBluetooth);
|
||||
case setWifiTethering:
|
||||
return context.getResources().getString(R.string.actionSetWifiTethering);
|
||||
case setBluetoothTethering:
|
||||
return context.getResources().getString(R.string.actionSetBluetoothTethering);
|
||||
case setUsbTethering:
|
||||
return context.getResources().getString(R.string.actionSetUsbTethering);
|
||||
case setDisplayRotation:
|
||||
return context.getResources().getString(R.string.actionSetDisplayRotation);
|
||||
case turnWifiOn:
|
||||
return context.getResources().getString(R.string.actionTurnWifiOn);
|
||||
case turnWifiOff:
|
||||
return context.getResources().getString(R.string.actionTurnWifiOff);
|
||||
case turnBluetoothOn:
|
||||
return context.getResources().getString(R.string.actionTurnBluetoothOn);
|
||||
case turnBluetoothOff:
|
||||
return context.getResources().getString(R.string.actionTurnBluetoothOff);
|
||||
case triggerUrl:
|
||||
return context.getResources().getString(R.string.actionTriggerUrl);
|
||||
case changeSoundProfile:
|
||||
return context.getResources().getString(R.string.actionChangeSoundProfile);
|
||||
case turnUsbTetheringOn:
|
||||
return context.getResources().getString(R.string.actionTurnUsbTetheringOn);
|
||||
case turnUsbTetheringOff:
|
||||
return context.getResources().getString(R.string.actionTurnUsbTetheringOff);
|
||||
case turnWifiTetheringOn:
|
||||
return context.getResources().getString(R.string.actionTurnWifiTetheringOn);
|
||||
case turnWifiTetheringOff:
|
||||
return context.getResources().getString(R.string.actionTurnWifiTetheringOff);
|
||||
case enableScreenRotation:
|
||||
return context.getResources().getString(R.string.actionEnableScreenRotation);
|
||||
case disableScreenRotation:
|
||||
return context.getResources().getString(R.string.actionDisableScreenRotation);
|
||||
case startOtherActivity:
|
||||
return context.getResources().getString(R.string.startOtherActivity);
|
||||
case waitBeforeNextAction:
|
||||
return context.getResources().getString(R.string.waitBeforeNextAction);
|
||||
case turnScreenOnOrOff:
|
||||
return context.getResources().getString(R.string.turnScreenOnOrOff);
|
||||
case vibrate:
|
||||
return context.getResources().getString(R.string.vibrate);
|
||||
case setAirplaneMode:
|
||||
return context.getResources().getString(R.string.airplaneMode);
|
||||
case setDataConnection:
|
||||
return context.getResources().getString(R.string.actionDataConnection);
|
||||
case speakText:
|
||||
return context.getResources().getString(R.string.actionSpeakText);
|
||||
case playMusic:
|
||||
return context.getResources().getString(R.string.actionPlayMusic);
|
||||
case controlMediaPlayback:
|
||||
return context.getResources().getString(R.string.actionMediaControl);
|
||||
case playSound:
|
||||
return context.getResources().getString(R.string.playSound);
|
||||
case sendTextMessage:
|
||||
return context.getResources().getString(R.string.sendTextMessage);
|
||||
case setScreenBrightness:
|
||||
return context.getResources().getString(R.string.setScreenBrightness);
|
||||
case createNotification:
|
||||
return context.getResources().getString(R.string.createNotification);
|
||||
case closeNotification:
|
||||
return context.getResources().getString(R.string.closeNotifications);
|
||||
default:
|
||||
return "Unknown";
|
||||
}
|
||||
}
|
||||
};
|
||||
public enum Action_Enum
|
||||
{
|
||||
setWifi,
|
||||
setBluetooth,
|
||||
setUsbTethering,
|
||||
setWifiTethering,
|
||||
setBluetoothTethering,
|
||||
setDisplayRotation,
|
||||
turnWifiOn,turnWifiOff,
|
||||
turnBluetoothOn,turnBluetoothOff,
|
||||
triggerUrl,
|
||||
changeSoundProfile,
|
||||
turnUsbTetheringOn,turnUsbTetheringOff,
|
||||
turnWifiTetheringOn,turnWifiTetheringOff,
|
||||
enableScreenRotation,disableScreenRotation,
|
||||
startOtherActivity,
|
||||
waitBeforeNextAction,
|
||||
turnScreenOnOrOff,
|
||||
setAirplaneMode,
|
||||
setDataConnection,
|
||||
speakText,
|
||||
playMusic,
|
||||
controlMediaPlayback,
|
||||
setScreenBrightness,
|
||||
playSound,
|
||||
vibrate,
|
||||
createNotification,
|
||||
closeNotification,
|
||||
sendBroadcast,
|
||||
runExecutable,
|
||||
wakelock,
|
||||
setVariable,
|
||||
startPhoneCall,
|
||||
stopPhoneCall,
|
||||
sendTextMessage;
|
||||
|
||||
public String getFullName(Context context)
|
||||
{
|
||||
switch(this)
|
||||
{
|
||||
case setWifi:
|
||||
return context.getResources().getString(R.string.actionSetWifi);
|
||||
case setBluetooth:
|
||||
return context.getResources().getString(R.string.actionSetBluetooth);
|
||||
case setWifiTethering:
|
||||
return context.getResources().getString(R.string.actionSetWifiTethering);
|
||||
case setBluetoothTethering:
|
||||
return context.getResources().getString(R.string.actionSetBluetoothTethering);
|
||||
case setUsbTethering:
|
||||
return context.getResources().getString(R.string.actionSetUsbTethering);
|
||||
case setDisplayRotation:
|
||||
return context.getResources().getString(R.string.actionSetDisplayRotation);
|
||||
case turnWifiOn:
|
||||
return context.getResources().getString(R.string.actionTurnWifiOn);
|
||||
case turnWifiOff:
|
||||
return context.getResources().getString(R.string.actionTurnWifiOff);
|
||||
case turnBluetoothOn:
|
||||
return context.getResources().getString(R.string.actionTurnBluetoothOn);
|
||||
case turnBluetoothOff:
|
||||
return context.getResources().getString(R.string.actionTurnBluetoothOff);
|
||||
case triggerUrl:
|
||||
return context.getResources().getString(R.string.actionTriggerUrl);
|
||||
case changeSoundProfile:
|
||||
return context.getResources().getString(R.string.actionChangeSoundProfile);
|
||||
case turnUsbTetheringOn:
|
||||
return context.getResources().getString(R.string.actionTurnUsbTetheringOn);
|
||||
case turnUsbTetheringOff:
|
||||
return context.getResources().getString(R.string.actionTurnUsbTetheringOff);
|
||||
case turnWifiTetheringOn:
|
||||
return context.getResources().getString(R.string.actionTurnWifiTetheringOn);
|
||||
case turnWifiTetheringOff:
|
||||
return context.getResources().getString(R.string.actionTurnWifiTetheringOff);
|
||||
case enableScreenRotation:
|
||||
return context.getResources().getString(R.string.actionEnableScreenRotation);
|
||||
case disableScreenRotation:
|
||||
return context.getResources().getString(R.string.actionDisableScreenRotation);
|
||||
case startOtherActivity:
|
||||
return context.getResources().getString(R.string.startOtherActivity);
|
||||
case waitBeforeNextAction:
|
||||
return context.getResources().getString(R.string.waitBeforeNextAction);
|
||||
case turnScreenOnOrOff:
|
||||
return context.getResources().getString(R.string.turnScreenOnOrOff);
|
||||
case vibrate:
|
||||
return context.getResources().getString(R.string.vibrate);
|
||||
case setAirplaneMode:
|
||||
return context.getResources().getString(R.string.airplaneMode);
|
||||
case setDataConnection:
|
||||
return context.getResources().getString(R.string.actionDataConnection);
|
||||
case speakText:
|
||||
return context.getResources().getString(R.string.actionSpeakText);
|
||||
case playMusic:
|
||||
return context.getResources().getString(R.string.actionPlayMusic);
|
||||
case controlMediaPlayback:
|
||||
return context.getResources().getString(R.string.actionMediaControl);
|
||||
case playSound:
|
||||
return context.getResources().getString(R.string.playSound);
|
||||
case sendTextMessage:
|
||||
return context.getResources().getString(R.string.sendTextMessage);
|
||||
case setScreenBrightness:
|
||||
return context.getResources().getString(R.string.setScreenBrightness);
|
||||
case createNotification:
|
||||
return context.getResources().getString(R.string.createNotification);
|
||||
case closeNotification:
|
||||
return context.getResources().getString(R.string.closeNotifications);
|
||||
case sendBroadcast:
|
||||
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);
|
||||
default:
|
||||
return "Unknown";
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private Action_Enum action;
|
||||
private boolean parameter1 = false;
|
||||
@ -258,6 +277,31 @@ public class Action
|
||||
case closeNotification:
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.closeNotifications));
|
||||
break;
|
||||
case sendBroadcast:
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.sendBroadcast));
|
||||
break;
|
||||
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;
|
||||
default:
|
||||
returnString.append(action.toString());
|
||||
}
|
||||
@ -316,8 +360,24 @@ 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.controlMediaPlayback))
|
||||
else if (this.getAction().equals(Action_Enum.setWifi))
|
||||
{
|
||||
if (!StringUtils.isEmpty(this.parameter2))
|
||||
{
|
||||
boolean useRoot = Boolean.parseBoolean(this.parameter2);
|
||||
if (useRoot)
|
||||
returnString.append(" " + Miscellaneous.getAnyContext().getResources().getString(R.string.usingRoot));
|
||||
}
|
||||
}
|
||||
else if (this.getAction().equals(Action_Enum.controlMediaPlayback))
|
||||
{
|
||||
returnString.append(": ");
|
||||
|
||||
@ -345,6 +405,12 @@ public class Action
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.unknown));
|
||||
}
|
||||
}
|
||||
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))
|
||||
; // it's completed further above already
|
||||
else if (parameter2 != null && parameter2.length() > 0)
|
||||
returnString.append(": " + parameter2.replace(Action.actionParameter2Split, "; "));
|
||||
}
|
||||
@ -430,7 +496,7 @@ public class Action
|
||||
|
||||
return (String[])actionTypesList.toArray(new String[actionTypesList.size()]);
|
||||
}
|
||||
|
||||
|
||||
public void run(Context context, boolean toggleActionIfPossible)
|
||||
{
|
||||
try
|
||||
@ -458,7 +524,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);
|
||||
@ -533,6 +599,31 @@ public class Action
|
||||
else
|
||||
Miscellaneous.logEvent("w", "Close notification", "Close notification was requested, but OS version is too low: " + String.valueOf(Build.VERSION.SDK_INT), 2);
|
||||
break;
|
||||
case sendBroadcast:
|
||||
Actions.sendBroadcast(context, this.getParameter2());
|
||||
break;
|
||||
case runExecutable:
|
||||
String[] execParts = this.getParameter2().split(Action.actionParameter2Split);
|
||||
if(execParts.length == 1)
|
||||
Actions.runExecutable(context, this.getParameter1(), execParts[0], null);
|
||||
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;
|
||||
default:
|
||||
Miscellaneous.logEvent("w", "Action", context.getResources().getString(R.string.unknownActionSpecified), 3);
|
||||
break;
|
||||
@ -636,7 +727,7 @@ public class Action
|
||||
//Do something with result
|
||||
//Toast.makeText(context, text, duration) result;
|
||||
Miscellaneous.logEvent("i", "HTTP RESULT", result, 3);
|
||||
Actions myAction=new Actions();
|
||||
Actions myAction = new Actions();
|
||||
myAction.useDownloadedWebpage(result);
|
||||
}
|
||||
}
|
||||
|
@ -10,27 +10,27 @@ import android.bluetooth.BluetoothAdapter;
|
||||
import android.bluetooth.BluetoothDevice;
|
||||
import android.bluetooth.BluetoothProfile;
|
||||
import android.content.ActivityNotFoundException;
|
||||
import android.content.ComponentName;
|
||||
import android.content.ContentResolver;
|
||||
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;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.PowerManager;
|
||||
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;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.KeyEvent;
|
||||
import android.widget.Toast;
|
||||
@ -52,7 +52,13 @@ import org.apache.http.conn.ssl.SSLSocketFactory;
|
||||
import org.apache.http.conn.util.InetAddressUtils;
|
||||
import org.apache.http.impl.client.DefaultHttpClient;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.OutputStream;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
@ -62,8 +68,12 @@ import java.net.NetworkInterface;
|
||||
import java.security.KeyStore;
|
||||
import java.util.Calendar;
|
||||
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;
|
||||
|
||||
import javax.net.ssl.SSLContext;
|
||||
|
||||
@ -74,10 +84,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";
|
||||
|
||||
@ -119,11 +125,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())
|
||||
{
|
||||
@ -177,7 +186,12 @@ 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);
|
||||
}
|
||||
@ -185,11 +199,69 @@ public class Actions
|
||||
}
|
||||
}
|
||||
|
||||
public static void sendBroadcast(Context context, String action)
|
||||
{
|
||||
Miscellaneous.logEvent("i", "sendBroadcast", "Sending broadcast with action " + action, 5);
|
||||
Intent broadcastIntent = new Intent();
|
||||
|
||||
if(action.contains(Action.actionParameter2Split))
|
||||
{
|
||||
String[] parts = action.split(Action.actionParameter2Split);
|
||||
broadcastIntent.setAction(parts[0]);
|
||||
|
||||
String[] intentparts = parts[1].split(";");
|
||||
broadcastIntent = packParametersIntoIntent(broadcastIntent, intentparts, 0);
|
||||
}
|
||||
else
|
||||
broadcastIntent.setAction(action);
|
||||
|
||||
context.sendBroadcast(broadcastIntent);
|
||||
}
|
||||
|
||||
public static void setVariable(String parameter2)
|
||||
{
|
||||
String[] parts = parameter2.split(Action.actionParameter2Split);
|
||||
|
||||
if(AutomationService.isMyServiceRunning(Miscellaneous.getAnyContext()))
|
||||
{
|
||||
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, boolean toggleActionIfPossible)
|
||||
public static Boolean setWifi(Context context, Boolean desiredState, String parameter2, boolean toggleActionIfPossible)
|
||||
{
|
||||
if(context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.Q)
|
||||
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);
|
||||
@ -225,8 +297,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);
|
||||
|
||||
@ -754,29 +833,21 @@ public class Actions
|
||||
return false;
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.M)
|
||||
public static void setDoNotDisturb(Context context, int desiredSetting)
|
||||
public static void setDoNotDisturb(Context context, int desiredDndMode)
|
||||
{
|
||||
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
|
||||
// Check if the notification policy access has been granted for the app.
|
||||
/* if (!notificationManager.isNotificationPolicyAccessGranted())
|
||||
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
|
||||
{
|
||||
Intent intent = new Intent(android.provider.Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
|
||||
startActivity(intent);
|
||||
return;
|
||||
}*/
|
||||
/*
|
||||
if (!notificationManager.isNotificationPolicyAccessGranted())
|
||||
--> done externally
|
||||
*/
|
||||
|
||||
notificationManager.setInterruptionFilter(desiredSetting);
|
||||
|
||||
/*if (notificationManager.getCurrentInterruptionFilter() == NotificationManager.INTERRUPTION_FILTER_ALL)
|
||||
{
|
||||
notificationManager.setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_NONE);
|
||||
Miscellaneous.logEvent("i", context.getResources().getString(R.string.soundSettings), "Changing DND to " + String.valueOf(desiredDndMode), 4);
|
||||
NotificationManager mNotificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
mNotificationManager.setInterruptionFilter(desiredDndMode);
|
||||
}
|
||||
else
|
||||
{
|
||||
notificationManager.setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_ALL);
|
||||
}*/
|
||||
Miscellaneous.logEvent("w", context.getResources().getString(R.string.soundSettings), "Cannot change DND to " + String.valueOf(desiredDndMode) + ". This Android version is too and doesn\'t have that feature, yet.", 4);
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.M)
|
||||
@ -913,18 +984,6 @@ public class Actions
|
||||
}
|
||||
}
|
||||
|
||||
public static void setDND(Context context, int desiredDndMode)
|
||||
{
|
||||
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
|
||||
{
|
||||
Miscellaneous.logEvent("i", context.getResources().getString(R.string.soundSettings), "Changing DND to " + String.valueOf(desiredDndMode), 4);
|
||||
NotificationManager mNotificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
mNotificationManager.setInterruptionFilter(desiredDndMode);
|
||||
}
|
||||
else
|
||||
Miscellaneous.logEvent("w", context.getResources().getString(R.string.soundSettings), "Cannot change DND to " + String.valueOf(desiredDndMode) + ". This Android version is too and doesn\'t have that feature, yet.", 4);
|
||||
}
|
||||
|
||||
public void useDownloadedWebpage(String result)
|
||||
{
|
||||
// Toast.makeText(context, "Result: " + result, Toast.LENGTH_LONG).show();
|
||||
@ -992,8 +1051,6 @@ public class Actions
|
||||
{
|
||||
Intent externalActivityIntent;
|
||||
|
||||
int paramsStartIndex;
|
||||
|
||||
if (!startByAction)
|
||||
{
|
||||
// selected by activity
|
||||
@ -1005,8 +1062,6 @@ public class Actions
|
||||
|
||||
Miscellaneous.logEvent("i", "StartOtherApp", "Starting app by activity: " + packageName + " " + className, 3);
|
||||
|
||||
paramsStartIndex = 2;
|
||||
|
||||
externalActivityIntent = new Intent(Intent.ACTION_MAIN);
|
||||
externalActivityIntent.addCategory(Intent.CATEGORY_LAUNCHER);
|
||||
|
||||
@ -1034,9 +1089,27 @@ public class Actions
|
||||
externalActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
|
||||
// Pack intents
|
||||
for (int i = 3; i < params.length; i++)
|
||||
{
|
||||
String[] singleParam = params[i].split(Action.intentPairSeparator);
|
||||
externalActivityIntent = packParametersIntoIntent(externalActivityIntent, params, 3);
|
||||
|
||||
if (params[2].equals(ActivityManageActionStartActivity.startByActivityString))
|
||||
automationServerRef.startActivity(externalActivityIntent);
|
||||
if (params[2].equals(ActivityManageActionStartActivity.startByServiceString))
|
||||
automationServerRef.startService(externalActivityIntent);
|
||||
else
|
||||
automationServerRef.sendBroadcast(externalActivityIntent);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Miscellaneous.logEvent("e", "StartOtherApp", automationServerRef.getResources().getString(R.string.errorStartingOtherActivity) + ": " + Log.getStackTraceString(e), 2);
|
||||
Toast.makeText(automationServerRef, automationServerRef.getResources().getString(R.string.errorStartingOtherActivity) + ": " + e.getMessage(), Toast.LENGTH_LONG).show();
|
||||
}
|
||||
}
|
||||
|
||||
public static Intent packParametersIntoIntent(Intent intent, String[] params, int startIndex)
|
||||
{
|
||||
for (int i = startIndex; i < params.length; i++)
|
||||
{
|
||||
String[] singleParam = params[i].split(Action.intentPairSeparator);
|
||||
|
||||
/*Class c = Class.forName(singleParam[0]);
|
||||
for(Method m : c.getMethods())
|
||||
@ -1048,83 +1121,74 @@ public class Actions
|
||||
}
|
||||
}*/
|
||||
|
||||
if (singleParam[0].equals("boolean"))
|
||||
if (singleParam[0].equals("boolean"))
|
||||
{
|
||||
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3);
|
||||
intent.putExtra(singleParam[1], Boolean.parseBoolean(singleParam[2]));
|
||||
}
|
||||
else if (singleParam[0].equals("byte"))
|
||||
{
|
||||
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3);
|
||||
intent.putExtra(singleParam[1], Byte.parseByte(singleParam[2]));
|
||||
}
|
||||
else if (singleParam[0].equals("char"))
|
||||
{
|
||||
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].charAt(0));
|
||||
}
|
||||
else if (singleParam[0].equals("CharSequence"))
|
||||
{
|
||||
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3);
|
||||
intent.putExtra(singleParam[1], (CharSequence) singleParam[2]);
|
||||
}
|
||||
else if (singleParam[0].equals("double"))
|
||||
{
|
||||
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3);
|
||||
intent.putExtra(singleParam[1], Double.parseDouble(singleParam[2]));
|
||||
}
|
||||
else if (singleParam[0].equals("float"))
|
||||
{
|
||||
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3);
|
||||
intent.putExtra(singleParam[1], Float.parseFloat(singleParam[2]));
|
||||
}
|
||||
else if (singleParam[0].equals("int"))
|
||||
{
|
||||
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3);
|
||||
intent.putExtra(singleParam[1], Integer.parseInt(singleParam[2]));
|
||||
}
|
||||
else if (singleParam[0].equals("long"))
|
||||
{
|
||||
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3);
|
||||
intent.putExtra(singleParam[1], Long.parseLong(singleParam[2]));
|
||||
}
|
||||
else if (singleParam[0].equals("short"))
|
||||
{
|
||||
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3);
|
||||
intent.putExtra(singleParam[1], Short.parseShort(singleParam[2]));
|
||||
}
|
||||
else if (singleParam[0].equals("Uri"))
|
||||
{
|
||||
if (singleParam[1].equalsIgnoreCase("IntentData"))
|
||||
{
|
||||
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3);
|
||||
externalActivityIntent.putExtra(singleParam[1], Boolean.parseBoolean(singleParam[2]));
|
||||
}
|
||||
else if (singleParam[0].equals("byte"))
|
||||
{
|
||||
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3);
|
||||
externalActivityIntent.putExtra(singleParam[1], Byte.parseByte(singleParam[2]));
|
||||
}
|
||||
else if (singleParam[0].equals("char"))
|
||||
{
|
||||
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3);
|
||||
externalActivityIntent.putExtra(singleParam[1], singleParam[2].charAt(0));
|
||||
}
|
||||
else if (singleParam[0].equals("CharSequence"))
|
||||
{
|
||||
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3);
|
||||
externalActivityIntent.putExtra(singleParam[1], (CharSequence) singleParam[2]);
|
||||
}
|
||||
else if (singleParam[0].equals("double"))
|
||||
{
|
||||
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3);
|
||||
externalActivityIntent.putExtra(singleParam[1], Double.parseDouble(singleParam[2]));
|
||||
}
|
||||
else if (singleParam[0].equals("float"))
|
||||
{
|
||||
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3);
|
||||
externalActivityIntent.putExtra(singleParam[1], Float.parseFloat(singleParam[2]));
|
||||
}
|
||||
else if (singleParam[0].equals("int"))
|
||||
{
|
||||
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3);
|
||||
externalActivityIntent.putExtra(singleParam[1], Integer.parseInt(singleParam[2]));
|
||||
}
|
||||
else if (singleParam[0].equals("long"))
|
||||
{
|
||||
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3);
|
||||
externalActivityIntent.putExtra(singleParam[1], Long.parseLong(singleParam[2]));
|
||||
}
|
||||
else if (singleParam[0].equals("short"))
|
||||
{
|
||||
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3);
|
||||
externalActivityIntent.putExtra(singleParam[1], Short.parseShort(singleParam[2]));
|
||||
}
|
||||
else if (singleParam[0].equals("Uri"))
|
||||
{
|
||||
if (singleParam[1].equalsIgnoreCase("IntentData"))
|
||||
{
|
||||
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with value " + singleParam[2] + " as standard data parameter.", 3);
|
||||
externalActivityIntent.setData(Uri.parse(singleParam[2]));
|
||||
}
|
||||
else
|
||||
{
|
||||
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3);
|
||||
externalActivityIntent.putExtra(singleParam[1], Uri.parse(singleParam[2]));
|
||||
}
|
||||
}
|
||||
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);
|
||||
externalActivityIntent.putExtra(singleParam[1], singleParam[2]);
|
||||
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]));
|
||||
}
|
||||
else
|
||||
Miscellaneous.logEvent("w", "StartOtherApp", "Unknown type of parameter " + singleParam[0] + " found. Name " + singleParam[1] + " and value " + singleParam[2], 3);
|
||||
{
|
||||
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]));
|
||||
}
|
||||
}
|
||||
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]);
|
||||
}
|
||||
|
||||
if (params[2].equals(ActivityManageActionStartActivity.startByActivityString))
|
||||
automationServerRef.startActivity(externalActivityIntent);
|
||||
else
|
||||
automationServerRef.sendBroadcast(externalActivityIntent);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Miscellaneous.logEvent("e", "StartOtherApp", automationServerRef.getResources().getString(R.string.errorStartingOtherActivity) + ": " + Log.getStackTraceString(e), 2);
|
||||
Toast.makeText(automationServerRef, automationServerRef.getResources().getString(R.string.errorStartingOtherActivity) + ": " + e.getMessage(), Toast.LENGTH_LONG).show();
|
||||
Miscellaneous.logEvent("w", "StartOtherApp", "Unknown type of parameter " + singleParam[0] + " found. Name " + singleParam[1] + " and value " + singleParam[2], 3);
|
||||
}
|
||||
|
||||
return intent;
|
||||
}
|
||||
|
||||
public static void waitBeforeNextAction(Long waitTime)
|
||||
@ -1163,21 +1227,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);
|
||||
@ -1188,6 +1268,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;
|
||||
@ -1854,6 +1954,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
|
||||
@ -1863,17 +1969,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;
|
||||
}
|
||||
|
||||
@ -1899,4 +2018,283 @@ public class Actions
|
||||
return android.provider.Settings.Global.getInt(context.getContentResolver(), android.provider.Settings.Global.AIRPLANE_MODE_ON, 0) != 0;
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean runExecutable(Context context, boolean runAsRoot, String path, String parameters)
|
||||
{
|
||||
if(runAsRoot)
|
||||
{
|
||||
if(!StringUtils.isEmpty(parameters))
|
||||
return executeCommandViaSu(new String[] { path + " " + parameters });
|
||||
else
|
||||
return executeCommandViaSu(new String[] { path });
|
||||
}
|
||||
else
|
||||
{
|
||||
Object[] result;
|
||||
|
||||
File executable = new File(path);
|
||||
File workingDir = new File(executable.getParent());
|
||||
|
||||
if(!StringUtils.isEmpty(parameters))
|
||||
result = runExternalApplication(path, 0, workingDir, parameters);
|
||||
else
|
||||
result = runExternalApplication(path, 0, workingDir, null);
|
||||
|
||||
boolean execResult = (boolean) result[0];
|
||||
|
||||
return execResult;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param commandToExecute
|
||||
* @param timeout
|
||||
* @param params
|
||||
* @return Returns an array: 0=exit code, 1=cmdline output
|
||||
*/
|
||||
public static Object[] runExternalApplication(String commandToExecute, long timeout, File workingDirectory, String params)
|
||||
{
|
||||
/*
|
||||
* Classes stolen from https://github.com/stleary/JSON-java
|
||||
*/
|
||||
|
||||
String fullCommand;
|
||||
|
||||
if(!StringUtils.isEmpty(params))
|
||||
fullCommand = commandToExecute + " " + params;
|
||||
else
|
||||
fullCommand = commandToExecute;
|
||||
|
||||
Miscellaneous.logEvent("i", "Running executable", "Running external application " + fullCommand, 4);
|
||||
|
||||
Object[] returnObject = new Object[2];
|
||||
|
||||
StringBuilder output = new StringBuilder();
|
||||
String line = null;
|
||||
OutputStream stdin = null;
|
||||
InputStream stderr = null;
|
||||
InputStream stdout = null;
|
||||
|
||||
try
|
||||
{
|
||||
Process process = null;
|
||||
|
||||
if(workingDirectory != null)
|
||||
process = Runtime.getRuntime().exec(fullCommand, null, workingDirectory);
|
||||
else
|
||||
process = Runtime.getRuntime().exec(fullCommand);
|
||||
stdin = process.getOutputStream ();
|
||||
stderr = process.getErrorStream ();
|
||||
stdout = process.getInputStream ();
|
||||
|
||||
// "write" the parms into stdin
|
||||
/*line = "param1" + "\n";
|
||||
stdin.write(line.getBytes() );
|
||||
stdin.flush();
|
||||
|
||||
line = "param2" + "\n";
|
||||
stdin.write(line.getBytes() );
|
||||
stdin.flush();
|
||||
|
||||
line = "param3" + "\n";
|
||||
stdin.write(line.getBytes() );
|
||||
stdin.flush();*/
|
||||
|
||||
stdin.close();
|
||||
|
||||
// clean up if any output in stdout
|
||||
BufferedReader brCleanUp = new BufferedReader (new InputStreamReader (stdout));
|
||||
while ((line = brCleanUp.readLine ()) != null)
|
||||
{
|
||||
Miscellaneous.logEvent ("i", "Running executable", "[Stdout] " + line, 4);
|
||||
output.append(line);
|
||||
}
|
||||
brCleanUp.close();
|
||||
|
||||
// clean up if any output in stderr
|
||||
brCleanUp = new BufferedReader (new InputStreamReader(stderr));
|
||||
while ((line = brCleanUp.readLine ()) != null)
|
||||
{
|
||||
Miscellaneous.logEvent ("i", "Running executable", "[Stderr] " + line, 4);
|
||||
output.append(line);
|
||||
}
|
||||
brCleanUp.close();
|
||||
|
||||
try
|
||||
{
|
||||
// Wait for the process to exit, we want the return code
|
||||
if(timeout > 0 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
|
||||
{
|
||||
try
|
||||
{
|
||||
if(!process.waitFor(timeout, TimeUnit.MILLISECONDS))
|
||||
{
|
||||
Miscellaneous.logEvent("i", "Running executable", "Timeout of " + String.valueOf(timeout) + " ms reached. Killing check attempt.", 3);
|
||||
process.destroyForcibly();
|
||||
}
|
||||
}
|
||||
catch(NoSuchMethodError e)
|
||||
{
|
||||
process.waitFor();
|
||||
}
|
||||
}
|
||||
else
|
||||
process.waitFor();
|
||||
}
|
||||
catch (InterruptedException e)
|
||||
{
|
||||
Miscellaneous.logEvent("i", "Running executable", "Waiting for process failed: " + Log.getStackTraceString(e), 4);
|
||||
Miscellaneous.logEvent("i", "Running executable", Log.getStackTraceString(e), 1);
|
||||
}
|
||||
|
||||
if(process.exitValue() == 0)
|
||||
Miscellaneous.logEvent("i", "Running executable", "ReturnCode: " + String.valueOf(process.exitValue()), 4);
|
||||
else
|
||||
Miscellaneous.logEvent("i", "Running executable", "External execution (RC=" + String.valueOf(process.exitValue()) + ") returned error: " + output.toString(), 3);
|
||||
|
||||
returnObject[0] = process.exitValue();
|
||||
returnObject[1] = output.toString();
|
||||
|
||||
return returnObject;
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
Miscellaneous.logEvent("e", "Running executable", Log.getStackTraceString(e), 1);
|
||||
}
|
||||
|
||||
Miscellaneous.logEvent("i", "Running executable", "Error running external application.", 1);
|
||||
|
||||
// if(slotMap != null)
|
||||
// for(String key : slotMap.keySet())
|
||||
// System.clearProperty(key);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public static boolean isTetheringActive1(Context context)
|
||||
{
|
||||
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"))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
Miscellaneous.logEvent("e", "isTetheringActive()", Log.getStackTraceString(e), 3);
|
||||
}
|
||||
|
||||
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:" + 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();
|
||||
}
|
||||
}
|
||||
}
|
@ -353,11 +353,15 @@ public class ActivityControlCenter extends Activity
|
||||
systemInfoText.append("Device details" + Miscellaneous.lineSeparator);
|
||||
systemInfoText.append("OS version: " + System.getProperty("os.version") + Miscellaneous.lineSeparator);
|
||||
systemInfoText.append("API Level: " + android.os.Build.VERSION.SDK + Miscellaneous.lineSeparator);
|
||||
systemInfoText.append("Target SDK: " + Miscellaneous.getAnyContext().getApplicationInfo().targetSdkVersion + Miscellaneous.lineSeparator);
|
||||
systemInfoText.append("Device: " + android.os.Build.DEVICE + Miscellaneous.lineSeparator);
|
||||
systemInfoText.append("Model: " + android.os.Build.MODEL + Miscellaneous.lineSeparator);
|
||||
systemInfoText.append("Product: " + android.os.Build.PRODUCT + Miscellaneous.lineSeparator);
|
||||
systemInfoText.append("Rooted: " + String.valueOf(Miscellaneous.isPhoneRooted()) + Miscellaneous.lineSeparator);
|
||||
systemInfoText.append("Country: " + Miscellaneous.getUserCountry(Miscellaneous.getAnyContext()) + Miscellaneous.lineSeparator);
|
||||
systemInfoText.append("OS language: " + Locale.getDefault().getDisplayName());
|
||||
systemInfoText.append("OS language: " + Locale.getDefault().getDisplayName() + Miscellaneous.lineSeparator);
|
||||
systemInfoText.append("Logfile written: " + String.valueOf(Settings.writeLogFile) + Miscellaneous.lineSeparator);
|
||||
systemInfoText.append("Log level: " + String.valueOf(Settings.logLevel));
|
||||
|
||||
/*
|
||||
I've checked the Locale methods on my Android 4.1.2 device, and the results:
|
||||
|
@ -190,8 +190,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;
|
||||
}
|
||||
}
|
||||
|
@ -187,10 +187,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;
|
||||
|
||||
@ -213,11 +214,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;
|
||||
|
@ -77,10 +77,9 @@ public class ActivityMainScreen extends ActivityGeneric
|
||||
tvLockSoundDuration = (TextView)findViewById(R.id.tvlockSoundDuration);
|
||||
tbLockSound = (ToggleButton) findViewById(R.id.tbLockSound);
|
||||
toggleService = (ToggleButton) findViewById(R.id.tbArmMastListener);
|
||||
|
||||
bDonate = (Button)findViewById(R.id.bDonate);
|
||||
|
||||
if(!BuildConfig.FLAVOR.equalsIgnoreCase("googlePlayFlavor"))
|
||||
if(!BuildConfig.FLAVOR.equalsIgnoreCase(AutomationService.flavor_name_googleplay))
|
||||
bDonate.setVisibility(View.VISIBLE);
|
||||
|
||||
toggleService.setChecked(AutomationService.isMyServiceRunning(this));
|
||||
@ -271,9 +270,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
|
||||
@ -284,14 +288,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()
|
||||
@ -316,8 +312,7 @@ public class ActivityMainScreen extends ActivityGeneric
|
||||
uiUpdateRunning = true;
|
||||
activityMainScreenInstance.toggleService.setChecked(true);
|
||||
uiUpdateRunning = false;
|
||||
// if(activityMainScreenInstance.hasWindowFocus())
|
||||
// {
|
||||
|
||||
try
|
||||
{
|
||||
PointOfInterest activePoi = PointOfInterest.getActivePoi();
|
||||
|
@ -1,7 +1,5 @@
|
||||
package com.jens.automation2;
|
||||
|
||||
import static com.jens.automation2.Trigger.triggerParameter2Split;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.AlertDialog;
|
||||
import android.app.ProgressDialog;
|
||||
@ -18,11 +16,12 @@ import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.Button;
|
||||
import android.widget.CheckBox;
|
||||
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;
|
||||
|
||||
@ -43,13 +42,15 @@ 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;
|
||||
public static Trigger resultingTrigger;
|
||||
|
||||
final static String dismissRegularString = "p0815DismissString";
|
||||
|
||||
private static String[] directions;
|
||||
|
||||
@ -267,10 +268,14 @@ 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),
|
||||
getResources().getString(R.string.directionStringContains),
|
||||
getResources().getString(R.string.directionStringDoesNotContain),
|
||||
getResources().getString(R.string.directionStringStartsWith),
|
||||
getResources().getString(R.string.directionStringEndsWith),
|
||||
getResources().getString(R.string.directionStringNotEquals)
|
||||
@ -298,7 +303,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();
|
||||
@ -309,34 +314,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)))
|
||||
{
|
||||
@ -359,6 +374,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);
|
||||
|
||||
|
@ -0,0 +1,54 @@
|
||||
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);
|
||||
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();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -0,0 +1,114 @@
|
||||
package com.jens.automation2;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.EditText;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
public class ActivityManageActionRunExecutable extends Activity
|
||||
{
|
||||
final static int PICKFILE_RESULT_CODE = 4711;
|
||||
|
||||
CheckBox chkRunExecAsRoot;
|
||||
EditText etRunExecutablePath, etRunExecutableParameters;
|
||||
Button bChooseExecutable, bSaveActionRunExec;
|
||||
|
||||
@Override
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_manage_action_run_executable);
|
||||
|
||||
chkRunExecAsRoot = (CheckBox)findViewById(R.id.chkRunExecAsRoot);
|
||||
etRunExecutablePath = (EditText) findViewById(R.id.etRunExecutablePath);
|
||||
etRunExecutableParameters = (EditText) findViewById(R.id.etRunExecutableParameters);
|
||||
bChooseExecutable = (Button) findViewById(R.id.bChooseExecutable);
|
||||
bSaveActionRunExec = (Button) findViewById(R.id.bSaveActionRunExec);
|
||||
|
||||
bChooseExecutable.setOnClickListener(new View.OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
//Need to check for storage permissions
|
||||
Intent chooseFile = new Intent(Intent.ACTION_GET_CONTENT);
|
||||
chooseFile.setType("*/*");
|
||||
chooseFile = Intent.createChooser(chooseFile, getResources().getString(R.string.selectSoundFile));
|
||||
startActivityForResult(chooseFile, PICKFILE_RESULT_CODE);
|
||||
}
|
||||
});
|
||||
|
||||
bSaveActionRunExec.setOnClickListener(new View.OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View view)
|
||||
{
|
||||
saveExecSettings();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void saveExecSettings()
|
||||
{
|
||||
if(etRunExecutablePath.getText().toString() == null || etRunExecutablePath.getText().toString().length() == 0)
|
||||
{
|
||||
Toast.makeText(ActivityManageActionRunExecutable.this, getResources().getString(R.string.selectValidExecutable), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
File executableFile = new File(etRunExecutablePath.getText().toString());
|
||||
if(!executableFile.exists())
|
||||
{
|
||||
Toast.makeText(ActivityManageActionRunExecutable.this, getResources().getString(R.string.fileDoesNotExist), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!chkRunExecAsRoot.isChecked() && !executableFile.canExecute())
|
||||
{
|
||||
Toast.makeText(ActivityManageActionRunExecutable.this, getResources().getString(R.string.fileNotExecutable), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Intent returnData = new Intent();
|
||||
returnData.putExtra(ActivityManageRule.intentNameActionParameter1, chkRunExecAsRoot.isChecked());
|
||||
|
||||
if(etRunExecutableParameters.getText() != null && !StringUtils.isEmpty(etRunExecutableParameters.getText().toString()))
|
||||
returnData.putExtra(ActivityManageRule.intentNameActionParameter2, etRunExecutablePath.getText().toString() + Action.actionParameter2Split + etRunExecutableParameters.getText().toString());
|
||||
else
|
||||
returnData.putExtra(ActivityManageRule.intentNameActionParameter2, etRunExecutablePath.getText().toString());
|
||||
|
||||
setResult(RESULT_OK, returnData);
|
||||
finish();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onActivityResult(int requestCode, int resultCode, Intent data)
|
||||
{
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
|
||||
if(resultCode == RESULT_OK)
|
||||
{
|
||||
if(requestCode == PICKFILE_RESULT_CODE)
|
||||
{
|
||||
Uri fileUri = data.getData();
|
||||
String filePath = CompensateCrappyAndroidPaths.getPath(ActivityManageActionRunExecutable.this, fileUri);
|
||||
etRunExecutablePath.setText(filePath);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,281 @@
|
||||
package com.jens.automation2;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.AlertDialog;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.text.InputType;
|
||||
import android.view.View;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
import android.widget.ListView;
|
||||
import android.widget.Spinner;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class ActivityManageActionSendBroadcast extends Activity
|
||||
{
|
||||
EditText etBroadcastToSend;
|
||||
Button bBroadcastSendShowSuggestions, bSaveSendBroadcast, bAddIntentPair;
|
||||
ListView lvIntentPairs;
|
||||
EditText etParameterName, etParameterValue;
|
||||
Spinner spinnerParameterType;
|
||||
ArrayAdapter<String> intentTypeSpinnerAdapter, intentPairAdapter;
|
||||
private static final String[] supportedIntentTypes = { "boolean", "byte", "char", "double", "float", "int", "long", "short", "String", "Uri" };
|
||||
private ArrayList<String> intentPairList = new ArrayList<>();
|
||||
|
||||
@Override
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_manage_action_send_broadcast);
|
||||
|
||||
etBroadcastToSend = (EditText)findViewById(R.id.etBroadcastToSend);
|
||||
bBroadcastSendShowSuggestions = (Button)findViewById(R.id.bBroadcastSendShowSuggestions);
|
||||
bSaveSendBroadcast = (Button)findViewById(R.id.bSaveSendBroadcast);
|
||||
bAddIntentPair = (Button)findViewById(R.id.bAddIntentPair);
|
||||
lvIntentPairs = (ListView) findViewById(R.id.lvIntentPairs);
|
||||
etParameterName = (EditText) findViewById(R.id.etParameterName);
|
||||
etParameterValue = (EditText) findViewById(R.id.etParameterValue);
|
||||
spinnerParameterType = (Spinner) findViewById(R.id.spinnerParameterType);
|
||||
|
||||
intentTypeSpinnerAdapter = new ArrayAdapter<String>(this, R.layout.text_view_for_poi_listview_mediumtextsize, ActivityManageActionSendBroadcast.supportedIntentTypes);
|
||||
spinnerParameterType.setAdapter(intentTypeSpinnerAdapter);
|
||||
intentTypeSpinnerAdapter.notifyDataSetChanged();
|
||||
intentPairAdapter = new ArrayAdapter<String>(this, R.layout.text_view_for_poi_listview_mediumtextsize, intentPairList);
|
||||
|
||||
bSaveSendBroadcast.setOnClickListener(new View.OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View view)
|
||||
{
|
||||
if(checkInput())
|
||||
{
|
||||
Intent answer = new Intent();
|
||||
|
||||
String param2 = etBroadcastToSend.getText().toString();
|
||||
|
||||
if(intentPairList.size() > 0)
|
||||
{
|
||||
param2 += Action.actionParameter2Split;
|
||||
|
||||
for (String s : intentPairList)
|
||||
param2 += s + ";";
|
||||
|
||||
param2 = param2.substring(0, param2.length() - 1);
|
||||
}
|
||||
|
||||
answer.putExtra(ActivityManageRule.intentNameActionParameter2, param2);
|
||||
setResult(RESULT_OK, answer);
|
||||
finish();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
bBroadcastSendShowSuggestions.setOnClickListener(new View.OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(ActivityManageActionSendBroadcast.this);
|
||||
builder.setTitle(getResources().getString(R.string.selectBroadcast));
|
||||
builder.setItems(ActivityManageTriggerBroadcast.broadcastSuggestions, new DialogInterface.OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int which)
|
||||
{
|
||||
etBroadcastToSend.setText(ActivityManageTriggerBroadcast.broadcastSuggestions[which]);
|
||||
}
|
||||
});
|
||||
builder.create().show();
|
||||
}
|
||||
});
|
||||
|
||||
Intent input = getIntent();
|
||||
|
||||
if(input.hasExtra(ActivityManageRule.intentNameActionParameter2))
|
||||
{
|
||||
String param2 = input.getStringExtra(ActivityManageRule.intentNameActionParameter2);
|
||||
if(!param2.contains(Action.actionParameter2Split))
|
||||
etBroadcastToSend.setText(input.getStringExtra(ActivityManageRule.intentNameActionParameter2));
|
||||
else
|
||||
{
|
||||
String[] param2Parts = param2.split(Action.actionParameter2Split);
|
||||
etBroadcastToSend.setText(param2Parts[0]);
|
||||
|
||||
String[] params = param2Parts[1].split(";");
|
||||
|
||||
intentPairList.clear();
|
||||
|
||||
for(int i = 0; i < params.length; i++)
|
||||
{
|
||||
if(lvIntentPairs.getVisibility() != View.VISIBLE)
|
||||
lvIntentPairs.setVisibility(View.VISIBLE);
|
||||
|
||||
intentPairList.add(params[i]);
|
||||
}
|
||||
|
||||
updateIntentPairList();
|
||||
}
|
||||
}
|
||||
|
||||
bAddIntentPair.setOnClickListener(new View.OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
// type;name;value
|
||||
if(spinnerParameterType.getSelectedItem().toString().length() == 0)
|
||||
{
|
||||
Toast.makeText(ActivityManageActionSendBroadcast.this, getResources().getString(R.string.selectTypeOfIntentPair), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
|
||||
if(etParameterName.getText().toString().length() == 0)
|
||||
{
|
||||
Toast.makeText(ActivityManageActionSendBroadcast.this, getResources().getString(R.string.enterNameForIntentPair), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
else if(etParameterName.getText().toString().contains(Action.intentPairSeparator))
|
||||
{
|
||||
Toast.makeText(ActivityManageActionSendBroadcast.this, String.format(getResources().getString(R.string.stringNotAllowed), Action.intentPairSeparator), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
else if(etParameterName.getText().toString().contains(";"))
|
||||
{
|
||||
Toast.makeText(ActivityManageActionSendBroadcast.this, String.format(getResources().getString(R.string.stringNotAllowed), ";"), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
|
||||
if(etParameterValue.getText().toString().length() == 0)
|
||||
{
|
||||
Toast.makeText(ActivityManageActionSendBroadcast.this, getResources().getString(R.string.enterValueForIntentPair), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
else if(etParameterValue.getText().toString().contains(Action.intentPairSeparator))
|
||||
{
|
||||
Toast.makeText(ActivityManageActionSendBroadcast.this, String.format(getResources().getString(R.string.stringNotAllowed), Action.intentPairSeparator), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
else if(etParameterValue.getText().toString().contains(";"))
|
||||
{
|
||||
Toast.makeText(ActivityManageActionSendBroadcast.this, String.format(getResources().getString(R.string.stringNotAllowed), ";"), Toast.LENGTH_LONG).show();
|
||||
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);
|
||||
|
||||
spinnerParameterType.setSelection(0);
|
||||
etParameterName.setText("");
|
||||
etParameterValue.setText("");
|
||||
|
||||
updateIntentPairList();
|
||||
|
||||
if(lvIntentPairs.getVisibility() != View.VISIBLE)
|
||||
lvIntentPairs.setVisibility(View.VISIBLE);
|
||||
}
|
||||
});
|
||||
|
||||
lvIntentPairs.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener()
|
||||
{
|
||||
@Override
|
||||
public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3)
|
||||
{
|
||||
getIntentPairDialog(arg2).show();
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
spinnerParameterType.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
|
||||
{
|
||||
@Override
|
||||
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3)
|
||||
{
|
||||
if(supportedIntentTypes[arg2].equals("int") || supportedIntentTypes[arg2].equals("long") || supportedIntentTypes[arg2].equals("short"))
|
||||
ActivityManageActionSendBroadcast.this.etParameterValue.setInputType(InputType.TYPE_CLASS_NUMBER);
|
||||
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);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNothingSelected(AdapterView<?> arg0)
|
||||
{
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
boolean checkInput()
|
||||
{
|
||||
String broadcastToSend = etBroadcastToSend.getText().toString();
|
||||
if(StringUtils.isEmpty(broadcastToSend))
|
||||
{
|
||||
Toast.makeText(ActivityManageActionSendBroadcast.this, getResources().getString(R.string.enterBroadcast), Toast.LENGTH_SHORT).show();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private void updateIntentPairList()
|
||||
{
|
||||
if(lvIntentPairs.getAdapter() == null)
|
||||
lvIntentPairs.setAdapter(intentPairAdapter);
|
||||
|
||||
intentPairAdapter.notifyDataSetChanged();
|
||||
}
|
||||
|
||||
private AlertDialog getIntentPairDialog(final int itemPosition)
|
||||
{
|
||||
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(ActivityManageActionSendBroadcast.this);
|
||||
alertDialogBuilder.setTitle(getResources().getString(R.string.whatToDoWithIntentPair));
|
||||
alertDialogBuilder.setItems(new String[]{getResources().getString(R.string.delete)}, new DialogInterface.OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which)
|
||||
{
|
||||
// Only 1 choice at the moment, no need to check
|
||||
ActivityManageActionSendBroadcast.this.intentPairList.remove(itemPosition);
|
||||
updateIntentPairList();
|
||||
}
|
||||
});
|
||||
AlertDialog alertDialog = alertDialogBuilder.create();
|
||||
return alertDialog;
|
||||
}
|
||||
}
|
@ -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;
|
||||
@ -43,6 +54,10 @@ public class ActivityManageActionSendTextMessage extends Activity
|
||||
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 +66,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 +109,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 +197,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 +218,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,64 @@
|
||||
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);
|
||||
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]);
|
||||
}
|
||||
}
|
||||
}
|
@ -15,8 +15,6 @@ public class ActivityManageActionSpeakText extends Activity
|
||||
private Button bSaveSpeakText;
|
||||
private EditText etSpeakText;
|
||||
|
||||
// private String existingUrl = "";
|
||||
|
||||
public static boolean edit = false;
|
||||
public static Action resultingAction = null;
|
||||
|
||||
@ -27,7 +25,7 @@ public class ActivityManageActionSpeakText extends Activity
|
||||
this.setContentView(R.layout.activity_manage_action_speak_text);
|
||||
|
||||
etSpeakText = (EditText)findViewById(R.id.etTextToSpeak);
|
||||
bSaveSpeakText = (Button)findViewById(R.id.bSaveTriggerUrl);
|
||||
bSaveSpeakText = (Button)findViewById(R.id.bSaveSpeakText);
|
||||
bSaveSpeakText.setOnClickListener(new OnClickListener()
|
||||
{
|
||||
@Override
|
||||
|
@ -53,13 +53,260 @@ 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;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_manage_action_start_activity);
|
||||
|
||||
lvIntentPairs = (ListView)findViewById(R.id.lvIntentPairs);
|
||||
etParameterName = (EditText)findViewById(R.id.etParameterName);
|
||||
etParameterValue = (EditText)findViewById(R.id.etParameterValue);
|
||||
bSelectApp = (Button)findViewById(R.id.bSelectApp);
|
||||
bAddIntentPair = (Button)findViewById(R.id.bAddIntentPair);
|
||||
bSaveActionStartOtherActivity = (Button)findViewById(R.id.bSaveActionStartOtherActivity);
|
||||
spinnerParameterType = (Spinner)findViewById(R.id.spinnerParameterType);
|
||||
etPackageName = (EditText) findViewById(R.id.etPackageName);
|
||||
etActivityOrActionPath = (EditText) findViewById(R.id.etActivityOrActionPath);
|
||||
rbStartAppSelectByActivity = (RadioButton)findViewById(R.id.rbStartAppSelectByActivity);
|
||||
rbStartAppSelectByAction = (RadioButton)findViewById(R.id.rbStartAppSelectByAction);
|
||||
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);
|
||||
intentTypeSpinnerAdapter.notifyDataSetChanged();
|
||||
|
||||
intentPairAdapter = new ArrayAdapter<String>(this, R.layout.text_view_for_poi_listview_mediumtextsize, intentPairList);
|
||||
|
||||
bSelectApp.setOnClickListener(new OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
int targetSdkVersion = getApplicationContext().getApplicationInfo().targetSdkVersion;
|
||||
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && targetSdkVersion >= 30 && !ActivityPermissions.havePermission(Manifest.permission.QUERY_ALL_PACKAGES, ActivityManageActionStartActivity.this))// && shouldShowRequestPermissionRationale(Manifest.permission.QUERY_ALL_PACKAGES))
|
||||
{
|
||||
if(BuildConfig.FLAVOR.equals(AutomationService.flavor_name_googleplay))
|
||||
{
|
||||
// This ain't possible anymore.
|
||||
Miscellaneous.messageBox(getResources().getString(R.string.info), getResources().getString(R.string.featureNotInGooglePlayVersion) + Miscellaneous.lineSeparator + Miscellaneous.lineSeparator + getResources().getString(R.string.startActivityInsertManually), ActivityManageActionStartActivity.this).show();
|
||||
}
|
||||
else
|
||||
requestPermissions(new String[] {Manifest.permission.QUERY_ALL_PACKAGES}, requestCodeForRequestQueryAllPackagesPermission);
|
||||
}
|
||||
else
|
||||
getAppList();
|
||||
}
|
||||
});
|
||||
|
||||
bAddIntentPair.setOnClickListener(new OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
// type;name;value
|
||||
if(spinnerParameterType.getSelectedItem().toString().length() == 0)
|
||||
{
|
||||
Toast.makeText(ActivityManageActionStartActivity.this, getResources().getString(R.string.selectTypeOfIntentPair), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
|
||||
if(etParameterName.getText().toString().length() == 0)
|
||||
{
|
||||
Toast.makeText(ActivityManageActionStartActivity.this, getResources().getString(R.string.enterNameForIntentPair), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
else if(etParameterName.getText().toString().contains(Action.intentPairSeparator))
|
||||
{
|
||||
Toast.makeText(ActivityManageActionStartActivity.this, String.format(getResources().getString(R.string.stringNotAllowed), Action.intentPairSeparator), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
else if(etParameterName.getText().toString().contains(";"))
|
||||
{
|
||||
Toast.makeText(ActivityManageActionStartActivity.this, String.format(getResources().getString(R.string.stringNotAllowed), ";"), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
|
||||
if(etParameterValue.getText().toString().length() == 0)
|
||||
{
|
||||
Toast.makeText(ActivityManageActionStartActivity.this, getResources().getString(R.string.enterValueForIntentPair), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
else if(etParameterValue.getText().toString().contains(Action.intentPairSeparator))
|
||||
{
|
||||
Toast.makeText(ActivityManageActionStartActivity.this, String.format(getResources().getString(R.string.stringNotAllowed), Action.intentPairSeparator), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
else if(etParameterValue.getText().toString().contains(";"))
|
||||
{
|
||||
Toast.makeText(ActivityManageActionStartActivity.this, String.format(getResources().getString(R.string.stringNotAllowed), ";"), Toast.LENGTH_LONG).show();
|
||||
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);
|
||||
|
||||
spinnerParameterType.setSelection(0);
|
||||
etParameterName.setText("");
|
||||
etParameterValue.setText("");
|
||||
|
||||
updateIntentPairList();
|
||||
|
||||
if(lvIntentPairs.getVisibility() != View.VISIBLE)
|
||||
lvIntentPairs.setVisibility(View.VISIBLE);
|
||||
}
|
||||
});
|
||||
|
||||
showStartProgramExamples.setOnClickListener(new OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(urlShowExamples));
|
||||
startActivity(browserIntent);
|
||||
}
|
||||
});
|
||||
|
||||
lvIntentPairs.setOnItemLongClickListener(new OnItemLongClickListener()
|
||||
{
|
||||
@Override
|
||||
public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3)
|
||||
{
|
||||
getIntentPairDialog(arg2).show();
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
bSaveActionStartOtherActivity.setOnClickListener(new OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
if(checkInput())
|
||||
{
|
||||
Intent returnData = new Intent();
|
||||
|
||||
returnData.putExtra(ActivityManageRule.intentNameActionParameter1, rbStartAppSelectByAction.isChecked());
|
||||
|
||||
String parameter2 = "";
|
||||
|
||||
if (rbStartAppSelectByActivity.isChecked())
|
||||
parameter2 += etPackageName.getText().toString() + ";" + etActivityOrActionPath.getText().toString();
|
||||
else {
|
||||
if (etPackageName.getText().toString() != null && etPackageName.getText().toString().length() > 0)
|
||||
parameter2 += etPackageName.getText().toString() + ";" + etActivityOrActionPath.getText().toString();
|
||||
else
|
||||
parameter2 += Actions.dummyPackageString + ";" + etActivityOrActionPath.getText().toString();
|
||||
}
|
||||
|
||||
if (rbStartAppByActivity.isChecked())
|
||||
parameter2 += ";" + startByActivityString;
|
||||
else if(rbStartAppByService.isChecked())
|
||||
parameter2 += ";" + startByServiceString;
|
||||
else
|
||||
parameter2 += ";" + startByBroadcastString;
|
||||
|
||||
for (String s : intentPairList)
|
||||
parameter2 += ";" + s;
|
||||
|
||||
returnData.putExtra(ActivityManageRule.intentNameActionParameter2, parameter2);
|
||||
|
||||
setResult(RESULT_OK, returnData);
|
||||
finish();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
lvIntentPairs.setOnTouchListener(new OnTouchListener()
|
||||
{
|
||||
@Override
|
||||
public boolean onTouch(View v, MotionEvent event)
|
||||
{
|
||||
v.getParent().requestDisallowInterceptTouchEvent(true);
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
spinnerParameterType.setOnItemSelectedListener(new OnItemSelectedListener()
|
||||
{
|
||||
@Override
|
||||
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3)
|
||||
{
|
||||
if(supportedIntentTypes[arg2].equals("int") || supportedIntentTypes[arg2].equals("long") || supportedIntentTypes[arg2].equals("short"))
|
||||
ActivityManageActionStartActivity.this.etParameterValue.setInputType(InputType.TYPE_CLASS_NUMBER);
|
||||
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);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNothingSelected(AdapterView<?> arg0)
|
||||
{
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
rbStartAppSelectByActivity.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
|
||||
{
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
|
||||
{
|
||||
if(isChecked)
|
||||
bSelectApp.setEnabled(isChecked);
|
||||
}
|
||||
});
|
||||
|
||||
rbStartAppSelectByAction.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
|
||||
{
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
|
||||
{
|
||||
if(isChecked)
|
||||
bSelectApp.setEnabled(!isChecked);
|
||||
}
|
||||
});
|
||||
|
||||
Intent i = getIntent();
|
||||
if(i.hasExtra(ActivityManageRule.intentNameActionParameter1))
|
||||
loadValuesIntoGui(i);
|
||||
}
|
||||
|
||||
private class CustomPackageInfo extends PackageInfo implements Comparable<CustomPackageInfo>
|
||||
{
|
||||
@ -82,11 +329,9 @@ public class ActivityManageActionStartActivity extends Activity
|
||||
|
||||
return name1.compareTo(name2);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static List<PackageInfo> pInfos = null;
|
||||
public static Action resultingAction;
|
||||
|
||||
private static final String[] supportedIntentTypes = { "boolean", "byte", "char", "double", "float", "int", "long", "short", "String", "Uri" };
|
||||
private ArrayList<String> intentPairList = new ArrayList<String>();
|
||||
@ -343,208 +588,18 @@ public class ActivityManageActionStartActivity extends Activity
|
||||
getActivityListTask.execute();
|
||||
progressDialog = ProgressDialog.show(ActivityManageActionStartActivity.this, "", ActivityManageActionStartActivity.this.getResources().getString(R.string.gettingListOfInstalledApplications));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_manage_action_start_activity);
|
||||
|
||||
lvIntentPairs = (ListView)findViewById(R.id.lvIntentPairs);
|
||||
etParameterName = (EditText)findViewById(R.id.etParameterName);
|
||||
etParameterValue = (EditText)findViewById(R.id.etParameterValue);
|
||||
bSelectApp = (Button)findViewById(R.id.bSelectApp);
|
||||
bAddIntentPair = (Button)findViewById(R.id.bAddIntentPair);
|
||||
bSaveActionStartOtherActivity = (Button)findViewById(R.id.bSaveActionStartOtherActivity);
|
||||
spinnerParameterType = (Spinner)findViewById(R.id.spinnerParameterType);
|
||||
etPackageName = (EditText) findViewById(R.id.etPackageName);
|
||||
etActivityOrActionPath = (EditText) findViewById(R.id.etActivityOrActionPath);
|
||||
rbStartAppSelectByActivity = (RadioButton)findViewById(R.id.rbStartAppSelectByActivity);
|
||||
rbStartAppSelectByAction = (RadioButton)findViewById(R.id.rbStartAppSelectByAction);
|
||||
showStartProgramExamples = (Button)findViewById(R.id.showStartProgramExamples);
|
||||
|
||||
rbStartAppByActivity = (RadioButton)findViewById(R.id.rbStartAppByActivity);
|
||||
rbStartAppByBroadcast = (RadioButton)findViewById(R.id.rbStartAppByBroadcast);
|
||||
|
||||
intentTypeSpinnerAdapter = new ArrayAdapter<String>(this, R.layout.text_view_for_poi_listview_mediumtextsize, ActivityManageActionStartActivity.supportedIntentTypes);
|
||||
spinnerParameterType.setAdapter(intentTypeSpinnerAdapter);
|
||||
intentTypeSpinnerAdapter.notifyDataSetChanged();
|
||||
|
||||
intentPairAdapter = new ArrayAdapter<String>(this, R.layout.text_view_for_poi_listview_mediumtextsize, intentPairList);
|
||||
|
||||
bSelectApp.setOnClickListener(new OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
int targetSdkVersion = getApplicationContext().getApplicationInfo().targetSdkVersion;
|
||||
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && targetSdkVersion >= 30 && !ActivityPermissions.havePermission(Manifest.permission.QUERY_ALL_PACKAGES, ActivityManageActionStartActivity.this))// && shouldShowRequestPermissionRationale(Manifest.permission.QUERY_ALL_PACKAGES))
|
||||
{
|
||||
requestPermissions(new String[] {Manifest.permission.QUERY_ALL_PACKAGES}, requestCodeForRequestQueryAllPackagesPermission);
|
||||
}
|
||||
else
|
||||
getAppList();
|
||||
}
|
||||
});
|
||||
|
||||
bAddIntentPair.setOnClickListener(new OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
// type;name;value
|
||||
if(spinnerParameterType.getSelectedItem().toString().length() == 0)
|
||||
{
|
||||
Toast.makeText(ActivityManageActionStartActivity.this, getResources().getString(R.string.selectTypeOfIntentPair), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
|
||||
if(etParameterName.getText().toString().length() == 0)
|
||||
{
|
||||
Toast.makeText(ActivityManageActionStartActivity.this, getResources().getString(R.string.enterNameForIntentPair), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
else if(etParameterName.getText().toString().contains(Action.intentPairSeparator))
|
||||
{
|
||||
Toast.makeText(ActivityManageActionStartActivity.this, String.format(getResources().getString(R.string.stringNotAllowed), Action.intentPairSeparator), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
else if(etParameterName.getText().toString().contains(";"))
|
||||
{
|
||||
Toast.makeText(ActivityManageActionStartActivity.this, String.format(getResources().getString(R.string.stringNotAllowed), ";"), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
|
||||
if(etParameterValue.getText().toString().length() == 0)
|
||||
{
|
||||
Toast.makeText(ActivityManageActionStartActivity.this, getResources().getString(R.string.enterValueForIntentPair), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
else if(etParameterValue.getText().toString().contains(Action.intentPairSeparator))
|
||||
{
|
||||
Toast.makeText(ActivityManageActionStartActivity.this, String.format(getResources().getString(R.string.stringNotAllowed), Action.intentPairSeparator), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
else if(etParameterValue.getText().toString().contains(";"))
|
||||
{
|
||||
Toast.makeText(ActivityManageActionStartActivity.this, String.format(getResources().getString(R.string.stringNotAllowed), ";"), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
|
||||
String param = supportedIntentTypes[spinnerParameterType.getSelectedItemPosition()] + Action.intentPairSeparator + etParameterName.getText().toString() + Action.intentPairSeparator + etParameterValue.getText().toString();
|
||||
intentPairList.add(param);
|
||||
|
||||
spinnerParameterType.setSelection(0);
|
||||
etParameterName.setText("");
|
||||
etParameterValue.setText("");
|
||||
|
||||
updateIntentPairList();
|
||||
|
||||
if(lvIntentPairs.getVisibility() != View.VISIBLE)
|
||||
lvIntentPairs.setVisibility(View.VISIBLE);
|
||||
}
|
||||
});
|
||||
|
||||
showStartProgramExamples.setOnClickListener(new OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(urlShowExamples));
|
||||
startActivity(browserIntent);
|
||||
}
|
||||
});
|
||||
|
||||
lvIntentPairs.setOnItemLongClickListener(new OnItemLongClickListener()
|
||||
{
|
||||
@Override
|
||||
public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3)
|
||||
{
|
||||
getIntentPairDialog(arg2).show();
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
bSaveActionStartOtherActivity.setOnClickListener(new OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
if(saveAction())
|
||||
{
|
||||
ActivityManageActionStartActivity.this.setResult(RESULT_OK);
|
||||
finish();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
lvIntentPairs.setOnTouchListener(new OnTouchListener()
|
||||
{
|
||||
@Override
|
||||
public boolean onTouch(View v, MotionEvent event)
|
||||
{
|
||||
v.getParent().requestDisallowInterceptTouchEvent(true);
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
spinnerParameterType.setOnItemSelectedListener(new OnItemSelectedListener()
|
||||
{
|
||||
@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);
|
||||
else
|
||||
ActivityManageActionStartActivity.this.etParameterValue.setInputType(InputType.TYPE_CLASS_TEXT);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNothingSelected(AdapterView<?> arg0)
|
||||
{
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
rbStartAppSelectByActivity.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
|
||||
{
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
|
||||
{
|
||||
if(isChecked)
|
||||
bSelectApp.setEnabled(isChecked);
|
||||
}
|
||||
});
|
||||
|
||||
rbStartAppSelectByAction.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
|
||||
{
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
|
||||
{
|
||||
if(isChecked)
|
||||
bSelectApp.setEnabled(!isChecked);
|
||||
}
|
||||
});
|
||||
|
||||
Intent i = getIntent();
|
||||
if(i.getBooleanExtra("edit", false) == true)
|
||||
{
|
||||
edit = true;
|
||||
loadValuesIntoGui();
|
||||
}
|
||||
}
|
||||
|
||||
private void loadValuesIntoGui()
|
||||
private void loadValuesIntoGui(Intent input)
|
||||
{
|
||||
boolean selectionByAction = resultingAction.getParameter1();
|
||||
boolean selectionByAction = input.getBooleanExtra(ActivityManageRule.intentNameActionParameter1, true);
|
||||
rbStartAppSelectByActivity.setChecked(!selectionByAction);
|
||||
rbStartAppSelectByAction.setChecked(selectionByAction);
|
||||
|
||||
String[] params = resultingAction.getParameter2().split(";");
|
||||
String[] params = input.getStringExtra(ActivityManageRule.intentNameActionParameter2).split(";");
|
||||
|
||||
rbStartAppByActivity.setChecked(params[2].equals(startByActivityString));
|
||||
rbStartAppByBroadcast.setChecked(params[2].equals(startByBroadcastString));
|
||||
rbStartAppByService.setChecked(params[2].equals(startByServiceString));
|
||||
|
||||
int startIndex = -1;
|
||||
|
||||
@ -587,8 +642,8 @@ public class ActivityManageActionStartActivity extends Activity
|
||||
|
||||
intentPairAdapter.notifyDataSetChanged();
|
||||
}
|
||||
|
||||
private boolean saveAction()
|
||||
|
||||
boolean checkInput()
|
||||
{
|
||||
if(rbStartAppSelectByActivity.isChecked())
|
||||
{
|
||||
@ -611,36 +666,7 @@ public class ActivityManageActionStartActivity extends Activity
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if(resultingAction == null)
|
||||
resultingAction = new Action();
|
||||
|
||||
resultingAction.setParameter1(rbStartAppSelectByAction.isChecked());
|
||||
|
||||
resultingAction.setAction(Action_Enum.startOtherActivity);
|
||||
|
||||
String parameter2 = "";
|
||||
|
||||
if(rbStartAppSelectByActivity.isChecked())
|
||||
parameter2 += etPackageName.getText().toString() + ";" + etActivityOrActionPath.getText().toString();
|
||||
else
|
||||
{
|
||||
if(etPackageName.getText().toString() != null && etPackageName.getText().toString().length() > 0)
|
||||
parameter2 += etPackageName.getText().toString() + ";" + etActivityOrActionPath.getText().toString();
|
||||
else
|
||||
parameter2 += Actions.dummyPackageString + ";" + etActivityOrActionPath.getText().toString();
|
||||
}
|
||||
|
||||
if(rbStartAppByActivity.isChecked())
|
||||
parameter2 += ";" + startByActivityString;
|
||||
else
|
||||
parameter2 += ";" + startByBroadcastString;
|
||||
|
||||
for(String s : intentPairList)
|
||||
parameter2 += ";" + s;
|
||||
|
||||
resultingAction.setParameter2(parameter2);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -47,7 +47,7 @@ public class ActivityManageActionTriggerUrl extends Activity
|
||||
chkTriggerUrlUseAuthentication = (CheckBox)findViewById(R.id.chkTriggerUrlUseAuthentication);
|
||||
lvTriggerUrlPostParameters = (ListView)findViewById(R.id.lvTriggerUrlPostParameters);
|
||||
tlTriggerUrlAuthentication = (TableLayout)findViewById(R.id.tlTriggerUrlAuthentication);
|
||||
bSaveTriggerUrl = (Button)findViewById(R.id.bSaveTriggerUrl);
|
||||
bSaveTriggerUrl = (Button)findViewById(R.id.bSaveSpeakText);
|
||||
bSaveTriggerUrl.setOnClickListener(new OnClickListener()
|
||||
{
|
||||
@Override
|
||||
|
@ -0,0 +1,99 @@
|
||||
package com.jens.automation2;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.provider.MediaStore;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.CompoundButton;
|
||||
import android.widget.EditText;
|
||||
import android.widget.RadioButton;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
public class ActivityManageActionWakeLock extends Activity
|
||||
{
|
||||
RadioButton rbWakeLockActivate, rbWakeLockDeactivate;
|
||||
CheckBox chkWakeLockTimeout;
|
||||
EditText etWakeLockDuration;
|
||||
Button bSaveWakelock;
|
||||
|
||||
@Override
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_manage_action_wakelock);
|
||||
|
||||
rbWakeLockActivate = (RadioButton)findViewById(R.id.rbWakeLockActivate);
|
||||
rbWakeLockDeactivate = (RadioButton)findViewById(R.id.rbWakeLockDeactivate);
|
||||
chkWakeLockTimeout = (CheckBox)findViewById(R.id.chkWakeLockTimeout);
|
||||
etWakeLockDuration = (EditText)findViewById(R.id.etWakeLockDuration);
|
||||
bSaveWakelock = (Button)findViewById(R.id.bSaveWakelock);
|
||||
|
||||
etWakeLockDuration.setEnabled(chkWakeLockTimeout.isChecked());
|
||||
|
||||
chkWakeLockTimeout.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
|
||||
{
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton compoundButton, boolean wakeLockTimeoutSet)
|
||||
{
|
||||
etWakeLockDuration.setEnabled(wakeLockTimeoutSet);
|
||||
|
||||
if(wakeLockTimeoutSet)
|
||||
etWakeLockDuration.setText(String.valueOf(Actions.wakeLockTimeoutDisabled));
|
||||
}
|
||||
});
|
||||
|
||||
if(getIntent().hasExtra(ActivityManageRule.intentNameActionParameter1))
|
||||
{
|
||||
rbWakeLockActivate.setChecked(getIntent().getBooleanExtra(ActivityManageRule.intentNameActionParameter1, true));
|
||||
rbWakeLockDeactivate.setChecked(!getIntent().getBooleanExtra(ActivityManageRule.intentNameActionParameter1, false));
|
||||
|
||||
if(getIntent().hasExtra(ActivityManageRule.intentNameActionParameter2))
|
||||
{
|
||||
if(Miscellaneous.isNumeric(getIntent().getStringExtra(ActivityManageRule.intentNameActionParameter2)))
|
||||
{
|
||||
long timeout = Long.parseLong((getIntent().getStringExtra(ActivityManageRule.intentNameActionParameter2)));
|
||||
chkWakeLockTimeout.setChecked(timeout != Actions.wakeLockTimeoutDisabled);
|
||||
etWakeLockDuration.setText(String.valueOf(timeout));
|
||||
}
|
||||
else
|
||||
{
|
||||
chkWakeLockTimeout.setChecked(false);
|
||||
etWakeLockDuration.setText(String.valueOf(Actions.wakeLockTimeoutDisabled));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bSaveWakelock.setOnClickListener(new View.OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View view)
|
||||
{
|
||||
if(chkWakeLockTimeout.isChecked())
|
||||
{
|
||||
if((StringUtils.isEmpty(etWakeLockDuration.getText().toString()) || Integer.parseInt(etWakeLockDuration.getText().toString()) <= 0))
|
||||
{
|
||||
Toast.makeText(ActivityManageActionWakeLock.this, getResources().getString(R.string.enterAPositiveValidNonDecimalNumber), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Intent response = new Intent();
|
||||
response.putExtra(ActivityManageRule.intentNameActionParameter1, rbWakeLockActivate.isChecked());
|
||||
if(chkWakeLockTimeout.isChecked())
|
||||
response.putExtra(ActivityManageRule.intentNameActionParameter2, etWakeLockDuration.getText().toString());
|
||||
else
|
||||
response.putExtra(ActivityManageRule.intentNameActionParameter2, String.valueOf(Actions.wakeLockTimeoutDisabled));
|
||||
setResult(RESULT_OK, response);
|
||||
finish();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -0,0 +1,63 @@
|
||||
package com.jens.automation2;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.RadioButton;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
public class ActivityManageActionWifi extends Activity
|
||||
{
|
||||
CheckBox chkWifiRunAsRoot;
|
||||
RadioButton rbActionWifiOn, rbActionWifiOff;
|
||||
Button bActionWifiSave;
|
||||
TextView tvWifiExplanation1, tvWifiExplanation2;
|
||||
|
||||
@Override
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_manage_action_wifi);
|
||||
|
||||
chkWifiRunAsRoot = (CheckBox)findViewById(R.id.chkWifiRunAsRoot);
|
||||
rbActionWifiOn = (RadioButton) findViewById(R.id.rbActionWifiOn);
|
||||
rbActionWifiOff = (RadioButton)findViewById(R.id.rbActionWifiOff);
|
||||
bActionWifiSave = (Button) findViewById(R.id.bActionWifiSave);
|
||||
tvWifiExplanation1 = (TextView)findViewById(R.id.tvWifiExplanation1);
|
||||
tvWifiExplanation2 = (TextView)findViewById(R.id.tvWifiExplanation2);
|
||||
|
||||
Intent input = getIntent();
|
||||
if(input.hasExtra(ActivityManageRule.intentNameActionParameter1))
|
||||
rbActionWifiOn.setChecked(input.getBooleanExtra(ActivityManageRule.intentNameActionParameter1, true));
|
||||
|
||||
if(input.hasExtra(ActivityManageRule.intentNameActionParameter2))
|
||||
chkWifiRunAsRoot.setChecked(Boolean.parseBoolean(input.getStringExtra(ActivityManageRule.intentNameActionParameter2)));
|
||||
|
||||
// if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
|
||||
// Miscellaneous.messageBox(getResources().getString(R.string.app_name), getResources().getString(R.string.android10WifiToggleNotice), ActivityManageActionWifi.this).show();
|
||||
|
||||
if(getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.Q)
|
||||
tvWifiExplanation1.setVisibility(View.VISIBLE);
|
||||
else
|
||||
tvWifiExplanation1.setVisibility(View.GONE);
|
||||
|
||||
bActionWifiSave.setOnClickListener(new View.OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View view)
|
||||
{
|
||||
Intent response = new Intent();
|
||||
response.putExtra(ActivityManageRule.intentNameActionParameter1, rbActionWifiOn.isChecked());
|
||||
response.putExtra(ActivityManageRule.intentNameActionParameter2, String.valueOf(chkWifiRunAsRoot.isChecked()));
|
||||
setResult(RESULT_OK, response);
|
||||
finish();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
@ -284,26 +284,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 +324,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 +495,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 +516,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:
|
||||
|
@ -119,7 +119,27 @@ public class ActivityManageRule extends Activity
|
||||
final static int requestCodeActionCloseNotificationEdit = 806;
|
||||
final static int requestCodeActionControlMediaAdd = 807;
|
||||
final static int requestCodeActionControlMediaEdit = 808;
|
||||
|
||||
final static int requestCodeTriggerBroadcastReceivedAdd = 809;
|
||||
final static int requestCodeTriggerBroadcastReceivedEdit = 810;
|
||||
final static int requestCodeActionSendBroadcastAdd = 811;
|
||||
final static int requestCodeActionSendBroadcastEdit = 812;
|
||||
final static int requestCodeActionRunExecutableAdd = 813;
|
||||
final static int requestCodeActionRunExecutableEdit = 814;
|
||||
final static int requestCodeActionSetWifiAdd = 815;
|
||||
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;
|
||||
|
||||
public static ActivityManageRule getInstance()
|
||||
{
|
||||
if(instance == null)
|
||||
@ -298,6 +318,30 @@ public class ActivityManageRule extends Activity
|
||||
devicePositionEditor.putExtra(ActivityManageTriggerDeviceOrientation.vectorFieldName, selectedTrigger.getTriggerParameter2());
|
||||
startActivityForResult(devicePositionEditor, requestCodeTriggerDeviceOrientationEdit);
|
||||
break;
|
||||
case broadcastReceived:
|
||||
Intent broadcastEditor = new Intent(ActivityManageRule.this, ActivityManageTriggerBroadcast.class);
|
||||
broadcastEditor.putExtra(intentNameTriggerParameter1, selectedTrigger.getTriggerParameter());
|
||||
broadcastEditor.putExtra(intentNameTriggerParameter2, selectedTrigger.getTriggerParameter2());
|
||||
startActivityForResult(broadcastEditor, requestCodeTriggerBroadcastReceivedEdit);
|
||||
break;
|
||||
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;
|
||||
}
|
||||
@ -333,8 +377,8 @@ public class ActivityManageRule extends Activity
|
||||
{
|
||||
case startOtherActivity:
|
||||
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionStartActivity.class);
|
||||
ActivityManageActionStartActivity.resultingAction = a;
|
||||
intent.putExtra("edit", true);
|
||||
intent.putExtra(intentNameActionParameter1, a.getParameter1());
|
||||
intent.putExtra(intentNameActionParameter2, a.getParameter2());
|
||||
startActivityForResult(intent, requestCodeActionStartActivityEdit);
|
||||
break;
|
||||
case triggerUrl:
|
||||
@ -367,6 +411,40 @@ public class ActivityManageRule extends Activity
|
||||
activityEditVibrateIntent.putExtra("vibratePattern", a.getParameter2());
|
||||
startActivityForResult(activityEditVibrateIntent, requestCodeActionVibrateEdit);
|
||||
break;
|
||||
case sendBroadcast:
|
||||
Intent activityEditSendBroadcastIntent = new Intent(ActivityManageRule.this, ActivityManageActionSendBroadcast.class);
|
||||
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());
|
||||
activityEditSetWifiIntent.putExtra(intentNameActionParameter2, a.getParameter2());
|
||||
startActivityForResult(activityEditSetWifiIntent, requestCodeActionSetWifiEdit);
|
||||
break;
|
||||
case controlMediaPlayback:
|
||||
Intent activityEditControlMediaIntent = new Intent(ActivityManageRule.this, ActivityManageActionControlMedia.class);
|
||||
activityEditControlMediaIntent.putExtra(ActivityManageRule.intentNameActionParameter2, a.getParameter2());
|
||||
@ -508,6 +586,8 @@ public class ActivityManageRule extends Activity
|
||||
items.add(new Item(typesLong[i].toString(), R.drawable.plane));
|
||||
else if(types[i].toString().equals(Trigger_Enum.roaming.toString()))
|
||||
items.add(new Item(typesLong[i].toString(), R.drawable.roaming));
|
||||
else if(types[i].toString().equals(Trigger_Enum.broadcastReceived.toString()))
|
||||
items.add(new Item(typesLong[i].toString(), R.drawable.megaphone));
|
||||
else if(types[i].toString().equals(Trigger_Enum.phoneCall.toString()))
|
||||
{
|
||||
if(ActivityPermissions.isPermissionDeclaratedInManifest(ActivityManageRule.this, "android.permission.SEND_SMS"))
|
||||
@ -531,6 +611,14 @@ public class ActivityManageRule extends Activity
|
||||
items.add(new Item(typesLong[i].toString(), R.drawable.sound));
|
||||
else if(types[i].toString().equals(Trigger_Enum.screenState.toString()))
|
||||
items.add(new Item(typesLong[i].toString(), R.drawable.smartphone));
|
||||
else if(types[i].toString().equals(Trigger_Enum.deviceStarts.toString()))
|
||||
items.add(new Item(typesLong[i].toString(), R.drawable.alarm));
|
||||
else if(types[i].toString().equals(Trigger_Enum.serviceStarts.toString()))
|
||||
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));
|
||||
}
|
||||
@ -595,7 +683,7 @@ public class ActivityManageRule extends Activity
|
||||
booleanChoices = new String[]{getResources().getString(R.string.started), getResources().getString(R.string.stopped)};
|
||||
else if(triggerType == Trigger_Enum.usb_host_connection)
|
||||
booleanChoices = new String[]{getResources().getString(R.string.connected), getResources().getString(R.string.disconnected)};
|
||||
else if(triggerType == Trigger_Enum.speed | triggerType == Trigger_Enum.noiseLevel | triggerType == Trigger_Enum.batteryLevel)
|
||||
else if(triggerType == Trigger_Enum.speed || triggerType == Trigger_Enum.noiseLevel || triggerType == Trigger_Enum.batteryLevel)
|
||||
booleanChoices = new String[]{getResources().getString(R.string.exceeds), getResources().getString(R.string.dropsBelow)};
|
||||
else if(triggerType == Trigger_Enum.wifiConnection)
|
||||
{
|
||||
@ -685,21 +773,41 @@ public class ActivityManageRule extends Activity
|
||||
}
|
||||
else if(triggerType == Trigger_Enum.bluetoothConnection)
|
||||
{
|
||||
if(!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH))
|
||||
Miscellaneous.messageBox("Bluetooth", getResources().getString(R.string.deviceDoesNotHaveBluetooth), ActivityManageRule.this).show();;
|
||||
// if(!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH))
|
||||
// //Miscellaneous.messageBox("Bluetooth", getResources().getString(R.string.deviceDoesNotHaveBluetooth), ActivityManageRule.this).show();
|
||||
// Toast.makeText(ActivityManageRule.this, getResources().getString(R.string.deviceDoesNotHaveBluetooth), Toast.LENGTH_LONG).show();
|
||||
|
||||
newTrigger.setTriggerType(Trigger_Enum.bluetoothConnection);
|
||||
ActivityManageTriggerBluetooth.editedBluetoothTrigger = newTrigger;
|
||||
Intent bluetoothEditor = new Intent(myContext, ActivityManageTriggerBluetooth.class);
|
||||
startActivityForResult(bluetoothEditor, requestCodeTriggerBluetoothAdd);
|
||||
|
||||
return;
|
||||
}
|
||||
else if(triggerType == Trigger_Enum.screenState)
|
||||
{
|
||||
newTrigger.setTriggerType(Trigger_Enum.screenState);
|
||||
getTriggerScreenStateDialog().show();
|
||||
Miscellaneous.messageBox(getResources().getString(R.string.info), getResources().getString(R.string.lockedCommentScreenMustBeOff), ActivityManageRule.this).show();
|
||||
return;
|
||||
}
|
||||
/*else if(triggerType == Trigger_Enum.deviceStarts)
|
||||
{
|
||||
newTrigger.setTriggerType(Trigger_Enum.deviceStarts);
|
||||
ruleToEdit.getTriggerSet().add(newTrigger);
|
||||
refreshTriggerList();
|
||||
return;
|
||||
}*/
|
||||
else if(triggerType == Trigger_Enum.deviceStarts || triggerType == Trigger_Enum.serviceStarts)
|
||||
{
|
||||
// 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)};
|
||||
|
||||
@ -708,6 +816,34 @@ public class ActivityManageRule extends Activity
|
||||
if (NfcReceiver.checkNfcRequirements(ActivityManageRule.this, true))
|
||||
getTriggerParameterDialog(context, booleanChoices).show();
|
||||
}
|
||||
else if(triggerType == Trigger_Enum.broadcastReceived)
|
||||
{
|
||||
newTrigger.setTriggerType(Trigger_Enum.broadcastReceived);
|
||||
Intent broadcastTriggerEditor = new Intent(myContext, ActivityManageTriggerBroadcast.class);
|
||||
startActivityForResult(broadcastTriggerEditor, requestCodeTriggerBroadcastReceivedAdd);
|
||||
return;
|
||||
}
|
||||
else if(triggerType == Trigger_Enum.tethering)
|
||||
{
|
||||
newTrigger.setTriggerType(Trigger_Enum.tethering);
|
||||
Intent tetheringTriggerEditor = new Intent(myContext, ActivityManageTriggerTethering.class);
|
||||
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();
|
||||
|
||||
@ -799,6 +935,7 @@ public class ActivityManageRule extends Activity
|
||||
|
||||
return alertDialog;
|
||||
}
|
||||
|
||||
private AlertDialog getTriggerBatteryDialog(final Context myContext, final String[] choices)
|
||||
{
|
||||
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
|
||||
@ -813,6 +950,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);
|
||||
@ -947,7 +1085,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);
|
||||
@ -1044,7 +1182,9 @@ public class ActivityManageRule extends Activity
|
||||
String[] choices = {
|
||||
Miscellaneous.getAnyContext().getResources().getString(R.string.off),
|
||||
Miscellaneous.getAnyContext().getResources().getString(R.string.on),
|
||||
Miscellaneous.getAnyContext().getResources().getString(R.string.unlocked)
|
||||
Miscellaneous.getAnyContext().getResources().getString(R.string.unlocked),
|
||||
Miscellaneous.getAnyContext().getResources().getString(R.string.lockedWithoutSecurity),
|
||||
Miscellaneous.getAnyContext().getResources().getString(R.string.lockedWithSecurity)
|
||||
};
|
||||
|
||||
alertDialog.setItems(choices, new DialogInterface.OnClickListener()
|
||||
@ -1052,6 +1192,7 @@ public class ActivityManageRule extends Activity
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which)
|
||||
{
|
||||
newTrigger.setTriggerParameter(true);
|
||||
newTrigger.setTriggerParameter2(String.valueOf(which));
|
||||
ruleToEdit.getTriggerSet().add(newTrigger);
|
||||
refreshTriggerList();
|
||||
@ -1277,8 +1418,10 @@ public class ActivityManageRule extends Activity
|
||||
// manage start of other activity
|
||||
if(resultCode == RESULT_OK)
|
||||
{
|
||||
newAction = ActivityManageActionStartActivity.resultingAction;
|
||||
newAction.setParentRule(ruleToEdit);
|
||||
newAction.setAction(Action_Enum.startOtherActivity);
|
||||
newAction.setParameter1(data.getBooleanExtra(intentNameActionParameter1, true));
|
||||
newAction.setParameter2(data.getStringExtra(intentNameActionParameter2));
|
||||
ruleToEdit.getActionSet().add(newAction);
|
||||
this.refreshActionList();
|
||||
}
|
||||
@ -1288,9 +1431,14 @@ public class ActivityManageRule extends Activity
|
||||
// manage start of other activity
|
||||
if(resultCode == RESULT_OK)
|
||||
{
|
||||
newAction = ActivityManageActionStartActivity.resultingAction;
|
||||
newAction.setParentRule(ruleToEdit);
|
||||
// ruleToEdit.getActionSet().add(newAction);
|
||||
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();
|
||||
}
|
||||
}
|
||||
@ -1330,8 +1478,18 @@ public class ActivityManageRule extends Activity
|
||||
{
|
||||
if(resultCode == RESULT_OK)
|
||||
{
|
||||
newTrigger = ActivityManageTriggerNotification.resultingTrigger;
|
||||
newTrigger.setParentRule(ruleToEdit);
|
||||
Trigger editedTrigger = new Trigger();
|
||||
editedTrigger.setTriggerType(Trigger_Enum.notification);
|
||||
editedTrigger.setTriggerParameter(data.getBooleanExtra(ActivityManageTriggerNotification.intentNameNotificationDirection, false));
|
||||
editedTrigger.setTriggerParameter2(
|
||||
data.getStringExtra(ActivityManageTriggerNotification.intentNameNotificationApp) + Trigger.triggerParameter2Split +
|
||||
data.getStringExtra(ActivityManageTriggerNotification.intentNameNotificationTitleDir) + Trigger.triggerParameter2Split +
|
||||
data.getStringExtra(ActivityManageTriggerNotification.intentNameNotificationTitle) + Trigger.triggerParameter2Split +
|
||||
data.getStringExtra(ActivityManageTriggerNotification.intentNameNotificationTextDir) + Trigger.triggerParameter2Split +
|
||||
data.getStringExtra(ActivityManageTriggerNotification.intentNameNotificationText)
|
||||
);
|
||||
editedTrigger.setParentRule(ruleToEdit);
|
||||
ruleToEdit.getTriggerSet().set(editIndex, editedTrigger);
|
||||
this.refreshTriggerList();
|
||||
}
|
||||
}
|
||||
@ -1341,7 +1499,7 @@ public class ActivityManageRule extends Activity
|
||||
{
|
||||
newTrigger.setParentRule(ruleToEdit);
|
||||
ruleToEdit.getTriggerSet().add(newTrigger);
|
||||
newTrigger.setTriggerParameter2(data.getStringExtra("triggerParameter2"));
|
||||
newTrigger.setTriggerParameter2(data.getStringExtra(intentNameTriggerParameter2));
|
||||
this.refreshTriggerList();
|
||||
}
|
||||
}
|
||||
@ -1412,11 +1570,11 @@ public class ActivityManageRule extends Activity
|
||||
{
|
||||
if(resultCode == RESULT_OK)
|
||||
{
|
||||
if(data.hasExtra("autoBrightness"))
|
||||
ruleToEdit.getActionSet().get(editIndex).setParameter1(data.getBooleanExtra("autoBrightness", false));
|
||||
if(data.hasExtra(ActivityManageActionBrightnessSetting.intentNameAutoBrightness))
|
||||
ruleToEdit.getActionSet().get(editIndex).setParameter1(data.getBooleanExtra(ActivityManageActionBrightnessSetting.intentNameAutoBrightness, false));
|
||||
|
||||
if(data.hasExtra("brightnessValue"))
|
||||
ruleToEdit.getActionSet().get(editIndex).setParameter2(String.valueOf(data.getIntExtra("brightnessValue", 0)));
|
||||
if(data.hasExtra(ActivityManageActionBrightnessSetting.intentNameBrightnessValue))
|
||||
ruleToEdit.getActionSet().get(editIndex).setParameter2(String.valueOf(data.getIntExtra(ActivityManageActionBrightnessSetting.intentNameBrightnessValue, 0)));
|
||||
|
||||
ruleToEdit.getActionSet().get(editIndex).setParentRule(ruleToEdit);
|
||||
|
||||
@ -1433,6 +1591,59 @@ public class ActivityManageRule extends Activity
|
||||
this.refreshActionList();
|
||||
}
|
||||
}
|
||||
else if(requestCode == requestCodeActionSendBroadcastAdd)
|
||||
{
|
||||
if(resultCode == RESULT_OK)
|
||||
{
|
||||
newAction.setParentRule(ruleToEdit);
|
||||
newAction.setParameter2(data.getStringExtra(intentNameActionParameter2));
|
||||
ruleToEdit.getActionSet().add(newAction);
|
||||
this.refreshActionList();
|
||||
}
|
||||
}
|
||||
else if(requestCode == requestCodeActionRunExecutableAdd)
|
||||
{
|
||||
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 == 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)
|
||||
@ -1443,6 +1654,17 @@ public class ActivityManageRule extends Activity
|
||||
this.refreshActionList();
|
||||
}
|
||||
}
|
||||
else if(requestCode == requestCodeActionSetWifiAdd)
|
||||
{
|
||||
if(resultCode == RESULT_OK)
|
||||
{
|
||||
newAction.setParentRule(ruleToEdit);
|
||||
newAction.setParameter1(data.getBooleanExtra(ActivityManageRule.intentNameActionParameter1, true));
|
||||
newAction.setParameter2(data.getStringExtra(ActivityManageRule.intentNameActionParameter2));
|
||||
ruleToEdit.getActionSet().add(newAction);
|
||||
this.refreshActionList();
|
||||
}
|
||||
}
|
||||
else if(requestCode == requestCodeActionCreateNotificationAdd)
|
||||
{
|
||||
if(resultCode == RESULT_OK)
|
||||
@ -1479,6 +1701,92 @@ public class ActivityManageRule extends Activity
|
||||
this.refreshActionList();
|
||||
}
|
||||
}
|
||||
else if(requestCode == requestCodeActionSendBroadcastEdit)
|
||||
{
|
||||
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 == 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)
|
||||
{
|
||||
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 == 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(intentNameActionParameter1) && data.hasExtra(intentNameActionParameter2))
|
||||
{
|
||||
ruleToEdit.getActionSet().get(editIndex).setParameter2(data.getStringExtra(intentNameActionParameter2));
|
||||
}
|
||||
|
||||
this.refreshActionList();
|
||||
}
|
||||
}
|
||||
else if(requestCode == requestCodeActionSetWifiEdit)
|
||||
{
|
||||
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 == requestCodeActionControlMediaEdit)
|
||||
{
|
||||
if(resultCode == RESULT_OK)
|
||||
@ -1612,6 +1920,102 @@ public class ActivityManageRule extends Activity
|
||||
this.refreshTriggerList();
|
||||
}
|
||||
}
|
||||
else if(requestCode == requestCodeTriggerBroadcastReceivedAdd)
|
||||
{
|
||||
if(resultCode == RESULT_OK)
|
||||
{
|
||||
newTrigger.setTriggerParameter(data.getBooleanExtra(ActivityManageRule.intentNameTriggerParameter1, true));
|
||||
newTrigger.setTriggerParameter2(data.getStringExtra(ActivityManageRule.intentNameTriggerParameter2));
|
||||
newTrigger.setParentRule(ruleToEdit);
|
||||
ruleToEdit.getTriggerSet().add(newTrigger);
|
||||
this.refreshTriggerList();
|
||||
}
|
||||
}
|
||||
else if(requestCode == requestCodeTriggerBroadcastReceivedEdit)
|
||||
{
|
||||
if(resultCode == RESULT_OK)
|
||||
{
|
||||
Trigger editedTrigger = new Trigger();
|
||||
editedTrigger.setTriggerType(Trigger_Enum.broadcastReceived);
|
||||
editedTrigger.setTriggerParameter(data.getBooleanExtra(ActivityManageRule.intentNameTriggerParameter1, true));
|
||||
editedTrigger.setTriggerParameter2(data.getStringExtra(ActivityManageRule.intentNameTriggerParameter2));
|
||||
editedTrigger.setParentRule(ruleToEdit);
|
||||
ruleToEdit.getTriggerSet().set(editIndex, editedTrigger);
|
||||
this.refreshTriggerList();
|
||||
}
|
||||
}
|
||||
else if(requestCode == requestCodeTriggerTetheringAdd)
|
||||
{
|
||||
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();
|
||||
}
|
||||
}
|
||||
else if(requestCode == requestCodeTriggerTetheringEdit)
|
||||
{
|
||||
if(resultCode == RESULT_OK)
|
||||
{
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected AlertDialog getActionTypeDialog()
|
||||
@ -1665,9 +2069,24 @@ public class ActivityManageRule extends Activity
|
||||
items.add(new Item(typesLong[i].toString(), R.drawable.notification));
|
||||
else if(types[i].toString().equals(Action_Enum.closeNotification.toString()))
|
||||
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));
|
||||
}
|
||||
@ -1714,10 +2133,8 @@ public class ActivityManageRule extends Activity
|
||||
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.setWifi.toString()))
|
||||
{
|
||||
newAction.setAction(Action_Enum.setWifi);
|
||||
getActionParameter1Dialog(ActivityManageRule.this).show();
|
||||
|
||||
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
|
||||
Miscellaneous.messageBox(context.getResources().getString(R.string.app_name), context.getResources().getString(R.string.android10WifiToggleNotice), context).show();
|
||||
Intent editSetWifiIntent = new Intent(context, ActivityManageActionWifi.class);
|
||||
startActivityForResult(editSetWifiIntent, requestCodeActionSetWifiAdd);
|
||||
}
|
||||
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.setBluetooth.toString()))
|
||||
{
|
||||
@ -1827,6 +2244,42 @@ public class ActivityManageRule extends Activity
|
||||
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionVibrate.class);
|
||||
startActivityForResult(intent, requestCodeActionVibrateAdd);
|
||||
}
|
||||
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.sendBroadcast.toString()))
|
||||
{
|
||||
newAction.setAction(Action_Enum.sendBroadcast);
|
||||
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionSendBroadcast.class);
|
||||
startActivityForResult(intent, requestCodeActionSendBroadcastAdd);
|
||||
}
|
||||
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.runExecutable.toString()))
|
||||
{
|
||||
newAction.setAction(Action_Enum.runExecutable);
|
||||
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);
|
||||
|
@ -2,6 +2,7 @@ package com.jens.automation2;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.bluetooth.BluetoothDevice;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
@ -12,6 +13,7 @@ import android.widget.CompoundButton;
|
||||
import android.widget.CompoundButton.OnCheckedChangeListener;
|
||||
import android.widget.RadioButton;
|
||||
import android.widget.Spinner;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.jens.automation2.receivers.BluetoothReceiver;
|
||||
@ -22,6 +24,7 @@ public class ActivityManageTriggerBluetooth extends Activity
|
||||
RadioButton radioAnyBluetoothDevice, radioNoDevice, radioDeviceFromList, radioBluetoothConnected, radioBluetoothDisconnected, radioBluetoothInRange, radioBluetoothOutRange;
|
||||
Button bSaveBluetoothTrigger;
|
||||
Spinner spinnerBluetoothDevices;
|
||||
TextView tvBluetoothNotPresentNotice;
|
||||
|
||||
ArrayAdapter<String> bluetoothDevicesSpinnerAdapter;
|
||||
|
||||
@ -40,9 +43,15 @@ public class ActivityManageTriggerBluetooth extends Activity
|
||||
radioBluetoothOutRange = (RadioButton)findViewById(R.id.radioBluetoothOutRange);
|
||||
bSaveBluetoothTrigger = (Button)findViewById(R.id.bSaveBluetoothTrigger);
|
||||
spinnerBluetoothDevices = (Spinner)findViewById(R.id.spinnerBluetoothDevices);
|
||||
tvBluetoothNotPresentNotice = (TextView)findViewById(R.id.tvBluetoothNotPresentNotice);
|
||||
|
||||
bluetoothDevicesSpinnerAdapter = new ArrayAdapter<String>(this, R.layout.text_view_for_poi_listview_mediumtextsize, BluetoothReceiver.getAllPairedBluetoothDevicesStrings());
|
||||
|
||||
|
||||
if(!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH))
|
||||
tvBluetoothNotPresentNotice.setVisibility(View.VISIBLE);
|
||||
else
|
||||
tvBluetoothNotPresentNotice.setVisibility(View.GONE);
|
||||
|
||||
radioDeviceFromList.setOnCheckedChangeListener(new OnCheckedChangeListener()
|
||||
{
|
||||
@Override
|
||||
|
@ -0,0 +1,421 @@
|
||||
package com.jens.automation2;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.AlertDialog;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
import android.widget.RadioButton;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
public class ActivityManageTriggerBroadcast extends Activity
|
||||
{
|
||||
RadioButton rbBroadcastReceived, rbBroadcastNotReceived;
|
||||
EditText etBroadcastTriggerAction;
|
||||
Button bBroadcastShowSuggestions, bSaveTriggerBroadcast;
|
||||
TextView tvBroadcastUrl;
|
||||
|
||||
@Override
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_manage_trigger_broadcasts);
|
||||
|
||||
bBroadcastShowSuggestions = findViewById(R.id.bBroadcastShowSuggestions);
|
||||
bSaveTriggerBroadcast = findViewById(R.id.bSaveTriggerBroadcast);
|
||||
etBroadcastTriggerAction = findViewById(R.id.etBroadcastTriggerAction);
|
||||
rbBroadcastReceived = findViewById(R.id.rbBroadcastReceived);
|
||||
rbBroadcastNotReceived = findViewById(R.id.rbBroadcastNotReceived);
|
||||
tvBroadcastUrl = findViewById(R.id.tvBroadcastUrl);
|
||||
|
||||
if(getIntent().hasExtra(ActivityManageRule.intentNameTriggerParameter1) && getIntent().hasExtra(ActivityManageRule.intentNameTriggerParameter2))
|
||||
{
|
||||
if(getIntent().getBooleanExtra(ActivityManageRule.intentNameTriggerParameter1, true))
|
||||
rbBroadcastReceived.setChecked(true);
|
||||
else
|
||||
rbBroadcastNotReceived.setChecked(true);
|
||||
|
||||
etBroadcastTriggerAction.setText(getIntent().getStringExtra(ActivityManageRule.intentNameTriggerParameter2));
|
||||
}
|
||||
|
||||
tvBroadcastUrl.setOnClickListener(new View.OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View view)
|
||||
{
|
||||
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(getResources().getString(R.string.broadcastListUrl)));
|
||||
startActivity(browserIntent);
|
||||
}
|
||||
});
|
||||
|
||||
bBroadcastShowSuggestions.setOnClickListener(new View.OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View view)
|
||||
{
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(ActivityManageTriggerBroadcast.this);
|
||||
builder.setTitle(getResources().getString(R.string.selectBroadcast));
|
||||
builder.setItems(broadcastSuggestions, new DialogInterface.OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int which)
|
||||
{
|
||||
etBroadcastTriggerAction.setText(broadcastSuggestions[which]);
|
||||
}
|
||||
});
|
||||
builder.create().show();
|
||||
}
|
||||
});
|
||||
|
||||
bSaveTriggerBroadcast.setOnClickListener(new View.OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
if(etBroadcastTriggerAction.getText() != null && !StringUtils.isEmpty(etBroadcastTriggerAction.getText().toString()))
|
||||
{
|
||||
Intent data = new Intent();
|
||||
data.putExtra(ActivityManageRule.intentNameTriggerParameter1, rbBroadcastReceived.isChecked());
|
||||
data.putExtra(ActivityManageRule.intentNameTriggerParameter2, etBroadcastTriggerAction.getText().toString());
|
||||
ActivityManageTriggerBroadcast.this.setResult(RESULT_OK, data);
|
||||
|
||||
finish();
|
||||
}
|
||||
else
|
||||
Toast.makeText(ActivityManageTriggerBroadcast.this, getResources().getString(R.string.enterText), Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public static String[] broadcastSuggestions = {
|
||||
"android.accounts.LOGIN_ACCOUNTS_CHANGED",
|
||||
"android.accounts.action.ACCOUNT_REMOVED",
|
||||
"android.app.action.ACTION_PASSWORD_CHANGED",
|
||||
"android.app.action.ACTION_PASSWORD_EXPIRING",
|
||||
"android.app.action.ACTION_PASSWORD_FAILED",
|
||||
"android.app.action.ACTION_PASSWORD_SUCCEEDED",
|
||||
"android.app.action.AFFILIATED_PROFILE_TRANSFER_OWNERSHIP_COMPLETE",
|
||||
"android.app.action.APPLICATION_DELEGATION_SCOPES_CHANGED",
|
||||
"android.app.action.APP_BLOCK_STATE_CHANGED",
|
||||
"android.app.action.AUTOMATIC_ZEN_RULE_STATUS_CHANGED",
|
||||
"android.app.action.BUGREPORT_FAILED",
|
||||
"android.app.action.BUGREPORT_SHARE",
|
||||
"android.app.action.BUGREPORT_SHARING_DECLINED",
|
||||
"android.app.action.DATA_SHARING_RESTRICTION_APPLIED",
|
||||
"android.app.action.DATA_SHARING_RESTRICTION_CHANGED",
|
||||
"android.app.action.DEVICE_ADMIN_DISABLED",
|
||||
"android.app.action.DEVICE_ADMIN_DISABLE_REQUESTED",
|
||||
"android.app.action.DEVICE_ADMIN_ENABLED",
|
||||
"android.app.action.DEVICE_OWNER_CHANGED",
|
||||
"android.app.action.INTERRUPTION_FILTER_CHANGED",
|
||||
"android.app.action.INTERRUPTION_FILTER_CHANGED_INTERNAL",
|
||||
"android.app.action.LOCK_TASK_ENTERING",
|
||||
"android.app.action.LOCK_TASK_EXITING",
|
||||
"android.app.action.MANAGED_USER_CREATED",
|
||||
"android.app.action.NETWORK_LOGS_AVAILABLE",
|
||||
"android.app.action.NEXT_ALARM_CLOCK_CHANGED",
|
||||
"android.app.action.NOTIFICATION_CHANNEL_BLOCK_STATE_CHANGED",
|
||||
"android.app.action.NOTIFICATION_CHANNEL_GROUP_BLOCK_STATE_CHANGED",
|
||||
"android.app.action.NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED",
|
||||
"android.app.action.NOTIFICATION_POLICY_CHANGED",
|
||||
"android.app.action.NOTIFY_PENDING_SYSTEM_UPDATE",
|
||||
"android.app.action.PROFILE_OWNER_CHANGED",
|
||||
"android.app.action.PROFILE_PROVISIONING_COMPLETE",
|
||||
"android.app.action.SECURITY_LOGS_AVAILABLE",
|
||||
"android.app.action.SYSTEM_UPDATE_POLICY_CHANGED",
|
||||
"android.app.action.TRANSFER_OWNERSHIP_COMPLETE",
|
||||
"android.app.action.USER_ADDED",
|
||||
"android.app.action.USER_REMOVED",
|
||||
"android.app.action.USER_STARTED",
|
||||
"android.app.action.USER_STOPPED",
|
||||
"android.app.action.USER_SWITCHED",
|
||||
"android.appwidget.action.APPWIDGET_DELETED",
|
||||
"android.appwidget.action.APPWIDGET_DISABLED",
|
||||
"android.appwidget.action.APPWIDGET_ENABLED",
|
||||
"android.appwidget.action.APPWIDGET_HOST_RESTORED",
|
||||
"android.appwidget.action.APPWIDGET_RESTORED",
|
||||
"android.appwidget.action.APPWIDGET_UPDATE",
|
||||
"android.appwidget.action.APPWIDGET_UPDATE_OPTIONS",
|
||||
"android.bluetooth.a2dp.profile.action.ACTIVE_DEVICE_CHANGED",
|
||||
"android.bluetooth.a2dp.profile.action.AVRCP_CONNECTION_STATE_CHANGED",
|
||||
"android.bluetooth.a2dp.profile.action.CODEC_CONFIG_CHANGED",
|
||||
"android.bluetooth.a2dp.profile.action.CONNECTION_STATE_CHANGED",
|
||||
"android.bluetooth.a2dp.profile.action.PLAYING_STATE_CHANGED",
|
||||
"android.bluetooth.adapter.action.CONNECTION_STATE_CHANGED",
|
||||
"android.bluetooth.adapter.action.DISCOVERY_FINISHED",
|
||||
"android.bluetooth.adapter.action.DISCOVERY_STARTED",
|
||||
"android.bluetooth.adapter.action.LOCAL_NAME_CHANGED",
|
||||
"android.bluetooth.adapter.action.SCAN_MODE_CHANGED",
|
||||
"android.bluetooth.adapter.action.STATE_CHANGED",
|
||||
"android.bluetooth.device.action.ACL_CONNECTED",
|
||||
"android.bluetooth.device.action.ACL_DISCONNECTED",
|
||||
"android.bluetooth.device.action.ACL_DISCONNECT_REQUESTED",
|
||||
"android.bluetooth.device.action.ALIAS_CHANGED",
|
||||
"android.bluetooth.device.action.BATTERY_LEVEL_CHANGED",
|
||||
"android.bluetooth.device.action.BOND_STATE_CHANGED",
|
||||
"android.bluetooth.device.action.CLASS_CHANGED",
|
||||
"android.bluetooth.device.action.CONNECTION_ACCESS_CANCEL",
|
||||
"android.bluetooth.device.action.CONNECTION_ACCESS_REPLY",
|
||||
"android.bluetooth.device.action.CONNECTION_ACCESS_REQUEST",
|
||||
"android.bluetooth.device.action.FOUND",
|
||||
"android.bluetooth.device.action.MAS_INSTANCE",
|
||||
"android.bluetooth.device.action.NAME_CHANGED",
|
||||
"android.bluetooth.device.action.NAME_FAILED",
|
||||
"android.bluetooth.device.action.PAIRING_CANCEL",
|
||||
"android.bluetooth.device.action.PAIRING_REQUEST",
|
||||
"android.bluetooth.device.action.SDP_RECORD",
|
||||
"android.bluetooth.device.action.SILENCE_MODE_CHANGED",
|
||||
"android.bluetooth.device.action.UUID",
|
||||
"android.bluetooth.devicepicker.action.DEVICE_SELECTED",
|
||||
"android.bluetooth.devicepicker.action.LAUNCH",
|
||||
"android.bluetooth.headset.action.VENDOR_SPECIFIC_HEADSET_EVENT",
|
||||
"android.bluetooth.headset.profile.action.ACTIVE_DEVICE_CHANGED",
|
||||
"android.bluetooth.headset.profile.action.AUDIO_STATE_CHANGED",
|
||||
"android.bluetooth.headset.profile.action.CONNECTION_STATE_CHANGED",
|
||||
"android.bluetooth.hearingaid.profile.action.ACTIVE_DEVICE_CHANGED",
|
||||
"android.bluetooth.hearingaid.profile.action.CONNECTION_STATE_CHANGED",
|
||||
"android.bluetooth.hiddevice.profile.action.CONNECTION_STATE_CHANGED",
|
||||
"android.bluetooth.input.profile.action.CONNECTION_STATE_CHANGED",
|
||||
"android.bluetooth.input.profile.action.HANDSHAKE",
|
||||
"android.bluetooth.input.profile.action.IDLE_TIME_CHANGED",
|
||||
"android.bluetooth.input.profile.action.PROTOCOL_MODE_CHANGED",
|
||||
"android.bluetooth.input.profile.action.REPORT",
|
||||
"android.bluetooth.input.profile.action.VIRTUAL_UNPLUG_STATUS",
|
||||
"android.bluetooth.pan.profile.action.CONNECTION_STATE_CHANGED",
|
||||
"android.bluetooth.pbap.profile.action.CONNECTION_STATE_CHANGED",
|
||||
"android.content.pm.action.SESSION_COMMITTED",
|
||||
"android.content.pm.action.SESSION_UPDATED",
|
||||
"android.hardware.action.NEW_PICTURE",
|
||||
"android.hardware.action.NEW_VIDEO",
|
||||
"android.hardware.hdmi.action.OSD_MESSAGE",
|
||||
"android.hardware.input.action.QUERY_KEYBOARD_LAYOUTS",
|
||||
"android.hardware.usb.action.USB_ACCESSORY_ATTACHED",
|
||||
"android.hardware.usb.action.USB_ACCESSORY_DETACHED",
|
||||
"android.hardware.usb.action.USB_DEVICE_ATTACHED",
|
||||
"android.hardware.usb.action.USB_DEVICE_DETACHED",
|
||||
"android.intent.action.ACTION_IDLE_MAINTENANCE_END",
|
||||
"android.intent.action.ACTION_IDLE_MAINTENANCE_START",
|
||||
"android.intent.action.ACTION_POWER_CONNECTED",
|
||||
"android.intent.action.ACTION_POWER_DISCONNECTED",
|
||||
"android.intent.action.ACTION_PREFERRED_ACTIVITY_CHANGED",
|
||||
"android.intent.action.ACTION_SHUTDOWN",
|
||||
"android.intent.action.AIRPLANE_MODE",
|
||||
"android.intent.action.ALARM_CHANGED",
|
||||
"android.intent.action.APPLICATION_RESTRICTIONS_CHANGED",
|
||||
"android.intent.action.BATTERY_CHANGED",
|
||||
"android.intent.action.BATTERY_LOW",
|
||||
"android.intent.action.BATTERY_OKAY",
|
||||
"android.intent.action.BOOT_COMPLETED",
|
||||
"android.intent.action.CALL_DISCONNECT_CAUSE",
|
||||
"android.intent.action.CAMERA_BUTTON",
|
||||
"android.intent.action.CANCEL_ENABLE_ROLLBACK",
|
||||
"android.intent.action.CLEAR_DNS_CACHE",
|
||||
"android.intent.action.CLOSE_SYSTEM_DIALOGS",
|
||||
"android.intent.action.CONFIGURATION_CHANGED",
|
||||
"android.intent.action.CONTENT_CHANGED",
|
||||
"android.intent.action.DATA_SMS_RECEIVED",
|
||||
"android.intent.action.DATA_STALL_DETECTED",
|
||||
"android.intent.action.DATE_CHANGED",
|
||||
"android.intent.action.DEVICE_STORAGE_FULL",
|
||||
"android.intent.action.DEVICE_STORAGE_LOW",
|
||||
"android.intent.action.DEVICE_STORAGE_NOT_FULL",
|
||||
"android.intent.action.DEVICE_STORAGE_OK",
|
||||
"android.intent.action.DISTRACTING_PACKAGES_CHANGED",
|
||||
"android.intent.action.DOCK_EVENT",
|
||||
"android.intent.action.DOWNLOAD_COMPLETE",
|
||||
"android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED",
|
||||
"android.intent.action.DREAMING_STARTED",
|
||||
"android.intent.action.DREAMING_STOPPED",
|
||||
"android.intent.action.DROPBOX_ENTRY_ADDED",
|
||||
"android.intent.action.DYNAMIC_SENSOR_CHANGED",
|
||||
"android.intent.action.EMERGENCY_CALLBACK_MODE_CHANGED",
|
||||
"android.intent.action.EMERGENCY_CALL_STATE_CHANGED",
|
||||
"android.intent.action.EXTERNAL_APPLICATIONS_AVAILABLE",
|
||||
"android.intent.action.EXTERNAL_APPLICATIONS_UNAVAILABLE",
|
||||
"android.intent.action.FACTORY_RESET",
|
||||
"android.intent.action.FETCH_VOICEMAIL",
|
||||
"android.intent.action.GTALK_CONNECTED",
|
||||
"android.intent.action.GTALK_DISCONNECTED",
|
||||
"android.intent.action.HEADSET_PLUG",
|
||||
"android.intent.action.HEADSET_PLUG",
|
||||
"android.intent.action.INPUT_METHOD_CHANGED",
|
||||
"android.intent.action.INTENT_FILTER_NEEDS_VERIFICATION",
|
||||
"android.intent.action.LOCALE_CHANGED",
|
||||
"android.intent.action.LOCKED_BOOT_COMPLETED",
|
||||
"android.intent.action.MANAGE_PACKAGE_STORAGE",
|
||||
"android.intent.action.MASTER_CLEAR_NOTIFICATION",
|
||||
"android.intent.action.MEDIA_BAD_REMOVAL",
|
||||
"android.intent.action.MEDIA_BUTTON",
|
||||
"android.intent.action.MEDIA_CHECKING",
|
||||
"android.intent.action.MEDIA_EJECT",
|
||||
"android.intent.action.MEDIA_MOUNTED",
|
||||
"android.intent.action.MEDIA_NOFS",
|
||||
"android.intent.action.MEDIA_REMOVED",
|
||||
"android.intent.action.MEDIA_SCANNER_FINISHED",
|
||||
"android.intent.action.MEDIA_SCANNER_SCAN_FILE",
|
||||
"android.intent.action.MEDIA_SCANNER_STARTED",
|
||||
"android.intent.action.MEDIA_SHARED",
|
||||
"android.intent.action.MEDIA_UNMOUNTABLE",
|
||||
"android.intent.action.MEDIA_UNMOUNTED",
|
||||
"android.intent.action.MY_PACKAGE_REPLACED",
|
||||
"android.intent.action.MY_PACKAGE_SUSPENDED",
|
||||
"android.intent.action.MY_PACKAGE_UNSUSPENDED",
|
||||
"android.intent.action.NEW_OUTGOING_CALL",
|
||||
"android.intent.action.NEW_VOICEMAIL",
|
||||
"android.intent.action.PACKAGES_SUSPENDED",
|
||||
"android.intent.action.PACKAGES_UNSUSPENDED",
|
||||
"android.intent.action.PACKAGE_ADDED",
|
||||
"android.intent.action.PACKAGE_CHANGED",
|
||||
"android.intent.action.PACKAGE_DATA_CLEARED",
|
||||
"android.intent.action.PACKAGE_ENABLE_ROLLBACK",
|
||||
"android.intent.action.PACKAGE_FIRST_LAUNCH",
|
||||
"android.intent.action.PACKAGE_FULLY_REMOVED",
|
||||
"android.intent.action.PACKAGE_INSTALL",
|
||||
"android.intent.action.PACKAGE_NEEDS_INTEGRITY_VERIFICATION",
|
||||
"android.intent.action.PACKAGE_NEEDS_VERIFICATION",
|
||||
"android.intent.action.PACKAGE_REMOVED",
|
||||
"android.intent.action.PACKAGE_REPLACED",
|
||||
"android.intent.action.PACKAGE_RESTARTED",
|
||||
"android.intent.action.PACKAGE_UNSUSPENDED_MANUALLY",
|
||||
"android.intent.action.PACKAGE_VERIFIED",
|
||||
"android.intent.action.PHONE_STATE",
|
||||
"android.intent.action.PROVIDER_CHANGED",
|
||||
"android.intent.action.PROXY_CHANGE",
|
||||
"android.intent.action.QUERY_PACKAGE_RESTART",
|
||||
"android.intent.action.REBOOT",
|
||||
"android.intent.action.ROLLBACK_COMMITTED",
|
||||
"android.intent.action.SCREEN_OFF",
|
||||
"android.intent.action.SCREEN_ON",
|
||||
"android.intent.action.SERVICE_STATE",
|
||||
"android.intent.action.SIM_STATE_CHANGED",
|
||||
"android.intent.action.SPLIT_CONFIGURATION_CHANGED",
|
||||
"android.intent.action.SUB_DEFAULT_CHANGED",
|
||||
"android.intent.action.TIMEZONE_CHANGED",
|
||||
"android.intent.action.TIME_SET",
|
||||
"android.intent.action.TIME_TICK",
|
||||
"android.intent.action.UID_REMOVED",
|
||||
"android.intent.action.UMS_CONNECTED",
|
||||
"android.intent.action.UMS_DISCONNECTED",
|
||||
"android.intent.action.USER_PRESENT",
|
||||
"android.intent.action.USER_UNLOCKED",
|
||||
"android.intent.action.WALLPAPER_CHANGED",
|
||||
"android.media.ACTION_SCO_AUDIO_STATE_UPDATED",
|
||||
"android.media.AUDIO_BECOMING_NOISY",
|
||||
"android.media.INTERNAL_RINGER_MODE_CHANGED_ACTION",
|
||||
"android.media.MASTER_MUTE_CHANGED_ACTION",
|
||||
"android.media.RINGER_MODE_CHANGED",
|
||||
"android.media.SCO_AUDIO_STATE_CHANGED",
|
||||
"android.media.STREAM_DEVICES_CHANGED_ACTION",
|
||||
"android.media.STREAM_MUTE_CHANGED_ACTION",
|
||||
"android.media.VIBRATE_SETTING_CHANGED",
|
||||
"android.media.VOLUME_CHANGED_ACTION",
|
||||
"android.media.action.CLOSE_AUDIO_EFFECT_CONTROL_SESSION",
|
||||
"android.media.action.HDMI_AUDIO_PLUG",
|
||||
"android.media.action.MICROPHONE_MUTE_CHANGED",
|
||||
"android.media.action.OPEN_AUDIO_EFFECT_CONTROL_SESSION",
|
||||
"android.media.action.SPEAKERPHONE_STATE_CHANGED",
|
||||
"android.media.tv.action.CHANNEL_BROWSABLE_REQUESTED",
|
||||
"android.media.tv.action.INITIALIZE_PROGRAMS",
|
||||
"android.media.tv.action.PREVIEW_PROGRAM_ADDED_TO_WATCH_NEXT",
|
||||
"android.media.tv.action.PREVIEW_PROGRAM_BROWSABLE_DISABLED",
|
||||
"android.media.tv.action.WATCH_NEXT_PROGRAM_BROWSABLE_DISABLED",
|
||||
"android.net.conn.BACKGROUND_DATA_SETTING_CHANGED",
|
||||
"android.net.conn.CAPTIVE_PORTAL_TEST_COMPLETED",
|
||||
"android.net.conn.CONNECTIVITY_CHANGE",
|
||||
"android.net.conn.DATA_ACTIVITY_CHANGE",
|
||||
"android.net.conn.INET_CONDITION_ACTION",
|
||||
"android.net.conn.RESTRICT_BACKGROUND_CHANGED",
|
||||
"android.net.conn.TETHER_STATE_CHANGED",
|
||||
"android.net.nsd.STATE_CHANGED",
|
||||
"android.net.scoring.SCORER_CHANGED",
|
||||
"android.net.scoring.SCORE_NETWORKS",
|
||||
"android.net.sip.action.SIP_CALL_OPTION_CHANGED",
|
||||
"android.net.sip.action.SIP_INCOMING_CALL",
|
||||
"android.net.sip.action.SIP_REMOVE_PROFILE",
|
||||
"android.net.sip.action.SIP_SERVICE_UP",
|
||||
"android.net.sip.action.START_SIP",
|
||||
"android.net.wifi.BATCHED_RESULTS",
|
||||
"android.net.wifi.NETWORK_IDS_CHANGED",
|
||||
"android.net.wifi.RSSI_CHANGED",
|
||||
"android.net.wifi.SCAN_RESULTS",
|
||||
"android.net.wifi.STATE_CHANGE",
|
||||
"android.net.wifi.WIFI_STATE_CHANGED",
|
||||
"android.net.wifi.action.WIFI_NETWORK_SUGGESTION_POST_CONNECTION",
|
||||
"android.net.wifi.action.WIFI_SCAN_AVAILABILITY_CHANGED",
|
||||
"android.net.wifi.aware.action.WIFI_AWARE_STATE_CHANGED",
|
||||
"android.net.wifi.p2p.CONNECTION_STATE_CHANGE",
|
||||
"android.net.wifi.p2p.DISCOVERY_STATE_CHANGE",
|
||||
"android.net.wifi.p2p.PEERS_CHANGED",
|
||||
"android.net.wifi.p2p.STATE_CHANGED",
|
||||
"android.net.wifi.p2p.THIS_DEVICE_CHANGED",
|
||||
"android.net.wifi.rtt.action.WIFI_RTT_STATE_CHANGED",
|
||||
"android.net.wifi.supplicant.CONNECTION_CHANGE",
|
||||
"android.net.wifi.supplicant.STATE_CHANGE",
|
||||
"android.nfc.action.ADAPTER_STATE_CHANGED",
|
||||
"android.nfc.action.PREFERRED_PAYMENT_CHANGED",
|
||||
"android.nfc.action.TRANSACTION_DETECTED",
|
||||
"android.os.action.ACTION_EFFECTS_SUPPRESSOR_CHANGED",
|
||||
"android.os.action.DEVICE_IDLE_MODE_CHANGED",
|
||||
"android.os.action.LIGHT_DEVICE_IDLE_MODE_CHANGED",
|
||||
"android.os.action.POWER_SAVE_MODE_CHANGED",
|
||||
"android.os.action.POWER_SAVE_MODE_CHANGED_INTERNAL",
|
||||
"android.os.action.POWER_SAVE_MODE_CHANGING",
|
||||
"android.os.action.POWER_SAVE_TEMP_WHITELIST_CHANGED",
|
||||
"android.os.action.POWER_SAVE_WHITELIST_CHANGED",
|
||||
"android.os.action.UPDATE_EMERGENCY_NUMBER_DB",
|
||||
"android.provider.Telephony.MMS_DOWNLOADED",
|
||||
"android.provider.Telephony.SECRET_CODE",
|
||||
"android.provider.Telephony.SIM_FULL",
|
||||
"android.provider.Telephony.SMS_CARRIER_PROVISION",
|
||||
"android.provider.Telephony.SMS_CB_RECEIVED",
|
||||
"android.provider.Telephony.SMS_DELIVER",
|
||||
"android.provider.Telephony.SMS_RECEIVED",
|
||||
"android.provider.Telephony.SMS_REJECTED",
|
||||
"android.provider.Telephony.SMS_SERVICE_CATEGORY_PROGRAM_DATA_RECEIVED",
|
||||
"android.provider.Telephony.WAP_PUSH_DELIVER",
|
||||
"android.provider.Telephony.WAP_PUSH_RECEIVED",
|
||||
"android.provider.action.DEFAULT_SMS_PACKAGE_CHANGED",
|
||||
"android.provider.action.EXTERNAL_PROVIDER_CHANGE",
|
||||
"android.provider.action.SMS_EMERGENCY_CB_RECEIVED",
|
||||
"android.provider.action.SMS_MMS_DB_CREATED",
|
||||
"android.provider.action.SMS_MMS_DB_LOST",
|
||||
"android.provider.action.SYNC_VOICEMAIL",
|
||||
"android.security.STORAGE_CHANGED",
|
||||
"android.security.action.KEYCHAIN_CHANGED",
|
||||
"android.security.action.KEY_ACCESS_CHANGED",
|
||||
"android.security.action.TRUST_STORE_CHANGED",
|
||||
"android.service.controls.action.ADD_CONTROL",
|
||||
"android.settings.ENABLE_MMS_DATA_REQUEST",
|
||||
"android.speech.tts.TTS_QUEUE_PROCESSING_COMPLETED",
|
||||
"android.speech.tts.engine.TTS_DATA_INSTALLED",
|
||||
"android.telephony.action.AREA_INFO_UPDATED",
|
||||
"android.telephony.action.DEFAULT_SMS_SUBSCRIPTION_CHANGED",
|
||||
"android.telephony.action.DEFAULT_SUBSCRIPTION_CHANGED",
|
||||
"android.telephony.action.PRIMARY_SUBSCRIPTION_LIST_CHANGED",
|
||||
"android.telephony.action.REFRESH_SUBSCRIPTION_PLANS",
|
||||
"android.telephony.action.SECRET_CODE",
|
||||
"android.telephony.action.SERVICE_PROVIDERS_UPDATED",
|
||||
"android.telephony.action.SIM_APPLICATION_STATE_CHANGED",
|
||||
"android.telephony.action.SIM_CARD_STATE_CHANGED",
|
||||
"android.telephony.action.SIM_SLOT_STATUS_CHANGED",
|
||||
"android.telephony.action.SUBSCRIPTION_CARRIER_IDENTITY_CHANGED",
|
||||
"android.telephony.action.SUBSCRIPTION_PLANS_CHANGED",
|
||||
"android.telephony.action.SUBSCRIPTION_SPECIFIC_CARRIER_IDENTITY_CHANGED",
|
||||
"android.telephony.euicc.action.NOTIFY_CARRIER_SETUP_INCOMPLETE",
|
||||
"android.telephony.euicc.action.OTA_STATUS_CHANGED",
|
||||
"android.telephony.ims.action.WFC_IMS_REGISTRATION_ERROR",
|
||||
"com.android.intent.action.DISMISS_KEYBOARD_SHORTCUTS",
|
||||
"com.android.intent.action.SHOW_KEYBOARD_SHORTCUTS",
|
||||
"com.android.internal.intent.action.ACTION_FORBIDDEN_NO_SERVICE_AUTHORIZATION",
|
||||
"com.android.internal.provider.action.VOICEMAIL_SMS_RECEIVED"
|
||||
};
|
||||
}
|
@ -0,0 +1,56 @@
|
||||
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);
|
||||
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();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -272,6 +272,7 @@ public class ActivityManageTriggerNotification extends Activity
|
||||
directions = new String[] {
|
||||
getResources().getString(R.string.directionStringEquals),
|
||||
getResources().getString(R.string.directionStringContains),
|
||||
getResources().getString(R.string.directionStringDoesNotContain),
|
||||
getResources().getString(R.string.directionStringStartsWith),
|
||||
getResources().getString(R.string.directionStringEndsWith),
|
||||
getResources().getString(R.string.directionStringNotEquals)
|
||||
@ -321,23 +322,14 @@ public class ActivityManageTriggerNotification extends Activity
|
||||
String textDir = Trigger.getMatchCode(spinnerTextDirection.getSelectedItem().toString());
|
||||
String text = etNotificationText.getText().toString();
|
||||
|
||||
if(edit)
|
||||
{
|
||||
editedNotificationTrigger.setTriggerParameter(chkNotificationDirection.isChecked());
|
||||
editedNotificationTrigger.setTriggerParameter2(app + triggerParameter2Split + titleDir + triggerParameter2Split + title + triggerParameter2Split + textDir + triggerParameter2Split + text);
|
||||
ActivityManageTriggerNotification.this.setResult(RESULT_OK);
|
||||
}
|
||||
else
|
||||
{
|
||||
Intent data = new Intent();
|
||||
data.putExtra(intentNameNotificationDirection, chkNotificationDirection.isChecked());
|
||||
data.putExtra(intentNameNotificationApp, app);
|
||||
data.putExtra(intentNameNotificationTitleDir, titleDir);
|
||||
data.putExtra(intentNameNotificationTitle, title);
|
||||
data.putExtra(intentNameNotificationTextDir, textDir);
|
||||
data.putExtra(intentNameNotificationText, text);
|
||||
ActivityManageTriggerNotification.this.setResult(RESULT_OK, data);
|
||||
}
|
||||
Intent data = new Intent();
|
||||
data.putExtra(intentNameNotificationDirection, chkNotificationDirection.isChecked());
|
||||
data.putExtra(intentNameNotificationApp, app);
|
||||
data.putExtra(intentNameNotificationTitleDir, titleDir);
|
||||
data.putExtra(intentNameNotificationTitle, title);
|
||||
data.putExtra(intentNameNotificationTextDir, textDir);
|
||||
data.putExtra(intentNameNotificationText, text);
|
||||
ActivityManageTriggerNotification.this.setResult(RESULT_OK, data);
|
||||
|
||||
finish();
|
||||
}
|
||||
|
@ -86,8 +86,8 @@ public class ActivityManageTriggerPhoneCall extends Activity
|
||||
else
|
||||
{
|
||||
Intent data = new Intent();
|
||||
data.putExtra("triggerParameter", false);
|
||||
data.putExtra("triggerParameter2", tp2Result);
|
||||
data.putExtra(ActivityManageRule.intentNameTriggerParameter1, false);
|
||||
data.putExtra(ActivityManageRule.intentNameTriggerParameter2, tp2Result);
|
||||
ActivityManageTriggerPhoneCall.this.setResult(RESULT_OK, data);
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,72 @@
|
||||
package com.jens.automation2;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.RadioButton;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.jens.automation2.Trigger.subSystemStates;
|
||||
|
||||
public class ActivityManageTriggerSubSystemState extends Activity
|
||||
{
|
||||
RadioButton rbSubSystemStateWifi, rbSubSystemStateBluetooth;
|
||||
RadioButton rbSubSystemStateEnabled, rbSubSystemStateDisabled;
|
||||
Button bSubSystemStateSave;
|
||||
|
||||
@Override
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_manage_trigger_subsystemstate);
|
||||
|
||||
rbSubSystemStateWifi = (RadioButton)findViewById(R.id.rbSubSystemStateWifi);
|
||||
rbSubSystemStateBluetooth = (RadioButton)findViewById(R.id.rbSubSystemStateBluetooth);
|
||||
rbSubSystemStateEnabled = (RadioButton)findViewById(R.id.rbSubSystemStateEnabled);
|
||||
rbSubSystemStateDisabled = (RadioButton)findViewById(R.id.rbSubSystemStateDisabled);
|
||||
bSubSystemStateSave = (Button)findViewById(R.id.bSubSystemStateSave);
|
||||
|
||||
if(getIntent().hasExtra(ActivityManageRule.intentNameTriggerParameter1) && getIntent().hasExtra(ActivityManageRule.intentNameTriggerParameter2))
|
||||
{
|
||||
subSystemStates desiredState = subSystemStates.valueOf(getIntent().getStringExtra(ActivityManageRule.intentNameTriggerParameter2));
|
||||
|
||||
switch(desiredState)
|
||||
{
|
||||
case wifi:
|
||||
rbSubSystemStateWifi.setChecked(true);
|
||||
break;
|
||||
case bluetooth:
|
||||
rbSubSystemStateBluetooth.setChecked(true);
|
||||
break;
|
||||
default:
|
||||
}
|
||||
|
||||
if(getIntent().getBooleanExtra(ActivityManageRule.intentNameTriggerParameter1, true))
|
||||
rbSubSystemStateEnabled.setChecked(true);
|
||||
else
|
||||
rbSubSystemStateDisabled.setChecked(true);
|
||||
}
|
||||
|
||||
bSubSystemStateSave.setOnClickListener(new View.OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View view)
|
||||
{
|
||||
Intent data = new Intent();
|
||||
|
||||
data.putExtra(ActivityManageRule.intentNameTriggerParameter1, rbSubSystemStateEnabled.isChecked());
|
||||
|
||||
if(rbSubSystemStateWifi.isChecked())
|
||||
data.putExtra(ActivityManageRule.intentNameTriggerParameter2, subSystemStates.wifi.name());
|
||||
else if(rbSubSystemStateBluetooth.isChecked())
|
||||
data.putExtra(ActivityManageRule.intentNameTriggerParameter2, subSystemStates.bluetooth.name());
|
||||
|
||||
ActivityManageTriggerSubSystemState.this.setResult(RESULT_OK, data);
|
||||
finish();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -0,0 +1,101 @@
|
||||
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 org.apache.commons.lang3.StringUtils;
|
||||
|
||||
public class ActivityManageTriggerTethering extends Activity
|
||||
{
|
||||
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);
|
||||
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();
|
||||
if(input.hasExtra(ActivityManageRule.intentNameTriggerParameter1))
|
||||
{
|
||||
rbTetheringOn.setChecked(input.getBooleanExtra(ActivityManageRule.intentNameTriggerParameter1, true));
|
||||
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
|
||||
public void onClick(View view)
|
||||
{
|
||||
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();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -10,13 +10,13 @@ import android.widget.CheckBox;
|
||||
import android.widget.CompoundButton;
|
||||
import android.widget.EditText;
|
||||
import android.widget.RadioButton;
|
||||
import android.widget.TextView;
|
||||
import android.widget.TimePicker;
|
||||
import android.widget.Toast;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.sql.Time;
|
||||
import java.text.ParseException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
|
||||
@ -27,6 +27,7 @@ public class ActivityManageTriggerTimeFrame extends Activity
|
||||
CheckBox checkMonday, checkTuesday, checkWednesday, checkThursday, checkFriday, checkSaturday, checkSunday, chkRepeat;
|
||||
RadioButton radioTimeFrameEntering, radioTimeFrameLeaving;
|
||||
EditText etRepeatEvery;
|
||||
TextView tvDaysHint;
|
||||
|
||||
static Trigger editedTimeFrameTrigger = null;
|
||||
|
||||
@ -53,17 +54,18 @@ public class ActivityManageTriggerTimeFrame extends Activity
|
||||
radioTimeFrameLeaving = (RadioButton)findViewById(R.id.radioTimeFrameLeaving);
|
||||
chkRepeat = (CheckBox)findViewById(R.id.chkRepeat);
|
||||
etRepeatEvery = (EditText)findViewById(R.id.etRepeatEvery);
|
||||
tvDaysHint = (TextView)findViewById(R.id.tvDaysHint);
|
||||
|
||||
bSaveTimeFrame.setOnClickListener(new OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
Time startTime = new Time(0);
|
||||
TimeObject startTime = new TimeObject();
|
||||
startTime.setHours(startPicker.getCurrentHour());
|
||||
startTime.setMinutes(startPicker.getCurrentMinute());
|
||||
|
||||
Time stopTime = new Time(0);
|
||||
TimeObject stopTime = new TimeObject();
|
||||
stopTime.setHours(stopPicker.getCurrentHour());
|
||||
stopTime.setMinutes(stopPicker.getCurrentMinute());
|
||||
|
||||
@ -181,6 +183,31 @@ public class ActivityManageTriggerTimeFrame extends Activity
|
||||
editedTimeFrameTrigger.setTimeFrame(new TimeFrame(editedTimeFrameTrigger.getTriggerParameter2()));
|
||||
loadVariableIntoGui();
|
||||
}
|
||||
|
||||
TimePicker.OnTimeChangedListener pickerListener = new TimePicker.OnTimeChangedListener()
|
||||
{
|
||||
@Override
|
||||
public void onTimeChanged(TimePicker timePicker, int i, int i1)
|
||||
{
|
||||
if(
|
||||
startPicker.getCurrentHour() > stopPicker.getCurrentHour()
|
||||
||
|
||||
(
|
||||
startPicker.getCurrentHour() == stopPicker.getCurrentHour()
|
||||
&&
|
||||
startPicker.getCurrentMinute() >= stopPicker.getCurrentMinute()
|
||||
)
|
||||
)
|
||||
tvDaysHint.setText(getResources().getString(R.string.timeFrameDaysHint));
|
||||
else
|
||||
tvDaysHint.setText("");
|
||||
}
|
||||
};
|
||||
startPicker.setOnTimeChangedListener(pickerListener);
|
||||
stopPicker.setOnTimeChangedListener(pickerListener);
|
||||
|
||||
// Perform check once
|
||||
pickerListener.onTimeChanged(null, 0, 0);
|
||||
}
|
||||
|
||||
private void loadVariableIntoGui()
|
||||
|
@ -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,10 +39,11 @@ 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)
|
||||
@ -56,13 +55,21 @@ public class ActivityManageTriggerWifi extends Activity
|
||||
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 +81,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)
|
||||
|
@ -224,7 +224,7 @@ public class ActivityPermissions extends Activity
|
||||
}
|
||||
}
|
||||
|
||||
protected static void addToArrayListUnique(String value, ArrayList<String> list)
|
||||
public static void addToArrayListUnique(String value, List<String> list)
|
||||
{
|
||||
if (!list.contains(value))
|
||||
list.add(value);
|
||||
@ -248,9 +248,13 @@ 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("fdroidFlavor"))
|
||||
if(!BuildConfig.FLAVOR.equalsIgnoreCase(AutomationService.flavor_name_fdroid))
|
||||
if (!havePermission(s, context))
|
||||
return true;
|
||||
}
|
||||
@ -381,7 +385,7 @@ public class ActivityPermissions extends Activity
|
||||
}
|
||||
else if (singlePermission.equalsIgnoreCase(Manifest.permission.ACTIVITY_RECOGNITION) || singlePermission.equalsIgnoreCase(permissionNameGoogleActivityDetection))
|
||||
{
|
||||
if (!BuildConfig.FLAVOR.equalsIgnoreCase("fdroidFlavor"))
|
||||
if (!BuildConfig.FLAVOR.equalsIgnoreCase(AutomationService.flavor_name_fdroid))
|
||||
addToArrayListUnique(singlePermission, requiredPermissions);
|
||||
}
|
||||
else
|
||||
@ -509,6 +513,12 @@ 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)
|
||||
)
|
||||
addToArrayListUnique(Manifest.permission.ACCESS_BACKGROUND_LOCATION, requiredPermissions);
|
||||
break;
|
||||
case notification:
|
||||
addToArrayListUnique(Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE, requiredPermissions);
|
||||
@ -673,6 +683,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;
|
||||
}
|
||||
@ -864,6 +881,14 @@ 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.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;
|
||||
|
@ -18,10 +18,10 @@ public class ActivitySettings extends PreferenceActivity
|
||||
super.onCreate(savedInstanceState);
|
||||
addPreferencesFromResource(layout.activity_settings);
|
||||
|
||||
if(BuildConfig.FLAVOR.equals("apkFlavor"))
|
||||
if(BuildConfig.FLAVOR.equals(AutomationService.flavor_name_apk))
|
||||
{
|
||||
chkPrefUpdateCheck = (CheckBoxPreference) findPreference("automaticUpdateCheck");
|
||||
chkPrefUpdateCheck.setEnabled(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -33,6 +33,9 @@ import com.jens.automation2.receivers.PackageReplacedReceiver;
|
||||
import com.jens.automation2.receivers.PhoneStatusListener;
|
||||
|
||||
import java.util.Calendar;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
@SuppressLint("NewApi")
|
||||
public class AutomationService extends Service implements OnInitListener
|
||||
@ -42,6 +45,10 @@ public class AutomationService extends Service implements OnInitListener
|
||||
protected final static int notificationIdRestrictions = 1005;
|
||||
protected final static int notificationIdLocationRestriction = 1006;
|
||||
|
||||
public static final String flavor_name_apk = "apkFlavor";
|
||||
public static final String flavor_name_fdroid = "fdroidFlavor";
|
||||
public static final String flavor_name_googleplay = "googlePlayFlavor";
|
||||
|
||||
final static String NOTIFICATION_CHANNEL_ID_SERVICE = "com.jens.automation2_service";
|
||||
final static String NOTIFICATION_CHANNEL_NAME_SERVICE = "Service notification";
|
||||
|
||||
@ -58,6 +65,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()
|
||||
@ -193,6 +202,9 @@ public class AutomationService extends Service implements OnInitListener
|
||||
{
|
||||
Bundle b = intent.getExtras();
|
||||
startAtBoot = b.getBoolean("startAtBoot", false);
|
||||
|
||||
if(startAtBoot)
|
||||
Settings.deviceStartDone = false;
|
||||
}
|
||||
|
||||
if (checkStartupRequirements(this, startAtBoot))
|
||||
@ -212,12 +224,9 @@ public class AutomationService extends Service implements OnInitListener
|
||||
ActivityMainScreen.updateMainScreen();
|
||||
|
||||
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();
|
||||
// ********** Test area **********
|
||||
// Miscellaneous.logEvent("i", "setNetworkType", "bin hier.", 3);
|
||||
// Actions.setData(true);
|
||||
// ********** Test area **********
|
||||
|
||||
/*
|
||||
On normal phones the app is supposed to automatically restart in case of any problems.
|
||||
@ -247,8 +256,6 @@ public class AutomationService extends Service implements OnInitListener
|
||||
reloadSettings, reloadPointsOfInterest, reloadRules, updateNotification
|
||||
}
|
||||
|
||||
;
|
||||
|
||||
public void serviceInterface(serviceCommands command)
|
||||
{
|
||||
Miscellaneous.logEvent("i", "Bind", "Ahhhh, customers... How can I help you?", 5);
|
||||
@ -318,6 +325,8 @@ public class AutomationService extends Service implements OnInitListener
|
||||
|
||||
private void startUpRoutine()
|
||||
{
|
||||
Settings.serviceStartDone = false;
|
||||
|
||||
checkForTtsEngine();
|
||||
checkForPermissions();
|
||||
checkForRestrictedFeatures();
|
||||
@ -336,6 +345,9 @@ public class AutomationService extends Service implements OnInitListener
|
||||
if(r.getsGreenLight(AutomationService.this))
|
||||
r.activate(AutomationService.this, false);
|
||||
}
|
||||
|
||||
Settings.serviceStartDone = true;
|
||||
Settings.deviceStartDone = true;
|
||||
}
|
||||
|
||||
protected void startLocationProvider()
|
||||
@ -449,6 +461,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();
|
||||
@ -465,6 +481,7 @@ public class AutomationService extends Service implements OnInitListener
|
||||
PackageReplacedReceiver.setHasServiceBeenRunning(false, this);
|
||||
|
||||
centralInstance = null;
|
||||
Settings.serviceStartDone = false;
|
||||
}
|
||||
|
||||
protected static Builder createDefaultNotificationBuilderOld()
|
||||
@ -558,11 +575,11 @@ public class AutomationService extends Service implements OnInitListener
|
||||
if(activePoi == null)
|
||||
{
|
||||
PointOfInterest closestPoi = PointOfInterest.getClosestPOI(instance.getLocationProvider().getCurrentLocation());
|
||||
bodyText = AutomationService.getInstance().getResources().getString(R.string.activePoi) + ": " + AutomationService.getInstance().getResources().getString(R.string.none) + "\n" + AutomationService.getInstance().getResources().getString(R.string.closestPoi) + ": " + closestPoi.getName() + lastRuleString;
|
||||
bodyText = AutomationService.getInstance().getResources().getString(R.string.activePoi) + " " + AutomationService.getInstance().getResources().getString(R.string.none) + "\n" + AutomationService.getInstance().getResources().getString(R.string.closestPoi) + ": " + closestPoi.getName() + lastRuleString;
|
||||
}
|
||||
else
|
||||
{
|
||||
bodyText = AutomationService.getInstance().getResources().getString(R.string.activePoi) + ": " + activePoi.getName() + lastRuleString;
|
||||
bodyText = AutomationService.getInstance().getResources().getString(R.string.activePoi) + " " + activePoi.getName() + lastRuleString;
|
||||
}
|
||||
}
|
||||
catch(NullPointerException e)
|
||||
@ -682,14 +699,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)
|
||||
{
|
||||
|
@ -82,7 +82,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 +90,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;
|
||||
@ -476,11 +474,16 @@ 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:
|
||||
return haystack.toLowerCase().contains(needle.toLowerCase());
|
||||
case Trigger.directionNotContains:
|
||||
return !haystack.toLowerCase().contains(needle.toLowerCase());
|
||||
case Trigger.directionStartsWith:
|
||||
return haystack.toLowerCase().startsWith(needle.toLowerCase());
|
||||
case Trigger.directionEndsWith:
|
||||
@ -490,7 +493,7 @@ public class Miscellaneous extends Service
|
||||
}
|
||||
}
|
||||
|
||||
public static int compareTimes(Time time1, Time time2)
|
||||
public static int compareTimes(TimeObject time1, TimeObject time2)
|
||||
{
|
||||
// Miscellaneous.logEvent("i", "TimeCompare", "To compare: " + time1.toString() + " / " + time2.toString());
|
||||
|
||||
@ -612,26 +615,81 @@ public class Miscellaneous extends Service
|
||||
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]", String.valueOf(cal.get(Calendar.SECOND)));
|
||||
}
|
||||
|
||||
if(source.contains("[ms]"))
|
||||
{
|
||||
source = source.replace("[ms]", String.valueOf(cal.get(Calendar.MILLISECOND)));
|
||||
}
|
||||
}
|
||||
|
||||
if(source.contains("[notificationTitle]"))
|
||||
@ -710,14 +768,6 @@ public class Miscellaneous extends Service
|
||||
}
|
||||
});
|
||||
|
||||
// alertDialog.setNegativeButton(context.getResources().getString(R.string.cancel), new DialogInterface.OnClickListener()
|
||||
// {
|
||||
// public void onClick(DialogInterface dialog, int whichButton)
|
||||
// {
|
||||
// // Canceled.
|
||||
// }
|
||||
// });
|
||||
|
||||
return alertDialog.create();
|
||||
}
|
||||
|
||||
@ -744,8 +794,8 @@ public class Miscellaneous extends Service
|
||||
*
|
||||
* @return <code>true</code> if the device is rooted, <code>false</code> otherwise.
|
||||
*/
|
||||
public static boolean isPhoneRooted()
|
||||
{
|
||||
public static boolean isPhoneRooted()
|
||||
{
|
||||
// if(true)
|
||||
// return true;
|
||||
|
||||
@ -753,30 +803,30 @@ public class Miscellaneous extends Service
|
||||
String buildTags = Build.TAGS;
|
||||
if (buildTags != null && buildTags.contains("test-keys"))
|
||||
{
|
||||
return true;
|
||||
return true;
|
||||
}
|
||||
|
||||
// check if /system/app/Superuser.apk is present
|
||||
try
|
||||
{
|
||||
File file = new File("/system/app/Superuser.apk");
|
||||
if (file.exists())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
catch (Exception e1)
|
||||
{
|
||||
try
|
||||
{
|
||||
File file = new File("/system/app/Superuser.apk");
|
||||
if (file.exists())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
catch (Exception e1)
|
||||
{
|
||||
// ignore
|
||||
}
|
||||
}
|
||||
|
||||
// try executing commands
|
||||
return canExecuteCommand("/system/xbin/which su")
|
||||
return canExecuteCommand("/system/xbin/which su")
|
||||
||
|
||||
canExecuteCommand("/system/bin/which su")
|
||||
||
|
||||
canExecuteCommand("which su");
|
||||
}
|
||||
}
|
||||
|
||||
// executes a command on the system
|
||||
private static boolean canExecuteCommand(String command)
|
||||
@ -794,19 +844,35 @@ 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
|
||||
* aid testing on a local box, not for use on production.
|
||||
*/
|
||||
private static void disableSSLCertificateChecking()
|
||||
{
|
||||
try
|
||||
private static void disableSSLCertificateChecking()
|
||||
{
|
||||
try
|
||||
{
|
||||
SSLSocketFactory ssf = null;
|
||||
|
||||
@ -1379,7 +1445,7 @@ public class Miscellaneous extends Service
|
||||
return result;
|
||||
}
|
||||
|
||||
public static boolean restrictedFeaturesConfigured()
|
||||
public static boolean restrictedFeaturesConfiguredFdroid()
|
||||
{
|
||||
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.activityDetection))
|
||||
{
|
||||
@ -1396,6 +1462,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();
|
||||
@ -1626,7 +1703,7 @@ public class Miscellaneous extends Service
|
||||
{
|
||||
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
|
||||
{
|
||||
if (BuildConfig.FLAVOR.equalsIgnoreCase("googlePlayFlavor"))
|
||||
if (BuildConfig.FLAVOR.equalsIgnoreCase(AutomationService.flavor_name_googleplay))
|
||||
{
|
||||
if(checkExistingRules)
|
||||
{
|
||||
@ -1759,13 +1836,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);
|
||||
}
|
||||
|
||||
@ -1899,4 +1975,9 @@ public class Miscellaneous extends Service
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public static int getTargetSDK(Context context)
|
||||
{
|
||||
return context.getApplicationContext().getApplicationInfo().targetSdkVersion;
|
||||
}
|
||||
}
|
@ -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()
|
||||
|
@ -3,13 +3,12 @@ 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.Ringtone;
|
||||
import android.media.RingtoneManager;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.provider.MediaStore;
|
||||
import android.provider.Settings;
|
||||
import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
|
||||
@ -43,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;
|
||||
@ -64,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()
|
||||
@ -173,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;
|
||||
}
|
||||
@ -209,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;
|
||||
}
|
||||
@ -294,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;
|
||||
}
|
||||
|
||||
@ -509,7 +524,7 @@ public class Profile implements Comparable<Profile>
|
||||
Actions.setSound(context, soundMode);
|
||||
|
||||
if(changeDndMode)
|
||||
Actions.setDND(context, dndMode);
|
||||
Actions.setDoNotDisturb(context, dndMode);
|
||||
|
||||
if(changeVolumeMusicVideoGameMedia)
|
||||
am.setStreamVolume(AudioManager.STREAM_MUSIC, volumeMusic, AudioManager.FLAG_PLAY_SOUND);
|
||||
@ -570,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
|
||||
|
@ -5,6 +5,7 @@ import android.util.Log;
|
||||
|
||||
import com.jens.automation2.location.CellLocationChangedReceiver;
|
||||
import com.jens.automation2.location.WifiBroadcastReceiver;
|
||||
import com.jens.automation2.receivers.BroadcastListener;
|
||||
import com.jens.automation2.receivers.DateTimeListener;
|
||||
import com.jens.automation2.receivers.AutomationListenerInterface;
|
||||
import com.jens.automation2.receivers.BatteryReceiver;
|
||||
@ -17,6 +18,8 @@ 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;
|
||||
|
||||
import androidx.annotation.RequiresApi;
|
||||
@ -58,7 +61,8 @@ public class ReceiverCoordinator
|
||||
ProcessListener.class,
|
||||
MediaPlayerListener.class,
|
||||
ScreenStateReceiver.class,
|
||||
TimeZoneListener.class
|
||||
TimeZoneListener.class,
|
||||
TetheringReceiver.class
|
||||
};
|
||||
}
|
||||
catch (ClassNotFoundException e)
|
||||
@ -67,6 +71,7 @@ public class ReceiverCoordinator
|
||||
DateTimeListener.class,
|
||||
BatteryReceiver.class,
|
||||
BluetoothReceiver.class,
|
||||
BroadcastListener.class,
|
||||
ConnectivityReceiver.class,
|
||||
DeviceOrientationListener.class,
|
||||
HeadphoneJackListener.class,
|
||||
@ -75,7 +80,8 @@ public class ReceiverCoordinator
|
||||
PhoneStatusListener.class,
|
||||
ProcessListener.class,
|
||||
ScreenStateReceiver.class,
|
||||
TimeZoneListener.class
|
||||
TimeZoneListener.class,
|
||||
TetheringReceiver.class
|
||||
};
|
||||
}
|
||||
}
|
||||
@ -163,6 +169,10 @@ public class ReceiverCoordinator
|
||||
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.noiseLevel))
|
||||
NoiseListener.startNoiseListener(AutomationService.getInstance());
|
||||
|
||||
// startBroadcastListener
|
||||
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.broadcastReceived))
|
||||
BroadcastListener.getInstance().startListener(AutomationService.getInstance());
|
||||
|
||||
// startProcessListener
|
||||
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.process_started_stopped))
|
||||
ProcessListener.startProcessListener(AutomationService.getInstance());
|
||||
@ -170,6 +180,12 @@ public class ReceiverCoordinator
|
||||
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.deviceOrientation))
|
||||
DeviceOrientationListener.getInstance().startListener(AutomationService.getInstance());
|
||||
|
||||
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);
|
||||
@ -206,16 +222,19 @@ public class ReceiverCoordinator
|
||||
TimeZoneListener.stopTimeZoneListener();
|
||||
DateTimeListener.stopAlarmListener(AutomationService.getInstance());
|
||||
NoiseListener.stopNoiseListener();
|
||||
BroadcastListener.getInstance().stopListener(AutomationService.getInstance());
|
||||
ProcessListener.stopProcessListener(AutomationService.getInstance());
|
||||
MediaPlayerListener.getInstance().stopListener(AutomationService.getInstance());
|
||||
DeviceOrientationListener.getInstance().stopListener(AutomationService.getInstance());
|
||||
TetheringReceiver.getInstance().stopListener(AutomationService.getInstance());
|
||||
SubSystemStateReceiver.getInstance().stopListener(AutomationService.getInstance());
|
||||
|
||||
try
|
||||
{
|
||||
Class testClass = Class.forName(ActivityManageRule.activityDetectionClassPath);
|
||||
Miscellaneous.runMethodReflective("ActivityDetectionReceiver", "stopActivityDetectionReceiver", null);
|
||||
}
|
||||
catch(ClassNotFoundException e)
|
||||
catch(Exception e)
|
||||
{
|
||||
// Nothing to do, just not stopping this one.
|
||||
}
|
||||
@ -266,6 +285,17 @@ public class ReceiverCoordinator
|
||||
NoiseListener.stopNoiseListener();
|
||||
}
|
||||
|
||||
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.broadcastReceived))
|
||||
{
|
||||
Miscellaneous.logEvent("i", "LocationProvider", "Starting BroadcastReceiver because used in a new/changed rule.", 4);
|
||||
BroadcastListener.getInstance().startListener(AutomationService.getInstance());
|
||||
}
|
||||
else
|
||||
{
|
||||
Miscellaneous.logEvent("i", "LocationProvider", "Shutting down BroadcastReceiver because not used in any rule.", 4);
|
||||
BroadcastListener.getInstance().stopListener(AutomationService.getInstance());
|
||||
}
|
||||
|
||||
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.process_started_stopped))
|
||||
{
|
||||
Miscellaneous.logEvent("i", "LocationProvider", "Starting ProcessListener because used in a new/changed rule.", 4);
|
||||
@ -300,7 +330,7 @@ public class ReceiverCoordinator
|
||||
MediaPlayerListener.getInstance().stopListener(AutomationService.getInstance());
|
||||
}
|
||||
|
||||
if(!BuildConfig.FLAVOR.equalsIgnoreCase("fdroidFlavor"))
|
||||
if(!BuildConfig.FLAVOR.equalsIgnoreCase(AutomationService.flavor_name_fdroid))
|
||||
{
|
||||
if (Rule.isAnyRuleUsing(Trigger.Trigger_Enum.activityDetection))
|
||||
{
|
||||
@ -397,6 +427,42 @@ public class ReceiverCoordinator
|
||||
}
|
||||
}
|
||||
|
||||
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.tethering))
|
||||
{
|
||||
if(!TetheringReceiver.getInstance().isListenerRunning())
|
||||
{
|
||||
Miscellaneous.logEvent("i", "TetheringReceiver", "Starting TetheringReceiver because used in a new/changed rule.", 4);
|
||||
// if(DevicePositionListener.getInstance().haveAllPermission())
|
||||
TetheringReceiver.getInstance().startListener(AutomationService.getInstance());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(TetheringReceiver.getInstance().isListenerRunning())
|
||||
{
|
||||
Miscellaneous.logEvent("i", "TetheringReceiver", "Shutting down TetheringReceiver because not used in any rule.", 4);
|
||||
TetheringReceiver.getInstance().stopListener(AutomationService.getInstance());
|
||||
}
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
@ -12,7 +12,7 @@ import java.util.Set;
|
||||
public class Settings implements SharedPreferences
|
||||
{
|
||||
public static final int rulesThatHaveBeenRanHistorySize = 10;
|
||||
public final static int lockSoundChangesInterval = 15;
|
||||
public static final int lockSoundChangesInterval = 15;
|
||||
public static final int newsPollEveryXDays = 3;
|
||||
public static final int newsDisplayForXDays = 3;
|
||||
public static final int updateCheckFrequencyDays = 7;
|
||||
@ -77,7 +77,13 @@ public class Settings implements SharedPreferences
|
||||
public static ArrayList<String> whatHasBeenDone;
|
||||
|
||||
/*
|
||||
Generic settings valid for all installations and not changable
|
||||
Not saved permanently.
|
||||
*/
|
||||
public static boolean deviceStartDone = true; // by default assume device has not just been started
|
||||
public static boolean serviceStartDone = false;
|
||||
|
||||
/*
|
||||
Generic settings valid for all installations and not changeable
|
||||
*/
|
||||
public static final String dateFormat = "E dd.MM.yyyy HH:mm:ss:ssss";
|
||||
|
||||
@ -600,5 +606,4 @@ public class Settings implements SharedPreferences
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
@ -6,8 +6,8 @@ import java.util.ArrayList;
|
||||
public class TimeFrame
|
||||
{
|
||||
// Defines a timeframe
|
||||
protected Time triggerTimeStart;
|
||||
protected Time triggerTimeStop;
|
||||
protected TimeObject triggerTimeStart;
|
||||
protected TimeObject triggerTimeStop;
|
||||
protected long repetition;
|
||||
|
||||
protected final static String separator = "/";
|
||||
@ -34,20 +34,20 @@ public class TimeFrame
|
||||
}
|
||||
}
|
||||
|
||||
public Time getTriggerTimeStart()
|
||||
public TimeObject getTriggerTimeStart()
|
||||
{
|
||||
return triggerTimeStart;
|
||||
}
|
||||
public void setTriggerTimeStart(Time triggerTimeStart)
|
||||
public void setTriggerTimeStart(TimeObject triggerTimeStart)
|
||||
{
|
||||
this.triggerTimeStart = triggerTimeStart;
|
||||
}
|
||||
|
||||
public Time getTriggerTimeStop()
|
||||
public TimeObject getTriggerTimeStop()
|
||||
{
|
||||
return triggerTimeStop;
|
||||
}
|
||||
public void setTriggerTimeStop(Time triggerTimeStop)
|
||||
public void setTriggerTimeStop(TimeObject triggerTimeStop)
|
||||
{
|
||||
this.triggerTimeStop = triggerTimeStop;
|
||||
}
|
||||
@ -62,7 +62,7 @@ public class TimeFrame
|
||||
this.repetition = repetition;
|
||||
}
|
||||
|
||||
public TimeFrame (Time timeStart, Time timeEnd, ArrayList<Integer> dayList2, long repetition)
|
||||
public TimeFrame (TimeObject timeStart, TimeObject timeEnd, ArrayList<Integer> dayList2, long repetition)
|
||||
{
|
||||
this.setTriggerTimeStart(timeStart);
|
||||
this.setTriggerTimeStop(timeEnd);
|
||||
@ -73,8 +73,8 @@ public class TimeFrame
|
||||
public TimeFrame (String fileContent)
|
||||
{
|
||||
String[] dateArray = fileContent.split(separator); // example: timestart/timestop/days[int]/repetition
|
||||
this.setTriggerTimeStart(Time.valueOf(dateArray[0]));
|
||||
this.setTriggerTimeStop(Time.valueOf(dateArray[1]));
|
||||
this.setTriggerTimeStart(TimeObject.valueOf(dateArray[0]));
|
||||
this.setTriggerTimeStop(TimeObject.valueOf(dateArray[1]));
|
||||
this.setDayListFromString(dateArray[2]);
|
||||
if(dateArray.length > 3) // may not exist in old config files
|
||||
this.setRepetition(Long.parseLong(dateArray[3]));
|
||||
|
78
app/src/main/java/com/jens/automation2/TimeObject.java
Normal file
78
app/src/main/java/com/jens/automation2/TimeObject.java
Normal file
@ -0,0 +1,78 @@
|
||||
package com.jens.automation2;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import java.sql.Time;
|
||||
|
||||
public class TimeObject
|
||||
{
|
||||
int hours, minutes, seconds;
|
||||
|
||||
public TimeObject()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public int getHours()
|
||||
{
|
||||
return hours;
|
||||
}
|
||||
|
||||
public void setHours(int hours)
|
||||
{
|
||||
this.hours = hours;
|
||||
}
|
||||
|
||||
public int getMinutes()
|
||||
{
|
||||
return minutes;
|
||||
}
|
||||
|
||||
public void setMinutes(int minutes)
|
||||
{
|
||||
this.minutes = minutes;
|
||||
}
|
||||
|
||||
public int getSeconds()
|
||||
{
|
||||
return seconds;
|
||||
}
|
||||
|
||||
public void setSeconds(int seconds)
|
||||
{
|
||||
this.seconds = seconds;
|
||||
}
|
||||
|
||||
public TimeObject(int hours, int minutes, int seconds)
|
||||
{
|
||||
this.hours = hours;
|
||||
this.minutes = minutes;
|
||||
this.seconds = seconds;
|
||||
}
|
||||
|
||||
public static TimeObject valueOf(String input)
|
||||
{
|
||||
TimeObject ro = null;
|
||||
|
||||
if(input.contains(":"))
|
||||
{
|
||||
String[] parts = input.split(":");
|
||||
if(parts.length == 2)
|
||||
ro = new TimeObject(Integer.parseInt(parts[0]), Integer.parseInt(parts[1]), 0);
|
||||
else if(parts.length == 3)
|
||||
ro = new TimeObject(Integer.parseInt(parts[0]), Integer.parseInt(parts[1]), Integer.parseInt(parts[2]));
|
||||
else
|
||||
Miscellaneous.logEvent("w", "TimeObject", "Invalid length for time. Input: " + input, 4);
|
||||
}
|
||||
|
||||
return ro;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
Time time = Time.valueOf(this.getHours() + ":" + this.getMinutes() + ":" + this.getSeconds());
|
||||
return time.toString();
|
||||
}
|
||||
}
|
@ -3,7 +3,6 @@ package com.jens.automation2;
|
||||
import android.bluetooth.BluetoothDevice;
|
||||
import android.content.Context;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.service.notification.StatusBarNotification;
|
||||
import android.telephony.TelephonyManager;
|
||||
import android.util.Log;
|
||||
@ -14,6 +13,7 @@ import com.jens.automation2.location.LocationProvider;
|
||||
import com.jens.automation2.location.WifiBroadcastReceiver;
|
||||
import com.jens.automation2.receivers.BatteryReceiver;
|
||||
import com.jens.automation2.receivers.BluetoothReceiver;
|
||||
import com.jens.automation2.receivers.BroadcastListener;
|
||||
import com.jens.automation2.receivers.ConnectivityReceiver;
|
||||
import com.jens.automation2.receivers.DeviceOrientationListener;
|
||||
import com.jens.automation2.receivers.HeadphoneJackListener;
|
||||
@ -24,22 +24,46 @@ import com.jens.automation2.receivers.NotificationListener;
|
||||
import com.jens.automation2.receivers.PhoneStatusListener;
|
||||
import com.jens.automation2.receivers.ProcessListener;
|
||||
import com.jens.automation2.receivers.ScreenStateReceiver;
|
||||
|
||||
import static com.jens.automation2.Trigger.triggerParameter2Split;
|
||||
import static com.jens.automation2.receivers.NotificationListener.EXTRA_TEXT;
|
||||
import static com.jens.automation2.receivers.NotificationListener.EXTRA_TITLE;
|
||||
import com.jens.automation2.receivers.TetheringReceiver;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.sql.Time;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.Map;
|
||||
|
||||
public class Trigger
|
||||
{
|
||||
public enum Trigger_Enum {
|
||||
pointOfInterest, timeFrame, charging, batteryLevel, usb_host_connection, speed, noiseLevel, wifiConnection, process_started_stopped, airplaneMode, roaming, nfcTag, activityDetection, bluetoothConnection, headsetPlugged, notification, deviceOrientation, profileActive, screenState, musicPlaying, phoneCall; //phoneCall always needs to be at the very end because of Google's shitty so called privacy
|
||||
public enum Trigger_Enum
|
||||
{
|
||||
pointOfInterest,
|
||||
timeFrame,
|
||||
charging,
|
||||
batteryLevel,
|
||||
usb_host_connection,
|
||||
speed,
|
||||
noiseLevel,
|
||||
wifiConnection,
|
||||
process_started_stopped,
|
||||
airplaneMode,
|
||||
roaming,
|
||||
nfcTag,
|
||||
activityDetection,
|
||||
bluetoothConnection,
|
||||
headsetPlugged,
|
||||
notification,
|
||||
deviceOrientation,
|
||||
profileActive,
|
||||
screenState,
|
||||
musicPlaying,
|
||||
deviceStarts,
|
||||
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)
|
||||
{
|
||||
@ -87,12 +111,26 @@ public class Trigger
|
||||
return context.getResources().getString(R.string.musicPlaying);
|
||||
case screenState:
|
||||
return context.getResources().getString(R.string.screenState);
|
||||
case deviceStarts:
|
||||
return context.getResources().getString(R.string.deviceStarts);
|
||||
case serviceStarts:
|
||||
return context.getResources().getString(R.string.serviceStarts);
|
||||
case broadcastReceived:
|
||||
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;
|
||||
|
||||
@ -190,6 +228,30 @@ public class Trigger
|
||||
if(!checkScreenState())
|
||||
result = false;
|
||||
break;
|
||||
case deviceStarts:
|
||||
if(!checkDeviceStarts())
|
||||
result = false;
|
||||
break;
|
||||
case serviceStarts:
|
||||
if(!checkServiceStarts())
|
||||
result = false;
|
||||
break;
|
||||
case broadcastReceived:
|
||||
if(!checkBroadcastReceived())
|
||||
result = false;
|
||||
break;
|
||||
case tethering:
|
||||
if(!checkTetheringActive())
|
||||
result = false;
|
||||
break;
|
||||
case subSystemState:
|
||||
if(!checkSubSystemState())
|
||||
result = false;
|
||||
break;
|
||||
case checkVariable:
|
||||
if(!checkVariable())
|
||||
result = false;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -206,7 +268,19 @@ public class Trigger
|
||||
return result;
|
||||
}
|
||||
|
||||
boolean checkNotification()
|
||||
boolean checkBroadcastReceived()
|
||||
{
|
||||
/*
|
||||
We cannot reasonably check the current state for every broadcast event.
|
||||
We can only hope that when starting the receiver we get an initial broadcast
|
||||
for every current state. That collection of states will be saved and checked if
|
||||
it contains the specific event of this trigger.
|
||||
*/
|
||||
|
||||
return triggerParameter == BroadcastListener.getInstance().hasBroadcastOccurred(triggerParameter2);
|
||||
}
|
||||
|
||||
boolean checkNotification()
|
||||
{
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
|
||||
{
|
||||
@ -343,6 +417,21 @@ public class Trigger
|
||||
return triggerParameter == MediaPlayerListener.isAudioPlaying(Miscellaneous.getAnyContext());
|
||||
}
|
||||
|
||||
boolean checkDeviceStarts()
|
||||
{
|
||||
if(triggerParameter && checkServiceStarts() && !Settings.deviceStartDone)
|
||||
return true;
|
||||
else if(!triggerParameter && !checkServiceStarts() && Settings.deviceStartDone)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean checkServiceStarts()
|
||||
{
|
||||
return !Settings.serviceStartDone == getTriggerParameter();
|
||||
}
|
||||
|
||||
boolean checkProfileActive()
|
||||
{
|
||||
String demandedProfileName = getTriggerParameter2().split(Trigger.triggerParameter2Split)[0];
|
||||
@ -385,13 +474,15 @@ public class Trigger
|
||||
try
|
||||
{
|
||||
int desiredState = Integer.parseInt(getTriggerParameter2());
|
||||
int currentState = ScreenStateReceiver.getScreenState();
|
||||
|
||||
return desiredState == currentState;
|
||||
if(desiredState == ScreenStateReceiver.SCREEN_STATE_OFF || desiredState == ScreenStateReceiver.SCREEN_STATE_ON)
|
||||
return desiredState == ScreenStateReceiver.getScreenPowerState();
|
||||
else
|
||||
return desiredState == ScreenStateReceiver.getScreenLockState();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Miscellaneous.logEvent("w", "Trigger", "Error checking profile trigger.", 4);
|
||||
Miscellaneous.logEvent("w", "Trigger", "Error checking screen state trigger.", 4);
|
||||
}
|
||||
|
||||
return false;
|
||||
@ -466,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);
|
||||
@ -659,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;
|
||||
@ -725,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;
|
||||
@ -735,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;
|
||||
@ -857,6 +1022,28 @@ public class Trigger
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean checkTetheringActive()
|
||||
{
|
||||
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)
|
||||
{
|
||||
/*
|
||||
@ -872,7 +1059,7 @@ public class Trigger
|
||||
triggeringTime = new Date();
|
||||
|
||||
String timeString = String.valueOf(triggeringTime.getHours()) + ":" + String.valueOf(triggeringTime.getMinutes()) + ":" + String.valueOf(triggeringTime.getSeconds());
|
||||
Time nowTime = Time.valueOf(timeString);
|
||||
TimeObject nowTime = TimeObject.valueOf(timeString);
|
||||
Calendar calNow = Calendar.getInstance();
|
||||
|
||||
try
|
||||
@ -884,20 +1071,24 @@ public class Trigger
|
||||
if(
|
||||
// Regular case, start time is lower than end time
|
||||
(
|
||||
Miscellaneous.compareTimes(tf.getTriggerTimeStart(), nowTime) >= 0
|
||||
&&
|
||||
Miscellaneous.compareTimes(nowTime, tf.getTriggerTimeStop()) > 0
|
||||
Miscellaneous.compareTimes(tf.getTriggerTimeStart(), nowTime) >= 0
|
||||
&&
|
||||
Miscellaneous.compareTimes(nowTime, tf.getTriggerTimeStop()) > 0
|
||||
)
|
||||
||
|
||||
// Other case, start time higher than end time, timeframe goes over midnight
|
||||
(
|
||||
Miscellaneous.compareTimes(tf.getTriggerTimeStart(), tf.getTriggerTimeStop()) < 0
|
||||
&&
|
||||
(Miscellaneous.compareTimes(tf.getTriggerTimeStart(), nowTime) >= 0
|
||||
||
|
||||
Miscellaneous.compareTimes(nowTime, tf.getTriggerTimeStop()) > 0)
|
||||
)
|
||||
||
|
||||
// further case: start and end times are identical, meaning a 24h window
|
||||
(
|
||||
Miscellaneous.compareTimes(tf.getTriggerTimeStart(), tf.getTriggerTimeStop()) == 0
|
||||
)
|
||||
|
|
||||
// Other case, start time higher than end time, timeframe goes over midnight
|
||||
(
|
||||
Miscellaneous.compareTimes(tf.getTriggerTimeStart(), tf.getTriggerTimeStop()) < 0
|
||||
&&
|
||||
(Miscellaneous.compareTimes(tf.getTriggerTimeStart(), nowTime) >= 0
|
||||
||
|
||||
Miscellaneous.compareTimes(nowTime, tf.getTriggerTimeStop()) > 0)
|
||||
)
|
||||
|
||||
)
|
||||
{
|
||||
// We are in the timeframe
|
||||
@ -1023,7 +1214,7 @@ public class Trigger
|
||||
public static Calendar getNextRepeatedExecutionAfter(Trigger trigger, Calendar now)
|
||||
{
|
||||
Calendar calSet;
|
||||
Time setTime;
|
||||
TimeObject setTime;
|
||||
TimeFrame tf = new TimeFrame(trigger.getTriggerParameter2());
|
||||
|
||||
if(tf.getRepetition() > 0)
|
||||
@ -1217,9 +1408,9 @@ public class Trigger
|
||||
return triggerType;
|
||||
}
|
||||
|
||||
public void setTriggerType(Trigger_Enum settriggerType)
|
||||
public void setTriggerType(Trigger_Enum setTriggerType)
|
||||
{
|
||||
this.triggerType = settriggerType;
|
||||
this.triggerType = setTriggerType;
|
||||
}
|
||||
|
||||
public boolean getTriggerParameter()
|
||||
@ -1239,7 +1430,7 @@ public class Trigger
|
||||
|
||||
public void setTriggerParameter2(String triggerParameter2)
|
||||
{
|
||||
this.triggerParameter2 = triggerParameter2;
|
||||
this.triggerParameter2 = triggerParameter2.trim();
|
||||
}
|
||||
|
||||
public TimeFrame getTimeFrame()
|
||||
@ -1262,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) + " ");
|
||||
@ -1270,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) + " ");
|
||||
@ -1285,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) + " ");
|
||||
@ -1296,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) + " ");
|
||||
@ -1330,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) + " ");
|
||||
@ -1358,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));
|
||||
@ -1370,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;
|
||||
@ -1410,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);
|
||||
}
|
||||
@ -1431,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));
|
||||
@ -1455,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);
|
||||
@ -1470,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);
|
||||
|
||||
@ -1497,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));
|
||||
@ -1519,20 +1710,20 @@ 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);
|
||||
@ -1543,11 +1734,68 @@ public class Trigger
|
||||
case "2":
|
||||
state = Miscellaneous.getAnyContext().getString(R.string.unlocked);
|
||||
break;
|
||||
case "3":
|
||||
state = Miscellaneous.getAnyContext().getString(R.string.lockedWithoutSecurity);
|
||||
break;
|
||||
case "4":
|
||||
state = Miscellaneous.getAnyContext().getString(R.string.lockedWithSecurity);
|
||||
break;
|
||||
default:
|
||||
state = Miscellaneous.getAnyContext().getString(R.string.unknown);
|
||||
}
|
||||
returnString.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.screenIs), state));
|
||||
break;
|
||||
case deviceStarts:
|
||||
// This type doesn't have an activate/deactivate equivalent
|
||||
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.serviceIsStarting) + ": " + String.valueOf(triggerParameter));
|
||||
break;
|
||||
case broadcastReceived:
|
||||
if (triggerParameter)
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.broadcastReceived));
|
||||
else
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.broadcastNotReceived));
|
||||
|
||||
returnString.append(String.format(Miscellaneous.getAnyContext().getString(R.string.screenIs), state));
|
||||
returnString.append(": " + triggerParameter2);
|
||||
break;
|
||||
case tethering:
|
||||
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");
|
||||
@ -1559,6 +1807,7 @@ public class Trigger
|
||||
|
||||
public static final String directionEquals = "eq";
|
||||
public static final String directionContains = "ct";
|
||||
public static final String directionNotContains = "nc";
|
||||
public static final String directionStartsWith = "sw";
|
||||
public static final String directionEndsWith = "ew";
|
||||
public static final String directionNotEquals = "ne";
|
||||
@ -1571,6 +1820,8 @@ public class Trigger
|
||||
return Miscellaneous.getAnyContext().getString(R.string.directionStringEquals);
|
||||
case directionContains:
|
||||
return Miscellaneous.getAnyContext().getString(R.string.directionStringContains);
|
||||
case directionNotContains:
|
||||
return Miscellaneous.getAnyContext().getString(R.string.directionStringDoesNotContain);
|
||||
case directionStartsWith:
|
||||
return Miscellaneous.getAnyContext().getString(R.string.directionStringStartsWith);
|
||||
case directionEndsWith:
|
||||
@ -1588,6 +1839,8 @@ public class Trigger
|
||||
return directionEquals;
|
||||
else if(direction.equalsIgnoreCase(Miscellaneous.getAnyContext().getString(R.string.directionStringContains)))
|
||||
return directionContains;
|
||||
else if(direction.equalsIgnoreCase(Miscellaneous.getAnyContext().getString(R.string.directionStringDoesNotContain)))
|
||||
return directionNotContains;
|
||||
else if(direction.equalsIgnoreCase(Miscellaneous.getAnyContext().getString(R.string.directionStringStartsWith)))
|
||||
return directionStartsWith;
|
||||
else if(direction.equalsIgnoreCase(Miscellaneous.getAnyContext().getString(R.string.directionStringEndsWith)))
|
||||
@ -1612,11 +1865,7 @@ public class Trigger
|
||||
public static String[] getTriggerTypesStringAsArray(Context context)
|
||||
{
|
||||
ArrayList<String> triggerTypesList = new ArrayList<String>();
|
||||
|
||||
/*for(int i=0; i<Trigger_Enum.values().length; i++)
|
||||
{
|
||||
triggerTypesList.add(Trigger_Enum.values()[i].getFullName(context));
|
||||
}*/
|
||||
|
||||
for(Trigger_Enum triggerType : Trigger_Enum.values())
|
||||
triggerTypesList.add(triggerType.getFullName(context));
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -7,7 +7,6 @@ import android.location.LocationManager;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
import android.telephony.TelephonyManager;
|
||||
import android.util.Log;
|
||||
|
||||
import com.jens.automation2.ActivityMainScreen;
|
||||
@ -485,7 +484,6 @@ public class LocationProvider
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static void resetSpeedTimer(Calendar timeOfForcedLocationCheck)
|
||||
{
|
||||
if(speedTimerActive)
|
||||
|
@ -26,7 +26,7 @@ public class WifiBroadcastReceiver extends BroadcastReceiver
|
||||
public static Boolean wasConnected = false;
|
||||
protected static String lastWifiSsid = "";
|
||||
public static boolean lastConnectedState = false;
|
||||
protected static boolean mayCellLocationChangedReceiverBeActivatedFromWifiPointOfWifi = true;
|
||||
protected static boolean mayCellLocationChangedReceiverBeActivatedFromWifiPointOfView = true;
|
||||
protected static WifiBroadcastReceiver wifiBrInstance;
|
||||
protected static IntentFilter wifiListenerIntentFilter;
|
||||
protected static boolean wifiListenerActive=false;
|
||||
@ -52,7 +52,7 @@ public class WifiBroadcastReceiver extends BroadcastReceiver
|
||||
|
||||
public static boolean mayCellLocationReceiverBeActivated()
|
||||
{
|
||||
return mayCellLocationChangedReceiverBeActivatedFromWifiPointOfWifi;
|
||||
return mayCellLocationChangedReceiverBeActivatedFromWifiPointOfView;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -63,18 +63,12 @@ public class WifiBroadcastReceiver extends BroadcastReceiver
|
||||
// int state = -1;
|
||||
NetworkInfo myWifi = null;
|
||||
|
||||
// if(intent.getAction().equals(WifiManager.RSSI_CHANGED_ACTION)) //gefeuert bei Verbindung
|
||||
// {
|
||||
// Miscellaneous.logEvent("i", "WifiReceiver", "RSSI_CHANGED_ACTION: " + String.valueOf(intent.getIntExtra(WifiManager.RSSI_CHANGED_ACTION, -1)));
|
||||
// }
|
||||
// else
|
||||
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));
|
||||
myWifi = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
|
||||
}
|
||||
|
||||
|
||||
WifiManager myWifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
|
||||
// ConnectivityManager connManager = (ConnectivityManager)context.getSystemService(context.CONNECTIVITY_SERVICE);
|
||||
@ -95,8 +89,14 @@ public class WifiBroadcastReceiver extends BroadcastReceiver
|
||||
if(Settings.useWifiForPositioning && PointOfInterest.reachedPoiWithActivateWifiRule()) // Poi has wifi
|
||||
{
|
||||
Miscellaneous.logEvent("i", "WifiReceiver", context.getResources().getString(R.string.poiHasWifiStoppingCellLocationListener), 2);
|
||||
mayCellLocationChangedReceiverBeActivatedFromWifiPointOfWifi = false;
|
||||
mayCellLocationChangedReceiverBeActivatedFromWifiPointOfView = false;
|
||||
CellLocationChangedReceiver.stopCellLocationChangedReceiver();
|
||||
|
||||
/*
|
||||
TODO: Every time the screen is turned on, we receiver a "wifi has been connected"-event.
|
||||
This is technically wrong and not really any changed to when the screen was off. It has
|
||||
to be filtered.
|
||||
*/
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -110,7 +110,7 @@ public class WifiBroadcastReceiver extends BroadcastReceiver
|
||||
{
|
||||
wasConnected = true;
|
||||
Miscellaneous.logEvent("i", "WifiReceiver", "WifiReceiver just activated. Wifi already connected. Stopping CellLocationReceiver", 3);
|
||||
mayCellLocationChangedReceiverBeActivatedFromWifiPointOfWifi = false;
|
||||
mayCellLocationChangedReceiverBeActivatedFromWifiPointOfView = false;
|
||||
CellLocationChangedReceiver.stopCellLocationChangedReceiver();
|
||||
SensorActivity.stopAccelerometerTimer();
|
||||
String ssid = myWifiManager.getConnectionInfo().getSSID();
|
||||
@ -126,7 +126,7 @@ public class WifiBroadcastReceiver extends BroadcastReceiver
|
||||
{
|
||||
wasConnected = false;
|
||||
Miscellaneous.logEvent("i", "WifiReceiver", String.format(context.getResources().getString(R.string.disconnectedFromWifi), getLastWifiSsid()) + " Switching to CellLocationChangedReceiver.", 3);
|
||||
mayCellLocationChangedReceiverBeActivatedFromWifiPointOfWifi = true;
|
||||
mayCellLocationChangedReceiverBeActivatedFromWifiPointOfView = true;
|
||||
CellLocationChangedReceiver.startCellLocationChangedReceiver();
|
||||
lastConnectedState = false;
|
||||
findRules(AutomationService.getInstance());
|
||||
|
@ -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;
|
||||
@ -99,54 +98,49 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList
|
||||
|
||||
if(intent.getAction().equals(Intent.ACTION_BATTERY_LOW))
|
||||
{
|
||||
Log.i("Battery", "Low battery event");
|
||||
Miscellaneous.logEvent("i", "Battery", "Low battery event", 5);
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
// Miscellaneous.logEvent("i", "BatteryReceiver", "Received battery event.");
|
||||
// if(intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED))
|
||||
// {
|
||||
batteryLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
|
||||
// int scale = -1;
|
||||
// int voltage = -1;
|
||||
// int temp = -1;
|
||||
// scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
|
||||
// temp = intent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, -1);
|
||||
// voltage = intent.getIntExtra(BatteryManager.EXTRA_VOLTAGE, -1);
|
||||
Log.i("Battery", "Level: " + String.valueOf(batteryLevel));
|
||||
this.actionBatteryLevel(context);
|
||||
|
||||
int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
|
||||
int statusPlugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
|
||||
// Miscellaneous.logEvent("i", "BatteryReceiver", "Status: " + String.valueOf(statusPlugged));
|
||||
|
||||
switch(statusPlugged)
|
||||
{
|
||||
case BatteryManager.BATTERY_PLUGGED_AC:
|
||||
// Toast.makeText(context, "Regular charging", Toast.LENGTH_LONG).show();
|
||||
// Miscellaneous.logEvent("i", "BatteryReceiver", "Regular charging.");
|
||||
this.actionCharging(context);
|
||||
break;
|
||||
case BatteryManager.BATTERY_PLUGGED_USB:
|
||||
this.actionUsbConnected(context);
|
||||
break;
|
||||
}
|
||||
|
||||
switch(status)
|
||||
{
|
||||
// case BatteryManager.BATTERY_STATUS_CHARGING:
|
||||
// break;
|
||||
case BatteryManager.BATTERY_STATUS_FULL:
|
||||
// Toast.makeText(context, "Regular charging full", Toast.LENGTH_LONG).show();
|
||||
// Miscellaneous.logEvent("i", "BatteryReceiver", "Device has been fully charged.");
|
||||
this.actionCharging(context);
|
||||
break;
|
||||
case BatteryManager.BATTERY_STATUS_DISCHARGING:
|
||||
this.actionDischarging(context);
|
||||
break;
|
||||
}
|
||||
batteryLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
|
||||
// int scale = -1;
|
||||
// int voltage = -1;
|
||||
// int temp = -1;
|
||||
// scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
|
||||
// temp = intent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, -1);
|
||||
// voltage = intent.getIntExtra(BatteryManager.EXTRA_VOLTAGE, -1);
|
||||
Log.i("Battery", "Level: " + String.valueOf(batteryLevel));
|
||||
this.actionBatteryLevel(context);
|
||||
|
||||
int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
|
||||
int statusPlugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
|
||||
Miscellaneous.logEvent("i", "BatteryReceiver", "Status: " + String.valueOf(statusPlugged), 5);
|
||||
|
||||
switch(statusPlugged)
|
||||
{
|
||||
case BatteryManager.BATTERY_PLUGGED_AC:
|
||||
// Toast.makeText(context, "Regular charging", Toast.LENGTH_LONG).show();
|
||||
Miscellaneous.logEvent("i", "BatteryReceiver", "Regular charging.", 5);
|
||||
this.actionCharging(context);
|
||||
break;
|
||||
case BatteryManager.BATTERY_PLUGGED_USB:
|
||||
this.actionUsbConnected(context);
|
||||
break;
|
||||
}
|
||||
|
||||
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);
|
||||
break;
|
||||
case BatteryManager.BATTERY_STATUS_DISCHARGING:
|
||||
this.actionDischarging(context);
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
@ -264,11 +258,13 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void startListener(AutomationService automationService)
|
||||
{
|
||||
BatteryReceiver.startBatteryReceiver(automationService);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stopListener(AutomationService automationService)
|
||||
{
|
||||
@ -292,4 +288,4 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList
|
||||
// actually monitores several
|
||||
return new Trigger_Enum[] { Trigger_Enum.batteryLevel, Trigger_Enum.charging, Trigger_Enum.usb_host_connection };
|
||||
}
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -0,0 +1,168 @@
|
||||
package com.jens.automation2.receivers;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.jens.automation2.ActivityPermissions;
|
||||
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.Calendar;
|
||||
import java.util.List;
|
||||
|
||||
public class BroadcastListener extends android.content.BroadcastReceiver implements AutomationListenerInterface
|
||||
{
|
||||
ArrayList<EventOccurrence> broadcastsCollection = new ArrayList<>();
|
||||
public static AutomationService automationServiceRef = null;
|
||||
private static boolean broadcastReceiverActive = false;
|
||||
private static BroadcastListener broadcastReceiverInstance = null;
|
||||
private static IntentFilter broadcastIntentFilter = null;
|
||||
private static Intent broadcastStatus = null;
|
||||
|
||||
public static BroadcastListener getInstance()
|
||||
{
|
||||
if(broadcastReceiverInstance == null)
|
||||
broadcastReceiverInstance = new BroadcastListener();
|
||||
|
||||
return broadcastReceiverInstance;
|
||||
}
|
||||
|
||||
public static class EventOccurrence
|
||||
{
|
||||
Calendar time;
|
||||
String event;
|
||||
|
||||
public EventOccurrence(Calendar time, String event)
|
||||
{
|
||||
this.time = time;
|
||||
this.event = event;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent)
|
||||
{
|
||||
broadcastsCollection.add(new EventOccurrence(Calendar.getInstance(), intent.getAction()));
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger.Trigger_Enum.broadcastReceived);
|
||||
for(int i=0; i<ruleCandidates.size(); i++)
|
||||
{
|
||||
if(ruleCandidates.get(i).getsGreenLight(context))
|
||||
ruleCandidates.get(i).activate(automationServiceRef, false);
|
||||
}
|
||||
}
|
||||
|
||||
public ArrayList<EventOccurrence> getBroadcastsCollection()
|
||||
{
|
||||
return broadcastsCollection;
|
||||
}
|
||||
|
||||
public boolean hasBroadcastOccurred(String event)
|
||||
{
|
||||
for(EventOccurrence eo : broadcastsCollection)
|
||||
{
|
||||
if(eo.event.equalsIgnoreCase(event))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean hasBroadcastOccurredSince(String event, Calendar timeLimit)
|
||||
{
|
||||
for(EventOccurrence eo : broadcastsCollection)
|
||||
{
|
||||
if(eo.event.equalsIgnoreCase(event) && (timeLimit == null || eo.time.getTimeInMillis() > timeLimit.getTimeInMillis()))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void startListener(AutomationService automationService)
|
||||
{
|
||||
if(!broadcastReceiverActive)
|
||||
{
|
||||
BroadcastListener.automationServiceRef = automationService;
|
||||
|
||||
if(broadcastReceiverInstance == null)
|
||||
broadcastReceiverInstance = new BroadcastListener();
|
||||
|
||||
if(broadcastIntentFilter == null)
|
||||
{
|
||||
broadcastIntentFilter = new IntentFilter();
|
||||
|
||||
List<String> actionList = new ArrayList<>();
|
||||
ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger.Trigger_Enum.broadcastReceived);
|
||||
for(int i=0; i<ruleCandidates.size(); i++)
|
||||
{
|
||||
for(Trigger t : ruleCandidates.get(i).getTriggerSet())
|
||||
{
|
||||
if(t.getTriggerType().equals(Trigger.Trigger_Enum.broadcastReceived))
|
||||
{
|
||||
ActivityPermissions.addToArrayListUnique(t.getTriggerParameter2(), actionList);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for(String s : actionList)
|
||||
broadcastIntentFilter.addAction(s);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
broadcastStatus = automationServiceRef.registerReceiver(broadcastReceiverInstance, broadcastIntentFilter);
|
||||
broadcastReceiverActive = true;
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
/*
|
||||
We might be confronted with permission issues here.
|
||||
*/
|
||||
Miscellaneous.logEvent("e", "BroadcastListener", Log.getStackTraceString(e), 1);
|
||||
broadcastReceiverActive = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stopListener(AutomationService automationService)
|
||||
{
|
||||
if(broadcastReceiverActive)
|
||||
{
|
||||
if(broadcastReceiverInstance != null)
|
||||
{
|
||||
automationServiceRef.unregisterReceiver(broadcastReceiverInstance);
|
||||
broadcastReceiverInstance = null;
|
||||
}
|
||||
|
||||
broadcastReceiverActive = false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isListenerRunning()
|
||||
{
|
||||
return broadcastReceiverActive;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Trigger.Trigger_Enum[] getMonitoredTrigger()
|
||||
{
|
||||
return new Trigger.Trigger_Enum[] { Trigger.Trigger_Enum.broadcastReceived };
|
||||
}
|
||||
}
|
@ -14,6 +14,7 @@ import com.jens.automation2.AutomationService;
|
||||
import com.jens.automation2.Miscellaneous;
|
||||
import com.jens.automation2.Rule;
|
||||
import com.jens.automation2.TimeFrame;
|
||||
import com.jens.automation2.TimeObject;
|
||||
import com.jens.automation2.Trigger;
|
||||
import com.jens.automation2.Trigger.Trigger_Enum;
|
||||
|
||||
@ -96,7 +97,7 @@ public class DateTimeListener extends BroadcastReceiver implements AutomationLis
|
||||
TimeFrame tf = new TimeFrame(oneTrigger.getTriggerParameter2());
|
||||
|
||||
Calendar calSet;
|
||||
Time setTime;
|
||||
TimeObject setTime;
|
||||
|
||||
if(oneTrigger.getTriggerParameter())
|
||||
setTime = tf.getTriggerTimeStart();
|
||||
@ -365,7 +366,7 @@ public class DateTimeListener extends BroadcastReceiver implements AutomationLis
|
||||
public static Calendar getNextRepeatedExecutionAfter(Trigger trigger, Calendar now)
|
||||
{
|
||||
Calendar calSet;
|
||||
Time setTime;
|
||||
TimeObject setTime;
|
||||
TimeFrame tf = new TimeFrame(trigger.getTriggerParameter2());
|
||||
|
||||
if(tf.getRepetition() > 0)
|
||||
|
@ -34,17 +34,18 @@ public class DeviceOrientationListener implements SensorEventListener, Automatio
|
||||
static int sensorValueCounter = 0;
|
||||
|
||||
// Gravity rotational data
|
||||
private float gravity[];
|
||||
float gravity[];
|
||||
// Magnetic rotational data
|
||||
private float magnetic[]; //for magnetic rotational data
|
||||
private float accels[] = new float[3];
|
||||
private float mags[] = new float[3];
|
||||
private float[] values = new float[3];
|
||||
float magnetic[]; //for magnetic rotational data
|
||||
float accels[] = new float[3];
|
||||
float mags[] = new float[3];
|
||||
float[] values = new float[3];
|
||||
boolean hasMagneticSensor=false;
|
||||
|
||||
// azimuth, pitch and roll
|
||||
private float azimuth;
|
||||
private float pitch;
|
||||
private float roll;
|
||||
float azimuth;
|
||||
float pitch;
|
||||
float roll;
|
||||
|
||||
boolean applies = false;
|
||||
boolean flipped = false;
|
||||
@ -91,7 +92,7 @@ public class DeviceOrientationListener implements SensorEventListener, Automatio
|
||||
isRunning = true;
|
||||
|
||||
sManager.registerListener(this, sManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
|
||||
sManager.registerListener(this, sManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_NORMAL);
|
||||
hasMagneticSensor = sManager.registerListener(this, sManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_NORMAL);
|
||||
}
|
||||
}
|
||||
|
||||
@ -129,6 +130,9 @@ public class DeviceOrientationListener implements SensorEventListener, Automatio
|
||||
break;
|
||||
}
|
||||
|
||||
if (!hasMagneticSensor)
|
||||
mags=new float[]{1f,1f,1f};
|
||||
|
||||
if (mags != null && accels != null)
|
||||
{
|
||||
gravity = new float[9];
|
||||
|
@ -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,6 +2,7 @@ package com.jens.automation2.receivers;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.Notification;
|
||||
import android.app.PendingIntent;
|
||||
import android.bluetooth.BluetoothDevice;
|
||||
import android.content.IntentFilter;
|
||||
import android.os.Build;
|
||||
@ -89,6 +90,11 @@ public class NotificationListener extends NotificationListenerService// implemen
|
||||
{
|
||||
lastNotification = convertNotificationToSimpleNotification(created, sbn);
|
||||
|
||||
if(created)
|
||||
Miscellaneous.logEvent("i", "New notification", lastNotification.toString(), 5);
|
||||
else
|
||||
Miscellaneous.logEvent("i", "Notification removed", lastNotification.toString(), 5);
|
||||
|
||||
ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger.Trigger_Enum.notification);
|
||||
for (int i = 0; i < ruleCandidates.size(); i++)
|
||||
{
|
||||
@ -144,51 +150,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;
|
||||
@ -278,4 +239,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);
|
||||
}
|
||||
}
|
@ -22,8 +22,6 @@ import java.util.ArrayList;
|
||||
|
||||
public class PhoneStatusListener implements AutomationListenerInterface
|
||||
{
|
||||
// protected static int currentStateIncoming = -1;
|
||||
// protected static int currentStateOutgoing = -1;
|
||||
protected static String lastPhoneNumber="";
|
||||
protected static int lastPhoneDirection = -1; //0=incoming, 1=outgoing
|
||||
protected static int currentState = -1;
|
||||
@ -120,8 +118,6 @@ public class PhoneStatusListener implements AutomationListenerInterface
|
||||
}
|
||||
else
|
||||
{
|
||||
// state != TelephonyManager.CALL_STATE_IDLE &&
|
||||
|
||||
setCurrentState(state);
|
||||
setLastPhoneDirection(1);
|
||||
|
||||
@ -175,12 +171,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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -289,4 +285,4 @@ public class PhoneStatusListener implements AutomationListenerInterface
|
||||
{
|
||||
return new Trigger_Enum[] { Trigger_Enum.phoneCall };
|
||||
}
|
||||
}
|
||||
}
|
@ -1,14 +1,18 @@
|
||||
package com.jens.automation2.receivers;
|
||||
|
||||
import android.Manifest;
|
||||
import android.app.KeyguardManager;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.os.BatteryManager;
|
||||
import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
import android.os.Build;
|
||||
import android.provider.Settings;
|
||||
|
||||
import androidx.annotation.RequiresApi;
|
||||
|
||||
import com.jens.automation2.Actions;
|
||||
import com.jens.automation2.ActivityPermissions;
|
||||
import com.jens.automation2.AutomationService;
|
||||
import com.jens.automation2.Miscellaneous;
|
||||
@ -16,10 +20,13 @@ import com.jens.automation2.Rule;
|
||||
import com.jens.automation2.Trigger.Trigger_Enum;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
||||
public class ScreenStateReceiver extends BroadcastReceiver implements AutomationListenerInterface
|
||||
{
|
||||
static int screenState = -1; // initialize with a better value than this
|
||||
static int screenPowerState = -1; // initialize with a better value than this
|
||||
static int screenLockState = -1; // initialize with a better value than this
|
||||
public static AutomationService automationServiceRef = null;
|
||||
|
||||
private static boolean screenStateReceiverActive = false;
|
||||
@ -27,9 +34,18 @@ public class ScreenStateReceiver extends BroadcastReceiver implements Automation
|
||||
private static Intent screenStatusIntent = null;
|
||||
private static BroadcastReceiver screenStateReceiverInstance = null;
|
||||
|
||||
public final static String broadcastScreenLockedWithoutSecurity = "automation.system.screen_locked_without_security";
|
||||
public final static String broadcastScreenLockedWithSecurity = "automation.system.screen_locked_with_security";
|
||||
|
||||
public final static int SCREEN_STATE_OFF = 0;
|
||||
public final static int SCREEN_STATE_ON = 1;
|
||||
public final static int SCREEN_STATE_UNLOCKED = 2;
|
||||
public final static int SCREEN_STATE_LOCKED_WITHOUT_SECURITY = 3;
|
||||
public final static int SCREEN_STATE_LOCKED_WITH_SECURITY = 4;
|
||||
|
||||
public static BroadcastReceiver getScreenStateReceiverInstance()
|
||||
{
|
||||
if(screenStateReceiverInstance == null)
|
||||
if (screenStateReceiverInstance == null)
|
||||
screenStateReceiverInstance = new ScreenStateReceiver();
|
||||
|
||||
return screenStateReceiverInstance;
|
||||
@ -37,58 +53,60 @@ public class ScreenStateReceiver extends BroadcastReceiver implements Automation
|
||||
|
||||
public static void startScreenStateReceiver(final AutomationService automationServiceRef)
|
||||
{
|
||||
if(!screenStateReceiverActive)
|
||||
if (!screenStateReceiverActive)
|
||||
{
|
||||
ScreenStateReceiver.automationServiceRef = automationServiceRef;
|
||||
|
||||
if(screenStateReceiverInstance == null)
|
||||
|
||||
if (screenStateReceiverInstance == null)
|
||||
screenStateReceiverInstance = new ScreenStateReceiver();
|
||||
|
||||
if(screenStateIntentFilter == null)
|
||||
|
||||
if (screenStateIntentFilter == null)
|
||||
{
|
||||
screenStateIntentFilter = new IntentFilter();
|
||||
screenStateIntentFilter.addAction(Intent.ACTION_SCREEN_OFF);
|
||||
screenStateIntentFilter.addAction(Intent.ACTION_SCREEN_ON);
|
||||
screenStateIntentFilter.addAction(Intent.ACTION_USER_PRESENT);
|
||||
screenStateIntentFilter.addAction(Intent.ACTION_USER_PRESENT); // also fired when device is unlocked
|
||||
screenStateIntentFilter.addAction(broadcastScreenLockedWithoutSecurity);
|
||||
screenStateIntentFilter.addAction(broadcastScreenLockedWithSecurity);
|
||||
// Intent.ACTION_USER_UNLOCKED
|
||||
}
|
||||
|
||||
|
||||
screenStatusIntent = automationServiceRef.registerReceiver(screenStateReceiverInstance, screenStateIntentFilter);
|
||||
|
||||
|
||||
screenStateReceiverActive = true;
|
||||
}
|
||||
}
|
||||
|
||||
public static void stopScreenStateReceiver()
|
||||
{
|
||||
if(screenStateReceiverActive)
|
||||
if (screenStateReceiverActive)
|
||||
{
|
||||
if(screenStateReceiverInstance != null)
|
||||
if (screenStateReceiverInstance != null)
|
||||
{
|
||||
automationServiceRef.unregisterReceiver(screenStateReceiverInstance);
|
||||
screenStateReceiverInstance = null;
|
||||
}
|
||||
|
||||
|
||||
screenStateReceiverActive = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static boolean isScreenStateReceiverActive()
|
||||
{
|
||||
return screenStateReceiverActive;
|
||||
}
|
||||
|
||||
public static int getScreenState()
|
||||
public static int getScreenPowerState()
|
||||
{
|
||||
return screenState;
|
||||
return screenPowerState;
|
||||
}
|
||||
|
||||
private static int currentChargingState = 0; //0=unknown, 1=no, 2=yes
|
||||
|
||||
public static int getCurrentChargingState()
|
||||
public static int getScreenLockState()
|
||||
{
|
||||
return currentChargingState;
|
||||
return screenLockState;
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP_MR1)
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent)
|
||||
{
|
||||
@ -101,32 +119,65 @@ public class ScreenStateReceiver extends BroadcastReceiver implements Automation
|
||||
|
||||
try
|
||||
{
|
||||
if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF))
|
||||
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF))
|
||||
{
|
||||
ScreenStateReceiver.screenState = 0;
|
||||
ScreenStateReceiver.screenPowerState = SCREEN_STATE_OFF;
|
||||
|
||||
KeyguardManager keyguardManager = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
|
||||
|
||||
// PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
|
||||
// Miscellaneous.logEvent("i", "ScreenStateReceiver", "Method 2: " + String.valueOf(pm.isInteractive() && pm.isScreenOn() && keyguardManager.isKeyguardLocked() && keyguardManager.isDeviceLocked()), 4);
|
||||
// if (pm.isInteractive() && pm.isScreenOn() && keyguardManager.isKeyguardLocked() && keyguardManager.isDeviceLocked())
|
||||
// Miscellaneous.logEvent("i", "ScreenStateReceiver", "pm.isInteractive(): " + String.valueOf(pm.isInteractive()), 4);
|
||||
// Miscellaneous.logEvent("i", "ScreenStateReceiver", "pm.isScreenOn(): " + String.valueOf(pm.isScreenOn()), 4);
|
||||
Miscellaneous.logEvent("i", "ScreenStateReceiver", "keyguardManager.isKeyguardLocked(): " + String.valueOf(keyguardManager.isKeyguardLocked()), 4);
|
||||
Miscellaneous.logEvent("i", "ScreenStateReceiver", "keyguardManager.isDeviceLocked(): " + String.valueOf(keyguardManager.isDeviceLocked()), 4);
|
||||
|
||||
if(keyguardManager.isKeyguardLocked() && !keyguardManager.isDeviceLocked())
|
||||
{
|
||||
Actions.sendBroadcast(Miscellaneous.getAnyContext(), broadcastScreenLockedWithoutSecurity);
|
||||
}
|
||||
else if(keyguardManager.isDeviceLocked())
|
||||
{
|
||||
Actions.sendBroadcast(Miscellaneous.getAnyContext(), broadcastScreenLockedWithSecurity);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Lock may be activated delayed, not at power button press
|
||||
ScreenLockMonitor mon = new ScreenLockMonitor();
|
||||
mon.startMonitor();
|
||||
}
|
||||
}
|
||||
else if(intent.getAction().equals(Intent.ACTION_SCREEN_ON))
|
||||
else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON))
|
||||
{
|
||||
ScreenStateReceiver.screenState = 1;
|
||||
ScreenStateReceiver.screenPowerState = SCREEN_STATE_ON;
|
||||
}
|
||||
else if(intent.getAction().equals(Intent.ACTION_USER_PRESENT))
|
||||
else if (intent.getAction().equals(Intent.ACTION_USER_PRESENT))
|
||||
{
|
||||
ScreenStateReceiver.screenState = 2;
|
||||
ScreenStateReceiver.screenLockState = SCREEN_STATE_UNLOCKED;
|
||||
}
|
||||
else if (intent.getAction().equals(broadcastScreenLockedWithoutSecurity))
|
||||
{
|
||||
ScreenStateReceiver.screenLockState = SCREEN_STATE_LOCKED_WITHOUT_SECURITY;
|
||||
}
|
||||
else if (intent.getAction().equals(broadcastScreenLockedWithSecurity))
|
||||
{
|
||||
ScreenStateReceiver.screenLockState = SCREEN_STATE_LOCKED_WITH_SECURITY;
|
||||
}
|
||||
else
|
||||
{
|
||||
Miscellaneous.logEvent("e", "ScreenStateReceiver", "Unknown state received: " + intent.getAction(), 3);
|
||||
}
|
||||
}
|
||||
catch(Exception e)
|
||||
catch (Exception e)
|
||||
{
|
||||
Miscellaneous.logEvent("e", "ScreenStateReceiver", "Error receiving screen state: " + e.getMessage(), 3);
|
||||
}
|
||||
|
||||
ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.screenState);
|
||||
for(int i=0; i<ruleCandidates.size(); i++)
|
||||
for (int i = 0; i < ruleCandidates.size(); i++)
|
||||
{
|
||||
if(ruleCandidates.get(i).getsGreenLight(context))
|
||||
if (ruleCandidates.get(i).getsGreenLight(context))
|
||||
ruleCandidates.get(i).activate(automationServiceRef, false);
|
||||
}
|
||||
}
|
||||
@ -136,6 +187,7 @@ public class ScreenStateReceiver extends BroadcastReceiver implements Automation
|
||||
{
|
||||
ScreenStateReceiver.startScreenStateReceiver(automationService);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stopListener(AutomationService automationService)
|
||||
{
|
||||
@ -145,7 +197,7 @@ public class ScreenStateReceiver extends BroadcastReceiver implements Automation
|
||||
public static boolean haveAllPermission()
|
||||
{
|
||||
return ActivityPermissions.havePermission(Manifest.permission.READ_PHONE_STATE, Miscellaneous.getAnyContext()) &&
|
||||
ActivityPermissions.havePermission(Manifest.permission.BATTERY_STATS, Miscellaneous.getAnyContext());
|
||||
ActivityPermissions.havePermission(Manifest.permission.BATTERY_STATS, Miscellaneous.getAnyContext());
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -157,6 +209,66 @@ public class ScreenStateReceiver extends BroadcastReceiver implements Automation
|
||||
@Override
|
||||
public Trigger_Enum[] getMonitoredTrigger()
|
||||
{
|
||||
return new Trigger_Enum[] { Trigger_Enum.screenState };
|
||||
return new Trigger_Enum[]{Trigger_Enum.screenState};
|
||||
}
|
||||
|
||||
class ScreenLockMonitor
|
||||
{
|
||||
long runs = 0;
|
||||
final long maxRuns = 20;
|
||||
final long interval = 1000;
|
||||
|
||||
Timer timer = new Timer();
|
||||
|
||||
TimerTask task = new TimerTask()
|
||||
{
|
||||
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP_MR1)
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
KeyguardManager keyguardManager = (KeyguardManager) Miscellaneous.getAnyContext().getSystemService(Context.KEYGUARD_SERVICE);
|
||||
|
||||
Miscellaneous.logEvent("i", "ScreenStateReceiver", "keyguardManager.isKeyguardLocked(): " + String.valueOf(keyguardManager.isKeyguardLocked()), 4);
|
||||
Miscellaneous.logEvent("i", "ScreenStateReceiver", "keyguardManager.isDeviceLocked(): " + String.valueOf(keyguardManager.isDeviceLocked()), 4);
|
||||
|
||||
if(keyguardManager.isKeyguardLocked() && !keyguardManager.isDeviceLocked())
|
||||
{
|
||||
Actions.sendBroadcast(Miscellaneous.getAnyContext(), broadcastScreenLockedWithoutSecurity);
|
||||
timer.purge();
|
||||
timer.cancel();
|
||||
}
|
||||
else if(keyguardManager.isDeviceLocked())
|
||||
{
|
||||
Actions.sendBroadcast(Miscellaneous.getAnyContext(), broadcastScreenLockedWithSecurity);
|
||||
timer.purge();
|
||||
timer.cancel();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (runs++ > maxRuns)
|
||||
{
|
||||
Miscellaneous.logEvent("w", "ScreenStateReceiver->ScreenLockMonitor", "Lock never came.", 4);
|
||||
timer.purge();
|
||||
timer.cancel();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
public void startMonitor()
|
||||
{
|
||||
ContentResolver mResolver = Miscellaneous.getAnyContext().getContentResolver();
|
||||
long lockscreen_timeout = 0;
|
||||
|
||||
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.N_MR1)
|
||||
lockscreen_timeout = Settings.System.getInt(mResolver, "lock_screen_lock_after_timeout", 0);
|
||||
else
|
||||
lockscreen_timeout = Settings.Secure.getInt(mResolver, "lock_screen_lock_after_timeout", 0);
|
||||
|
||||
if(lockscreen_timeout > 0)
|
||||
timer.schedule(task, lockscreen_timeout);
|
||||
else
|
||||
timer.scheduleAtFixedRate(task, 0, interval);
|
||||
}
|
||||
}
|
||||
}
|
@ -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};
|
||||
}
|
||||
}
|
@ -0,0 +1,205 @@
|
||||
package com.jens.automation2.receivers;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
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
|
||||
{
|
||||
public static AutomationService automationServiceRef = null;
|
||||
private static boolean receiverActive = false;
|
||||
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)
|
||||
receiverInstance = new TetheringReceiver();
|
||||
|
||||
return receiverInstance;
|
||||
}
|
||||
|
||||
public static boolean isTetheringActive()
|
||||
{
|
||||
return tetheringActive;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent)
|
||||
{
|
||||
Miscellaneous.logEvent("i", "TetheringReceiver", "Received " + intent.getAction(), 5);
|
||||
|
||||
/*
|
||||
DETECT BY DATA DELIVERED IN INTENT
|
||||
*/
|
||||
|
||||
// if(intent.getAction().equals("android.net.conn.TETHER_STATE_CHANGED"))
|
||||
// {
|
||||
String searchArray = null;
|
||||
|
||||
if (Build.VERSION.SDK_INT >= 26)
|
||||
searchArray = "tetherArray";
|
||||
else
|
||||
searchArray = "activeArray";
|
||||
|
||||
for (String key : intent.getExtras().keySet())
|
||||
{
|
||||
// Miscellaneous.logEvent("i", "Broadcast extra", "Broadcast " + intent.getAction() + " has extra " + key + " and type " + intent.getExtras().get(key).getClass().getName(), 4);
|
||||
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++)
|
||||
{
|
||||
if(ruleCandidates.get(i).getsGreenLight(context))
|
||||
ruleCandidates.get(i).activate(automationServiceRef, false);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void startListener(AutomationService automationService)
|
||||
{
|
||||
if(!receiverActive)
|
||||
{
|
||||
TetheringReceiver.automationServiceRef = automationService;
|
||||
|
||||
if(receiverInstance == null)
|
||||
receiverInstance = new TetheringReceiver();
|
||||
|
||||
if(intentFilter == null)
|
||||
{
|
||||
intentFilter = new IntentFilter();
|
||||
intentFilter.addAction("android.net.conn.TETHER_STATE_CHANGED");
|
||||
// intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
automationServiceRef.registerReceiver(receiverInstance, intentFilter);
|
||||
receiverActive = true;
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
/*
|
||||
We might be confronted with permission issues here.
|
||||
*/
|
||||
Miscellaneous.logEvent("e", "TetheringReceiver", Log.getStackTraceString(e), 1);
|
||||
receiverActive = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stopListener(AutomationService automationService)
|
||||
{
|
||||
if(receiverActive)
|
||||
{
|
||||
if(receiverInstance != null)
|
||||
{
|
||||
automationServiceRef.unregisterReceiver(receiverInstance);
|
||||
receiverInstance = null;
|
||||
}
|
||||
|
||||
receiverActive = false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isListenerRunning()
|
||||
{
|
||||
return receiverActive;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Trigger.Trigger_Enum[] getMonitoredTrigger()
|
||||
{
|
||||
return new Trigger.Trigger_Enum[] { Trigger.Trigger_Enum.tethering};
|
||||
}
|
||||
}
|
@ -14,14 +14,13 @@ import com.jens.automation2.Trigger.Trigger_Enum;
|
||||
public class TimeZoneListener extends BroadcastReceiver implements AutomationListenerInterface
|
||||
{
|
||||
private static TimeZoneListener timeZoneListenerInstance = null;
|
||||
protected static boolean timeZoneListenerActive = false;
|
||||
protected static boolean timezoneListenerActive = false;
|
||||
protected static AutomationService automationServiceRef = null;
|
||||
protected static IntentFilter timeZoneListenerIntentFilter = null;
|
||||
|
||||
protected static IntentFilter timezoneListenerIntentFilter = null;
|
||||
|
||||
public static boolean isTimeZoneListenerActive()
|
||||
public static boolean isTimezoneListenerActive()
|
||||
{
|
||||
return timeZoneListenerActive;
|
||||
return timezoneListenerActive;
|
||||
}
|
||||
|
||||
public static void startTimeZoneListener(AutomationService automationService)
|
||||
@ -33,19 +32,19 @@ public class TimeZoneListener extends BroadcastReceiver implements AutomationLis
|
||||
|
||||
try
|
||||
{
|
||||
if(!timeZoneListenerActive && Rule.isAnyRuleUsing(Trigger_Enum.timeFrame))
|
||||
if(!timezoneListenerActive && Rule.isAnyRuleUsing(Trigger_Enum.timeFrame))
|
||||
{
|
||||
Miscellaneous.logEvent("i", "TimeZoneListener", "Starting TimeZoneListener", 4);
|
||||
timeZoneListenerActive = true;
|
||||
timezoneListenerActive = true;
|
||||
|
||||
if(timeZoneListenerIntentFilter == null)
|
||||
if(timezoneListenerIntentFilter == null)
|
||||
{
|
||||
timeZoneListenerIntentFilter = new IntentFilter();
|
||||
timeZoneListenerIntentFilter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
|
||||
timeZoneListenerIntentFilter.addAction(Intent.ACTION_TIME_CHANGED);
|
||||
timezoneListenerIntentFilter = new IntentFilter();
|
||||
timezoneListenerIntentFilter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
|
||||
timezoneListenerIntentFilter.addAction(Intent.ACTION_TIME_CHANGED);
|
||||
}
|
||||
|
||||
automationService.registerReceiver(timeZoneListenerInstance, timeZoneListenerIntentFilter);
|
||||
automationService.registerReceiver(timeZoneListenerInstance, timezoneListenerIntentFilter);
|
||||
}
|
||||
}
|
||||
catch(Exception ex)
|
||||
@ -57,11 +56,11 @@ public class TimeZoneListener extends BroadcastReceiver implements AutomationLis
|
||||
{
|
||||
try
|
||||
{
|
||||
if(timeZoneListenerActive)
|
||||
if(timezoneListenerActive)
|
||||
{
|
||||
Miscellaneous.logEvent("i", "TimeZoneListener", "Stopping TimeZoneListener", 4);
|
||||
automationServiceRef.unregisterReceiver(timeZoneListenerInstance);
|
||||
timeZoneListenerActive = false;
|
||||
timezoneListenerActive = false;
|
||||
}
|
||||
}
|
||||
catch(Exception ex)
|
||||
@ -81,7 +80,7 @@ public class TimeZoneListener extends BroadcastReceiver implements AutomationLis
|
||||
}
|
||||
else if(action.equals(Intent.ACTION_TIME_CHANGED))
|
||||
{
|
||||
Miscellaneous.logEvent("i", "TimeZoneListener", "Device time changed. Reloading alarms.", 4);
|
||||
Miscellaneous.logEvent("i", "TimeZoneListener", "Device time changed. Reloading alarms.", 3);
|
||||
DateTimeListener.reloadAlarms();
|
||||
}
|
||||
}
|
||||
@ -104,7 +103,7 @@ public class TimeZoneListener extends BroadcastReceiver implements AutomationLis
|
||||
@Override
|
||||
public boolean isListenerRunning()
|
||||
{
|
||||
return TimeZoneListener.isTimeZoneListenerActive();
|
||||
return TimeZoneListener.isTimezoneListenerActive();
|
||||
}
|
||||
@Override
|
||||
public Trigger_Enum[] getMonitoredTrigger()
|
||||
|
BIN
app/src/main/res/drawable-hdpi/coffee.png
Normal file
BIN
app/src/main/res/drawable-hdpi/coffee.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.6 KiB |
BIN
app/src/main/res/drawable-hdpi/megaphone.png
Normal file
BIN
app/src/main/res/drawable-hdpi/megaphone.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.1 KiB |
BIN
app/src/main/res/drawable-hdpi/script.png
Normal file
BIN
app/src/main/res/drawable-hdpi/script.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 679 B |
BIN
app/src/main/res/drawable-hdpi/subsystemstate.png
Normal file
BIN
app/src/main/res/drawable-hdpi/subsystemstate.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.0 KiB |
@ -83,6 +83,12 @@
|
||||
android:layout_margin="@dimen/default_margin"
|
||||
android:background="#aa000000" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="@dimen/default_margin"
|
||||
android:text="@string/emailPretext" />
|
||||
|
||||
<CheckBox
|
||||
android:id="@+id/chkShareConfigAndLog"
|
||||
android:layout_width="wrap_content"
|
||||
@ -94,8 +100,14 @@
|
||||
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
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/logsExplanation" />
|
||||
|
||||
<ImageView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_span="2"
|
||||
|
@ -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,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>
|
@ -0,0 +1,117 @@
|
||||
<?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="match_parent"
|
||||
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/runExecutable" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/runExecutableExplanation" />
|
||||
|
||||
<TableLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:stretchColumns="1"
|
||||
android:shrinkColumns="1">
|
||||
|
||||
<TableRow>
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/runAsRoot" />
|
||||
|
||||
<CheckBox
|
||||
android:id="@+id/chkRunExecAsRoot"
|
||||
android:layout_marginBottom="10dp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content" >
|
||||
|
||||
</CheckBox>
|
||||
|
||||
</TableRow>
|
||||
|
||||
<TableRow>
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/path" />
|
||||
|
||||
<EditText
|
||||
android:id="@+id/etRunExecutablePath"
|
||||
android:layout_marginBottom="10dp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:ems="10"
|
||||
android:inputType="textUri" >
|
||||
|
||||
</EditText>
|
||||
|
||||
</TableRow>
|
||||
|
||||
<TableRow>
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginRight="@dimen/default_margin"
|
||||
android:text="@string/parameters" />
|
||||
|
||||
<EditText
|
||||
android:id="@+id/etRunExecutableParameters"
|
||||
android:layout_marginBottom="10dp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:ems="10"
|
||||
android:inputType="text" >
|
||||
|
||||
</EditText>
|
||||
|
||||
</TableRow>
|
||||
</TableLayout>
|
||||
|
||||
<Button
|
||||
android:id="@+id/bChooseExecutable"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/chooseExecutable" />
|
||||
|
||||
<ScrollView
|
||||
android:layout_marginTop="@dimen/default_margin"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvLegend"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dip"
|
||||
android:text="@string/urlLegend" />
|
||||
|
||||
</ScrollView>
|
||||
|
||||
<Button
|
||||
android:id="@+id/bSaveActionRunExec"
|
||||
android:layout_marginTop="15dp"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/save" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</ScrollView>
|
@ -0,0 +1,160 @@
|
||||
<?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:layout_span="2"
|
||||
android:textSize="25dp"
|
||||
android:textStyle="bold"
|
||||
android:layout_marginBottom="@dimen/default_margin"
|
||||
android:text="@string/sendBroadcast" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="@dimen/default_margin"
|
||||
android:text="@string/broadcastExplanation" />
|
||||
|
||||
<TextView
|
||||
android:layout_marginTop="@dimen/default_margin"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Broadcast:" />
|
||||
|
||||
<EditText
|
||||
android:id="@+id/etBroadcastToSend"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/bBroadcastSendShowSuggestions"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginVertical="@dimen/default_margin"
|
||||
android:text="@string/broadcastsShowSuggestions" />
|
||||
|
||||
<TableLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:stretchColumns="1"
|
||||
android:shrinkColumns="1" >
|
||||
|
||||
<TableRow
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<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/addParameters" />
|
||||
|
||||
</TableRow>
|
||||
|
||||
<TableRow
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_span="2"
|
||||
android:layout_marginBottom="@dimen/default_margin"
|
||||
android:text="@string/intentDataComment" />
|
||||
|
||||
</TableRow>
|
||||
|
||||
<TableRow
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:text="@string/parameterType" />
|
||||
|
||||
<Spinner
|
||||
android:id="@+id/spinnerParameterType"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
</TableRow>
|
||||
|
||||
<TableRow
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvCurrentNfcIdValue"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/parameterName" />
|
||||
|
||||
<EditText
|
||||
android:id="@+id/etParameterName"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
</TableRow>
|
||||
|
||||
<TableRow
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/textView2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/parameterValue" />
|
||||
|
||||
<EditText
|
||||
android:id="@+id/etParameterValue"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
</TableRow>
|
||||
|
||||
</TableLayout>
|
||||
|
||||
<Button
|
||||
android:id="@+id/bAddIntentPair"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/addIntentValue" />
|
||||
|
||||
<ImageView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1dp"
|
||||
android:layout_margin="10dp"
|
||||
android:background="#aa000000" />
|
||||
|
||||
<ListView
|
||||
android:id="@+id/lvIntentPairs"
|
||||
android:visibility="gone"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="115dp"
|
||||
android:layout_marginBottom="@dimen/default_margin" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/bSaveSendBroadcast"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
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>
|
@ -2,13 +2,22 @@
|
||||
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_margin="10dp" >
|
||||
android:layout_margin="@dimen/default_margin" >
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
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/actionSpeakText" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvRuleTitle"
|
||||
android:layout_width="wrap_content"
|
||||
@ -40,7 +49,7 @@
|
||||
</ScrollView>
|
||||
|
||||
<Button
|
||||
android:id="@+id/bSaveTriggerUrl"
|
||||
android:id="@+id/bSaveSpeakText"
|
||||
android:layout_marginTop="15dp"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
|
@ -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>
|
||||
|
@ -110,7 +110,7 @@
|
||||
</ScrollView>
|
||||
|
||||
<Button
|
||||
android:id="@+id/bSaveTriggerUrl"
|
||||
android:id="@+id/bSaveSpeakText"
|
||||
android:layout_marginTop="15dp"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
|
100
app/src/main/res/layout/activity_manage_action_wakelock.xml
Normal file
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>
|
100
app/src/main/res/layout/activity_manage_action_wifi.xml
Normal file
100
app/src/main/res/layout/activity_manage_action_wifi.xml
Normal file
@ -0,0 +1,100 @@
|
||||
<?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/actionSetWifi"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvWifiExplanation1"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/wifiExplanation1" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvWifiExplanation2"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/default_margin"
|
||||
android:text="@string/wifiExplanation2" />
|
||||
|
||||
<TableLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/default_margin"
|
||||
android:stretchColumns="1"
|
||||
android:shrinkColumns="1" >
|
||||
|
||||
<TableRow>
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/runAsRoot" />
|
||||
|
||||
<CheckBox
|
||||
android:id="@+id/chkWifiRunAsRoot"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/runAsRoot" />
|
||||
|
||||
</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/state" />
|
||||
|
||||
<RadioGroup
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content" >
|
||||
|
||||
<RadioButton
|
||||
android:id="@+id/rbActionWifiOn"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:checked="true"
|
||||
android:text="@string/on" />
|
||||
|
||||
<RadioButton
|
||||
android:id="@+id/rbActionWifiOff"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/off" />
|
||||
|
||||
</RadioGroup>
|
||||
|
||||
</TableRow>
|
||||
|
||||
</TableLayout>
|
||||
|
||||
<Button
|
||||
android:id="@+id/bActionWifiSave"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/default_margin"
|
||||
android:text="@string/save" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</ScrollView>
|
@ -29,6 +29,14 @@
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical"
|
||||
android:layout_margin="10dp" >
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvBluetoothNotPresentNotice"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textColor="@color/red"
|
||||
android:layout_marginVertical="@dimen/default_margin"
|
||||
android:text="@string/deviceDoesNotHaveBluetooth" />
|
||||
|
||||
<RadioGroup
|
||||
android:layout_width="match_parent"
|
||||
|
@ -0,0 +1,81 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.appcompat.widget.LinearLayoutCompat 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">
|
||||
|
||||
<ScrollView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical" >
|
||||
|
||||
<androidx.appcompat.widget.LinearLayoutCompat
|
||||
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/broadcastReceivedTitle" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="@dimen/default_margin"
|
||||
android:text="@string/explanationBroadcastTrigger" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvBroadcastUrl"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginVertical="@dimen/default_margin"
|
||||
android:text="@string/broadcastListUrl" />
|
||||
|
||||
<RadioGroup
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content" >
|
||||
|
||||
<RadioButton
|
||||
android:id="@+id/rbBroadcastReceived"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:checked="true"
|
||||
android:text="@string/broadcastReceived" />
|
||||
|
||||
<RadioButton
|
||||
android:id="@+id/rbBroadcastNotReceived"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/broadcastNotReceived" />
|
||||
|
||||
</RadioGroup>
|
||||
|
||||
<EditText
|
||||
android:id="@+id/etBroadcastTriggerAction"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/bBroadcastShowSuggestions"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/broadcastsShowSuggestions" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/bSaveTriggerBroadcast"
|
||||
android:layout_marginTop="@dimen/default_margin"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/save" />
|
||||
|
||||
</androidx.appcompat.widget.LinearLayoutCompat>
|
||||
|
||||
</ScrollView>
|
||||
|
||||
</androidx.appcompat.widget.LinearLayoutCompat>
|
@ -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>
|
132
app/src/main/res/layout/activity_manage_trigger_tethering.xml
Normal file
132
app/src/main/res/layout/activity_manage_trigger_tethering.xml
Normal file
@ -0,0 +1,132 @@
|
||||
<?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/tetheringState"/>
|
||||
|
||||
<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/state" />
|
||||
|
||||
<RadioGroup
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content" >
|
||||
|
||||
<RadioButton
|
||||
android:id="@+id/rbTetheringOn"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:checked="true"
|
||||
android:text="@string/on" />
|
||||
|
||||
<RadioButton
|
||||
android:id="@+id/rbTetheringOff"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/off" />
|
||||
|
||||
</RadioGroup>
|
||||
|
||||
</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"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/default_margin"
|
||||
android:text="@string/save" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</ScrollView>
|
@ -71,13 +71,20 @@
|
||||
android:layout_margin="10dp"
|
||||
android:background="#aa000000" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvCurrentNfcIdValue"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/timeFrameWhichDays"
|
||||
android:textAppearance="?android:attr/textAppearanceLarge" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvCurrentNfcIdValue"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/timeFrameWhichDays"
|
||||
android:textAppearance="?android:attr/textAppearanceLarge" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvDaysHint"
|
||||
android:layout_marginVertical="@dimen/default_margin"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:textColor="@color/red" />
|
||||
|
||||
<CheckBox
|
||||
android:id="@+id/checkMonday"
|
||||
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"
|
||||
|
@ -270,7 +270,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>
|
||||
@ -413,7 +414,7 @@
|
||||
<string name="volumeTest">Lautstärkekalibrierung</string>
|
||||
<string name="volumeCalibrationExplanation">Um einen dB Wert für die Lautstärkemessung zu berechnen müssen Sie einen sogenannten physikalischen Referenzwert angeben. Bitte lesen Sie bei Wikipedia nach, um mehr zu erfahren. Dieser Wert wird höchstwahrscheinlich für jedes Smartphone oder Tablet anders sein, deshalb diese Testanwendung. Verschieben Sie den Regler, um den gegenwärtig definierten Wert zu ändern. Je höher der Referenzwert desto niedriger wird der dB Wert. Es werden alle paar %1$s Sekunden neue Messungen vorgenommen und das Ergebnis unten angezeigt. Drücken Sie den zurück-Button, wenn Sie einen passenden Wert gefunden haben.</string>
|
||||
<string name="settingsWillTakeTime">Manche Einstellungen können nicht übernommen werden bevor der Dienst neu gestartet wird.</string>
|
||||
<string name="rootExplanation">Sie müssen Ihr Telefon rooten, damit diese Funktion funktionieren kann. Danach müssen Sie "Regel manuell ausführen", um den SuperUser Berechtigungsdialog zu zeigen. Wenn dieser erscheint, müssen Sie den Haken setzen, der es immer erlaubt. Ansonsten kann die Regel nicht funktionieren, wenn Sie das Telefon gerade nicht benutzen und demnach den nächsten Dialog nicht genehmigen können.</string>
|
||||
<string name="rootExplanation">Sie müssen Ihr Telefon rooten, damit diese Funktion funktionieren kann. Danach müssen Sie die Regel manuell ausführen, um den SuperUser Berechtigungsdialog zu zeigen. Wenn dieser erscheint, müssen Sie den Haken "immer erlauben" setzen. Ansonsten wird die Regel nicht funktionieren, wenn Sie das Telefon gerade nicht benutzen.</string>
|
||||
<string name="errorWritingConfig">Fehler beim Schreiben der Konfiguration. Gibt es einen beschreibbaren Speicher, und wurde alle Berechtigungen gegeben?</string>
|
||||
<string name="phoneNrReplacementError">Die letzte Telefonnummer konnte nicht in die Variable integriert werden. Sie liegt mir nicht vor.</string>
|
||||
<string name="username">Benutzername</string>
|
||||
@ -511,7 +512,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 +520,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>
|
||||
@ -557,7 +558,7 @@
|
||||
<string name="noFilesImported">Keine Dateien konnten importiert werden.</string>
|
||||
<string name="notAllFilesImported">Nicht alle passenden Dateien konnten importiert werden.</string>
|
||||
<string name="openExamplesPage">Webseite mit Beispielen öffnen</string>
|
||||
<string name="phoneNumberExplanation">Sie können eine bestimmte Nummer eingeben, aber müssen nicht. Wenn Sie eine angeben wollen, können Sie auch eine aus dem Adressbuch auswählen. Außerdem können Sie reguläre Audrücke verwenden. Zum Testen selbiger mag ich die Seite:</string>
|
||||
<string name="phoneNumberExplanation">Sie können eine bestimmte Nummer eingeben (des Anrufpartners), aber müssen nicht. Wenn Sie eine angeben wollen, können Sie auch eine aus dem Adressbuch auswählen. Außerdem können Sie reguläre Audrücke verwenden. Zum Testen selbiger mag ich die Seite:</string>
|
||||
<string name="prefsImportError">Fehler beim Importieren der Einstellungen.</string>
|
||||
<string name="rulesImportedSuccessfully">Regeln und Orte wurden erfolgreich importiert.</string>
|
||||
<string name="rulesImportError">Fehler beim Importieren der Regeln.</string>
|
||||
@ -667,7 +668,7 @@
|
||||
<string name="closeNotifications">Benachrichtigung(en) schließen</string>
|
||||
<string name="comparisonCaseInsensitive">Groß-/Kleinschreibung ist egal.</string>
|
||||
<string name="notificationCloseActionExplanation">Wenn Sie keine Kriterien angeben, werden ALLE Benachrichtigungen geschlossen. Es wird also empfohlen, zumindest eine Anwendung zu spezifizieren und/oder Titel oder Text anzugeben.</string>
|
||||
<string name="profileWarning">Die Einstellungen, die Sie hier vornehmen, können dazu führen, dass Sie bestimmte Dinge auf Ihrem Telefon nicht mehr mitbekommen. Sie können sogar Ihren Wecker zum Schweigen bringen. Was auch immer Sie hier einstellen - es wird empfohlen, es zu testen.</string>
|
||||
<string name="profileWarning">Die Einstellungen, die Sie hier vornehmen, können dazu führen, dass Sie bestimmte Dinge auf Ihrem Telefon nicht mehr mitbekommen. Sie können sogar Ihren Wecker zum Schweigen bringen. Was auch immer Sie hier einstellen - es wird empfohlen, daß Sie es testen - auch nach Android Updates.</string>
|
||||
<string name="ifString">falls</string>
|
||||
<string name="pleaseSelectActionValue">Bitte wählen Sie eine Aktion!</string>
|
||||
<string name="android.permission.MEDIA_CONTENT_CONTROL">Medien steuern</string>
|
||||
@ -688,7 +689,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>
|
||||
@ -701,4 +702,73 @@
|
||||
<string name="profileXrequiresThis">Profil \"%1$s\" benötigt dies.</string>
|
||||
<string name="lastProfile">Letztes Profil:</string>
|
||||
<string name="queryAllPackages">Liste von installierten Anwendungen auslesen</string>
|
||||
<string name="timeFrameDaysHint">Wenn Sie ein Zeitfenster verwenden, das sich über Mitternacht erstreckt, müssen Sie auch den Folgetag auswählen, wenn der Auslöser auch nach Mitternacht noch auslösen soll.</string>
|
||||
<string name="featureNotInGooglePlayVersion">Diese Funktion ist in der Google Play-Version nicht mehr verfügbar.\n\nHin und wieder schikaniert Google Entwickler. Wenn Sie bestimmte Funktionen weiterhin verwenden möchten, müssen Sie Unterlagen einreichen. Leider besteht eine 99% ige Chance, dass der Papierkram abgelehnt wird. Es ist so ziemlich wie im Asterix-Comic/Film.\n\nIch habe in der Vergangenheit Wochen damit verbracht, mit ihnen über solche Fälle zu streiten, aber ich bekam immer wieder Ablehnungen - entweder von Bots oder von Leuten, die ungefähr so intelligent sind wie Bots. Ich kann mich dann nur entscheiden, ob die App vollständig aus dem Play Store fliegen soll oder die Funktion aus der Play Store Version entfernen.\n\nBitte erwägen Sie, die APK-Version von meiner Website oder die von F-Droid zu verwenden, wenn Sie diese Funktionen benötigen.</string>
|
||||
<string name="startActivityInsertManually">Diese Einschränkung betrifft nur die Auswahl einer App, nicht den eigentlichen Start. So können Sie den Namen einer Anwendung immer noch manuell eingeben, falls Sie ihn kennen.</string>
|
||||
<string name="serviceStarts">Dienst startet</string>
|
||||
<string name="deviceStarts">Gerät startet</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>
|
||||
<string name="broadcastsShowSuggestions">Vorschläge anzeigen</string>
|
||||
<string name="selectBroadcast">Broadcast auswählen</string>
|
||||
<string name="lockedWithoutSecurity">gesperrt (nur wischen, keine PIN, etc.)</string>
|
||||
<string name="lockedWithSecurity">gesperrt (mit PIN, etc.)</string>
|
||||
<string name="lockedCommentScreenMustBeOff">Jeglicher Sperrzustand wird nur erkannt werden, wenn gleichzeitig der Bildschirm aus ist.</string>
|
||||
<string name="emailPretext">Wenn Sie ein Problem, einen Vorschlag oder eine Frage haben, schreiben Sie bitte auch etwas in die Email. Senden Sie mir nicht einfach die Dateien mit dem Standard-Mailtext. Ich werde solche Nachrichten ignorieren, sollten wir nicht bereits in einer Konversation sein.</string>
|
||||
<string name="sendBroadcast">Broadcast verschicken</string>
|
||||
<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="directionStringDoesNotContain">enthält nicht</string>
|
||||
<string name="path">Pfad</string>
|
||||
<string name="runExecutable">Programm/Script ausführen</string>
|
||||
<string name="parameters">Parameter</string>
|
||||
<string name="chooseExecutable">Datei auswählen</string>
|
||||
<string name="runAsRoot">Als root ausführen</string>
|
||||
<string name="selectValidExecutable">Wählen Sie eine gültige ausführbare Datei aus.</string>
|
||||
<string name="fileNotExecutable">Diese Datei ist nicht ausführbar.</string>
|
||||
<string name="usingRoot">als root</string>
|
||||
<string name="tetheringActive">Tethering ist aktiv</string>
|
||||
<string name="tetheringNotActive">Tethering ist nicht aktiv</string>
|
||||
<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 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>
|
||||
</resources>
|
@ -117,7 +117,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>
|
||||
@ -127,10 +127,10 @@
|
||||
<string name="actionTurnWifiTetheringOff">desactivar enrutador wifi</string>
|
||||
<string name="actionTurnAirplaneModeOn">encender modo de vuelo</string>
|
||||
<string name="actionTurnAirplaneModeOff">desactivar modo de vuelo</string>
|
||||
<string name="activePoi">sitio activo</string>
|
||||
<string name="activePoi">Sitio activo:</string>
|
||||
<string name="closestPoi">sitio mas cerca</string>
|
||||
<string name="poi">Posición</string>
|
||||
<string name="pois">posiciónes</string>
|
||||
<string name="pois">Posiciones</string>
|
||||
<string name="serviceNotRunning">Servicio no está activo</string>
|
||||
<string name="general">General</string>
|
||||
<string name="startServiceAfterAppUpdate">Encender servicio después de un update si estuvo activado.</string>
|
||||
@ -254,7 +254,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>
|
||||
@ -294,7 +295,7 @@
|
||||
<string name="parameterValue">Valor del parámetro</string>
|
||||
<string name="addIntentValue">Añadir pareja intento</string>
|
||||
<string name="parameterType">Tipo del parámetro</string>
|
||||
<string name="phoneNumberExplanation">Puedes introducir un número, pero es opciónal. Si quieres usar uno puedes elegir uno de su directorio o introducir uno manualmente. Adiciónalmente puedes usar expresiónes regulares. Para probar esos me gusta la pagina:</string>
|
||||
<string name="phoneNumberExplanation">Puedes introducir un número remoto, pero es opciónal. Si quieres usar uno puedes elegir uno de su directorio o introducir uno manualmente. Adiciónalmente puedes usar expresiónes regulares. Para probar esos me gusta la pagina:</string>
|
||||
<string name="screenRotationEnabled">Rotación del monitor activado.</string>
|
||||
<string name="screenRotationDisabled">Rotación del monitor desactivado.</string>
|
||||
<string name="noPoisDefinedShort">No hay sitios.</string>
|
||||
@ -575,7 +576,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>
|
||||
@ -666,7 +667,7 @@
|
||||
<string name="notificationCloseActionExplanation">Si no especifica ningún criterio, esta acción cerrará TODAS las notificaciones. Por lo tanto, se recomienda al menos especificar criterios para al menos 1 de la aplicación, título o texto.</string>
|
||||
<string name="closeNotifications">Cerrar notificación(es)</string>
|
||||
<string name="comparisonCaseInsensitive">Las comparaciones se realizan sin distinción de mayúsculas y minúsculas</string>
|
||||
<string name="profileWarning">La configuración que realice aquí puede hacer que ya no note ciertas cosas de su teléfono. Incluso puede silenciar su alarma de despertar. Así que hagas lo que hagas, se recomienda que lo pruebes.</string>
|
||||
<string name="profileWarning">La configuración que realice aquí puede hacer que ya no note ciertas cosas de su teléfono. Incluso puede silenciar su alarma de despertar. Así que hagas lo que hagas, se recomienda que lo pruebe - tambien despues upgrades de Android.</string>
|
||||
<string name="ifString">si</string>
|
||||
<string name="on">encendido</string>
|
||||
<string name="off">apagado</string>
|
||||
@ -687,7 +688,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>
|
||||
@ -700,4 +701,73 @@
|
||||
<string name="profileXrequiresThis">El perfil \"%1$s\" requiere esto.</string>
|
||||
<string name="lastProfile">Último perfil:</string>
|
||||
<string name="queryAllPackages">Obtener una lista de las aplicaciones instaladas</string>
|
||||
<string name="timeFrameDaysHint">Si utiliza un marco de tiempo que se extiende más allá de la medianoche, también debe seleccionar el día siguiente si desea que la condición se aplique después de la medianoche.</string>
|
||||
<string name="featureNotInGooglePlayVersion">Esta función ya no está disponible en la versión de Google Play.\n\nTodo de vez en cuando Google intimida a los desarrolladores. Si desea seguir utilizando ciertas funciones, debe presentar documentos. Desafortunadamente, hay un 99% de posibilidades de que el papeleo sea rechazado. Es más o menos como en el cómic/la película de Astérix.\n\nHe pasado semanas discutiendo con ellos sobre casos como ese en el pasado, pero seguí recibiendo rechazos, ya sea por bots o personas que son tan inteligentes como los bots. En el puedo decidir entre que la aplicación se elimine de Play Store por completo o eliminar la función.\n\nPor favor, considere usar la versión APK de mi sitio web o la de F-Droid si necesita esas características.</string>
|
||||
<string name="startActivityInsertManually">Esta limitación se refiere solo a la selección de una aplicación, no al inicio real. Por lo tanto, aún puede ingresar el nombre de una aplicación manualmente si lo conoce.</string>
|
||||
<string name="deviceStarts">Dispositivo esta enciendo</string>
|
||||
<string name="serviceStarts">Servicio esta enciendo</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>
|
||||
<string name="lockedWithoutSecurity">bloqueado (solo deslizar, sin PIN)</string>
|
||||
<string name="selectBroadcast">Seleccionar broadcast</string>
|
||||
<string name="broadcastsShowSuggestions">Mostrar sugerencias</string>
|
||||
<string name="broadcastReceivedTitle">Broadcast recibido</string>
|
||||
<string name="broadcastReceived">broadcast recibido</string>
|
||||
<string name="broadcastNotReceived">broadcast no recibido</string>
|
||||
<string name="broadcastExplanation">Esta acción permite enviar una transmisión a través del sistema de mensajes de Android. Esto no es visible para el usuario, pero las aplicaciones que se han registrado para ciertas transmisiones pueden responder a ello.</string>
|
||||
<string name="sendBroadcast">Enviar broadcast</string>
|
||||
<string name="enterBroadcast">Introduzca una acción de broadcast.</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">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>
|
||||
</resources>
|
772
app/src/main/res/values-fr/strings.xml
Normal file
772
app/src/main/res/values-fr/strings.xml
Normal file
@ -0,0 +1,772 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<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</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.</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="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>
|
||||
</resources>
|
@ -1,26 +1,26 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:ns1="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="ConfigurationExportError">C\'è stato un errore durante l\'esportazione della configurazione.</string>
|
||||
<string name="ConfigurationExportError">È avvenuto un errore durante l\'esportazione della configurazione.</string>
|
||||
<string name="accelerometer">Accelerometro</string>
|
||||
<string name="accelerometerThreshold">Soglia accelerometro</string>
|
||||
<string name="accelerometerThresholdDescription">Soglia per i movimenti dell\'accelerometro</string>
|
||||
<string name="accelerometerTimer">Usa l\'accelerometro dopo x minuti senza lunghi cambiamenti delripetitore</string>
|
||||
<string name="accelerometerTimer">Usa l\'accelerometro dopo x minuti senza lunghi cambiamenti del ripetitore</string>
|
||||
<string name="actionChangeSoundProfile">Cambia il profilo sonoro</string>
|
||||
<string name="actionDataConnection">Connessione dati mobile</string>
|
||||
<string name="actionDataConnection">Connessione dati</string>
|
||||
<string name="actionDisableScreenRotation">disabilita la rotazione dello schermo</string>
|
||||
<string name="actionEnableScreenRotation">abilita la rotazione dello schermo</string>
|
||||
<string name="actionPlayMusic">Apri il lettore musicale</string>
|
||||
<string name="actionSetBluetooth">Bluetooth</string>
|
||||
<string name="actionSetDataConnectionOff">disattiva la connessione mobile</string>
|
||||
<string name="actionSetDataConnectionOn">attiva la connessione mobile</string>
|
||||
<string name="actionSetDataConnectionOff">disattiva la connessione dati</string>
|
||||
<string name="actionSetDataConnectionOn">attiva la connessione dati</string>
|
||||
<string name="actionSetDisplayRotation">Rotazione dello schermo</string>
|
||||
<string name="actionSetUsbTethering">USB Tethering</string>
|
||||
<string name="actionSetUsbTethering">Tethering USB</string>
|
||||
<string name="actionSetWifi">Wifi</string>
|
||||
<string name="actionSetWifiTethering">Wifi Tethering</string>
|
||||
<string name="actionSetWifiTethering">Tethering Wifi</string>
|
||||
<string name="actionSpeakText">Pronuncia testo</string>
|
||||
<string name="actionTriggerUrl">Apri indirizzo</string>
|
||||
<string name="actionTurnAirplaneModeOff">termina la modalità aereo</string>
|
||||
<string name="actionTurnAirplaneModeOn">passa a modalità aereo</string>
|
||||
<string name="actionTurnAirplaneModeOff">disattiva modalità aereo</string>
|
||||
<string name="actionTurnAirplaneModeOn">attiva modalità aereo</string>
|
||||
<string name="actionTurnBluetoothOff">disattiva Bluetooth</string>
|
||||
<string name="actionTurnBluetoothOn">attiva Bluetooth</string>
|
||||
<string name="actionTurnUsbTetheringOff">disattiva Tethering USB</string>
|
||||
@ -29,20 +29,20 @@
|
||||
<string name="actionTurnWifiOn">attiva Wifi</string>
|
||||
<string name="actionTurnWifiTetheringOff">disattiva Tethering Wifi</string>
|
||||
<string name="actionTurnWifiTetheringOn">attiva Tethering Wifi</string>
|
||||
<string name="actions">Azione(i)</string>
|
||||
<string name="actions">Azione/i</string>
|
||||
<string name="actionsComment">(saranno eseguite in quest\'ordine)</string>
|
||||
<string name="activate">Attiva</string>
|
||||
<string name="activated">attivo</string>
|
||||
<string name="activating">Sto attivando</string>
|
||||
<string name="activated">attivato</string>
|
||||
<string name="activating">Attivazione in corso</string>
|
||||
<string name="activePoi">Posizione attiva:</string>
|
||||
<string name="activityDetection">Rilevamento dell\'attività</string>
|
||||
<string name="activityDetectionFrequencySummary">Secondi tra i tentativi di rilevamento dell\'attività.</string>
|
||||
<string name="activityDetectionFrequencyTitle">Frequenza di rilevamento [sec]</string>
|
||||
<string name="activityDetectionRequiredProbabilitySummary">Attendibilità alla quale esecuzione delle attività è considerata corretta.</string>
|
||||
<string name="activityDetectionRequiredProbabilitySummary">Attendibilità minima per considerare le attività corrette.</string>
|
||||
<string name="activityDetectionRequiredProbabilityTitle">Probabilità di rilevamento dell\'attività</string>
|
||||
<string name="activityOrActionName">Nome attività/azione</string>
|
||||
<string name="addAction">Aggiungi azione</string>
|
||||
<string name="addIntentValue">Aggiungi una coppia di intenzioni</string>
|
||||
<string name="addIntentValue">Aggiungi coppia dell\'Intent</string>
|
||||
<string name="addParameters">Aggiungi parametri</string>
|
||||
<string name="addPoi">Aggiungi posizione</string>
|
||||
<string name="addProfile">Aggiungi profilo</string>
|
||||
@ -59,38 +59,38 @@
|
||||
<string name="android.permission.ACCESS_NOTIFICATION_POLICY">Ignora la politica di "non disturbare"</string>
|
||||
<string name="android.permission.ACCESS_WIFI_STATE">Leggi lo stato della rete wifi</string>
|
||||
<string name="android.permission.ACTIVITY_RECOGNITION">Identificazione attività</string>
|
||||
<string name="android.permission.BATTERY_STATS">Leggere lo stato della batteria</string>
|
||||
<string name="android.permission.BATTERY_STATS">Leggi lo stato della batteria</string>
|
||||
<string name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">Leggere le notifiche di sistema</string>
|
||||
<string name="android.permission.BLUETOOTH">Cambia le impostazioni Bluetooth</string>
|
||||
<string name="android.permission.BLUETOOTH_ADMIN">Cambia le impostazioni Bluetooth</string>
|
||||
<string name="android.permission.CHANGE_BACKGROUND_DATA_SETTING">Cambia la connessione dati</string>
|
||||
<string name="android.permission.BLUETOOTH">Modifica le impostazioni Bluetooth</string>
|
||||
<string name="android.permission.BLUETOOTH_ADMIN">Modifica le impostazioni Bluetooth</string>
|
||||
<string name="android.permission.CHANGE_BACKGROUND_DATA_SETTING">Modifica la connessione dati</string>
|
||||
<string name="android.permission.GET_TASKS">Rileva i processi attivi</string>
|
||||
<string name="android.permission.INTERNET">Invia dati su una connessione di rete</string>
|
||||
<string name="android.permission.MODIFY_AUDIO_SETTINGS">Cambia le impostazioni audio</string>
|
||||
<string name="android.permission.MODIFY_PHONE_STATE">Cambia le impostazioni del dispositivo</string>
|
||||
<string name="android.permission.MODIFY_AUDIO_SETTINGS">Modifica le impostazioni audio</string>
|
||||
<string name="android.permission.MODIFY_PHONE_STATE">Modifica le impostazioni del dispositivo</string>
|
||||
<string name="android.permission.NFC">Usa il modulo NFC</string>
|
||||
<string name="android.permission.PROCESS_OUTGOING_CALLS">Rileva chiamate in uscita</string>
|
||||
<string name="android.permission.READ_CALENDAR">Leggere gli appuntamenti dal calendario</string>
|
||||
<string name="android.permission.READ_CALL_LOG">Leggere il registro chiamate</string>
|
||||
<string name="android.permission.READ_CONTACTS">Leggere informazioni dai Contatti</string>
|
||||
<string name="android.permission.READ_EXTERNAL_STORAGE">Leggere la memoria esterna</string>
|
||||
<string name="android.permission.READ_CALENDAR">Leggi dal calendario</string>
|
||||
<string name="android.permission.READ_CALL_LOG">Leggi il registro chiamate</string>
|
||||
<string name="android.permission.READ_CONTACTS">Leggi informazioni dai contatti</string>
|
||||
<string name="android.permission.READ_EXTERNAL_STORAGE">Leggi dalla memoria esterna</string>
|
||||
<string name="android.permission.READ_PHONE_STATE">Rileva lo stato del telefono</string>
|
||||
<string name="android.permission.RECEIVE_BOOT_COMPLETED">Rileva riavvio del dispositivo</string>
|
||||
<string name="android.permission.RECORD_AUDIO">Registra audio</string>
|
||||
<string name="android.permission.SEND_SMS">Invia messaggio di testo</string>
|
||||
<string name="android.permission.VIBRATE">Attiva vibrazione</string>
|
||||
<string name="android.permission.WAKE_LOCK">Mantienere attivo il dispositivo</string>
|
||||
<string name="android.permission.WRITE_EXTERNAL_STORAGE">Scrive sulla SD</string>
|
||||
<string name="android.permission.WRITE_SECURE_SETTINGS">Cambia le impostazioni del dispositivo</string>
|
||||
<string name="android.permission.WRITE_SETTINGS">Cambia le impostazioni del dispositivo</string>
|
||||
<string name="android10WifiToggleNotice">Sfortunatamente, Google ha deciso di rimuovere questa funzione in Android 10. Applicazioni normali non hanno più accesso alla accensione o spegnimento della connessione wifi on. Questo significa che questa azione non avrà effetto su questo dispositivo.</string>
|
||||
<string name="android9RecordAudioNotice">Se si sta usando il livello di rumore come evento di attivazione: sfortunatamente, a partire da Android 9 (Pie), Google ha deciso di non permettere l\'accesso al microfono da parte di applicazioni attive in secondo piano. Pertanto questo evento non ha più effetto e non attiverà nessuna azione.</string>
|
||||
<string name="anotherAppIsRunning">Si è avviata/fermata un\'altra app</string>
|
||||
<string name="android.permission.VIBRATE">Fa vibrare il telefono</string>
|
||||
<string name="android.permission.WAKE_LOCK">Mantieni attivo il dispositivo</string>
|
||||
<string name="android.permission.WRITE_EXTERNAL_STORAGE">Scrivi nella memoria esterna</string>
|
||||
<string name="android.permission.WRITE_SECURE_SETTINGS">Modifica le impostazioni del dispositivo</string>
|
||||
<string name="android.permission.WRITE_SETTINGS">Modifica le impostazioni del dispositivo</string>
|
||||
<string name="android10WifiToggleNotice">Purtroppo Google ha deciso di rimuovere questa funzione in Android 10. Le applicazioni normali non hanno più accesso ad attivazione o disattivazione della connessione wifi, perciò questa azione non avrà effetto su questo dispositivo.</string>
|
||||
<string name="android9RecordAudioNotice">Se si sta usando il livello di rumore come evento di attivazione: purtroppo, a partire da Android 9 (Pie), Google ha deciso di non permettere l\'accesso al microfono da parte di applicazioni attive in secondo piano. Pertanto questo evento non ha più effetto e non attiverà nessuna azione.</string>
|
||||
<string name="anotherAppIsRunning">È stata avviata/fermata un\'altra app</string>
|
||||
<string name="anotherPoiByThatName">Nome già usato per un\'altra posizione.</string>
|
||||
<string name="anotherProfileByThatName">Nome già usato per un altro profilo.</string>
|
||||
<string name="anotherRuleByThatName">Nome già usato per un\'altra regola.</string>
|
||||
<string name="any">qualsiaisi</string>
|
||||
<string name="anyApp">Qualsiasi applicazione</string>
|
||||
<string name="any">qualsiasi</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>
|
||||
@ -101,21 +101,21 @@
|
||||
<string name="areYouSure">Sei sicuro?</string>
|
||||
<string name="at">al</string>
|
||||
<string name="audibleSelection">Audio abilitato quando si seleziona lo schermo</string>
|
||||
<string name="autoBrightness">Abilitare luminosità automatica</string>
|
||||
<string name="autoBrightnessNotice">Se usi la luminosità automatica, il valore di luminosità scelto a seguito non sarà probabilmente in use per molto.</string>
|
||||
<string name="batteryLevel">livello della batteria</string>
|
||||
<string name="autoBrightness">Attiva luminosità automatica</string>
|
||||
<string name="autoBrightnessNotice">Se usi la luminosità automatica, il valore di luminosità scelto in seguito probabilmente non sarà in uso per molto.</string>
|
||||
<string name="batteryLevel">Livello della batteria</string>
|
||||
<string name="bluetoothConnection">Connessione Bluetooth</string>
|
||||
<string name="bluetoothConnectionTo">Connessione Bluetooth con %1$s</string>
|
||||
<string name="bluetoothDeviceInRange">Dispositivo Bluetooth %1$s rilevato.</string>
|
||||
<string name="bluetoothDeviceOutOfRange">Dispositivo Bluetooth %1$s non raggiungibile.</string>
|
||||
<string name="bluetoothDisconnectFrom">Connessione Bluetooth con %1$s interrotta</string>
|
||||
<string name="bluetoothFailed">Impossibile attivare il Bluetooth. Questo dispositivo è dotato di Bluetooth?</string>
|
||||
<string name="bluetoothFailed">Impossibile attivare il Bluetooth. Questo dispositivo ne è dotato?</string>
|
||||
<string name="brightnessAuto">luminosità automatica</string>
|
||||
<string name="brightnessManual">luminosità manuale</string>
|
||||
<string name="cancel">Annulla</string>
|
||||
<string name="cantFindSoundFile">Impossibile trovate il file audio %1$s e riprodurlo.</string>
|
||||
<string name="cantMoveDown">Non posso spostare giù l\'elemento. E\' già l\'ultimo.</string>
|
||||
<string name="cantMoveUp">Non posso spostare su l\'elemento. E\' già il primo.</string>
|
||||
<string name="cantMoveDown">Impossibile spostare in basso l\'elemento, è già l\'ultimo.</string>
|
||||
<string name="cantMoveUp">Non posso spostare in alto l\'elemento, è già il primo.</string>
|
||||
<string name="cantRunRule">Impossibile eseguire le regole.</string>
|
||||
<string name="cantStopIt">Non posso fermarla.</string>
|
||||
<string name="cellMastIdleTime">Massimo tempo di inattività del ripetitore</string>
|
||||
@ -124,25 +124,25 @@
|
||||
<string name="clickAndHoldForOptions">Clicca e mantieni premuto un elemento per vedere le opzioni.</string>
|
||||
<string name="closeTo">vicino a</string>
|
||||
<string name="closestPoi">Posizione più vicina:</string>
|
||||
<string name="com.wireguard.android.permission.CONTROL_TUNNELS">Controllare i tunnels dell\'applicazione wireguard</string>
|
||||
<string name="com.wireguard.android.permission.CONTROL_TUNNELS">Controlla i tunnel dell\'applicazione wireguard</string>
|
||||
<string name="configurationExportedSuccessfully">Configurazione esportata con successo.</string>
|
||||
<string name="configurationImportedSuccessfully">Configurazione esportata con successo.</string>
|
||||
<string name="configurationImportedSuccessfully">Configurazione importata con successo.</string>
|
||||
<string name="connected">connesso</string>
|
||||
<string name="connectedToWifi">connesso al wifi \"%1$s</string>
|
||||
<string name="connectedToWifi">connesso al wifi \"%1$s\"</string>
|
||||
<string name="connecting">connessione in corso</string>
|
||||
<string name="connectionToDevice">connessione al dispositivo</string>
|
||||
<string name="continueText">continua</string>
|
||||
<string name="currentId">ID corrente:</string>
|
||||
<string name="currentId">ID attuale:</string>
|
||||
<string name="currentVolume">Volume attuale</string>
|
||||
<string name="deactivate">Disattivazione</string>
|
||||
<string name="deactivated">non attivo</string>
|
||||
<string name="deactivate">Disattiva</string>
|
||||
<string name="deactivated">disattivato</string>
|
||||
<string name="deactivating">Disattivazione in corso</string>
|
||||
<string name="defaultSettings">Ripristino impostazioni di default</string>
|
||||
<string name="delete">rimuovi</string>
|
||||
<string name="deleteCapital">Rimuovi</string>
|
||||
<string name="deletePoi">Cancella posizione</string>
|
||||
<string name="detectedActivity">Attività rilevata:</string>
|
||||
<string name="detectedActivityInVehicle">In un veicolo (auto, bus,...)</string>
|
||||
<string name="detectedActivityInVehicle">In un veicolo (auto, bus,…)</string>
|
||||
<string name="detectedActivityInvalidStatus">Attività non valida</string>
|
||||
<string name="detectedActivityOnBicycle">In bicicletta</string>
|
||||
<string name="detectedActivityOnFoot">A piedi</string>
|
||||
@ -151,8 +151,8 @@
|
||||
<string name="detectedActivityTilting">Ribaltando</string>
|
||||
<string name="detectedActivityUnknown">Sconosciuto</string>
|
||||
<string name="detectedActivityWalking">Camminando</string>
|
||||
<string name="deviceDoesNotHaveBluetooth">Questo dispositivo non sembra avere bluetooth. Puoi comunque configurare questa opzione, ma non avrà probabilmente nessun effetto.</string>
|
||||
<string name="deviceDoesNotHaveNfc">Sembra che il dispositivo non abbia la funzione NFC.</string>
|
||||
<string name="deviceDoesNotHaveBluetooth">Questo dispositivo sembra non disporre del Bluetooth. Si può comunque configurare questa opzione, ma probabilmente senza alcun risultato.</string>
|
||||
<string name="deviceDoesNotHaveNfc">Sembra che il dispositivo non disponga del NFC.</string>
|
||||
<string name="deviceInRange">dispositivo visibile</string>
|
||||
<string name="deviceOutOfRange">dispositivo fuori portata</string>
|
||||
<string name="direction">Direzione</string>
|
||||
@ -163,71 +163,72 @@
|
||||
<string name="directionStringStartsWith">comincia con</string>
|
||||
<string name="disabledFeatures">Funzioni disabilitate</string>
|
||||
<string name="disconnected">disconnesso</string>
|
||||
<string name="disconnectedFromWifi">disconnesso dalla rete wifi \"%1$s</string>
|
||||
<string name="disconnectedFromWifi">disconnesso dalla rete wifi \"%1$s\"</string>
|
||||
<string name="disconnecting">disconnessione in corso</string>
|
||||
<string name="disconnectionFromDevice">disconnesso dal dispositivo</string>
|
||||
<string name="displayNewsOnMainScreen">Visualizza le novità dell\'applicazione sullo schermo principale</string>
|
||||
<string name="displayNewsOnMainScreenDescription">Novità relative solo a questa applicazione, stiamo parlando di un paio per anno, non di più.</string>
|
||||
<string name="displayNewsOnMainScreenDescription">Novità relative solo a questa applicazione, saranno un paio ogni anno, non di più.</string>
|
||||
<string name="distanceBetween">La distanza tra la posizione GPS e la posizione di rete è di %1$d metri. Il raggio minimo è +1 metro.</string>
|
||||
<string name="distanceForGpsUpdate">Distanza per l\'aggiornamento del GPS [m]</string>
|
||||
<string name="distanceForNetworkUpdate">Distanza per l\'aggiornamento della rete [m]</string>
|
||||
<string name="droppingBelow">sta andando sotto</string>
|
||||
<string name="dropsBelow">inferiore</string>
|
||||
<string name="droppingBelow">sta scendendo</string>
|
||||
<string name="dropsBelow">scende sotto</string>
|
||||
<string name="edit">Modifica</string>
|
||||
<string name="end">Fine</string>
|
||||
<string name="enterAPositiveValidNonDecimalNumber">Inserisci un numero intero positivo</string>
|
||||
<string name="enterAname">Inserisci un nome.</string>
|
||||
<string name="enterNameForIntentPair">Definisci un nome per la coppia di intenzioni</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 di Intenzioni.</string>
|
||||
<string name="enterWifiName">Inserire un nome per la wifi. Se vuoto sarà valido per qualsiasi wifi.</string>
|
||||
<string name="enterValueForIntentPair">Definisci un valore per la coppia dell\'Intent.</string>
|
||||
<string name="enterWifiName">Inserisci un nome per la rete wifi. Se vuoto sarà valido per qualsiasi wifi.</string>
|
||||
<string name="entering">entrando in</string>
|
||||
<string name="eraseSettings">Azzera le impostazioni</string>
|
||||
<string name="error">Errore</string>
|
||||
<string name="errorActivatingProfile">Errore nell\'attivazione del profilo:</string>
|
||||
<string name="errorReadingPoisAndRulesFromFile">Errore nella lettura di regole e posizioni dal file.</string>
|
||||
<string name="errorRunningRule">C\'è stato un errore cercando di eseguire una regola.</string>
|
||||
<string name="errorStartingOtherActivity">Errore nel\'avvio dell\'altra attività</string>
|
||||
<string name="errorRunningRule">È avvenuto un errore durante il tentativo di eseguire di una regola.</string>
|
||||
<string name="errorStartingOtherActivity">Errore nell\'avvio dell\'altra attività</string>
|
||||
<string name="errorWritingConfig">Errore nello scrivere la configurazione. È la memoria in sola lettura?</string>
|
||||
<string name="errorWritingFile">Errore nella scrittura delle impostazioni.</string>
|
||||
<string name="exceeding">sta sorpassando</string>
|
||||
<string name="exceeds">è superiore</string>
|
||||
<string name="executeRulesAndProfilesWithSingleClickTitle">Esegui regole/profili con un singolo click.</string>
|
||||
<string name="exportConfiguration">Esporta la configurazione</string>
|
||||
<string name="failedToTriggerBluetooth">Non riesco ad attivare il Bluetooth. Questo dispositivo ha il Bluetooth?</string>
|
||||
<string name="featureNotInFdroidVersion">Questa funzione sfrutta software non basato su codice aperto. Pertanto non è disponibile nella versione F-Droid.</string>
|
||||
<string name="exceeding">sta superando</string>
|
||||
<string name="exceeds">supera</string>
|
||||
<string name="executeRulesAndProfilesWithSingleClickTitle">Esegui regole/profili con un click.</string>
|
||||
<string name="exportConfiguration">Esporta configurazione</string>
|
||||
<string name="failedToTriggerBluetooth">Non riesco ad attivare il Bluetooth. Questo dispositivo ne dispone?</string>
|
||||
<string name="featureNotInFdroidVersion">Questa funzione sfrutta software basato su codice non libero, pertanto non è disponibile nella versione F-Droid.</string>
|
||||
<string name="featuresDisabled">L\'applicazione è in esecuzione in modalità limitata a causa di autorizzazioni mancanti.</string>
|
||||
<string name="fileDoesNotExist">Il file non esiste.</string>
|
||||
<string name="filesHaveBeenMovedTo">Automation usa adesso un percorso nuovo per salvare i tuoi files. Tutti i files di Automation sono stati mossi qui: \"%s\". I permessi di accesso alla memoria esterna non sono più necessari e si possono revocare. Questo verrà permanentemente rimosso in una versione futura.</string>
|
||||
<string name="filesStoredAt">I files di configurazione e log sono salvati nella cartella %1$s. Clicca su questo testo per aprire l\'esploratore di files. Sfortunatamente, questo solo funziona su un dispositivo con accesso root.\n\nPER TUTTI GLI ALTRI DISPOSITIVI: basta usare il bottone \'esporta\' per fare un backup.</string>
|
||||
<string name="filesHaveBeenMovedTo">Automation usa adesso un percorso nuovo per salvare i tuoi file. Tutti i file di Automation sono stati mossi qui: \"%s\". I permessi di accesso alla memoria esterna non sono più necessari e si possono revocare. Questo verrà permanentemente rimosso in una versione futura.</string>
|
||||
<string name="filesStoredAt">I file di configurazione e log sono salvati nella cartella %1$s. Clicca su questo testo per aprire l\'esploratore di file. Sfortunatamente, questo solo funziona su un dispositivo con accesso root.\n\nPER TUTTI GLI ALTRI DISPOSITIVI: basta usare il bottone \'esporta\' per fare un backup.</string>
|
||||
<string name="friday">Venerdì</string>
|
||||
<string name="from">da</string>
|
||||
<string name="general">Generale</string>
|
||||
<string name="generalSettings">Impostazioni globali</string>
|
||||
<string name="generalText">Per utilizzare questo programma è necessario impostare delle regole. Le regole contengono eventi, per esempio l\'arrivare in una determinata zona o essere in un intervallo temporale. Dopo che è stato fatto, fare clic sul pulsante ON / OFF nella home-page.</string>
|
||||
<string name="generalSettings">Impostazioni generali</string>
|
||||
<string name="generalText">Per utilizzare questo programma è necessario impostare delle regole. Le regole contengono eventi, per esempio l\'arrivare in una determinata zona o essere in un intervallo temporale. Dopo che è stato fatto, fare clic sul pulsante ON/OFF nella home-page.</string>
|
||||
<string name="getCurrentPosition">Rileva la posizione attuale</string>
|
||||
<string name="gettingListOfInstalledApplications">Sto cercando le applicazioni installate … </string>
|
||||
<string name="gettingPosition">Sto rilevando la posizione. Attendere prego ...</string>
|
||||
<string name="gettingListOfInstalledApplications">Ottenimento della lista delle applicazioni installate in corso…</string>
|
||||
<string name="gettingPosition">Sto rilevando la posizione. Attendere prego…</string>
|
||||
<string name="googleLocationChicanery">Questa applicazione accumula dati di localizzazione per abilitare regole basate sulla posizione insieme al rilevamento della velocità anche quando l\'applicazione è chiusa o non in uso.</string>
|
||||
<string name="googleLocationChicaneryOld">Questa applicazione accumula dati di localizzazione per determinare se sei attualmente ad una delle posizioni che hai creato. Inoltre, questa funzione è usata per determinare la tua velocità attuale se tale evento è stato attivato nelle regole. Questi rilevamenti sono effettuati anche quando l\'applicazione è chiusa o non in uso (ma solo se il servizio è attivato).</string>
|
||||
<string name="googleSarcasm">Grazie alla infinita sapienza di Google e continui sforzi per proteggere la nostra privacy, nelle regole che possano inviare SMS o coinvolgere lo stato del telefono, sono state rimossi eventi ed azioni rilevanti.</string>
|
||||
<string name="gpsAccuracy">Precisone del GPS [m]</string>
|
||||
<string name="gpsComparison">Comparazione GPS</string>
|
||||
<string name="hapticFeedback">Sensazione tattile (vibrazione al tocco)</string>
|
||||
<string name="headphoneAny">Oppure</string>
|
||||
<string name="googleSarcasm">Grazie alla infinita sapienza di Google e i suoi continui sforzi per proteggere la nostra privacy, nelle regole che possano inviare SMS o coinvolgere lo stato del telefono, sono state rimossi eventi ed azioni rilevanti.</string>
|
||||
<string name="gpsAccuracy">Precisione del GPS [m]</string>
|
||||
<string name="gpsComparison">Confronto del GPS</string>
|
||||
<string name="hapticFeedback">Riscontro tattile (vibra al tocco)</string>
|
||||
<string name="headphoneAny">Uno dei due</string>
|
||||
<string name="headphoneMicrophone">Microfono</string>
|
||||
<string name="headphoneSelectType">Seleziona il tipo di auricolare</string>
|
||||
<string name="headphoneSimple">Auricolari</string>
|
||||
<string name="headsetConnected">Connesso auricolare (tipo: %1$s) </string>
|
||||
<string name="headsetDisconnected">Disconnesso auticolari (tipo: %1$s) </string>
|
||||
<string name="headsetConnected">"Connessi auricolari (tipo: %1$s) "</string>
|
||||
<string name="headsetDisconnected">"Disconnessi auricolari (tipo: %1$s) "</string>
|
||||
<string name="helpTextActivityDetection">Questa funzione può identificare se sei attualmente in movimento e se sei a piedi o in che tipo di veicolo (almeno con una certa precisione). Questa funzione non è completamente integrata con Automation, ma viene fornita dai servizi di Google Play. In pratica, non fornisce un risultato si/no, ma provvede una percentuale del livello di sicurezza dello stato di movimento identificato. Puoi scegliere la percentuale raggiunta la quale Automation accetterà un resultato. Nota: 1) è possibile che più di uno stato sia identificato nello stesso momento. Per esempio, potresti star CAMMINANDO dentro a un bus in movimento; 2) Questo sensore ha bisogno di molte risorse di sistema. Se possibile, potresti considerare delle alternative, per esempio, potresti identificare che stai guidando, forzando una connessione con il vivavoce.</string>
|
||||
<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 cooridinate 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="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">Una regola sarà eseguita quando tutti i suoi eventi risultano veri. Basta che solo un evento non sia eseguito e la regola non si attiverà. Per eseguire una regola in base a diversi eventi individuali, è sufficiente creare regole specifiche per ogni set di eventi.</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="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>
|
||||
@ -242,15 +243,15 @@
|
||||
<string name="httpAttemptsTimeoutTitle">Timeout [sec]</string>
|
||||
<string name="httpAttemptsTitle">Numero di tentativi HTTP</string>
|
||||
<string name="importConfiguration">Importa configurazione</string>
|
||||
<string name="importExportExplanation">Quando si clicca su importa o esporta, stai scegliendo la direzione in cui i files vengono importati o esportati. Quando si procede alla esportazione, files esistenti potrebbero essere sovrascritti.</string>
|
||||
<string name="importExportExplanation">Quando si clicca su importa o esporta, stai scegliendo la direzione in cui i file vengono importati o esportati. Quando si procede alla esportazione, file esistenti potrebbero essere sovrascritti.</string>
|
||||
<string name="importNumberFromContacts">Importa numero dai contatti</string>
|
||||
<string name="incoming">in arrivo</string>
|
||||
<string name="incomingAdjective">in arrivo</string>
|
||||
<string name="incomingCallFrom">Chiamata in arrivo da %1$s.</string>
|
||||
<string name="incomingCallsRingtone">Suoneria per le chiamate in arrivo</string>
|
||||
<string name="insideOrOutsideTimeFrames">Dentro o fuori questi intervalli?</string>
|
||||
<string name="intentDataComment">Se il tuo parametro è di tipo Uri e usi \"IntentData\" come nome (in maiuscole o minuscole non importa), il parametro non verrà aggiunto come parametro normale con putExtra(), ma sarà aggiunto all\'intento con setData().</string>
|
||||
<string name="invalidDevice">Dispositivo non valido.</string>
|
||||
<string name="intentDataComment">Se il tuo parametro è di tipo Uri e usi \"IntentData\" come nome (in maiuscole o minuscole non importa), il parametro non verrà aggiunto come parametro normale con putExtra(), ma sarà aggiunto all\'Intent con setData().</string>
|
||||
<string name="invalidDevice">Dispositivo non valido</string>
|
||||
<string name="invalidPoiName">Nome posizione non valido.</string>
|
||||
<string name="invalidProfileName">Nome profilo non valido.</string>
|
||||
<string name="is">è</string>
|
||||
@ -266,15 +267,15 @@
|
||||
<string name="locationEngineDisabledLong">Purtroppo la tua posizione non può più essere determinata. Un debito di gratitudine è dovuto a Google per la sua infinita saggezza e amabilità.\\n\\nVediamo di approfondire questo problema. A partire da Android 10 è stato introdotto un nuovo permesso che è necessario per determinare la vostra posizione in secondo piano (che naturalmente è necessario per un\'app come questa). Sebbene la consideri una buona idea in generale, i problemi che comporta per gli sviluppatori non lo sono.\\n\\nWQuando si sviluppa un\'app si può cercare di qualificarsi per questo permesso rispettando un catalogo di requisiti. Purtroppo le nuove versioni della mia app sono state rifiutate per un periodo di tre mesi. Ho soddisfatto tutti questi requisiti, mentre il merdoso supporto allo sviluppo di Google ha affermato che non l\'ho fatto. Dopo aver dato loro la prova che l\'ho fatto - ho ottenuto una risposta del tipo \"non posso più aiutarti\". Alla fine mi sono arreso. \\n\\nDi conseguenza, la versione di Google Play non può più usare la tua posizione come trigger. La mia unica opzione alternativa sarebbe stata quella di avere questa applicazione rimossa dal negozio interamente.\\n\\nNe sono molto dispiaciuto, ma ho fatto del mio meglio per discutere con un \"supporto\" che ripetutamente non ha superato il test di Turing.\n\\nInfine, c\'è una buona notizia: puoi ancora avere tutto!\\n\\nAutomation è adesso una applicazione di codice aperto e si può trovare su F-Droid. Questo è un app store che si preoccupa davvero della tua privacy - invece che fingere di farlo. Basta fare il backup del tuo file di configurazione, disinstallare questa app, installarla di nuovo da F-Droid e ripristinare il tuo file di configurazione - fatto.\\n\\nClicca qui per maggiori informazioni:</string>
|
||||
<string name="locationEngineDisabledShort">La localizzazione non può più essere determinata. Clicca qui per scoprirne il perché.</string>
|
||||
<string name="locationEngineNotActive">Ricerca posizione non attiva.</string>
|
||||
<string name="lockSoundChanges">Blocca il cambio dei suoni:</string>
|
||||
<string name="logFileMaxSizeSummary">Massima dimensione del file di log in Megabyte. Tronca quando la dimensione eccede.</string>
|
||||
<string name="lockSoundChanges">Blocca il cambio dei suoni</string>
|
||||
<string name="logFileMaxSizeSummary">Massima dimensione del file di log in Megabyte. Tronca quando la dimensione eccede.</string>
|
||||
<string name="logFileMaxSizeTitle">Massima dimensione del file di log [Mb]</string>
|
||||
<string name="logLevelSummary">Dettaglio del file di Log (1=minimo, 5=massimo)</string>
|
||||
<string name="logLevelSummary">Dettaglio del file di log (1=minimo, 5=massimo)</string>
|
||||
<string name="logLevelTitle">Dettaglio del file di log</string>
|
||||
<string name="logServiceStopping">Arrestando il servizio.</string>
|
||||
<string name="logServiceStopping">Arresto del servizio in corso.</string>
|
||||
<string name="longitude">Longitudine</string>
|
||||
<string name="mainScreenPermissionNote">Automation richiede ulteriori autorizzazioni per funzionare correttamente. Clicca su questo testo per saperne di più e richiederle.</string>
|
||||
<string name="manageLocations">Creare o modificare posizioni</string>
|
||||
<string name="manageLocations">Crea o modifica posizioni</string>
|
||||
<string name="matching">abbinando</string>
|
||||
<string name="messageNotShownAgain">Questo messaggio non sarà mostrato più.</string>
|
||||
<string name="minimumDistanceChangeForGpsLocationUpdates">Minimo intervallo (in metri) per aggiornare le posizioni GPS </string>
|
||||
@ -283,24 +284,24 @@
|
||||
<string name="monday">Lunedì</string>
|
||||
<string name="moreSettings">Altre impostazioni</string>
|
||||
<string name="moveDown">Sposta verso il basso</string>
|
||||
<string name="moveUp">Sposta versol\'alto</string>
|
||||
<string name="muteTextToSpeechDuringCallsSummary">Disabilitazione del TextToSpeach durante le chiamate</string>
|
||||
<string name="muteTextToSpeechDuringCallsTitle">Silenziare durante le chiamate</string>
|
||||
<string name="moveUp">Sposta verso l\'alto</string>
|
||||
<string name="muteTextToSpeechDuringCallsSummary">Silenzia il TextToSpeach durante le chiamate</string>
|
||||
<string name="muteTextToSpeechDuringCallsTitle">Silenzia durante le chiamate</string>
|
||||
<string name="name">Nome</string>
|
||||
<string name="needLocationPermForWifiList">L\'elenco delle wifi a cui il tuo dispositivo è stato connesso potrebbe essere usato per determinare i luoghi in cui sei stato. Questo è il motivo per cui il permesso di localizzazione è richiesto per caricare l\'elenco delle wifi. Se vuoi essere in grado di sceglierne una dalla lista devi concedere questo permesso. Altrimenti puoi ancora inserire il nome della tua wifi manualmente.</string>
|
||||
<string name="needLocationPermForWifiList">L\'elenco delle reti wifi a cui il dispositivo è stato connesso potrebbe essere usato per determinare i luoghi in cui sei stato. Questo è il motivo per cui il permesso di localizzazione è richiesto per caricare l\'elenco delle wifi. Se vuoi essere in grado di sceglierne una dalla lista devi concedere questo permesso. Altrimenti puoi ancora inserire il nome della tua wifi manualmente.</string>
|
||||
<string name="networkAccuracy">Precisione della rete [m]</string>
|
||||
<string name="newId">Nuovo ID:</string>
|
||||
<string name="newNfcId">Scrivi un nuovo ID NFC</string>
|
||||
<string name="newThreadRules">Nuova discussione</string>
|
||||
<string name="newsOptIn">Vuoi ricevere delle notizie su questa app (solo quelle importanti) nella schermata principale? Queste vengono scaricate dal sito web dello sviluppatore. Non ci sarà nessuna notifica intrusiva, solo un testo nella schermata principale quando apri l\'app.</string>
|
||||
<string name="nfcApplyTagToRule">Applicazione della etichetta alla regola</string>
|
||||
<string name="nfcBringTagIntoRange">Portare una etichetta NFC nel campo d\'azione.</string>
|
||||
<string name="nfcBringTagIntoRangeToRead">Avvicina la etichetta da leggere.</string>
|
||||
<string name="nfcApplyTagToRule">Applica etichetta alla regola</string>
|
||||
<string name="nfcBringTagIntoRange">Porta una etichetta NFC nel campo d\'azione.</string>
|
||||
<string name="nfcBringTagIntoRangeToRead">Avvicina l\'etichetta da leggere.</string>
|
||||
<string name="nfcEnterValidIdentifier">Inserire un nome valido per l\'etichetta (come "Porta d\'ingresso di casa").</string>
|
||||
<string name="nfcNoNdefIntentBut">Nessun intento NFC NDEF, ma</string>
|
||||
<string name="nfcNoNdefIntentBut">Nessun Intent NFC NDEF, ma</string>
|
||||
<string name="nfcNoTag">Nessuna etichetta rilevata.</string>
|
||||
<string name="nfcNotSupportedInThisAndroidVersionYet">NFC non ancora supportato in questa versione di Android.</string>
|
||||
<string name="nfcReadTag">Lettura ID dall\'etichetta</string>
|
||||
<string name="nfcReadTag">Leggi ID dall\'etichetta</string>
|
||||
<string name="nfcTag">Etichetta NFC</string>
|
||||
<string name="nfcTagDataNotUsable">Dati dell\'etichetta non leggibili, si prega di riscriverli.</string>
|
||||
<string name="nfcTagDiscovered">Etichetta rilevata</string>
|
||||
@ -310,15 +311,15 @@
|
||||
<string name="nfcTagWrittenSuccessfully">Scrittura dell\'etichetta eseguita con successo.</string>
|
||||
<string name="nfcUnsupportedEncoding">Codifica non supportata:</string>
|
||||
<string name="nfcValueNotSuitable">Valore memorizzato non adatto.</string>
|
||||
<string name="nfcWriteTag">Scrittura etichetta</string>
|
||||
<string name="nfcWriteTag">Scrivi etichetta</string>
|
||||
<string name="no">No</string>
|
||||
<string name="noApplicableFilesFoundInDirectory">Nessun file adatto è stato trovato in quella directory.</string>
|
||||
<string name="noChangeSelectedProfileDoesntMakeSense">Nessun cambiamento selezionato. Questo profilo non ha senso.</string>
|
||||
<string name="noChangeSelectedProfileDoesntMakeSense">Nessun cambiamento selezionato, questo profilo non ha senso.</string>
|
||||
<string name="noDataChangedReadingAnyway">Sembra che non siano state salvate le modifiche. Tuttavia ci possono essere stati cambiamenti in memoria che devono essere rimossi. Devo ricaricare il file.</string>
|
||||
<string name="noDevice">nessun dispositivo</string>
|
||||
<string name="noFileManageInstalled">Nessun esploratore di files installato.</string>
|
||||
<string name="noFileManageInstalled">Nessun esploratore di file installato.</string>
|
||||
<string name="noFilesImported">Non è stato possibile importare nessun file.</string>
|
||||
<string name="noKnownWifis">Non c\'è nessuna wifi conosciuta sul tuo dispositivo.</string>
|
||||
<string name="noKnownWifis">Non c\'è nessuna rete wifi nota sul dispositivo.</string>
|
||||
<string name="noMapsApplicationFound">Non trovo un navigatore installato.</string>
|
||||
<string name="noPoisDefinedShort">Nessuna posizione indicata.</string>
|
||||
<string name="noPoisSpecified">Non hai specificato nessuna posizione. È necessario.</string>
|
||||
@ -329,8 +330,8 @@
|
||||
<string name="none">nessuno</string>
|
||||
<string name="notAllFilesImported">Non è stato possibile importare tutti i file rilevanti.</string>
|
||||
<string name="notification">Notifica</string>
|
||||
<string name="notificationAppears">La notifica appare</string>
|
||||
<string name="notificationDisappears">La notifica non appare</string>
|
||||
<string name="notificationAppears">La notifica compare</string>
|
||||
<string name="notificationDisappears">La notifica scompare</string>
|
||||
<string name="notificationRingtone">Tono di notifica</string>
|
||||
<string name="notificationTriggerExplanation">Questo evento risponderà ad altre applicazioni che aprono notifiche nell\'area apposita (o che vengono chiuse). Puoi specificare un\'altra applicazione da cui la notifica deve provenire. Se non lo fai, saranno incluse le notifiche da qualsiasi altra applicazione. Puoi anche specificare le stringhe che devono o non devono essere presenti nel titolo o nel corpo della notifica. Il confronto fatto non è sensibile alle maiuscole e alle minuscole.</string>
|
||||
<string name="number">numero</string>
|
||||
@ -345,17 +346,17 @@
|
||||
<string name="packageName">Nome del pacchetto</string>
|
||||
<string name="parameterName">Nome parametro</string>
|
||||
<string name="parameterType">Tipo parametro</string>
|
||||
<string name="parameterValue">Valore</string>
|
||||
<string name="parameterValue">Valore del parametro</string>
|
||||
<string name="password">Password</string>
|
||||
<string name="permissionsExplanation">Spiegazione delle autorizzazioni richieste</string>
|
||||
<string name="permissionsExplanationGeneric">L\'applicazione si sta eseguendo in modalità limitata ed ha pertanto disattivato alcune funzioni. Per funzionare appieno richiede ulteriori permessi. Se vuoi utilizzare tutte le funzionalità è necessario concedere i permessi nelle successive finestre o alcune regole non potranno essere eseguite. Di seguito ti viene data una spiegazione dei permessi richiesti. Clicca su \"Continua\" quando sei pronto a procedere.</string>
|
||||
<string name="permissionsExplanationGeneric">Si sta eseguendo l\'applicazione in modalità limitata, pertanto alcune funzioni sono disattivate. Per funzionare appieno richiede ulteriori permessi. Se vuoi utilizzare tutte le funzionalità, è necessario concedere i permessi nelle successive finestre altrimenti alcune regole non potranno essere eseguite. Di seguito ti viene data una spiegazione dei permessi richiesti. Clicca su \"Continua\" quando sei pronto a procedere.</string>
|
||||
<string name="permissionsExplanationSmall">Per attivare la funzione che hai appena tentato di utilizzare, sono necessari ulteriori permessi. Clicca \"Continua\" per richiederli.</string>
|
||||
<string name="permissionsTitle">Permessi necessari</string>
|
||||
<string name="permissionsTitle">Sono necessari dei permessi</string>
|
||||
<string name="phoneCall">Chiamata</string>
|
||||
<string name="phoneDirection">Seleziona se\nentrante o uscente</string>
|
||||
<string name="phoneNrReplacementError">Non ho l\'ultimo numero di telefono e quindi non posso inserirlo nella variabile.</string>
|
||||
<string name="phoneNumber">Numero di telefono</string>
|
||||
<string name="phoneNumberExplanation">È possibile inserire un numero di telefono specifico, ma non è necessario. Se vuoi specificarne uno, puoi sceglierlo dalla tua rubrica o inserirlo manualmente. Inoltre puoi usare espressioni regolari. Per testare un\'espressione regolare mi piace questa pagina:</string>
|
||||
<string name="phoneNumberExplanation">È possibile inserire un numero di telefono specifico, ma non è obbligatorio. Se si vuole farlo, si può scegliere dalla rubrica o lo si può inserire manualmente. Si può anche usare un\'espressione regolare. Per testarle, mi piace questa pagina:</string>
|
||||
<string name="playSound">Esegui suono</string>
|
||||
<string name="pleaseEnterValidLatitude">Inserisci una latitudine valida.</string>
|
||||
<string name="pleaseEnterValidLongitude">Inserisci una longitudine valida.</string>
|
||||
@ -365,15 +366,15 @@
|
||||
<string name="pleaseSpecifiyTrigger">Indica almeno un evento.</string>
|
||||
<string name="poi">Posizione</string>
|
||||
<string name="poiList">Elenco delle posizioni:</string>
|
||||
<string name="poiStillReferenced">Ci sono ancora regole che fanno riferimento a questa posizione (%1$s). Quindi non posso cancellarla ancora.</string>
|
||||
<string name="poiStillReferenced">Ci sono ancora regole che fanno riferimento a questa posizione (%1$s), per cui non posso ancora cancellarla.</string>
|
||||
<string name="pois">Posizioni</string>
|
||||
<string name="positioningEngine">Modulo di posizionamento</string>
|
||||
<string name="positioningSettings">Impostazioni del posizionamento</string>
|
||||
<string name="positioningThresholds">Soglie del posizionamento</string>
|
||||
<string name="positioningWindowNotice">Se sei all\' interno di un edificio è fortemente consigliato avvicinarsi ad una finestra fino a quando è stata trovata una posizione. Diversamente la ricerca potrebbe richiedere molto tempo o non riuscire a trovare nulla.</string>
|
||||
<string name="positioningWindowNotice">Se sei all\'interno di un edificio è fortemente consigliato avvicinarsi ad una finestra fino a quando è stata trovata una posizione. Diversamente la ricerca potrebbe richiedere molto tempo o non riuscire a trovare nulla.</string>
|
||||
<string name="postsNotification">%1$s notifica dei messaggi</string>
|
||||
<string name="prefsImportError">C\'è stato un errore nell\'importazione delle preferenze.</string>
|
||||
<string name="privacy">Informativa sulla Privacy</string>
|
||||
<string name="privacy">Informativa sulla privacy</string>
|
||||
<string name="privacyConfirmationText">Sarai reindirizzato al sito dello sviluppatore per scaricare l\'informativa sulla privacy.</string>
|
||||
<string name="privacyLocationingSummary">Evita i metodi di localizzazione che possono inviare la tua posizione a un provider, ad esempio Google. Userà solo il GPS e pertanto potrebbe essere lento o non funzionare correttamente.</string>
|
||||
<string name="privacyLocationingTitle">Solo posizioni private</string>
|
||||
@ -385,20 +386,20 @@
|
||||
<string name="publishedOn">pubblicato il</string>
|
||||
<string name="radiusHasToBePositive">Il raggio deve essere un numero positivo.</string>
|
||||
<string name="radiusWithUnit">Raggio [m]</string>
|
||||
<string name="readLocation">Legge la posizione</string>
|
||||
<string name="readLocation">Leggi la posizione</string>
|
||||
<string name="referenceValueForNoiseLevelMeasurementsSummary">Valore di riferimento fisico per la misura di rumore</string>
|
||||
<string name="referenceValueForNoiseLevelMeasurementsTitle">Riferimento per la misura di rumore</string>
|
||||
<string name="rememberLastActivePoiSummary">Se sei in una posizione, riavvia il tuo dispositivo o l\'applicazione e lascia la posizione. L\'applicazione eseguirà le regole associate alla uscita dal luogo al suo prossimo avvio.</string>
|
||||
<string name="rememberLastActivePoiSummary">Se sei in una posizione, riavvia il tuo dispositivo o l\'applicazione e lascia la posizione. L\'applicazione eseguirà le regole associate all\'uscita dal luogo al suo prossimo avvio.</string>
|
||||
<string name="rememberLastActivePoiTitle">Ricorda la ultima posizione attiva</string>
|
||||
<string name="removedNotification">la notifica da %1$s rimossa</string>
|
||||
<string name="ringing">squillando</string>
|
||||
<string name="roaming">Roaming</string>
|
||||
<string name="rootExplanation">È necessario avere 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. Quando la finestra di superuser appare, bisognerà autorizzare l\'applicazione a utilizzare superuser sempre. In caso contrario, la regola non potrà funzionare quando il telefono è inattivo.</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="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>
|
||||
<string name="ruleHistory">Cronologia delle regole (dalla più recente):</string>
|
||||
<string name="ruleHistory">Cronologia delle regole (dalla più recente):</string>
|
||||
<string name="ruleLegend">Verde = abilitata, Rosso = disabilitata, Giallo = necessita ulteriori permessi</string>
|
||||
<string name="ruleList">Elenco delle regole:</string>
|
||||
<string name="ruleName">Nome della regola</string>
|
||||
@ -408,12 +409,12 @@
|
||||
<string name="rulesImportError">C\'è stato un errore nell\'importazione di regole e posizioni</string>
|
||||
<string name="rulesImportedSuccessfully">Le regole e le posizioni sono state importate con successo.</string>
|
||||
<string name="runManually">Esecuzione manuale</string>
|
||||
<string name="satisfactoryAccuracyGps">Precisione minima in metri quando la posizione è individuata via GPS</string>
|
||||
<string name="satisfactoryAccuracyNetwork">Precisione minima quando la localizzazione è effettuata in metri attraverso i ripetitori</string>
|
||||
<string name="satisfactoryAccuracyGps">Precisione sufficiente in metri quando la posizione è individuata tramite GPS</string>
|
||||
<string name="satisfactoryAccuracyNetwork">Precisione sufficiente quando la localizzazione è effettuata in metri attraverso i ripetitori</string>
|
||||
<string name="saturday">Sabato</string>
|
||||
<string name="save">Salva</string>
|
||||
<string name="savePoi">Salva posizione</string>
|
||||
<string name="saveRule">Salva Regola</string>
|
||||
<string name="saveRule">Salva regola</string>
|
||||
<string name="screenLockSoundNotice">I suoni di blocco dello schermo non possono più essere modificati automaticamente sui dispositivi con Android versione 6.0 o superiore. Qualunque cosa tu abbia impostato qui, non funzionerà in nessuna direzione.</string>
|
||||
<string name="screenLockUnlockSound">Suono di blocco/sblocco schermo</string>
|
||||
<string name="screenRotationAlreadyDisabled">Rotazione schermo già disattivata.</string>
|
||||
@ -421,22 +422,22 @@
|
||||
<string name="screenRotationDisabled">Rotazione schermo disabilitata.</string>
|
||||
<string name="screenRotationEnabled">Rotazione schermo attivata.</string>
|
||||
<string name="selectActivityToBeStarted">Seleziona l\'attività del pacchetto scelto</string>
|
||||
<string name="selectApplication">Scegli App</string>
|
||||
<string name="selectApplication">Scegli app</string>
|
||||
<string name="selectBattery">Seleziona il livello di batteria</string>
|
||||
<string name="selectConnectionOption">Seleziona una opzione di connessione.</string>
|
||||
<string name="selectDeviceFromList">uno dalla lista</string>
|
||||
<string name="selectDeviceOption">Seleziona una opzione di dispositivo</string>
|
||||
<string name="selectDeviceOption">Seleziona una opzione di dispositivo.</string>
|
||||
<string name="selectNoiseLevel">Seleziona il livello di rumore</string>
|
||||
<string name="selectOneDay">Seleziona almeno un giorno</string>
|
||||
<string name="selectPackageOfApplication">Seleziona il pacchetto dell\'applicazione</string>
|
||||
<string name="selectPoi">Seleziona la posizione</string>
|
||||
<string name="selectSoundFile">Select sound file</string>
|
||||
<string name="selectSoundFile">Scegli file musicale</string>
|
||||
<string name="selectSoundProfile">Seleziona il profilo audio</string>
|
||||
<string name="selectSpeed">Seleziona la velocità</string>
|
||||
<string name="selectToggleDirection">Seleziona acceso o spento?</string>
|
||||
<string name="selectTypeOfAction">Seleziona il tipo di azione</string>
|
||||
<string name="selectTypeOfActivity">Seleziona il tipo di attività</string>
|
||||
<string name="selectTypeOfIntentPair">Seleziona il tipo per la coppia di Intenzioni</string>
|
||||
<string name="selectTypeOfIntentPair">Seleziona il tipo per la coppia dell\'Intent</string>
|
||||
<string name="selectTypeOfTrigger">Seleziona il tipo di evento</string>
|
||||
<string name="sendTextMessage">Invia messaggio di testo</string>
|
||||
<string name="service">Servizio:</string>
|
||||
@ -444,20 +445,20 @@
|
||||
<string name="serviceNotRunning">Servizio non attivo.</string>
|
||||
<string name="serviceStarted">Il servizio di Automation è attivo.</string>
|
||||
<string name="serviceStopped">Il servizio di Automation è stato fermato.</string>
|
||||
<string name="serviceWontStart">Nessuna regola definita. Il servizio non può iniziare.</string>
|
||||
<string name="setScreenBrightness">Impostare la luminosità dello schermo</string>
|
||||
<string name="setScreenBrightnessEnterValue">Digitare la luminosità desiderata (da 0 a 100).</string>
|
||||
<string name="serviceWontStart">Nessuna regola definita. Il servizio non può essere avviato.</string>
|
||||
<string name="setScreenBrightness">Imposta la luminosità dello schermo</string>
|
||||
<string name="setScreenBrightnessEnterValue">Inserisci la luminosità voluta (da 0 a 100).</string>
|
||||
<string name="settings">Impostazioni</string>
|
||||
<string name="settingsCategoryHttp">Richieste HTTP(s)</string>
|
||||
<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>
|
||||
<string name="shareConfigAndLogFilesWithDev">Allegare i file di configurazione e di registro</string>
|
||||
<string name="showHelp">Mostra Aiuto</string>
|
||||
<string name="shareConfigAndLogFilesWithDev">Allega i file di configurazione e di registro</string>
|
||||
<string name="showHelp">Mostra aiuto</string>
|
||||
<string name="showIcon">Mostra icona</string>
|
||||
<string name="showIconWhenServiceIsRunning">Mostra una icona quando il servizio è attivo (nasconderla funziona solo in versioni inferiori ad Android 7). Se hai una versione superiore, vai alle impostazioni di sistema, quindi Automation, e poi seleziona Notifiche, dove potrai disabilitare la \"Service notification\".</string>
|
||||
<string name="showOnMap">Mostra sulla mappa</string>
|
||||
@ -466,7 +467,7 @@
|
||||
<string name="soundModeNormal">Normale</string>
|
||||
<string name="soundModeSilent">Silenziosa</string>
|
||||
<string name="soundModeVibrate">Vibrazione</string>
|
||||
<string name="soundSettings">Impostazioni del suono</string>
|
||||
<string name="soundSettings">Impostazioni audio</string>
|
||||
<string name="speedMaximumTime">Tempo in minuti</string>
|
||||
<string name="speedMaximumTimeBetweenLocations">Tempo massimo tra la rilevazione di due posizioni per determinarne la velocità.</string>
|
||||
<string name="start">Inizio</string>
|
||||
@ -477,19 +478,19 @@
|
||||
<string name="startAppChoiceNote">Qui hai 2 opzioni generali:\n\n1. Puoi avviare un programma selezionando un\'attività. Immagina questo come la preselezione di una specifica schermata/finestra di un\'applicazione. Tieni a mente che questo potrebbe non funzionare sempre. Questo perché le finestre di un\'applicazione potrebbero interagire tra loro, ad esempio per passarsi dei parametri. Quando si avvia direttamente una schermata specifica la cui\n\ninterazione non è ancora avvenuta, la finestra potrebbe chiudersi istantaneamente (quindi non verrà mai mostrata). Ma puoi provare comunque! Inserisci un percorso di attività manualmente, ma si raccomanda di usare il pulsante \"Seleziona\". Se decidi di inserirlo manualmente, digita il nome del pacchetto dell\'applicazione nel campo superiore e il percorso completo dell\'attività in quello inferiore.\n\n2. Selezione per azione. Invece che selezionare una specifica finestra puoi anche avviare un programma per mezzo di un\'azione. Questo è come gridare "Vorrei xyz" e se c\'è un\'applicazione installata che è registrata con quella funzione, verrà avviata. Un buon esempio sarebbe avviare un navigatore - potresti anche averne più di uno installato (ma uno è di solito quello di default). Devi inserire questo manualmente, mentre PackageName è opzionale qui. Tieni a mente che nessuna variabile sarà risolta. Se vuoi avviare la fotocamera per esempio usando \"MediaStore.ACTION_IMAGE_CAPTURE\" non funzionerà. Devi dare un\'occhiata alla documentazione di Android e usare invece il valore effettivo di questa variabile che in questo esempio sarebbe \"android.media.action.IMAGE_CAPTURE\".</string>
|
||||
<string name="startAppSelectionType">Metodo per\nselezionare l\'applicazione</string>
|
||||
<string name="startAppStartType">Seleziona tipo di avvio</string>
|
||||
<string name="startAtSystemBoot">Avvio automatico al boot</string>
|
||||
<string name="startAtSystemBoot">Avvia all\'accensione</string>
|
||||
<string name="startAutomationAsService">Avvia Automation come un servizio</string>
|
||||
<string name="startNewThreadForRuleExecution">Iniziata nuova esecuzione per l\'attivazione della regola.</string>
|
||||
<string name="startOtherActivity">Inizia una nuova app</string>
|
||||
<string name="startScreen">Schermo di Avvio</string>
|
||||
<string name="startOtherActivity">Avvia una nuova app</string>
|
||||
<string name="startScreen">Schermata di avvio</string>
|
||||
<string name="startScreenSummary">Seleziona la schermata con cui le applicazioni si aprono all\'inizio.</string>
|
||||
<string name="startServiceAfterAppUpdate">Riavvia automaticamente il servizio se era già in esecuzione, dopo che l\'applicazione venga aggiornata.</string>
|
||||
<string name="startServiceAfterAppUpdate">Riavvia automaticamente il servizio se era già in esecuzione, dopo che l\'applicazione viene aggiornata.</string>
|
||||
<string name="startServiceAfterAppUpdateShort">Riavvio del servizio dopo l\'aggiornamento</string>
|
||||
<string name="started">avviato</string>
|
||||
<string name="starting">avviando</string>
|
||||
<string name="starting">avvio in corso</string>
|
||||
<string name="status">Stato</string>
|
||||
<string name="stillGettingPosition">Ancora in attesa della posizione</string>
|
||||
<string name="stopped">terminatoo</string>
|
||||
<string name="stopped">terminato</string>
|
||||
<string name="stopping">terminando</string>
|
||||
<string name="storeSettings">Leggere e scrivere le impostazioni</string>
|
||||
<string name="stringNotAllowed">La stringa %1$s non è permessa.</string>
|
||||
@ -515,21 +516,21 @@
|
||||
<string name="timeoutForGpsComparisonsTitle">Timeout del GPS [sec]</string>
|
||||
<string name="title">Titolo</string>
|
||||
<string name="to">a</string>
|
||||
<string name="toggableRules">Regole \"Reversibili\"</string>
|
||||
<string name="toggableRules">Regole reversibili</string>
|
||||
<string name="toggle">reversibile</string>
|
||||
<string name="toggleNotAllowed">La reversibilità al momento è disponibile solo per le regole che hanno come evento una etichetta NFC. Consulta l\'aiuto per i dettagli.</string>
|
||||
<string name="toggleRule">Regola Reversibile</string>
|
||||
<string name="toggling">Attivando</string>
|
||||
<string name="triggerCharging">Batteria sotto carica</string>
|
||||
<string name="triggerHeadsetPlugged">Connessione Auricolari</string>
|
||||
<string name="triggerHeadsetPlugged">Connessione auricolari</string>
|
||||
<string name="triggerNoiseLevel">Livello del rumore di fondo</string>
|
||||
<string name="triggerOnlyAvailableIfPlayServicesInstalled">Questa evento è valido solo se Google play service è installato.</string>
|
||||
<string name="triggerPointOfInterest">Posizione</string>
|
||||
<string name="triggerSpeed">Velocità</string>
|
||||
<string name="triggerTimeFrame">Intervallo</string>
|
||||
<string name="triggerUsb_host_connection">connessione al computer (USB)</string>
|
||||
<string name="triggers">Evento(i)</string>
|
||||
<string name="triggersComment">(tutti gli eventi devono essere validi allo stesso tempo)</string>
|
||||
<string name="triggerUsb_host_connection">Connessione al computer (USB)</string>
|
||||
<string name="triggers">Evento/i</string>
|
||||
<string name="triggersComment">(tutti gli eventi devono essere validi contemporaneamente)</string>
|
||||
<string name="tuesday">Martedì</string>
|
||||
<string name="unknownError">Errore indeterminato.</string>
|
||||
<string name="until">finchè</string>
|
||||
@ -538,25 +539,25 @@
|
||||
<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>
|
||||
<string name="useAuthentication">Usa l\'autenticazione</string>
|
||||
<string name="useExistingTag">Utilizzo di una etichetta NFC esistente</string>
|
||||
<string name="useTextToSpeechOnNormalSummary">Usa TextToSpeech nel modo normale</string>
|
||||
<string name="useTextToSpeechOnNormalTitle">TTS in modo normale</string>
|
||||
<string name="useTextToSpeechOnSilentSummary">Usa TextToSpeech nel modo silenzioso</string>
|
||||
<string name="useTextToSpeechOnSilentTitle">TTS in modo silenzioso</string>
|
||||
<string name="useTextToSpeechOnVibrateSummary">Usa TextToSpeech nel modo vibrazione</string>
|
||||
<string name="useTextToSpeechOnVibrateTitle">TTS in modo vibrazione</string>
|
||||
<string name="useExistingTag">Usa una etichetta NFC esistente</string>
|
||||
<string name="useTextToSpeechOnNormalSummary">Usa TextToSpeech nella modalità normale</string>
|
||||
<string name="useTextToSpeechOnNormalTitle">TTS in modalità normale</string>
|
||||
<string name="useTextToSpeechOnSilentSummary">Usa TextToSpeech nella modalità silenziosa</string>
|
||||
<string name="useTextToSpeechOnSilentTitle">TTS in modalità silenzioso</string>
|
||||
<string name="useTextToSpeechOnVibrateSummary">Usa TextToSpeech nella modalità vibrazione</string>
|
||||
<string name="useTextToSpeechOnVibrateTitle">TTS in modalità vibrazione</string>
|
||||
<string name="username">Nome utente</string>
|
||||
<string name="usingNewThreadForRuleExecution">Iniziata nuova esecuzione per l\'attivazione della regola.</string>
|
||||
<string name="version">Versione %1$s.</string>
|
||||
<string name="vibrateWhenRinging">Vibrazione alla chiamata</string>
|
||||
<string name="vibrateWhenRinging">Vibra alla chiamata</string>
|
||||
<string name="volumeAlarms">Allarmi sonori</string>
|
||||
<string name="volumeMusicVideoGameMedia">Multimedia (musica, video …)</string>
|
||||
<string name="volumeRingtoneNotifications">Toni e notifiche</string>
|
||||
<string name="volumeTest">Calibratura audio</string>
|
||||
<string name="volumeTest">Calibrazione audio</string>
|
||||
<string name="volumeCalibrationExplanation">Per calcolare il valore del rumore di fondo in dB è necessario specificare un valore di riferimento fisico (si prega di leggere Wikipedia per ulteriori informazioni). Questo valore è probabilmente diverso per ogni telefono. Trascinare il cursore per modificare il valore di riferimento fisico definito. Più alto è il valore di riferimento e più basso sarà il valore misurato in dB. Misurazioni costanti saranno effettuate ogni %1$s secondi ed i risultati visualizzati sotto. Premere indietro quando hai trovato un valore adeguato.</string>
|
||||
<string name="volumes">Volumi</string>
|
||||
<string name="waitBeforeNextAction">Attesa prima della azione successiva</string>
|
||||
<string name="waitBeforeNextActionEnterValue">Inserisci il valore della pausa tra tra un\'azione e la successiva (millisecondi).</string>
|
||||
<string name="waitBeforeNextAction">Attendi prima della azione successiva</string>
|
||||
<string name="waitBeforeNextActionEnterValue">Inserisci il valore della pausa tra un\'azione e la successiva (millisecondi).</string>
|
||||
<string name="wakeupDevice">Sveglia il dispositivo</string>
|
||||
<string name="wakeupDeviceValue">Inserisci per quanto tempo il dispositivo deve rimanere attivo (millisecondi). Usa 0 per i valori standard.</string>
|
||||
<string name="warning">Attenzione</string>
|
||||
@ -571,13 +572,13 @@
|
||||
<string name="wifi">wifi</string>
|
||||
<string name="wifiConnection">Connessione wifi</string>
|
||||
<string name="wifiName">Nome wifi</string>
|
||||
<string name="wifiState">Stato Wifi</string>
|
||||
<string name="wifiState">Stato wifi</string>
|
||||
<string name="with">con</string>
|
||||
<string name="withLabel">con etichetta</string>
|
||||
<string name="writeLogFile">Memorizza un file di log</string>
|
||||
<string name="yes">Si</string>
|
||||
<string name="clone">Clonare</string>
|
||||
<string name="state">Status</string>
|
||||
<string name="yes">Sì</string>
|
||||
<string name="clone">Clona</string>
|
||||
<string name="state">Stato</string>
|
||||
<string name="urlToTriggerExplanation">Questa funzione NON apre un navigatore, ma attiva un indirizzo URL in secondo piano. Puoi usarla per esempio per mandare dei comandi al tuo sistema di domotica.</string>
|
||||
<string name="automaticUpdateCheck">Controlla aggiornamenti</string>
|
||||
<string name="automaticUpdateCheckSummary">Applicabile solo alla versione APK.</string>
|
||||
@ -586,62 +587,62 @@
|
||||
<string name="locationFoundInaccurate">È stato possibile solo trovare una ubicazione con una precisione limitata. Potrebbe non funzionare in maniera affidabile. Il raggio minimo per le ubicazioni è di %1$d m.</string>
|
||||
<string name="noLocationCouldBeFound">Nessuna posizione è stata trovata dopo un tempo di attesa di %1$s seconds.</string>
|
||||
<string name="pleaseGiveBgLocation">Nella schermata successiva vai su permessi, poi posizione. Lì seleziona \"Consenti sempre\" per permettere ad Automation di determinare la tua posizione in secondo piano.</string>
|
||||
<string name="tones">Suonerias</string>
|
||||
<string name="tones">Suonerie</string>
|
||||
<string name="dnd">Non disturbare</string>
|
||||
<string name="deviceOrientation">Orientamento</string>
|
||||
<string name="tolerance">Tolleranza</string>
|
||||
<string name="deviceOrientation">Orientamento del dispositivo</string>
|
||||
<string name="tolerance">Tolleranza (0–180)</string>
|
||||
<string name="orientationAzimuth">Azimut:</string>
|
||||
<string name="actionSetBluetoothTethering">Bluetooth Tethering</string>
|
||||
<string name="actionTurnBluetoothTetheringOn">accendere Bluetooth Tethering</string>
|
||||
<string name="actionTurnBluetoothTetheringOff">spegnere Bluetooth Tethering</string>
|
||||
<string name="vibrate">Vibrare</string>
|
||||
<string name="test">Provare</string>
|
||||
<string name="actionSetBluetoothTethering">Tethering Bluetooth</string>
|
||||
<string name="actionTurnBluetoothTetheringOn">attiva Tethering Bluetooth</string>
|
||||
<string name="actionTurnBluetoothTetheringOff">disattiva Tethering Bluetooth</string>
|
||||
<string name="vibrate">Vibra</string>
|
||||
<string name="test">Prova</string>
|
||||
<string name="VibrateExplanation">Inserisci una durata per la vibrazione, seguita da una virgola e poi la durata di una pausa. Si possono concatenare tutte le vibrazioni che si vogliono. Per esempio, lo schema 100,500,500,1000,100 farà vibrare il dispositivo per 100ms, aspetterà 500ms, vibrerà 500ms, aspetterà 1000ms e vibrerà 100ms. Se pensi che una vibrazione non venga eseguita, prova ad aumentare la pausa precedente.</string>
|
||||
<string name="pleaseEnterValidVibrationPattern">Si prega di inserire uno schema di vibrazione valido.</string>
|
||||
<string name="top">Superiore</string>
|
||||
<string name="bottom">Inferiore</string>
|
||||
<string name="top">In alto</string>
|
||||
<string name="bottom">In basso</string>
|
||||
<string name="tabsPlacement">Posizione della barra delle schede</string>
|
||||
<string name="tabsPlacementSummary">Scegli dove posizionare la barra delle schede.</string>
|
||||
<string name="wifiApi30">Dato che Google ha rovinato un\'altra parte ancora di Android, a partire con le API 30, solo le reti wifi attualmente visibili possono essere visualizzate, non tutte quelle a cui il tuo dispositivo si è collegato.</string>
|
||||
<string name="smsDialogNotice">Se non hai mai usato una azione \"invia-sms\" prima, Android potrebbe visualizzare una finestra di conferma addizionale, chiedendo di permettere l\'invio di messaggi. Dovrai mettere il segno di spunta su \"permetti sempre"\ e confermare se vuoi che questa attività funzioni in secondo piano. Si raccomanda l\'esecuzione manuale la prima volta solo per far apparire questa finestra.</string>
|
||||
<string name="silentTriggersDnd">ATTENZIONE: La modalità silenziosa spesso attiva quella \"non disturbare\" sui dispositivi più nuovi. Se questo avviene sul tuo, ti raccomando di usare la modalità normale invece di abbassare tutti i volumi a zero.</string>
|
||||
<string name="silentTriggersDnd">ATTENZIONE: La modalità silenziosa spesso attiva quella \"non disturbare\" sui dispositivi più nuovi. Se questo è vero, è raccomandabile usare la modalità normale abbassando tutti i volumi a zero.</string>
|
||||
<string name="miscellaneous">Altro</string>
|
||||
<string name="dndOff">Spegni \"Non disturbare\"</string>
|
||||
<string name="dndOff">Disattiva \"Non disturbare\"</string>
|
||||
<string name="dndPriority">Permetti notifiche prioritarie</string>
|
||||
<string name="dndAlarms">Permetti allarmi</string>
|
||||
<string name="dndNothing">Non permettere nulla</string>
|
||||
<string name="dndRemarks">La configurazione dettagliata (come il permesso di fare chiamate, scegliere numeri specifici, etc.) può solo essere effettuata dalle impostazioni di sistema.</string>
|
||||
<string name="permissionsRequiredNotAvailable">Le tue regole hanno bisogno di permessi che non possono essere richiesti da questa versione di Automation.</string>
|
||||
<string name="automationNotificationsIgnored">Se non scegli una applicazione specifica, ma scegli \"Qualsiasi applicazione\", le notifiche provenienti da Automation saranno ignorate per evitare che vada in ripetizione.</string>
|
||||
<string name="automationNotificationsIgnored">Se non scegli una applicazione specifica, ma scegli \"Qualsiasi applicazione\", le notifiche provenienti da Automation saranno ignorate per evitare cicli infiniti.</string>
|
||||
<string name="repeatEveryXseconds">Ripeti ogni x secondi</string>
|
||||
<string name="repeatEveryXsecondsWithVariable">ripeti ogni %1$s secondi</string>
|
||||
<string name="enterRepetitionTime">Devi inserire un valore positivo e non decimale per il tempo di ripetizione.</string>
|
||||
<string name="elementSkipped">Un elemento del file di configurazione non può essere letto. Il file potrebbe essere stato create da una versione più recente del programma.</string>
|
||||
<string name="donate">Donazioni</string>
|
||||
<string name="btTetheringNotice">È stato confermato che questa caratteristica funziona fino ad Android 8.0. Da qualche versione superiore ha cessato di funzionare, ma dato che non ho sufficienti dispositivi fisici, non posso identificare quale sia. Su Android 11 sicuramente non funziona più. Se hai una versione intermedia, per favore fammi sapere se funziona per il tuo dispositivo, o no. </string>
|
||||
<string name="btTetheringNotice">È stato confermato che questa caratteristica funziona fino ad Android 8.0. Da qualche versione superiore ha cessato di funzionare, ma dato che non ho sufficienti dispositivi fisici, non posso identificare quale. Su Android 11 sicuramente non funziona più. Se hai una versione intermedia, per favore fammi sapere se funziona o no sul tuo dispositivo.</string>
|
||||
<string name="notice">Avviso</string>
|
||||
<string name="orientationPitch">Inclinazione:</string>
|
||||
<string name="orientationRoll">Rotazione:</string>
|
||||
<string name="orientationPitch">Beccheggio:</string>
|
||||
<string name="orientationRoll">Rollio:</string>
|
||||
<string name="enterValidNumbersIntoAllFields">Inserire un numero valido in tutti i campi.</string>
|
||||
<string name="deviceOrientationExplanation">When you move your device the below numbers will update. What you can see there, is the current orientation of your device measured in degrees. If it is in the desired orientation, click the apply button to copy the current values to the desired fields.\nBecause reaching this exact orientation ever again is highly unlikely you must also enter a tolerance. The is amount of degrees to which the orientation can deviate in either direction. 15° will result in a total angle of 30°, 15° in every direction.\nIf you only care about one specific axis, specify a tolerance of 180° for the two other ones.</string>
|
||||
<string name="wouldCurrentlyApply">Si applica attualmente?</string>
|
||||
<string name="deviceIsInCertainOrientation">il dispositivo si trova in una certa orientazione</string>
|
||||
<string name="toleranceOf180OnlyAllowedIn2Fields">Una tolleranza di 180 è permessa solo per 2 campi di tolleranza, non tutti e tre. Altrimenti l\'attività si applicherebbe SEMPRE.</string>
|
||||
<string name="deviceOrientationExplanation">Muovendo il dispositivo i numeri qua sotto cambieranno, dove si può vedere l\'orientamento attuale del dispositivo, misurata in gradi. Se è nell\'orientamento voluto, si può cliccare il tasto applica per copiare i valori attuali nei campi desiderati. Siccome è impossibile ritrovare questo orientamento preciso, è necessario indicare una tolleranza. Questa indica il numero di gradi di deviazione dell\'orientamento accettati in entrambe le direzioni. 15° comporta un angolo complessivo di 30°, 15° in ogni direzione. Se solo un asse è di interesse, allora specifica una tolleranza di 180° per gli altri due.</string>
|
||||
<string name="wouldCurrentlyApply">Sarebbe applicabile?</string>
|
||||
<string name="deviceIsInCertainOrientation">il dispositivo si trova in un certo orientamento</string>
|
||||
<string name="toleranceOf180OnlyAllowedIn2Fields">Una tolleranza di 180 è permessa solo per 2 campi, non tutti e tre, altrimenti l\'evento sarebbe SEMPRE verificato.</string>
|
||||
<string name="unknown">sconosciuto</string>
|
||||
<string name="orientation">Orientazione</string>
|
||||
<string name="orientation">Orientamento</string>
|
||||
<string name="triggerWrong">C\'è qualcosa di errato con questo evento. Non può essere caricato correttamente.</string>
|
||||
<string name="turnScreenOnOrOff">Accendi/Spegni lo schermo</string>
|
||||
<string name="turnScreenOnOrOff">Accendi o spegni lo schermo</string>
|
||||
<string name="turnScreenOn">accendi lo schermo</string>
|
||||
<string name="turnScreenOff">spegni lo schermo</string>
|
||||
<string name="mustApply">Si deve applicare</string>
|
||||
<string name="explanationDeviceOrientationDirection">Se la casella di controllo è spuntata, significa che il dispositivo deve essere nell\'orientamento specificato. Se non è spuntata, qualsiasi orientamento che NON corrisponde ai tuoi criteri andrà bene. </string>
|
||||
<string name="mustApply">Deve verificarsi</string>
|
||||
<string name="explanationDeviceOrientationDirection">Se la casella di controllo è spuntata, allora il dispositivo deve essere nell\'orientamento specificato. Se non è spuntata, qualsiasi orientamento che NON rientra nelle specifiche andrà bene. </string>
|
||||
<string name="deviceOrientationTimeAcceptIntervalTitle">Frequenza del segnale</string>
|
||||
<string name="deviceOrientationTimeAcceptIntervalSummary">Accetta nuovi segnali di movimento ogni x millisecondi </string>
|
||||
<string name="deviceOrientationSettings">Impostazioni di orientamento del dispositivo</string>
|
||||
<string name="android.permission.BIND_DEVICE_ADMIN">Amministrazione dispositivo</string>
|
||||
<string name="deviceAdminNote">I permessi di amministratore del dispositivo sono necessari per almeno 1 delle regole che hai creato.</string>
|
||||
<string name="profileTriggerCheckSettings">Se questa casella di controllo non è disabilitata, verrà selezionata solo se il profilo selezionato è stato l\'ultimo ad essere attivato. Non importa se le impostazioni relative all\'audio sono state modificate esternamente.\nTuttavia, se la casella di controllo è abilitata, le impostazioni audio correnti devono essere definite nel profilo. ATTENZIONE: il controllo del file della suoneria non è ancora supportato.</string>
|
||||
<string name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS">Escludere dall\'ottimizzazione della batteria</string>
|
||||
<string name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS">Escludi dall\'ottimizzazione della batteria</string>
|
||||
<string name="recommendedForBetterReliability">Consigliato per una migliore affidabilità</string>
|
||||
<string name="needsToBeActive">Deve essere attivo</string>
|
||||
<string name="checkSettings">Controlla le impostazioni</string>
|
||||
@ -665,40 +666,109 @@
|
||||
<string name="info">Informazioni</string>
|
||||
<string name="profileWasNotFound">Il profilo utilizzato in questa regola non sembra più esistere. Il primo in ordine alfabetico è stato selezionato.</string>
|
||||
<string name="comparisonCaseInsensitive">I confronti non distinguono fra maiuscole e minuscole</string>
|
||||
<string name="closeNotifications">Chiudi notifica(e)</string>
|
||||
<string name="notificationCloseActionExplanation">Se non specifichi alcun criterio, questa azione chiuderà TUTTE le notifiche. Quindi si consiglia di specificare almeno i criteri per almeno una applicazione, titolo o testo.</string>
|
||||
<string name="profileWarning">Le impostazioni che modifichi in questa sezione possono far sì che tu non possa più notare certe cose dal tuo telefono. Possono perfino silenziare la sveglia. Quindi, qualunque cosa tu faccia, ti consigliamo di provarlo.</string>
|
||||
<string name="closeNotifications">Chiudi notifica/e</string>
|
||||
<string name="notificationCloseActionExplanation">Se è non specificato alcun criterio, questa azione chiuderà TUTTE le notifiche. Quindi si consiglia di specificare almeno i criteri per almeno una applicazione, titolo o testo.</string>
|
||||
<string name="profileWarning">Le impostazioni che si possono modificare in questa sezione possono impedirti di notare certe cose del tuo telefono. Si può perfino silenziare la sveglia, quindi, qualunque cosa tu faccia, ti consigliamo di provarlo.</string>
|
||||
<string name="ifString">se</string>
|
||||
<string name="actionMediaControlNotice">Tieni presente che questa azione potrebbe non funzionare con TUTTI i lettori là fuori. E anche se lo facesse, non tutti i pulsanti funzionerebbero necessariamente.</string>
|
||||
<string name="actionMediaControlNotice">Tieni presente che questa azione potrebbe non funzionare con TUTTI i lettori esistenti. E anche fosse, non è detto che tutti i pulsanti funzionerebbero.</string>
|
||||
<string name="pleaseSelectActionValue">Si prega di selezionare un\'azione!</string>
|
||||
<string name="stop">stop</string>
|
||||
<string name="android.permission.MEDIA_CONTENT_CONTROL">Controllo riproduzione multimediale</string>
|
||||
<string name="next">prossimo</string>
|
||||
<string name="android.permission.MEDIA_CONTENT_CONTROL">Controlla riproduzione multimediale</string>
|
||||
<string name="next">successivo</string>
|
||||
<string name="previous">precedente</string>
|
||||
<string name="pause">pausa</string>
|
||||
<string name="play">riproduci</string>
|
||||
<string name="playPause">attiva/disattiva riproduzione/pausa</string>
|
||||
<string name="playPause">commuta riproduzione/pausa</string>
|
||||
<string name="selectCommand">Seleziona comando</string>
|
||||
<string name="actionMediaControl">Controllare la riproduzione multimediale</string>
|
||||
<string name="featureCeasedToWorkLastWorkingAndroidVersion">A causa della saggezza infinita di Google, l\'ultima versione di Android su cui questa funzione è nota per funzionare è %1 $s. Puoi configurarlo, ma probabilmente non avrà alcun effetto.</string>
|
||||
<string name="actionMediaControl">Controlla la riproduzione multimediale</string>
|
||||
<string name="featureCeasedToWorkLastWorkingAndroidVersion">A causa della sconfinata saggezza di Google, l\'ultima versione di Android su cui questa funzione si sa che funziona è la %1$s. Puoi configurarla, ma probabilmente non avrà alcun effetto.</string>
|
||||
<string name="screenState">Stato dello schermo</string>
|
||||
<string name="selectDesiredState">Seleziona lo stato desiderato</string>
|
||||
<string name="unlocked">Sbloccato</string>
|
||||
<string name="unlocked">sbloccato</string>
|
||||
<string name="off">spento</string>
|
||||
<string name="on">attivo</string>
|
||||
<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>
|
||||
<string name="selectParameters">Selezionare i parametri</string>
|
||||
<string name="selectParameters">Seleziona i parametri</string>
|
||||
<string name="musicCheckFrequencyTitle">Frequenza dei controlli [ms]</string>
|
||||
<string name="musicCheckFrequencySummary">Millisecondi tra i controlli</string>
|
||||
<string name="musicPlayingDetection">Rilevamento della riproduzione musicale</string>
|
||||
<string name="profileXrequiresThis">Questo è richiesto dal profilo \"%1$s\".</string>
|
||||
<string name="locationNotWorkingOn12">Ottenere la posizione non sembra funzionare su dispositivi Android 12 al momento. Se non funziona per te, mi dispiace. Cercherò di risolvere questo problema non appena conoscerò la causa. Quindi, se cerchio rotante non smette di girare, sai perché.</string>
|
||||
<string name="locationNotWorkingOn12">Ottenere la posizione non sembra funzionare su dispositivi Android 12 al momento. Se a te non funziona, mi dispiace. Cercherò di risolvere questo problema non appena capirò la causa. Se il cerchio di caricamento non smette di girare, sai perché.</string>
|
||||
<string name="lastProfile">Ultimo profilo:</string>
|
||||
<string name="queryAllPackages">Ottenere un elenco delle applicazioni installate</string>
|
||||
<string name="queryAllPackages">Ottieni un elenco delle applicazioni installate</string>
|
||||
<string name="timeFrameDaysHint">Se si utilizza un intervallo di tempo che si estende oltre la mezzanotte, è necessario selezionare anche il giorno successivo se si desidera che il trigger venga applicato dopo la mezzanotte.</string>
|
||||
<string name="featureNotInGooglePlayVersion">Questa funzione non è più disponibile nella versione di Google Play.\\n\\nOltre di tanto in tanto Google bullizza gli sviluppatori. Se si desidera continuare a utilizzare determinate funzionalità, è necessario archiviare i documenti. Sfortunatamente c\'è una probabilità del 99% che i documenti vengano rifiutati. È più o meno come nel fumetto / film di Asterix.\\n\\nHo passato settimane a discutere con loro su casi del genere in passato, ma ho continuato a ricevere rifiuti - sia da bot che da persone che sono intelligenti come i bot. Nella sezione Posso decidere se l\'app viene rimossa completamente dal Play Store o rimuovere la funzione.\\nConsigliare l\'utilizzo della versione APK dal mio sito Web o quella di F-Droid se sono necessarie tali funzionalità.</string>
|
||||
<string name="startActivityInsertManually">Questa limitazione riguarda solo la selezione di un\'app, non l\'avvio effettivo. Quindi puoi comunque inserire manualmente il nome di un\'applicazione se lo conosci.</string>
|
||||
<string name="deviceStarts">Device starts</string>
|
||||
<string name="serviceStarts">Avvio del servizio</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>
|
||||
<string name="broadcastsShowSuggestions">Mostra suggerimenti</string>
|
||||
<string name="selectBroadcast">Seleziona trasmissione</string>
|
||||
<string name="lockedWithoutSecurity">bloccato (solo scorrimento rapido, nessun PIN)</string>
|
||||
<string name="lockedWithSecurity">bloccato (con PIN, ecc.)</string>
|
||||
<string name="lockedCommentScreenMustBeOff">Qualsiasi stato di blocco verrà rilevato solo se lo schermo è spento.</string>
|
||||
<string name="emailPretext">Se hai un problema, suggerimenti o domande, scrivi qualcosa nell\'e-mail. Non inviarmi semplicemente i file con il testo predefinito. Ignorerò tutto ciò che li riguarda a meno che non siamo già in una conversazione.</string>
|
||||
<string name="broadcastExplanation">Questa azione consente di inviare un broadcast all\'interno del sistema di messaggi di Android. Questo non è visibile all\'utente, ma le applicazioni che si sono registrate a determinati broadcast possono rispondere.</string>
|
||||
<string name="sendBroadcast">Invia broadcast</string>
|
||||
<string name="enterBroadcast">Immettere un\'azione per il broadcast.</string>
|
||||
<string name="explanationBroadcastTrigger">La maggior parte degli eventi sul telefono verrà \"pubblicata\" trasmettendoli in tutto il sistema operativo.\nAd esempio, l\'attivazione/disattivazione della modalità aereo attiverà tale trasmissione. Queste trasmissioni non sono automaticamente visibili / udibili, ma se un\'applicazione (come l\'automazione) è interessata può collegarsi a loro. Quando si verificano, riceverà una notifica e può reagire.\n\nÈ possibile definire qui un evento di trasmissione per il quale l\'applicazione attenderà. Puoi inserirlo manualmente, copiarlo e incollarlo da qualche parte o sceglierne uno dall\'elenco dei suggerimenti. Poiché questo trigger è pensato per essere e rimanere molto flessibile, non posso fornirti spiegazioni per gli articoli.\n\nL\'elenco dei suggerimenti non pretende di essere completo. Si prega di visitare l\'URL sottostante per dare un\'occhiata alla documentazione Android.\nInoltre qualsiasi app può inviare eventi personalizzati che ovviamente non saranno presenti nella documentazione Android.\n\nMolti broadcast richiedono autorizzazioni specifiche per funzionare. Provo a richiedere le autorizzazioni dove so che servono. Se ritieni che sia necessaria un\'autorizzazione per l\'azione che hai inserito, fammi sapere.\n\nNon ricevuto significa che non è capitato un broadcast di questo tipo da quando il servizio è stato avviato. La risposta a certi parametri è in fase di sviluppo.</string>
|
||||
<string name="logsExplanation">Per evitare di sprecare lo spazio di archiviazione, i registri non vengono salvati per impostazione predefinita. Quindi, se hai un problema, attiva prima le impostazioni di accesso e imposta il livello di registro su 5, poi riproduci il problema. Solo allora i registri possono essere allegati.</string>
|
||||
<string name="directionStringDoesNotContain">non contiene</string>
|
||||
<string name="path">Percorso</string>
|
||||
<string name="runExecutable">Esegui script o eseguibile</string>
|
||||
<string name="parameters">Parametri</string>
|
||||
<string name="chooseExecutable">Scegli eseguibile</string>
|
||||
<string name="runAsRoot">Esegui con root</string>
|
||||
<string name="selectValidExecutable">Scegli un file eseguibile valido.</string>
|
||||
<string name="fileNotExecutable">Questo file non è eseguibile.</string>
|
||||
<string name="usingRoot">usando il root</string>
|
||||
<string name="tetheringActive">il tethering è attivo</string>
|
||||
<string name="tetheringNotActive">il tethering non è attivo</string>
|
||||
<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">È 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>
|
||||
</resources>
|
||||
|
3
app/src/main/res/values-land/dimens.xml
Normal file
3
app/src/main/res/values-land/dimens.xml
Normal file
@ -0,0 +1,3 @@
|
||||
<resources>
|
||||
<dimen name="fab_margin">48dp</dimen>
|
||||
</resources>
|
@ -30,7 +30,7 @@
|
||||
<string name="logServiceStopping">Service stoppen.</string>
|
||||
<string name="stillGettingPosition">Nog steeds positie aan het verkrijgen.</string>
|
||||
<string name="lastRule">Laatste regel:</string>
|
||||
<string name="at">Bij</string>
|
||||
<string name="at">bij</string>
|
||||
<string name="service">Service:</string>
|
||||
<string name="getCurrentPosition">Huidige locatie ophalen</string>
|
||||
<string name="savePoi">Sla locatie op</string>
|
||||
@ -268,7 +268,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 +500,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 +517,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>
|
||||
@ -543,7 +544,7 @@
|
||||
<string name="enterValidAction">Voer een geldige actie in</string>
|
||||
<string name="enterPackageName">Voer een geldige pakketnaam in.</string>
|
||||
<string name="state">Staat</string>
|
||||
<string name="phoneNumberExplanation">U kunt een specifiek telefoonnummer opgeven, maar dat hoeft niet. Als u er een wilt opgeven, kunt u er een uit uw adresboek kiezen of het handmatig invoeren. Daarnaast kun je reguliere expressies gebruiken. Om een reguliere expressie te testen is deze pagina behulpzaam:</string>
|
||||
<string name="phoneNumberExplanation">U kunt een specifiek telefoonnummer opgeven (van de bellende partner), maar dat hoeft niet. Als u er een wilt opgeven, kunt u er een uit uw adresboek kiezen of het handmatig invoeren. Daarnaast kun je reguliere expressies gebruiken. Om een reguliere expressie te testen is deze pagina behulpzaam:</string>
|
||||
<string name="importConfiguration">Import configuration</string>
|
||||
<string name="exportConfiguration">Export configuration</string>
|
||||
<string name="moreSettings">Meer instellingen</string>
|
||||
@ -627,14 +628,14 @@
|
||||
<string name="orientationRoll">Rollen:</string>
|
||||
<string name="enterValidNumbersIntoAllFields">Voer geldige nummers in alle velden in.</string>
|
||||
<string name="deviceOrientation">Apparaat oriëntatie</string>
|
||||
<string name="notice">Bemerken</string>
|
||||
<string name="notice">Opmerking</string>
|
||||
<string name="tolerance">Tolerantie (0-180)</string>
|
||||
<string name="actionSetBluetoothTethering">Bluetooth Tethering</string>
|
||||
<string name="enterPhoneNumberAndText">Voer een telefoonnummer en een sms in.</string>
|
||||
<string name="actionTurnBluetoothTetheringOn">Schakel Bluetooth Tethering in</string>
|
||||
<string name="actionTurnBluetoothTetheringOff">Schakel Bluetooth Tethering uit</string>
|
||||
<string name="deviceIsInCertainOrientation">het apparaat zich in een bepaalde richting bevindt</string>
|
||||
<string name="wouldCurrentlyApply">Zou momenteel van toepassing zijn?</string>
|
||||
<string name="deviceIsInCertainOrientation">het apparaat bevindt zich in een bepaalde richting</string>
|
||||
<string name="wouldCurrentlyApply">Is de huidige van toepassing?</string>
|
||||
<string name="btTetheringNotice">Deze functie werkt naar verluidt tot Android 8.0. Vanaf een hogere versie werkt het niet meer, maar door een gebrek aan fysieke apparaten kan ik niet zeggen welke dat is. Op Android 11 werkt het absoluut niet meer. Als je een versie tussendoor hebt, laat het me dan weten of het werkt of niet.</string>
|
||||
<string name="deviceOrientationExplanation">Wanneer u uw apparaat verplaatst, worden de onderstaande nummers bijgewerkt. Wat je daar kunt zien, is de huidige oriëntatie van je apparaat gemeten in graden. Als het zich in de gewenste richting bevindt, klikt u op de knop Toepassen om de huidige waarden naar de gewenste velden te kopiëren.\nOmdat het zeer onwaarschijnlijk is dat u deze exacte oriëntatie ooit nog bereikt, moet u ook een tolerantie invoeren. Dit is het aantal graden waarin de oriëntatie in beide richtingen kan afwijken. 15° resulteert in een totale hoek van 30°, 15° in elke richting.\nAls u slechts om één specifieke as geeft, geef dan een tolerantie van 180° op voor de twee andere.</string>
|
||||
<string name="toleranceOf180OnlyAllowedIn2Fields">Een tolerantie van 180 is alleen toegestaan voor 2 tolerantievelden, niet alle 3. Anders zou de trigger ALTIJD van toepassing zijn.</string>
|
||||
@ -665,9 +666,9 @@
|
||||
<string name="notificationCloseActionExplanation">Als u geen criteria opgeeft, worden met deze actie ALLE meldingen gesloten. Het is dus aan te raden om in ieder geval criteria te specificeren voor minimaal 1 van de toepassing, titel of tekst.</string>
|
||||
<string name="closeNotifications">Melding(en) sluiten</string>
|
||||
<string name="comparisonCaseInsensitive">Vergelijkingen worden gedaan case-INsensitief</string>
|
||||
<string name="profileWarning">De instellingen die je hier maakt kunnen ervoor zorgen dat je bepaalde dingen niet meer van je telefoon merkt. Ze kunnen zelfs je wekker dempen. Dus wat je ook doet - het wordt aanbevolen om het te testen.</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>
|
||||
@ -699,4 +700,74 @@
|
||||
<string name="profileXrequiresThis">Profiel \"%1$s\" vereist dit.</string>
|
||||
<string name="lastProfile">Laatste profiel:</string>
|
||||
<string name="queryAllPackages">Een lijst met geïnstalleerde toepassingen ophalen</string>
|
||||
<string name="timeFrameDaysHint">Als u een tijdsbestek gebruikt dat zich uitstrekt over middernacht, moet u ook de volgende dag selecteren als u wilt dat de trigger na middernacht van toepassing is.</string>
|
||||
<string name="featureNotInGooglePlayVersion">Deze functie is niet meer beschikbaar in de Google Play-versie.\\n\\nAlles af en toe pest Google ontwikkelaars. Als u bepaalde functies wilt blijven gebruiken, moet u papierwerk indienen. Helaas is er een kans van 99% dat het papierwerk wordt afgewezen. Het is vrijwel net als in de Asterix-strip / film.\\n\\nIk heb in het verleden wekenlang met hen gediscussieerd over dergelijke gevallen, maar ik bleef afwijzingen krijgen - hetzij door bots of mensen die ongeveer net zo intelligent zijn als bots. In de ik kan kiezen tussen de app die volledig uit de Play Store wordt verwijderd of de functie verwijdert.\\n Overweeg de APK-versie van mijn website of die van F-Droid te gebruiken als je die functies nodig hebt.</string>
|
||||
<string name="startActivityInsertManually">Deze beperking heeft alleen betrekking op de selectie van een app, niet op de daadwerkelijke start. U kunt dus nog steeds handmatig de naam van een toepassing invoeren als u deze kent.</string>
|
||||
<string name="deviceIsStarting">apparaat start</string>
|
||||
<string name="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>
|
||||
<string name="lockedCommentScreenMustBeOff">Elke vergrendelde status wordt alleen gedetecteerd als het scherm is uitgeschakeld.</string>
|
||||
<string name="lockedWithSecurity">vergrendeld (met PINCODE, enz.)</string>
|
||||
<string name="lockedWithoutSecurity">vergrendeld (alleen vegen, geen pincode)</string>
|
||||
<string name="selectBroadcast">Selecteer broadcast</string>
|
||||
<string name="broadcastsShowSuggestions">Toon suggesties</string>
|
||||
<string name="broadcastReceivedTitle">Broadcast ontvangen</string>
|
||||
<string name="broadcastNotReceived">broadcast niet ontvangen</string>
|
||||
<string name="broadcastReceived">broadcast ontvangen</string>
|
||||
<string name="broadcastExplanation">Deze actie maakt het mogelijk om een uitzending te versturen via het berichtensysteem van Android. Dit is niet zichtbaar voor de gebruiker, maar applicaties die zich voor bepaalde uitzendingen hebben geregistreerd, kunnen hierop reageren.</string>
|
||||
<string name="sendBroadcast">Broadcast verzenden</string>
|
||||
<string name="enterBroadcast">Voer een uitzendactie in.</string>
|
||||
<string name="explanationBroadcastTrigger">De meeste gebeurtenissen op uw telefoon worden \"gepubliceerd\" door ze uit te zenden in het hele besturingssysteem.\nHet in- en uitschakelen van de vliegtuigmodus zal bijvoorbeeld een dergelijke uitzending activeren. Die uitzendingen zijn niet automatisch zichtbaar/hoorbaar, maar als een applicatie (zoals Automation) geïnteresseerd is, kan deze erop aansluiten. Wanneer ze zich voordoen, wordt het een melding gegeven en kan het reageren.\n\nU kunt hier een uitzendgebeurtenis definiëren waarop de toepassing zal wachten. U kunt het handmatig invoeren, ergens vandaan kopiëren en plakken of er een kiezen uit de lijst met suggesties. Omdat deze trigger bedoeld is en zeer flexibel is, kan ik u geen uitleg geven voor de items.\n\nDe lijst met suggesties beweert niet volledig te zijn. Ga naar de onderstaande URL om de Android-documentatie te bekijken.\nOok kan elke app aangepaste gebeurtenissen verzenden die natuurlijk niet in de Android-documentatie worden weergegeven.\n\nVeel uitzendingen vereisen specifieke machtigingen om te kunnen werken. Ik probeer toestemmingen te vragen waarvan ik weet dat ze nodig zijn. Als u denkt dat er een toestemming vereist is voor de actie die u hebt ingevoerd, laat het me dan weten.\n\nNiet ontvangen betekent dat er sinds de service is gestart niet meer zo\'n uitzending is geweest. Inspelen op bepaalde parameters is in ontwikkeling.</string>
|
||||
<string name="logsExplanation">Om onnodige slijtage van uw opslag te voorkomen, worden logboeken niet standaard opgeslagen. Dus als u een probleem hebt, activeer dan eerst de inloginstellingen en stel het logniveau in op 5. Reproduceer vervolgens het probleem. Alleen dan kunnen logs worden bijgevoegd.</string>
|
||||
<string name="directionStringDoesNotContain">bevat geen</string>
|
||||
<string name="runExecutable">Script of programma uitvoeren</string>
|
||||
<string name="path">Pad</string>
|
||||
<string name="parameters">Parameters</string>
|
||||
<string name="chooseExecutable">Kies programma</string>
|
||||
<string name="runAsRoot">Uitvoeren als Root</string>
|
||||
<string name="selectValidExecutable">Selecteer een geldig programma.</string>
|
||||
<string name="fileNotExecutable">Het programma kan niet worden uitgevoerd.</string>
|
||||
<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">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>
|
||||
|
||||
</resources>
|
||||
|
831
app/src/main/res/values-ru/strings.xml
Normal file
831
app/src/main/res/values-ru/strings.xml
Normal file
@ -0,0 +1,831 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="ruleActivate">Активация правила %1$s</string>
|
||||
<string name="profileActivate">Активация профиля %1$s</string>
|
||||
<string name="ruleActivateToggle">Активация правила %1$s в режиме переключения</string>
|
||||
<string name="addPoi">Добавить местоположение</string>
|
||||
<string name="addRule">Добавить правило</string>
|
||||
<string name="poiList">Список местоположений:</string>
|
||||
<string name="ruleList">Список правил:</string>
|
||||
<string name="pleaseEnterValidName">Пожалуйста, введите корректное имя.</string>
|
||||
<string name="pleaseSpecifiyTrigger">Пожалуйста, укажите хотя бы один триггер.</string>
|
||||
<string name="pleaseSpecifiyAction">Пожалуйста, укажите хотя бы одно действие.</string>
|
||||
<string name="serviceWontStart">Отсутствуют правила. Сервис не запустится</string>
|
||||
<string name="serviceStarted">Служба Automation запущена</string>
|
||||
<string name="version">Версия %1$s.</string>
|
||||
<string name="distanceBetween">Расстояние между местоположением GPS и местоположением сети составляет %1$d метров. Это знчение и плюс 1м должно быть минимальным радиусом.</string>
|
||||
<string name="positioningWindowNotice">Если вы находитесь в здании, настоятельно рекомендуется размещать устройство рядом с окном до тех пор, пока GPS координаты не будут определены. В противном случае это может занять очень много времени или вообще не будет возможным.</string>
|
||||
<string name="gettingPosition">Получение GPS координат. Пожалуйста, подождите...</string>
|
||||
<string name="yes">Да</string>
|
||||
<string name="no">Нет</string>
|
||||
<string name="pleaseEnterValidLatitude">Укажите широту.</string>
|
||||
<string name="pleaseEnterValidLongitude">Укажите долготу.</string>
|
||||
<string name="pleaseEnterValidRadius">Укажите допустимый радиус.</string>
|
||||
<string name="selectOneDay">Выберите хотя бы один день.</string>
|
||||
<string name="whatToDoWithRule">Что делать с правилом?</string>
|
||||
<string name="whatToDoWithPoi">Что делать с местоположением?</string>
|
||||
<string name="whatToDoWithProfile">Что делать с профилем?</string>
|
||||
<string name="delete">Удалить</string>
|
||||
<string name="deleteCapital">Удалить</string>
|
||||
<string name="serviceStopped">Служба Automation остановлена.</string>
|
||||
<string name="logServiceStopping">Служка останавливается.</string>
|
||||
<string name="stillGettingPosition">Всё ещё получаю GPS координаты</string>
|
||||
<string name="lastRule">Последнее правило:</string>
|
||||
<string name="at">в</string>
|
||||
<string name="service">Служба:</string>
|
||||
<string name="getCurrentPosition">Получить текущее местоположение</string>
|
||||
<string name="savePoi">Сохранить местоположение</string>
|
||||
<string name="deletePoi">Удалить местоположение</string>
|
||||
<string name="latitude">Широта</string>
|
||||
<string name="longitude">Долгота</string>
|
||||
<string name="ruleName">Имя правила</string>
|
||||
<string name="triggers">Триггер(ы)</string>
|
||||
<string name="triggersComment">и-логика (все должны применяться одновременно)</string>
|
||||
<string name="addTrigger">Добавить триггер</string>
|
||||
<string name="actions">Действие(я)</string>
|
||||
<string name="actionsComment">(будет выполнено в таком порядке)</string>
|
||||
<string name="addAction">Добавить действие</string>
|
||||
<string name="saveRule">Сохранить правило</string>
|
||||
<string name="monday">Понедельник</string>
|
||||
<string name="tuesday">Вторник</string>
|
||||
<string name="wednesday">Среда</string>
|
||||
<string name="thursday">Четверг</string>
|
||||
<string name="friday">Пятница</string>
|
||||
<string name="saturday">Суббота</string>
|
||||
<string name="sunday">Воскресенье</string>
|
||||
<string name="start">Начало</string>
|
||||
<string name="end">Конец</string>
|
||||
<string name="save">Сохранить</string>
|
||||
<string name="urlToTrigger">URL для вызова:</string>
|
||||
<string name="urlLegend">Переменные:\nВы можете использовать следующие переменные. При срабатывании они будут заменены соответствующим значением на вашем устройстве. Скобки- часть переменной.\n\n[uniqueid] - уникальный идентификатор\n[serialnr] - серийный номер(< Android 9)\n[latitude] - широта\n[longitude] - долгота\n[phonenr] - Номер последнего входящего или исходящего вызова\n[d] - День месяца, 2 цифры с начальными нулями\n[m] – Месяц, 2 цифры с начальными нулями\n[Y] - Год, 4 цифры\n[h] - 12-часовой формат часа с начальными нулями\n[H] - 24-часовой формат часа с начальными нулями\n[i] - Минуты с начальными нулями\n[s] - Секунды с начальными нулями\n[ms] - миллисекунды\n[notificationTitle] - заголовок последнего уведомления\n[notificationText] - текст последнего уведомления</string>
|
||||
<string name="wifi">Wi-Fi</string>
|
||||
<string name="activating">Активация</string>
|
||||
<string name="deactivating">Деактивация</string>
|
||||
<string name="bluetoothFailed">Не удалось запустить Bluetooth. Есть ли у этого устройства Bluetooth?</string>
|
||||
<string name="urlTooShort">URL-адрес должен содержать не менее 10 символов.</string>
|
||||
<string name="enterPhoneNumberAndText">Введите номер телефона и текстовое сообщение.</string>
|
||||
<string name="selectTypeOfTrigger">Выберите тип триггера</string>
|
||||
<string name="entering">вхождение</string>
|
||||
<string name="leaving">покидание</string>
|
||||
<string name="noPoisSpecified">Вы не создали местоположение. Начните с этого.</string>
|
||||
<string name="started">запущено</string>
|
||||
<string name="stopped">остановлено</string>
|
||||
<string name="connected">подключено</string>
|
||||
<string name="disconnected">отключено</string>
|
||||
<string name="selectPoi">Выберите местоположение</string>
|
||||
<string name="selectTypeOfAction">Выберите тип действия</string>
|
||||
<string name="selectSoundProfile">Выберите звуковой профиль</string>
|
||||
<string name="whatToDoWithTrigger">Что делать с триггером?</string>
|
||||
<string name="whatToDoWithAction">Что делать с действием?</string>
|
||||
<string name="radiusHasToBePositive">Радиус должен быть положительным числом.</string>
|
||||
<string name="poiStillReferenced">Есть еще правила, которые ссылаются на это местоположение (%1$s). Удаление невозможно.</string>
|
||||
<string name="generalSettings">Общие настройки</string>
|
||||
<string name="startAtSystemBoot">Запуск при загрузке системы</string>
|
||||
<string name="onOff">Вкл/Выкл</string>
|
||||
<string name="writeLogFile">Запись файла журнала</string>
|
||||
<string name="useTextToSpeechOnNormalSummary">Использовать TextToSpeech в обычном режиме</string>
|
||||
<string name="useTextToSpeechOnVibrateSummary">Использовать TextToSpeech в режиме вибрации</string>
|
||||
<string name="useTextToSpeechOnSilentSummary">Использовать TextToSpeech в режиме не беспокоить</string>
|
||||
<string name="useTextToSpeechOnNormalTitle">TTS в обычном режиме</string>
|
||||
<string name="useTextToSpeechOnVibrateTitle">TTS в режиме вибрации</string>
|
||||
<string name="useTextToSpeechOnSilentTitle">TTS в режиме не беспокоить</string>
|
||||
<string name="positioningSettings">Настройки позиционирования</string>
|
||||
<string name="listenToWifiState">Прослушивание изменений состояния Wi-Fi, если возможно</string>
|
||||
<string name="wifiState">Состояние Wi-Fi</string>
|
||||
<string name="listenToAccelerometerState">Следить за движением устройства когда Wi-Fi недоступен</string>
|
||||
<string name="accelerometer">Акселерометр</string>
|
||||
<string name="accelerometerTimer">Использовать акселерометр через x минут без смены базовой станции сотовой станции</string>
|
||||
<string name="cellMastIdleTime">Время простоя базовой станции сотовой связи</string>
|
||||
<string name="accelerometerThresholdDescription">Порог срабатывания акселерометра</string>
|
||||
<string name="accelerometerThreshold">Порог срабатывания акселерометра</string>
|
||||
<string name="positioningThresholds">Порог срабатывания GPS координат</string>
|
||||
<string name="minimumDistanceChangeForGpsLocationUpdates">Минимальное изменение расстояния для обновления местоположения по GPS</string>
|
||||
<string name="distanceForGpsUpdate">Расстояние для обновления местоположения по GPS [м]</string>
|
||||
<string name="minimumDistanceChangeForNetworkLocationUpdates">Минимальное изменение расстояния для обновления местоположения по базовым станциям сотовой связи</string>
|
||||
<string name="distanceForNetworkUpdate">Расстояние для обновления местоположения по базовым станциям сотовой связи [м]</string>
|
||||
<string name="satisfactoryAccuracyGps">Удовлетворительная точность определения местоположения по GPS в метрах</string>
|
||||
<string name="gpsAccuracy">Точность GPS [м]</string>
|
||||
<string name="satisfactoryAccuracyNetwork">Удовлетворительная точность определения местоположения по базовым станциям сотовой связи в метрах</string>
|
||||
<string name="networkAccuracy">Точность местоположения по сотовой связи [м]</string>
|
||||
<string name="minimumTimeForLocationUpdates">Минимальное изменение времени в миллисекундах для обновления местоположения</string>
|
||||
<string name="timeForUpdate">Период обновления [миллисекунды]</string>
|
||||
<string name="soundSettings">Настройки звука</string>
|
||||
<string name="showHelp">Показать справку</string>
|
||||
<string name="rules">Правила</string>
|
||||
<string name="helpTextRules">Все триггеры в правиле связаны логикой И. Правило будет применяться только в том случае, если будут выполнены все триггеры. Если вы хотите логику ИЛИ, создайте другое правило.</string>
|
||||
<string name="timeframes">Временные интервалы</string>
|
||||
<string name="helpTextTimeFrame">Если вы указываете правило с временными интервалами, у вас есть два варианта. Вы можете выбрать между началом ИЛИ окончанием временного интервала. Правило срабатывает только один раз. Поэтому, если вы создадите правило с "начало временного интервала" в качестве триггера и позволите ему изменить ваш звуковой профиль на вибрацию, это не означает, что телефон автоматически перейдет в обычный режим, когда временной интервал закончится. Если вам это необходимо,создайте другое правило с другим временным интервалом.</string>
|
||||
<string name="helpTextSound">На главном экране есть возможность заблокировать изменение уровня громкости вызова сконфигурированными правилами, например, вы можете быть в ситуации или месте, где необходим обычный режим звука, но в настоящее время его использовать нельзя. Эта функция автоматически отключится по истечении заданного времени. Нажмите кнопку +, чтобы задать необходимый период времени. После включения, вы можете вручную выключить его с помощью кнопки переключения (и таким образом снова включить изменения громкости звука).</string>
|
||||
<string name="toggableRules">Переключаемые правила</string>
|
||||
<string name="helpTextToggable">Правила имеют флаг "Переключаемый". Это означает, что если правило выполняется, а затем те же самые триггеры применяются снова, то правило будет выполняться в противоположное состояние, если это возможно. В настоящее время это будет происходить только с NFC-метками. Если вы поднесете телефон к NFC-метке повтороно и с ними будет связано правило с флагом “Переключаемый”, оно будет выполнять противоположное текущему состоянию действие, например, Wi-Fi будет отключен, если он в данный момент включен.</string>
|
||||
<string name="helpTextProcessMonitoring">Если вы создадите правило мониторинга процесса, приложение будет проверять наличие этого процесса каждые x секунд (период может быть изменён в настройках). Увеличение периода мониторинга приведёт к задержке срабатывания правила, но частый мониторинг повышает потребление батареи. И Android не отправляет широковещательные сообщения такого рода.</string>
|
||||
<string name="helpTitleEnergySaving">Энергосбережение</string>
|
||||
<string name="speedMaximumTimeBetweenLocations">Максимальное время между 2 местоположениями для определения скорости.</string>
|
||||
<string name="speedMaximumTime">Время в минутах</string>
|
||||
<string name="exceeds">превышает</string>
|
||||
<string name="dropsBelow">падает ниже</string>
|
||||
<string name="settingsCategoryNoiseLevelMeasurements">Измерение уровня шума</string>
|
||||
<string name="timeBetweenNoiseLevelMeasurementsSummary">Секунды между измерениями уровня шума</string>
|
||||
<string name="timeBetweenNoiseLevelMeasurementsTitle">Секунды между измерениями уровня шума</string>
|
||||
<string name="lengthOfNoiseLevelMeasurementsSummary">Длина в секундах для каждого измерения уровня шума</string>
|
||||
<string name="lengthOfNoiseLevelMeasurementsTitle">Длина каждого измерения уровня шума</string>
|
||||
<string name="referenceValueForNoiseLevelMeasurementsSummary">Физическое эталонное значение для измерения уровня шума</string>
|
||||
<string name="referenceValueForNoiseLevelMeasurementsTitle">Эталон для измерения шума</string>
|
||||
<string name="logLevelSummary">Уровень журнала (1 = минимум, 5 = максимум)</string>
|
||||
<string name="logLevelTitle">Уровень журнала</string>
|
||||
<string name="ruleActive">Правило активно</string>
|
||||
<string name="triggerPointOfInterest">Местоположение </string>
|
||||
<string name="triggerTimeFrame">Временной интервал</string>
|
||||
<string name="triggerCharging">Зарядка аккумулятора</string>
|
||||
<string name="triggerUsb_host_connection">USB-подключение к компьютеру</string>
|
||||
<string name="triggerSpeed">Скорость</string>
|
||||
<string name="triggerNoiseLevel">Уровень фонового шума</string>
|
||||
<string name="actionSetWifi">Wi-Fi</string>
|
||||
<string name="actionSetBluetooth">Bluetooth</string>
|
||||
<string name="actionSetUsbTethering">Режим USB-модема</string>
|
||||
<string name="actionSetWifiTethering">Режим Wi-Fi-точки доступа</string>
|
||||
<string name="actionSetBluetoothTethering">Режим Bluetooth-модема</string>
|
||||
<string name="actionSetDisplayRotation">Вращение дисплея</string>
|
||||
<string name="actionTurnWifiOn">включить Wi-Fi</string>
|
||||
<string name="actionTurnWifiOff">выключить Wi-Fi</string>
|
||||
<string name="actionTurnBluetoothOn">включить Bluetooth</string>
|
||||
<string name="actionTurnBluetoothOff">выключить Bluetooth</string>
|
||||
<string name="actionTriggerUrl">Вызвать URL-адрес</string>
|
||||
<string name="actionChangeSoundProfile">Изменение звукового профиля</string>
|
||||
<string name="actionTurnUsbTetheringOn">включить режим USB-модема</string>
|
||||
<string name="actionTurnUsbTetheringOff">выключить режим USB-модема</string>
|
||||
<string name="actionTurnWifiTetheringOn">включить Wi-Fi точку доступа</string>
|
||||
<string name="actionTurnWifiTetheringOff">выключить Wi-Fi точку доступа</string>
|
||||
<string name="actionTurnBluetoothTetheringOn">включить режим Bluetooth-модема</string>
|
||||
<string name="actionTurnBluetoothTetheringOff">выключить режим Bluetooth-модема</string>
|
||||
<string name="actionTurnAirplaneModeOn">включить режим полета</string>
|
||||
<string name="actionTurnAirplaneModeOff">выключить режим полета</string>
|
||||
<string name="actionEnableScreenRotation">включить поворот экрана</string>
|
||||
<string name="actionDisableScreenRotation">отключить поворот экрана</string>
|
||||
<string name="screenRotationEnabled">Поворот экрана включен.</string>
|
||||
<string name="screenRotationDisabled">Поворот экрана отключен.</string>
|
||||
<string name="screenRotationAlreadyEnabled">Поворот экрана уже был включен.</string>
|
||||
<string name="screenRotationAlreadyDisabled">Поворот экрана уже был отключен.</string>
|
||||
<string name="noPoisDefinedShort">Местоположения не созданы.</string>
|
||||
<string name="activePoi">Активное местоположение:</string>
|
||||
<string name="closestPoi">Ближайшее местоположение:</string>
|
||||
<string name="overview">Обзор</string>
|
||||
<string name="poi">Местоположение </string>
|
||||
<string name="pois">Местоположения</string>
|
||||
<string name="helpTextPoi">Местоположение состоит из GPS-координат и радиуса. Поскольку позиционирование через вышки сотовой связи довольно неточно (но быстро и эффективно), не указывайте радиус слишком маленьким. Приложение предложит вам минимальный радиус при создании нового местоположения.</string>
|
||||
<string name="serviceNotRunning">Служба не работает.</string>
|
||||
<string name="general">Общая информация</string>
|
||||
<string name="generalText">Чтобы использовать эту программу, вы должны настроить правила. Они содержат триггеры, например, вхождение в зону местоположения или начало временного интервала. После того, как это будет сделано, нажмите кнопку включения/выключения на главном экране.</string>
|
||||
<string name="failedToTriggerBluetooth">Не удалось запустить Bluetooth. Есть ли у этого устройства Bluetooth?</string>
|
||||
<string name="startServiceAfterAppUpdate">Запустить службу автоматически после обновления приложения, если она была запущена ранее.</string>
|
||||
<string name="startServiceAfterAppUpdateShort">Запустить службу после обновления</string>
|
||||
<string name="wifiConnection">Подключение Wi-Fi</string>
|
||||
<string name="wifiName">Имя Wi-Fi</string>
|
||||
<string name="enterWifiName">Введите имя Wi-Fi. Оставьте пустым для любого Wi-Fi.</string>
|
||||
<string name="cancel">Отмена</string>
|
||||
<string name="starting">запуск</string>
|
||||
<string name="stopping">остановка</string>
|
||||
<string name="connecting">подключение</string>
|
||||
<string name="disconnecting">отсоединение</string>
|
||||
<string name="exceeding">превышение</string>
|
||||
<string name="droppingBelow">опускание ниже</string>
|
||||
<string name="connectedToWifi">подключено к Wi-Fi \"%1$s\"</string>
|
||||
<string name="disconnectedFromWifi">отключено от Wi-Fi \"%1$s\"</string>
|
||||
<string name="anyWifi">любой Wi-Fi</string>
|
||||
<string name="cantStopIt">Невозможно остановить.</string>
|
||||
<string name="settingsCategoryHttp">HTTP(s) Запросы</string>
|
||||
<string name="httpAcceptAllCertificatesTitle">Принять все сертификаты</string>
|
||||
<string name="httpAcceptAllCertificatesSummary">Пропустить проверку валидности SSL-сертификатов (рекомендуется не активировать эту функцию)</string>
|
||||
<string name="httpAttemptsSummary">Количество попыток в случае ошибок подключения для HTTP-запросов</string>
|
||||
<string name="httpAttemptsTitle">Количество попыток HTTP</string>
|
||||
<string name="httpAttemptsTimeoutSummary">Тайм-аут для HTTP-запросов [секунды]</string>
|
||||
<string name="httpAttemptsTimeoutTitle">Тайм-аут [сек]</string>
|
||||
<string name="httpAttemptGapSummary">Пауза перед очередной попыткой [секунды]</string>
|
||||
<string name="httpAttemptGapTitle">Пауза [сек]</string>
|
||||
<string name="runManually">Запуск вручную</string>
|
||||
<string name="serviceHasToRunForThat">Для этого служба должна быть запущена.</string>
|
||||
<string name="gpsComparison">Сравнение GPS</string>
|
||||
<string name="gpsComparisonTimeoutStop" translatable="false">Stopping comparison GPS measurement due to timeout.</string>
|
||||
<string name="timeoutForGpsComparisonsTitle">Тайм-аут GPS [сек]</string>
|
||||
<string name="timeoutForGpsComparisonsSummary">Максимальное время получения GPS-местоположения в секундах. По истечении этого времени будет применено последнее известное местоположение.</string>
|
||||
<string name="startingGpsTimeout" translatable="false">Starting GPS timeout.</string>
|
||||
<string name="forcedLocationUpdate" translatable="false">Forced location update</string>
|
||||
<string name="forcedLocationUpdateLong" translatable="false">Due to timeout in comparison measurement the last best location will be applied.</string>
|
||||
<string name="rememberLastActivePoiSummary">Если вы находитесь в каком-то местоположении, перезагружаете устройство или приложение и покидаете это местоположение, при старте приложение будет запускать правила, связанные с выходом из этого местоположения.</string>
|
||||
<string name="rememberLastActivePoiTitle">Запомнить последнее активное местоположение</string>
|
||||
<string name="muteTextToSpeechDuringCallsTitle">Отключение звука во время звонков</string>
|
||||
<string name="muteTextToSpeechDuringCallsSummary">Отключение звука TextToSpeech во время звонков</string>
|
||||
<string name="anotherPoiByThatName">Местоположение с таким названием уже существует.</string>
|
||||
<string name="anotherRuleByThatName">Правило с таким названием уже существует.</string>
|
||||
<string name="startOtherActivity">Запуск другого приложения</string>
|
||||
<string name="selectApplication">Выберите приложение</string>
|
||||
<string name="selectPackageOfApplication">Выберите пакет приложения</string>
|
||||
<string name="selectActivityToBeStarted">Выберите Activity выбранного пакета</string>
|
||||
<string name="errorStartingOtherActivity">Ошибка запуска Activity</string>
|
||||
<string name="anotherAppIsRunning">Другое приложение запускается/останавливается</string>
|
||||
<string name="settingsCategoryProcessMonitoring">Мониторинг процесса</string>
|
||||
<string name="timeBetweenProcessMonitoringsTitle">Период мониторингама процесса в секундах</string>
|
||||
<string name="timeBetweenProcessMonitoringsSummary">Чем меньше, тем выше расход батареи</string>
|
||||
<string name="refreshingProcessList" translatable="false">Refreshing process list.</string>
|
||||
<string name="processes">Процессы</string>
|
||||
<string name="startingPeriodicProcessMonitoringEngine" translatable="false">Starting periodic process monitoring engine.</string>
|
||||
<string name="processMonitoring">Мониторинг процесса</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">Настройки</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">Настройки стерты.</string>
|
||||
<string name="settingsSetToDefault">Настройки установлены по умолчанию.</string>
|
||||
<string name="batteryLevel">Уровень заряда батареи</string>
|
||||
<string name="selectSpeed">Выберите скорость</string>
|
||||
<string name="selectBattery">Выберите уровень заряда батареи</string>
|
||||
<string name="applyingSettingsAndRules" translatable="false">Applying settings, rules and locations.</string>
|
||||
<string name="privacy">Политика конфиденциальности</string>
|
||||
<string name="privacyConfirmationText">На вашем устройстве будет запущен браузер и загрузится политика конфиденциальности с веб-сайта разработчика.</string>
|
||||
<string name="waitBeforeNextAction">Ожидание перед следующим действием</string>
|
||||
<string name="wakeupDevice">Пробудить устройство</string>
|
||||
<string name="waitBeforeNextActionEnterValue">Введите значение в миллисекундах, сколько времени необходимо ждать перед следующеим действием.</string>
|
||||
<string name="wakeupDeviceValue">Введите значение в миллисекундах как долго устройство должно бодрствовать. 0 для значений по умолчанию.</string>
|
||||
<string name="enterAPositiveValidNonDecimalNumber">Введите положительное действительное не десятичное число.</string>
|
||||
<string name="moveUp">Переместить вверх</string>
|
||||
<string name="moveDown">Переместить вниз</string>
|
||||
<string name="cantMoveUp">Невозможно переместить элемент вверх. Он уже находится на самом верху.</string>
|
||||
<string name="cantMoveDown">Невозможно переместить элемент вниз. Он уже в самом низу.</string>
|
||||
<string name="wifiNameSpecifiedCheckingThat" translatable="false">Wifi name specified, checking that.</string>
|
||||
<string name="wifiNameMatchesRuleWillApply" translatable="false">Wifi name matches. Rule will apply.</string>
|
||||
<string name="noWifiNameSpecifiedAnyWillDo" translatable="false">No wifi name specified, any will do.</string>
|
||||
<string name="ruleCheckOf" translatable="false">RuleCheck of %1$s</string>
|
||||
<string name="airplaneMode">Режим полета</string>
|
||||
<string name="activate">Активировать</string>
|
||||
<string name="deactivate">Деактивировать</string>
|
||||
<string name="airplaneModeSdk17Warning">Начиная с версии Android 4.2 эта функция работает только в том случае, если на вашем устройстве есть root-права.</string>
|
||||
<string name="triggerUrlReplacementPositionError" translatable="false">You asked for a position to be added to your URL. Unfortunately at this point I do not have any location, yet.</string>
|
||||
<string name="addIntentValue">Добавить Intent пару</string>
|
||||
<string name="parameterName">Имя параметра</string>
|
||||
<string name="parameterValue">Значение параметра</string>
|
||||
<string name="parameterType">Тип параметра</string>
|
||||
<string name="selectTypeOfIntentPair">Выберите тип для Intent пары.</string>
|
||||
<string name="enterNameForIntentPair">Введите имя для Intent пары.</string>
|
||||
<string name="enterValueForIntentPair">Введите значение для Intent пары.</string>
|
||||
<string name="whatToDoWithIntentPair">Что делать с парой?</string>
|
||||
<string name="gettingListOfInstalledApplications">Получение списка установленных приложений...</string>
|
||||
<string name="timeFrameWhichDays">В какие дни?</string>
|
||||
<string name="insideOrOutsideTimeFrames">Внутри или вне этих временных интервалов?</string>
|
||||
<string name="selectToggleDirection">Включить или выключить?</string>
|
||||
<string name="name">Имя</string>
|
||||
<string name="radiusWithUnit">Радиус [м]</string>
|
||||
<string name="status">Статус</string>
|
||||
<string name="actionDataConnection">Подключение для передачи данных</string>
|
||||
<string name="actionSetDataConnectionOn">включить мобильные данные</string>
|
||||
<string name="actionSetDataConnectionOff">выключить мобильные данные</string>
|
||||
<string name="roaming">Роуминг</string>
|
||||
<string name="activated">активировано</string>
|
||||
<string name="deactivated">деактивировано</string>
|
||||
<string name="until">пока</string>
|
||||
<string name="application">Приложение</string>
|
||||
<string name="is"></string>
|
||||
<string name="phoneCall">Телефонный звонок</string>
|
||||
<string name="with">с</string>
|
||||
<string name="phoneNumber">Номер телефона</string>
|
||||
<string name="enterPhoneNumberBlankForAny">Введите номер телефона. Оставьте пустым для любого номера телефона.</string>
|
||||
<string name="enterPhoneNumber">Введите номер телефона.</string>
|
||||
<string name="phoneDirection">Выберите вызов\nнаправление</string>
|
||||
<string name="any">Любой</string>
|
||||
<string name="incoming">входящий</string>
|
||||
<string name="outgoing">исходящий</string>
|
||||
<string name="incomingAdjective">входящий</string>
|
||||
<string name="outgoingAdjective">исходящий</string>
|
||||
<string name="anyNumber">любой номер</string>
|
||||
<string name="number">номер</string>
|
||||
<string name="nfcTag">NFC-метка</string>
|
||||
<string name="closeTo">рядом с</string>
|
||||
<string name="withLabel">с меткой</string>
|
||||
<string name="deviceDoesNotHaveNfc">Похоже, у этого устройства нет NFC.</string>
|
||||
<string name="nfcReadTag">Считывание идентификатора из метки</string>
|
||||
<string name="nfcWriteTag">Записать метку</string>
|
||||
<string name="nfcEnterValidIdentifier">Введите название метки (например, "Входная дверь").</string>
|
||||
<string name="nfcTagWrittenSuccessfully">Метка записана успешно.</string>
|
||||
<string name="nfcTagWriteError">Ошибка записи метки. Устройство поднесено к метке?</string>
|
||||
<string name="nfcTagDiscovered">Метка обнаружена.</string>
|
||||
<string name="nfcBringTagIntoRange">Поднесите NFC-метку.</string>
|
||||
<string name="nfcTagFoundWithText">Найдена метка с текстом:</string>
|
||||
<string name="nfcUnsupportedEncoding">Неподдерживаемая кодировка:</string>
|
||||
<string name="nfcNoNdefIntentBut">Нет NFC NDEF Intent, но</string>
|
||||
<string name="nfcNotSupportedInThisAndroidVersionYet">NFC пока не поддерживается в этой версии Android.</string>
|
||||
<string name="cantRunRule">Не удается запустить правила.</string>
|
||||
<string name="cantDownloadTooFewRequestsInSettings" translatable="false">Can\'t download anything. Amount of http requests in settings is lower than 1.</string>
|
||||
<string name="nfcApplyTagToRule">Применить метку к правилу</string>
|
||||
<string name="nfcTagReadSuccessfully">Метка прочитана успешно.</string>
|
||||
<string name="nfcValueNotSuitable">Сохранённое значение не подходит.</string>
|
||||
<string name="nfcNoTag">Метки нет.</string>
|
||||
<string name="newNfcId">Записать новый NFC идентификатор</string>
|
||||
<string name="useExistingTag">Использовать существующую NFC-метку</string>
|
||||
<string name="newId">Новый идентификатор:</string>
|
||||
<string name="currentId">Текущий идентификатор:</string>
|
||||
<string name="nfcTagDataNotUsable">Данные метки некорректны, запишите заново.</string>
|
||||
<string name="nfcBringTagIntoRangeToRead">Поднесите метку для чтения.</string>
|
||||
<string name="toggleRule">Переключаемое правило</string>
|
||||
<string name="toggling">Переключение</string>
|
||||
<string name="toggle">переключить</string>
|
||||
<string name="overlapBetweenPois">Обнаружено перекрытие с местоположением %1$s на %2$s метров. Уменьшите радиус хотя бы на это значение.</string>
|
||||
<string name="noOverLap" translatable="false">No overlap to other locations detected.</string>
|
||||
<string name="ruleToggable" translatable="false">Rule %1$s is toggable.</string>
|
||||
<string name="ruleNotToggable" translatable="false">Rule %1$s is not suitable for toggling.</string>
|
||||
<string name="none">Нет</string>
|
||||
<string name="anyLocation">любое местоположение</string>
|
||||
<string name="invalidPoiName">Неверное имя для местоположения.</string>
|
||||
<string name="eraseSettings">Стереть настройки</string>
|
||||
<string name="defaultSettings">Настройки по умолчанию</string>
|
||||
<string name="areYouSure">Вы уверены?</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">Обнаружение активности</string>
|
||||
<string name="android.permission.ACTIVITY_RECOGNITION">Обнаружение активности</string>
|
||||
<string name="detectedActivity">Обнаруженная активность:</string>
|
||||
<string name="detectedActivityInVehicle">В транспортном средстве (автомобиль /автобус)</string>
|
||||
<string name="detectedActivityOnBicycle">На велосипеде</string>
|
||||
<string name="detectedActivityOnFoot">Пешком</string>
|
||||
<string name="detectedActivityStill">Без движения</string>
|
||||
<string name="detectedActivityUnknown">неизвестно</string>
|
||||
<string name="detectedActivityTilting">Наклон</string>
|
||||
<string name="detectedActivityWalking">Ходьба</string>
|
||||
<string name="detectedActivityRunning">Бег</string>
|
||||
<string name="detectedActivityInvalidStatus">Недопустимая активность</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">Выберите вид активности</string>
|
||||
<string name="triggerOnlyAvailableIfPlayServicesInstalled">Этот триггер доступен только, если установлены службы Google Play.</string>
|
||||
<string name="activityDetectionFrequencyTitle">Частота обнаружения активности [сек]</string>
|
||||
<string name="activityDetectionFrequencySummary">Секунды между попытками обнаружения активности.</string>
|
||||
<string name="activityDetectionRequiredProbabilityTitle">Вероятность обнаружения активности</string>
|
||||
<string name="activityDetectionRequiredProbabilitySummary">Определенность, исходя из которой активность принимается как факт.</string>
|
||||
<string name="incomingCallFrom">Входящий телефонный звонок от %1$s.</string>
|
||||
<string name="outgoingCallTo">Исходящий телефонный звонок до %1$s.</string>
|
||||
<string name="actionSpeakText">Говорить текст</string>
|
||||
<string name="textToSpeak">Текст в речь</string>
|
||||
<string name="toggleNotAllowed">В настоящее время переключение разрешено только для правил, имеющих NFC-метки в качестве триггера. Дополнительные сведения см. в справке.</string>
|
||||
<string name="errorReadingPoisAndRulesFromFile">Ошибка чтения местоположений и правил из файла.</string>
|
||||
<string name="noDataChangedReadingAnyway">Похоже, что изменения данных не были сохранены. Однако в памяти могут быть изменения, которые необходимо откатить. Перечитываю файл.</string>
|
||||
<string name="bluetoothConnection">Подключение по Bluetooth</string>
|
||||
<string name="bluetoothConnectionTo">Подключение Bluetooth к %1$s</string>
|
||||
<string name="bluetoothDisconnectFrom">Подключение Bluetooth к %1$s разорвано</string>
|
||||
<string name="bluetoothDeviceInRange">Устройство Bluetooth %1$s в диапазоне.</string>
|
||||
<string name="bluetoothDeviceOutOfRange">Устройство Bluetooth %1$s вне диапазона.</string>
|
||||
<string name="anyDevice">любое устройство</string>
|
||||
<string name="ruleDoesntApplyNotTheCorrectDeviceName" translatable="false">Rule %1$s doesn\'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">нет устройства</string>
|
||||
<string name="selectDeviceFromList">один из списка</string>
|
||||
<string name="connectionToDevice">подключение к устройству</string>
|
||||
<string name="disconnectionFromDevice">отключение от устройства</string>
|
||||
<string name="deviceInRange">устройство в диапазоне</string>
|
||||
<string name="deviceOutOfRange">устройство вне зоны досягаемости</string>
|
||||
<string name="selectDeviceOption">Выберите опцию устройства.</string>
|
||||
<string name="selectConnectionOption">Выберите вариант подключения.</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">Подключение гарнитуры</string>
|
||||
<string name="actionPlayMusic">Открыть музыкальный плеер</string>
|
||||
<string name="headsetConnected">Гарнитура (тип: %1$s) подключена</string>
|
||||
<string name="headsetDisconnected">Гарнитура (тип: %1$s) отключена</string>
|
||||
<string name="headphoneSimple">Наушники</string>
|
||||
<string name="headphoneMicrophone">Микрофон</string>
|
||||
<string name="headphoneAny">Любой</string>
|
||||
<string name="headphoneSelectType">Выберите тип гарнитуры</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">Что это такое?</string>
|
||||
<string name="atLeastRuleXisUsingY" translatable="false">At least rule \"%1$s\" is using a trigger of type \"%2$s\".</string>
|
||||
<string name="privacyLocationingTitle">Только приватное определение местоположения</string>
|
||||
<string name="privacyLocationingSummary">Избегайте методов определения местоположения, которые могут отправить ваши данные внешним компаниями, например Google. При включении будет использоваться только GPS, определение местоположения может занять больше времени или работать менее надежно.</string>
|
||||
<string name="enforcingGps" translatable="false">Private Locationing enabled, enforcing GPS use.</string>
|
||||
<string name="notEnforcingGps" translatable="false">Private Locationing not enabled, using regular provider search.</string>
|
||||
<string name="gpsMeasurement" translatable="false">GPS measurement</string>
|
||||
<string name="gpsMeasurementTimeout" translatable="false">GPS measurement stopped due to timeout.</string>
|
||||
<string name="cellMastChanged" translatable="false">Cell tower changed: %1$s</string>
|
||||
<string name="noiseDetectionHint">Если вы думаете, что обнаружение шума работает некорректно (в зависимости от значения, которое вы указываете), пожалуйста, имейте в виду, что каждое устройство отличается, поэтому вы можете изменить "Эталон для измерения шума" в настройках. См . http://en.wikipedia.org/wiki/Decibel для получения дополнительной информации. Для калибровки устройства можно использовать калибратор громкости на главном экране.</string>
|
||||
<string name="hint">Подсказка</string>
|
||||
<string name="selectNoiseLevel">Выбор уровня шума</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">Показать на карте</string>
|
||||
<string name="noMapsApplicationFound">На вашем устройстве нет приложения просмотра карт.</string>
|
||||
<string name="locationEngineNotActive">Сервис определения местоположения не активен.</string>
|
||||
<string name="addProfile">Добавить профиль</string>
|
||||
<string name="profile">Профиль</string>
|
||||
<string name="soundMode">Звуковой режим</string>
|
||||
<string name="volumes">Громкость</string>
|
||||
<string name="incomingCallsRingtone">Звуковой сигнал для входящих вызовов</string>
|
||||
<string name="notificationRingtone">Звуковой сигнал для уведомлений</string>
|
||||
<string name="hapticFeedback">Тактильная обратная связь (вибрация при прикосновении к экрану)</string>
|
||||
<string name="volumeMusicVideoGameMedia">Музыка, видео, игры и другое медиаа</string>
|
||||
<string name="volumeRingtoneNotifications">Рингтон и уведомления</string>
|
||||
<string name="volumeAlarms">Будильники</string>
|
||||
<string name="change">Изменить</string>
|
||||
<string name="audibleSelection">Звуковое уведомление при выборе (звук при выборе экрана)</string>
|
||||
<string name="screenLockUnlockSound">Звук блокировки/разблокировки экрана</string>
|
||||
<string name="vibrateWhenRinging">Вибрировать при звонке</string>
|
||||
<string name="profiles">Профили</string>
|
||||
<string name="soundModeNormal">Обычный</string>
|
||||
<string name="soundModeVibrate">Вибрация</string>
|
||||
<string name="soundModeSilent">Тихий</string>
|
||||
<string name="enterAname">Введите имя.</string>
|
||||
<string name="noChangeSelectedProfileDoesntMakeSense">Изменения не внесены. Профиль не имеет смысла.</string>
|
||||
<string name="noProfilesCreateOneFirst">В вашей конфигурации нет профилей. Сначала создайте его.</string>
|
||||
<string name="errorActivatingProfile">Ошибка активации профиля:</string>
|
||||
<string name="anotherProfileByThatName">Профиль с таким названием уже существует.</string>
|
||||
<string name="invalidProfileName">Неверное имя профиля.</string>
|
||||
<string name="errorWritingFile">Ошибка записи файла настроек.</string>
|
||||
<string name="unknownError">Неизвестная ошибка.</string>
|
||||
<string name="noWritableFolderFound">Не найдена доступная для записи папка для хранения конфигурационного файла.</string>
|
||||
<string name="usbTetheringFailForAboveGingerbread">Это, скорее всего, не будет работать, так как версия Android вашего устройства выше 2.3. Вместо этого вы можете использовать Wi-Fi точку доступа.</string>
|
||||
<string name="usingNewThreadForRuleExecution">Использование нового потока для активации правила.</string>
|
||||
<string name="startNewThreadForRuleExecution">Запуск нового потока для активации правила.</string>
|
||||
<string name="newThreadRules">Новый поток</string>
|
||||
<string name="showIcon">Показать иконку</string>
|
||||
<string name="showIconWhenServiceIsRunning">Показывать значок при запуске службы (скрытие работает только на Android версии ниже 7). Если вы находитесь на более старшей версии, перейдите в настройки системы, затем Automation, затем уведомления и отключите "Сервисное уведомление".</string>
|
||||
<string name="ruleHistory">Журнал правил (обратн. порядок):</string>
|
||||
<string name="someOptionsNotAvailableYet">Некоторые опции отключены, так как они пока не могут быть использованы. Они будут включены в более поздней версии программы.</string>
|
||||
<string name="lockSoundChanges">Блокировка изменений звука</string>
|
||||
<string name="noProfileChangeSoundLocked">Профиль не будет активирован. Последний активированный профиль был заблокирован.</string>
|
||||
<string name="currentVolume">Текущая громкость</string>
|
||||
<string name="enterValidReferenceValue">Введите эталонное значение.</string>
|
||||
<string name="volumeTest">Калибровка громкости</string>
|
||||
<string name="volumeCalibrationExplanation">Чтобы рассчитать значение дБ для мониторинга шума, необходимо указать так называемое физическое эталонное значение. Пожалуйста, прочтите Wikipedia для получения дополнительной информации. Это значение, скорее всего, разное для каждого телефона. Перетащите ползунок, чтобы изменить физическое эталонное значение. Чем выше опорное значение, тем ниже будет значение дБ. Постоянные измерения будут выполняться каждые %1$s секунд и результаты будут показаны ниже. Нажмите кнопку назад, когда найдете подходящее значение.</string>
|
||||
<string name="settingsWillTakeTime">Некоторые настройки не будут применены до изменения определенных параметров среды или перезапуска службы.</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">Для того, чтобы эта функция работала, вам нужно получить права root на своем телефоне. После этого вам нужно "запустить правило вручную", чтобы отобразить запрос на разрешение действий суперпользователя. Когда появится запрос на разрешение действий суперпользователя, необходимо ответить утвердительно (Разрешить всегда), в противном случае правило не сможет работать, когда телефон находится без присмотра.</string>
|
||||
<string name="errorWritingConfig">Ошибка записи конфигурации. Есть ли у вас доступная на запись память?</string>
|
||||
<string name="phoneNrReplacementError">Я не смог вставить последний номер телефона в переменную. У меня его нет.</string>
|
||||
<string name="username">Имя пользователя</string>
|
||||
<string name="password">Пароль</string>
|
||||
<string name="useAuthentication">Использовать аутентификацию</string>
|
||||
<string name="permissionsTitle">Необходимые разрешения</string>
|
||||
<string name="permissionsExplanation">Объяснение необходимых разрешений</string>
|
||||
<string name="ok">ОК</string>
|
||||
<string name="disabledFeatures">Отключенные функции</string>
|
||||
<string name="theFollowingPermissionsHaveBeenDenied">Следующие разрешения были отклонены:</string>
|
||||
<string name="permissionsExplanationGeneric">В настоящее время приложение работает в ограниченном режиме и некоторый функционал отключен. Для полноценного функционирования ему требуются разрешения. Если вы хотите использовать все функциональные возможности, вам необходимо предоставить разрешения в следующих диалогах предоставления прав. Если вы этого не сделаете, некоторые правила не смогут быть выполнены. Далее вам будет дано объяснение запрашиваемых разрешений. Нажмите кнопку "Продолжить", когда будете готовы продолжить.</string>
|
||||
<string name="permissionsExplanationSmall">Чтобы включить функцию, которую вы только что пытались использовать, требуется больше разрешений. Нажмите кнопку продолжить, чтобы запросить их.</string>
|
||||
<string name="continueText">продолжить</string>
|
||||
<string name="rule">Правило</string>
|
||||
<string name="storeSettings">Чтение и сохранение настроек</string>
|
||||
<string name="featuresDisabled">ПРЕДУПРЕЖДЕНИЕ: Функции отключены, Automation работает в ограниченном режиме. Нажмите здесь для получения дополнительной информации.</string>
|
||||
<string name="ruleLegend">зел.=вкл, красн.=откл, желт.=недостаточно разрешений.</string>
|
||||
<string name="systemSettingsNote1">Требуется разрешение на изменение некоторых настроек ОС (даже для таких простых вещей, как включение Bluetooth или Wi-Fi). После нажатия кнопки "Продолжить" появится окно, в котором вам нужно включить разрешение для Automation. После этого нажмите клавишу "назад" для возврата.</string>
|
||||
<string name="systemSettingsNote2">После этого во втором диалоговом окне будут запрошены дополнительные разрешения.</string>
|
||||
<string name="appRequiresPermissiontoAccessExternalStorage">Automation требует доступа к внешнему хранилищу для чтения его настроек и правил.</string>
|
||||
<string name="mainScreenPermissionNote">Automation требует большего количества разрешений для полноценного функционирования. Нажмите на этот текст, чтобы узнать больше и запросить их.</string>
|
||||
<string name="invalidDevice">Недопустимое устройство</string>
|
||||
<string name="google_app_id" translatable="false">your app id</string>
|
||||
<string name="logFileMaxSizeSummary">Максимальный размер файла журнала в мегабайтах. Будет перезаписываться при превышении размера.</string>
|
||||
<string name="logFileMaxSizeTitle">Максимальный размер файла журнала [Мб]</string>
|
||||
<string name="android.permission.READ_CALL_LOG">Чтение журнала вызовов</string>
|
||||
<string name="android.permission.READ_CALENDAR">Чтение записей календаря</string>
|
||||
<string name="android.permission.ACCESS_FINE_LOCATION">Чтение точного местоположения</string>
|
||||
<string name="android.permission.ACCESS_COARSE_LOCATION">Чтение грубого местоположения</string>
|
||||
<string name="readLocation">Чтение местоположения</string>
|
||||
<string name="android.permission.INTERNET">Отправка данных</string>
|
||||
<string name="android.permission.ACCESS_NETWORK_STATE">Чтение состояния сети устройства</string>
|
||||
<string name="android.permission.ACCESS_WIFI_STATE">Чтение состояния Wi-Fi устройства</string>
|
||||
<string name="android.permission.BLUETOOTH">Изменение настроек Bluetooth</string>
|
||||
<string name="android.permission.BLUETOOTH_ADMIN">Изменение настроек Bluetooth</string>
|
||||
<string name="android.permission.NFC">Использование модуля NFC</string>
|
||||
<string name="android.permission.VIBRATE">Пусть телефон вибрирует</string>
|
||||
<string name="android.permission.WAKE_LOCK">Держать телефон включенным</string>
|
||||
<string name="android.permission.MODIFY_AUDIO_SETTINGS">Изменение настроек звука</string>
|
||||
<string name="android.permission.RECORD_AUDIO">Запись аудио</string>
|
||||
<string name="android.permission.PROCESS_OUTGOING_CALLS">Обнаружение исходящих вызовов</string>
|
||||
<string name="android.permission.MODIFY_PHONE_STATE">Изменение настроек устройства</string>
|
||||
<string name="android.permission.READ_PHONE_STATE">Обнаружение состояния телефона</string>
|
||||
<string name="android.permission.READ_EXTERNAL_STORAGE">Хранилище для чтения</string>
|
||||
<string name="android.permission.WRITE_EXTERNAL_STORAGE">Хранилище для записи</string>
|
||||
<string name="android.permission.GET_TASKS">Обнаружение запущенных процессов</string>
|
||||
<string name="android.permission.WRITE_SETTINGS">Изменение настроек устройства</string>
|
||||
<string name="android.permission.RECEIVE_BOOT_COMPLETED">Обнаружение перезагрузки устройства</string>
|
||||
<string name="android.permission.WRITE_SECURE_SETTINGS">Изменение настроек устройства</string>
|
||||
<string name="android.permission.BATTERY_STATS">Чтение состояния батареи</string>
|
||||
<string name="android.permission.CHANGE_BACKGROUND_DATA_SETTING">Изменение подключения мобильных данных</string>
|
||||
<string name="android.permission.SEND_SMS">Отправка текстовых сообщений</string>
|
||||
<string name="android.permission.READ_CONTACTS">Чтение данных контактов</string>
|
||||
<string name="android.permission.ACCESS_NOTIFICATION_POLICY">Переопределить политику "Не беспокоить"</string>
|
||||
<string name="theseAreThePermissionsRequired">Это необходимые разрешения:</string>
|
||||
<string name="ruleXrequiresThis">Правило \"%1$s\" требует этого.</string>
|
||||
<string name="profileXrequiresThis">Профиль \"%1$s\" требует этого.</string>
|
||||
<string name="helpTextActivityDetection">Эта функция может определить, находитесь ли вы в настоящее время в пути- пешком или в каком-то типе транспортного средства (в определенной степени). Эта функция не встроена в Automation, а предоставляется сервисами Google Play. Технически это не дает результата да/нет, а возвращает процент уверенности для какого-то состояния. Вы можете настроить процентное значение, при котором Automation будет принимать результат. Два замечания: 1) Одновременно может возникнуть более 1 статуса. Например, вы можете ИДТИ внутри едущего автобуса. 2) Этот датчик относительно сильно расходует ресурс батареи. Если есть возможность, используйте альтернативы, например, для “обнаружения” того, что вы за рулём использовать наличие подключения к Bluetooth автомобиля.</string>
|
||||
<string name="sendTextMessage">Отправить текстовое сообщение</string>
|
||||
<string name="textToSend">Текст для отправки</string>
|
||||
<string name="textMessageAnnotations">Вы можете напрямую ввести номер телефона или добавить из контактов. Имейте в виду: здесь будет храниться номер телефона, а не контакт. Если вы измените номер телефона выбранного контакта, вам необходимо будет обновить это правило. Automation не делает этого сам по себе.</string>
|
||||
<string name="importNumberFromContacts">Импорт номера из контактов</string>
|
||||
<string name="android9RecordAudioNotice">Если вы используете триггер уровня шума: К сожалению, начиная с Android 9 (Pie) Google решил запретить фоновым приложениям использовать микрофон. Таким образом, этот триггер больше не будет работать.</string>
|
||||
<string name="android10WifiToggleNotice">К сожалению, Google решил удалить эту функцию в Android 10. Обычные приложения больше не могут включать или выключать Wi-Fi. Оно должно продолжать работать, только если на вашем устройстве получены root права. Если нет, то, к сожалению, эта функция работать не будет.</string>
|
||||
<string name="messageNotShownAgain">Это сообщение больше не будет отображаться.</string>
|
||||
<string name="chooseActivityHint">В этом последнем окне выбора вам нужно указать конкретное действие (Activity). Другими словами, это похоже на окно нужного приложения. Если вы не знаете какой выбрать, то используйте тот, который имеет "main" или "launcher" в своем названии.</string>
|
||||
<string name="edit">Редактировать</string>
|
||||
<string name="clickAndHoldForOptions">Удерживайте элемент для параметров.</string>
|
||||
<string name="ruleActivationComplete" translatable="false">Rule \"%1$s\" finished.</string>
|
||||
<string name="positioningEngine">Служба позиционирования</string>
|
||||
<string name="googleSarcasm">Благодаря бесконечной мудрости Google и постоянному стремлению защитить частную жизнь каждого человека, из всех правил, которых использовали триггеры и действия отправки sms или чтения состояния телефона, данные триггеры и действия были удалены, потому что Google считает это рискованным.</string>
|
||||
<string name="startAutomationAsService">Запуск Automation как службы</string>
|
||||
<string name="setScreenBrightness">Настройка яркости экрана</string>
|
||||
<string name="setScreenBrightnessEnterValue">Введите желаемую яркость (от 0 до 100).</string>
|
||||
<string name="autoBrightness">Включить автоматическую яркость</string>
|
||||
<string name="apply">применить</string>
|
||||
<string name="brightnessAuto">автоматическая яркость</string>
|
||||
<string name="brightnessManual">ручная яркость</string>
|
||||
<string name="autoBrightnessNotice">Если вы используете автоматическую яркость, то значение яркости, которое указано ниже, вероятно, не будет использоваться долго.</string>
|
||||
<string name="screenLockSoundNotice">Звуки блокировки экрана больше не могут автоматически изменяться на устройствах под управлением Android версии 6.0 или выше. Что бы вы ни установили здесь, это не будет больше работать.</string>
|
||||
<string name="startScreen">Начальный экран</string>
|
||||
<string name="startScreenSummary">Выберите экран, на котором открываются приложения при запуске.</string>
|
||||
<string name="executeRulesAndProfilesWithSingleClickTitle">Запускайте правила / профили одним касанием.</string>
|
||||
<string name="googleLocationChicanery">Это приложение собирает данные о местоположении, чтобы правила определения местоположения и определения скорости работали, даже если приложение закрыто или не используется.</string>
|
||||
<string name="googleLocationChicaneryOld">Это приложение собирает данные о местоположении, чтобы определить, находитесь ли вы в настоящее время в одном из созданных вами местоположений. Кроме того, это необходимо для определения вашей текущей скорости, если вы используете этот триггер в правилах. Это делается даже тогда, когда приложение закрыто или не используется (но только тогда, когда сервис активирован).</string>
|
||||
<string name="android.permission.ACCESS_BACKGROUND_LOCATION">Считывание местоположения в фоновом режиме.</string>
|
||||
<string name="deviceDoesNotHaveBluetooth">Похоже, это устройство, не имеет bluetooth. Вы все еще можете продолжить настройку, но это, скорее всего, не будет иметь эффекта.</string>
|
||||
<string name="manageLocations">Создание или редактирование местоположений</string>
|
||||
<string name="error">Ошибка</string>
|
||||
<string name="featureNotInFdroidVersion">Эта функция использует несвободное программное обеспечение, поэтому недоступна в версии F-Droid.</string>
|
||||
<string name="settingsReferringToRestrictedFeaturesInFdroid">Ваши настройки и / или правила в настоящее время используют функциии, которые зависят от несвободного программного обеспечения, они не могут быть использованы в версии F-Droid. Это включает в себя определение вашей текущей физической активности.</string>
|
||||
<string name="publishedOn">опубликовано на</string>
|
||||
<string name="displayNewsOnMainScreen">Отображение новостей приложения на главном экране</string>
|
||||
<string name="displayNewsOnMainScreenDescription">Объявления об этом приложении, 1-2 в год, не больше.</string>
|
||||
<string name="filesHaveBeenMovedTo">Automation теперь использует другой путь для хранения ваших файлов. Все ваши файлы автоматизации были перемещены сюда: \"%s\". Разрешение на использование внешнего хранилища больше не требуется; вы можете отозвать его. Оно будет удалено в будущей версии.</string>
|
||||
<string name="locationDisabled">Местоположение отключено</string>
|
||||
<string name="locationEngineDisabledShort">Местоположение больше не может быть определено в фоновом режиме. Нажмите здесь, чтобы узнать почему.</string>
|
||||
<string name="locationEngineDisabledLong">К сожалению, ваше местоположение больше не может быть определено. Спасибо Google за его бесконечную мудрость и дружелюбие.\\n\\nПозвольте мне объяснить это подробнее. Начиная с Android 10, было введено новое разрешение, необходимое для определения вашего местоположения в фоновом режиме (что, конечно, требуется для такого приложения). В целом, это хорошая идея, но сложности, которые она влечет за собой для разработчиков, таковыми не являются.\\n\\nПри разработке приложения вы можете попытаться претендовать на это разрешение, придерживаясь каталога требований. К сожалению, новые версии моего приложения отклонялись в течение трех месяцев. Я выполнил все необходимые требования, но дерьмовая поддержка разработки Google утверждала, что я этого не сделал. Предоставив им доказательство того, что я все-таки это выполнил, я получил ответ типа "Я больше не могу вам помочь". В конце концов я сдался. \\n\\nКак следствие, версия Google Play больше НЕ может использовать ваше местоположение в качестве триггера. Моим единственным альтернативным вариантом было бы полностью удалить это приложение из магазина.\\n\\nЯ очень сожалею об этом, но я старался изо всех сил спорить с "поддержкой", которая неоднократно не проходила тест Тьюринга. Хорошая новость: вы все еще можете использовать все это! Теперь исходным кодо приложения открыт и оно может распространяться в F-Droid. Это магазин приложений, который действительно заботится о вашей конфиденциальности, а не просто делает вид. Просто сделайте резервную копию вашего конфигурационного файла, удалите это приложение, установите его снова из F-Droid, восстановите свой конфигурационный файл - готово.\\n\\nНажмите здесь, чтобы узнать больше:</string>
|
||||
<string name="filesStoredAt">Файлы конфигурации и журнала хранятся в папке %1$s. Нажмите на этот текст, чтобы открыть проводник. К сожалению, это будет работать только на устройстве с правами root. ДЛЯ ВСЕХ ОСТАЛЬНЫХ УСТРОЙСТВ: Просто используйте кнопку экспорта, чтобы сделать резервную копию.</string>
|
||||
<string name="notification">Уведомление</string>
|
||||
<string name="title">Название</string>
|
||||
<string name="text">Текст</string>
|
||||
<string name="directionStringEquals">равно</string>
|
||||
<string name="directionStringContains">содержит</string>
|
||||
<string name="directionStringStartsWith">начинается с</string>
|
||||
<string name="directionStringEndsWith">заканчивается</string>
|
||||
<string name="directionStringNotEquals">не равны</string>
|
||||
<string name="anyApp">Любое приложение</string>
|
||||
<string name="notificationTriggerExplanation">Этот триггер будет реагировать на другие приложения, открывающие уведомления в области уведомлений (или закрывающиеся). Вы можете указать другое приложение, из которого должно прийти уведомление. Если не указывать определённое приложение, будут считаться уведомления от любого приложения. Вы также можете указать строки, которые должны быть или не быть в заголовке или теле уведомления. Сравнение делается без учета регистра.</string>
|
||||
<string name="postsNotification">уведомление от %1$s</string>
|
||||
<string name="removedNotification">уведомление от %1$s удалено</string>
|
||||
<string name="notificationAppears">Появляется уведомление</string>
|
||||
<string name="notificationDisappears">Уведомление исчезает</string>
|
||||
<string name="direction">Направление</string>
|
||||
<string name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">Чтение системных уведомлений</string>
|
||||
<string name="playSound">Воспроизвести звук</string>
|
||||
<string name="alwaysPlay">всегда воспроизводить</string>
|
||||
<string name="alwaysPlayExplanation">Если эта настройка активна, звук будет воспроизводиться всегда. Если она отключена, он будет воспроизводиться только в том случае, если ваш телефон не в режиме “Без звука” или “Вибрация”. Однако если она активена, то не будет влиять на громкость. Таким образом, если ваш телефон находится в режиме звонка, он не увеличит громкость мультимедиа, например. Так что, если громкость мультимедиа отключена, вы тоже ничего не услышите.</string>
|
||||
<string name="selectSoundFile">Выберите звуковой файл</string>
|
||||
<string name="fileDoesNotExist">Файл не существует.</string>
|
||||
<string name="noFileManageInstalled">Файловый менеджер не установлен.</string>
|
||||
<string name="shareConfigAndLogFilesWithDev">Прикрепить файлы конфигурации и журнала.</string>
|
||||
<string name="shareConfigAndLogExplanation">Это запустит создание нового электронного письма с вашими конфигурационными и лог-файлами, прикрепленными в виде zip-файла. Оно не будет отправлено автоматически, вам все равно нужно будет нажать "отправить". Вы также можете изменить получателя на себя, например.</string>
|
||||
<string name="startAppChoiceNote">Здесь у вас есть 2 варианта: \n\n1. Вы можете запустить программу, выбрав \“Activity\”. Представьте себе, что это похоже на предварительный выбор определенного экрана/окна приложения. Имейте в виду, что это может сработать не всегда. Это связано с тем, что окна приложения могут взаимодействовать друг с другом, например передавать параметры. При прямом запуске определенного экрана это взаимодействие не произошло, и окно может закрыться мгновенно (поэтому не отобразиться). Тем не менее попробуйте! Вы можете ввести путь \”Activity\” вручную, но рекомендуется использовать кнопку \"Выбрать\". Если вы решите ввести его вручную, введите имя пакета приложения в верхнем поле и полный путь к \”Activity\” в нижнем.\n\nВыбор по действию. Аналогично запуску приложения с конкретного экрана, вы также можете запустить программу по \”Action\”. Это все равно что сказать: "Я бы хотел xyz" и если у вас установлено приложение, которое может выполнить это, оно будет запущено. Например, \”start browser\” - у вас может быть даже установлено несколько приложений браузера (обычно один из них используется по умолчанию). Вам нужно ввести имя \”action\” вручную, имя пакета здесь необязательно. Имейте в виду, что никакие переменные не будут работать. Если вы хотите запустить камеру, то \"MediaStore.ACTION_IMAGE_CAPTURE\” работать не будет. Вы должны заглянуть в документацию на Android и использовать фактическое название этого \”Action\”, которое, в данном случае, будет \"android.media.action.IMAGE_CAPTURE\".</string>
|
||||
<string name="errorRunningRule">Произошла ошибка при запуске правила.</string>
|
||||
<string name="cantFindSoundFile">Не удается найти звуковой файл %1$s и, следовательно, воспроизвести его.</string>
|
||||
<string name="addParameters">Добавить параметры</string>
|
||||
<string name="com.wireguard.android.permission.CONTROL_TUNNELS">Управлять туннелями приложения wireguard</string>
|
||||
<string name="startAppSelectionType">Метод\nвыбор приложения</string>
|
||||
<string name="startAppByActivity">по activity</string>
|
||||
<string name="startAppByAction">по action</string>
|
||||
<string name="enterValidAction">Введите action</string>
|
||||
<string name="enterPackageName">Введите имя пакета.</string>
|
||||
<string name="state">Состояние</string>
|
||||
<string name="phoneNumberExplanation">Вы можете ввести определенный номер телефона, но не обязательно. Если вы хотите указать его, вы можете либо выбрать его из своей адресной книги, либо ввести вручную. Кроме того, вы можете использовать регулярные выражения. Чтобы проверить регулярное выражение, можете использовать эту страницу:</string>
|
||||
<string name="importConfiguration">Импорт конфигурации</string>
|
||||
<string name="exportConfiguration">Экспорт конфигурации</string>
|
||||
<string name="moreSettings">Дополнительные настройки</string>
|
||||
<string name="configurationExportedSuccessfully">Конфигурация успешно экспортирована.</string>
|
||||
<string name="ConfigurationExportError">При экспорте конфигурации произошла ошибка.</string>
|
||||
<string name="rulesImportedSuccessfully">Правила и местоположения были успешно импортированы.</string>
|
||||
<string name="rulesImportError">Произошла ошибка импорта правил и местоположений.</string>
|
||||
<string name="configurationImportedSuccessfully">Конфигурация успешно импортирована.</string>
|
||||
<string name="prefsImportError">Произошла ошибка импорта настроек.</string>
|
||||
<string name="noApplicableFilesFoundInDirectory">В этом каталоге не удалось найти подходящих файлов.</string>
|
||||
<string name="noFilesImported">Ни один файл не может быть импортирован.</string>
|
||||
<string name="notAllFilesImported">Не все подходящие файлы могут быть импортированы.</string>
|
||||
<string name="importExportExplanation">При нажатии кнопки импорт или экспорт вы выбираете каталог, из которого будут импортированы или экспортированы файлы. При экспорте существующие файлы могут быть перезаписаны.</string>
|
||||
<string name="intentDataComment">Если ваш параметр имеет тип Uri И вы указываете \"IntentData\" в качестве имени (нижний/верхний регистр не важен), параметр не будет добавлен в качестве обычного параметра с помощью putExtra(), а вместо этого будет добавлен в intent с помощью setData() .</string>
|
||||
<string name="stringNotAllowed">Строка %1$s не допускается.</string>
|
||||
<string name="startAppStartType">Выберите тип запуска</string>
|
||||
<string name="startAppByStartActivity">по startActivity()</string>
|
||||
<string name="startAppBySendBroadcast">по sendBroadcast()</string>
|
||||
<string name="openExamplesPage">Открыть веб-страницу с примерами</string>
|
||||
<string name="packageName">Имя пакета</string>
|
||||
<string name="activityOrActionName">Название Activity/Action</string>
|
||||
<string name="warning">Предупреждение</string>
|
||||
<string name="ringing">звонит</string>
|
||||
<string name="from">от</string>
|
||||
<string name="to">к</string>
|
||||
<string name="matching">совпадает</string>
|
||||
<string name="loadWifiList">Загрузить список Wi-Fi</string>
|
||||
<string name="needLocationPermForWifiList">Список Wi-Fi, к которому было подключено ваше устройство. Можно использовать для определения того, в каких местах вы были. Вот почему для загрузки списка Wi-Fi требуется разрешение на доступ к местоположению. Если вы хотите выбрать один из из списка, вам необходимо предоставить это разрешение. Если вы этого не хотите, вы все равно можете ввести свое имя Wi-Fi вручную.</string>
|
||||
<string name="noKnownWifis">На вашем устройстве нет известных Wi-Fi.</string>
|
||||
<string name="urlToTriggerExplanation">Эта функция НЕ открывает браузер, а запускает URL-адрес в фоновом режиме. Вы можете использовать это, например, для отправки команд в вашу систему умного дома.</string>
|
||||
<string name="automaticUpdateCheck">Проверять наличие обновлений</string>
|
||||
<string name="automaticUpdateCheckSummary">Доступно только в версии APK.</string>
|
||||
<string name="updateAvailable">Доступно новое обновление. Открыть браузер, чтобы загрузить его?</string>
|
||||
<string name="locationFound">Местоположение найдено. Рекомендуемый минимальный радиус для локаций составляет %1$d м.</string>
|
||||
<string name="locationFoundInaccurate">Местоположение найдено с ограниченной точностью. Может работать ненадежно. Рекомендуемый минимальный радиус для местоположений составляет %1$d м.</string>
|
||||
<string name="clone">Клонировать</string>
|
||||
<string name="noLocationCouldBeFound">Местоположение не найдено после таймаута в %1$s секунд.</string>
|
||||
<string name="pleaseGiveBgLocation">На следующем экране перейдите в разрешения, затем “Местоположение”. Там выберите "Разрешить все время", чтобы позволить Automation определять ваше местоположение в фоновом режиме.</string>
|
||||
<string name="vibrate">Вибрировать</string>
|
||||
<string name="test">Попробуй</string>
|
||||
<string name="VibrateExplanation">Введите продолжительность вибрации, затем запятую, а затем продолжительность паузы. Вы можете объединить столько вибраций. Разделите их снова запятыми. Например, шаблон 100,500,500,1000,100 будет вибрировать 100, ждать 500, вибрировать 500, ждать 1000, вибрировать 100 мс. Если вам кажется, что вибрация пропала, попробуйте увеличить паузу перед ними.</string>
|
||||
<string name="pleaseEnterValidVibrationPattern">Пожалуйста, введите допустимый шаблон вибрации.</string>
|
||||
<string name="newsOptIn">Хотите получать (только важные) новости об этом приложении на главном экране? Они загружаются с веб-сайта разработчика. Там не будет никакого навязчивого уведомления, просто текст на главном экране, когда вы откроете приложение.</string>
|
||||
<string name="top">Наверх</string>
|
||||
<string name="bottom">Вниз</string>
|
||||
<string name="tabsPlacement">Положение панели</string>
|
||||
<string name="tabsPlacementSummary">Выберите, где должна располагаться главная панель.</string>
|
||||
<string name="wifiApi30">Поскольку Google испортил еще одну часть Android, начиная с API 30, могут отображаться только видимые в данный момент Wi-Fi, а не все те, к которым было подключено ваше устройство.</string>
|
||||
<string name="silentTriggersDnd">ПРИМЕЧАНИE: Бесшумный режим часто запускает режим "Не беспокоить" на новых устройствах. Если это произойдет на вашем устройстве, я рекомендую вместо этого использовать обычный режим и снизить громкость до нуля.</string>
|
||||
<string name="tones">Тоны</string>
|
||||
<string name="miscellaneous">Разное</string>
|
||||
<string name="dnd">Не беспокоить</string>
|
||||
<string name="dndOff">DND выключен</string>
|
||||
<string name="dndPriority">Разрешить приоритетные уведомления</string>
|
||||
<string name="dndAlarms">Разрешить будильники</string>
|
||||
<string name="dndNothing">Ничего не разрешать</string>
|
||||
<string name="dndRemarks">Тонкая настройка (например, разрешение телефонных звонков, выбор конкретных номеров и т.д.) может быть выполнена только из настроек системы.</string>
|
||||
<string name="automationNotificationsIgnored">Если вы не выберете конкретное приложение, а будете использовать "Любое приложение", уведомления от Automation будут игнорироваться, чтобы избежать зацикливания.</string>
|
||||
<string name="repeatEveryXseconds">Повторяйте каждые x секунд</string>
|
||||
<string name="repeatEveryXsecondsWithVariable">повторяйте каждые %1$s секунд</string>
|
||||
<string name="enterRepetitionTime">Вам нужно ввести положительное не десятичное значение для времени повторения.</string>
|
||||
<string name="elementSkipped">Не удалось прочитать элемент конфигурационного файла. Возможно, файл был создан более новой версией программы.</string>
|
||||
<string name="donate">Пожертвовать</string>
|
||||
<string name="btTetheringNotice">Подтверждено, что эта функция работает до Android 8.0. Начиная с какой-то более высокой версии она перестает работать, но из-за отсутствия физических устройств я не могу сказать с какой версии именно. На Android 11 она определенно больше не работает. Если у вас какая-то промежуточная версия, пожалуйста, дайте мне знать, работает эта функция или нет.</string>
|
||||
<string name="notice">Примечание</string>
|
||||
<string name="deviceOrientation">Ориентация устройства</string>
|
||||
<string name="tolerance">Допуск (0-180)</string>
|
||||
<string name="orientationAzimuth">Азимут:</string>
|
||||
<string name="orientationPitch">Наклон:</string>
|
||||
<string name="orientationRoll">Вращение:</string>
|
||||
<string name="enterValidNumbersIntoAllFields">Введите корректные значения во все поля.</string>
|
||||
<string name="deviceOrientationExplanation">При перемещении устройства будут обновляться приведенные ниже цифры. То, что вы там видите, - это текущая ориентация вашего устройства, измеренная в градусах. Если он находится в нужной ориентации, нажмите кнопку применить, чтобы скопировать текущие значения в нужные поля. Поскольку достижение этой точной ориентации когда-либо снова крайне маловероятно, вы также должны ввести допуск. Это количество градусов, на которые ориентация может отклоняться в любом направлении. 15° приведет к общему углу 30°, по 15° в каждом направлении. Если вам необходима только одна конкретная ось, укажите допуск 180° для двух других.</string>
|
||||
<string name="wouldCurrentlyApply">Будет ли в настоящее время применяться?</string>
|
||||
<string name="deviceIsInCertainOrientation">устройство находится в определенной ориентации</string>
|
||||
<string name="toleranceOf180OnlyAllowedIn2Fields">Допуск 180 допускается только для 2 полей, а не для всех 3. В противном случае триггер будет срабатывать ВСЕГДА.</string>
|
||||
<string name="unknown">неизвестно</string>
|
||||
<string name="orientation">Ориентация</string>
|
||||
<string name="triggerWrong">Что-то не так с этим триггером. Он не мог быть правильно загружен.</string>
|
||||
<string name="turnScreenOnOrOff">Включение или выключение экрана</string>
|
||||
<string name="turnScreenOn">включить экран</string>
|
||||
<string name="turnScreenOff">выключить экран</string>
|
||||
<string name="mustApply">Необходимо применить</string>
|
||||
<string name="deviceOrientationTimeAcceptIntervalTitle">Частота сигнала</string>
|
||||
<string name="deviceOrientationTimeAcceptIntervalSummary">Получать новые сигналы движения каждые x миллисекунд</string>
|
||||
<string name="deviceOrientationSettings">Настройки ориентации устройства</string>
|
||||
<string name="android.permission.BIND_DEVICE_ADMIN">Администратор устройства</string>
|
||||
<string name="deviceAdminNote">Разрешения администратора устройства требуются как минимум для 1 созданного вами правила.</string>
|
||||
<string name="explanationDeviceOrientationDirection">Если флажок установлен, это означает, что устройство должно находиться в указанной вами ориентации. Если он не установлен, будет срабатывать любая ориентация, которая НЕ соответствует вашим критериям.</string>
|
||||
<string name="permissionsRequiredNotAvailable">Ваши правила требуют разрешений, которые не могут быть запрошены из установленного варианта Automation.</string>
|
||||
<string name="smsDialogNotice">Если вы ранее не использовали действие отправки sms в этой программе, Android может показать дополнительное диалоговое окно подтверждения с просьбой разрешить отправку сообщений. Вам нужно установить флажок "всегда разрешать" и подтвердить, если вы хотите, чтобы это действие работало в фоновом режиме. Рекомендуется запустить это правило вручную один раз, чтобы получить этот диалог подтверждения.</string>
|
||||
<string name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS">Исключить из оптимизации батареи</string>
|
||||
<string name="recommendedForBetterReliability">Рекомендуется для повышения надежности</string>
|
||||
<string name="needsToBeActive">Должно быть активным</string>
|
||||
<string name="checkSettings">Проверьте настройки</string>
|
||||
<string name="profileActive">профиль %1$s активен</string>
|
||||
<string name="profileNotActive">профиль %1$s не активен</string>
|
||||
<string name="profileTriggerCheckSettings">Если этот флажок отключен, он будет установлен только в том случае, если выбранный профиль был активирован последним. Не имеет значения, были ли изменены какие-либо настройки, связанные со звуком, извне. Однако если флажок включен, то текущие настройки звука действительно должны быть такими, как определены в профиле. ПРЕДУПРЕЖДЕНИЕ: проверка файла мелодии звонка в настоящее время еще не поддерживается.</string>
|
||||
<string name="ruleXIsUsingProfileY">Невозможно удалить этот профиль. Правило %1$s ссылается на профиль %2$s.</string>
|
||||
<string name="profileCouldNotBeDeleted">Профиль не удалось удалить.</string>
|
||||
<string name="noRepetition">не повторять</string>
|
||||
<string name="usingAuthentication">использование аутентификации</string>
|
||||
<string name="toNumber">к номеру</string>
|
||||
<string name="message">сообщение</string>
|
||||
<string name="onDays">по дням</string>
|
||||
<string name="notSet">не установлено</string>
|
||||
<string name="takeLauncherActivity">Найти автоматически</string>
|
||||
<string name="pickActivityManually">Выберите вручную</string>
|
||||
<string name="launcherOrManualExplanation">Легкий режим: Automation может попытаться автоматически определить Activity для запуска нужной программы. Кроме того, вы также можете выбрать одно из Activity приложения вручную. Чего бы вы хотели?</string>
|
||||
<string name="launcherNotFound">Activity запуска этого приложения не может быть идентифицирована. Вам придется выбрать один из них вручную.</string>
|
||||
<string name="createNotification">Создать уведомление</string>
|
||||
<string name="enterTitle">Введите название.</string>
|
||||
<string name="enterText">Введите текст.</string>
|
||||
<string name="info">Информация</string>
|
||||
<string name="profileWasNotFound">Профиль, используемый в этом правиле, похоже, больше не существует. Выбран первый в алфавитном порядке.</string>
|
||||
<string name="notificationCloseActionExplanation">Если вы не укажете никаких критериев, это действие закроет все уведомления. Поэтому рекомендуется, по крайней мере, указать критерии хотя бы для 1 приложения, заголовка или текста.</string>
|
||||
<string name="closeNotifications">Закрыть уведомление(я)</string>
|
||||
<string name="comparisonCaseInsensitive">Сравнения проводятся без учета регистра</string>
|
||||
<string name="profileWarning">Настройки, которые вы можете изменить здесь, могут привести к тому, что вы больше не заметите определенных вещей с вашего телефона. Они могут даже отключить будильник. Так что что бы вы ни делали - рекомендуется это проверять.</string>
|
||||
<string name="ifString">если</string>
|
||||
<string name="emailContactNotice">Электронная почта - мой предпочтительный способ связи, для сообщений об ошибках, вопросов или предложений. Перейдите в центр управления, чтобы узнать больше.\nМногие вопросы не могут быть решены сразу, но требуют некоторых технических исследований. Поэтому, пожалуйста, наберитесь терпения.</string>
|
||||
<string name="controlCenter">Центр управления</string>
|
||||
<string name="sendEmailToDev">Отправить электронное письмо разработчику</string>
|
||||
<string name="screenIs">экран %1$s</string>
|
||||
<string name="on">вкл</string>
|
||||
<string name="off">выкл</string>
|
||||
<string name="unlocked">разблокирован</string>
|
||||
<string name="selectDesiredState">Выберите желаемое состояние</string>
|
||||
<string name="screenState">Состояние экрана</string>
|
||||
<string name="featureCeasedToWorkLastWorkingAndroidVersion">Из-за бесконечной мудрости Google последняя версия Android, на которой, как известно, работает эта функция, составляет %1$s. Вы можете настроить это, но оно, вероятно, не будет работать.</string>
|
||||
<string name="actionMediaControl">Управление воспроизведением мультимедиа</string>
|
||||
<string name="selectCommand">Выберите команду</string>
|
||||
<string name="playPause">переключение воспроизведения/паузы</string>
|
||||
<string name="play">воспроизвести</string>
|
||||
<string name="pause">пауза</string>
|
||||
<string name="previous">предыдущий</string>
|
||||
<string name="next">следующий</string>
|
||||
<string name="android.permission.MEDIA_CONTENT_CONTROL">Управление воспроизведением мультимедиа</string>
|
||||
<string name="stop">остановка</string>
|
||||
<string name="pleaseSelectActionValue">Пожалуйста, выберите действие!</string>
|
||||
<string name="actionMediaControlNotice">Имейте в виду, что это действие может работать не со ВСЕМИ плеерами. Так же возможна частичная поддержка вашего плеера (некоторые кнопки не работают).</string>
|
||||
<string name="musicPlaying">Музыка играет</string>
|
||||
<string name="selectParameters">Выбор параметров</string>
|
||||
<string name="musicIsPlaying">музыка играет</string>
|
||||
<string name="musicIsNotPlaying">музыка не играет</string>
|
||||
<string name="musicPlayingDetection">Обнаружение воспроизведения музыки</string>
|
||||
<string name="musicCheckFrequencyTitle">Частота проверки [мс]</string>
|
||||
<string name="musicCheckFrequencySummary">Миллисекунды между проверками</string>
|
||||
<string name="locationNotWorkingOn12">Получение местоположения, похоже, не работает на устройствах Android 12 в настоящее время. Если это не коснулось вас, мне очень жаль. Я постараюсь исправить это, как только узнаю причину. Так что если кружочек не перестанет вращаться, вы предупреждены.</string>
|
||||
<string name="lastProfile">Последний профиль:</string>
|
||||
<string name="queryAllPackages">Получить список установленных приложений</string>
|
||||
<string name="helpTextEnergySaving">Многие производители устройств пытаются снизить потребление энергии при помощи ограничения работы фоновых приложений. К сожалению, это приводит к тому, что они перестают работать корректно, Automation относится к их числу. Посетите эту <a href="https://dontkillmyapp.com/">web-страницу</a> для того, чтобы узнать как исключить Automation из этого процесса.</string>
|
||||
<string name="timeFrameDaysHint">Если вы используете временной период, который переходит через полночь, вам нужно выбрать следующий день, если хотите, чтобы триггер сработал после полночи.</string>
|
||||
<string name="featureNotInGooglePlayVersion">Эта функция больше не доступа для версии Google Play.\n\nGoogle постоянно усложняет жизнь разработчикам и требуют оформления бумажных заявлений для обоснавания необходимости использования определённых функций. К сожалению, эти заявления в 99% случаев откланяются. Почти как в комиксе Астерикс.\n\nЯ потратил недели на споры с ними, но заявления продолжают отклоняться ботами или людьми со схожим интеллектуальным развитием.\nПожалуйста, используйте версию APK или скачайте его с F-Droid, если вам нужны эти функции.</string>
|
||||
<string name="startActivityInsertManually">Это ограничение касается только выбора приложения, но не его запуска. Вы можете указать имя приложения вручную, если знаете его.</string>
|
||||
<string name="deviceStarts">Включение устройства</string>
|
||||
<string name="serviceStarts">Запуск службы</string>
|
||||
<string name="deviceIsStarting">устройство запускается</string>
|
||||
<string name="serviceIsStarting">Служба запускается</string>
|
||||
<string name="broadcastReceived">получено сообщение broadcast</string>
|
||||
<string name="broadcastNotReceived">сообщение broadcast не получено</string>
|
||||
<string name="explanationBroadcastTrigger">Большинство событий на вашем телефоне будут \"опубликованы\" при помощи Broadcast сообщений, которые передаются через операционную систему Android.\nНапример, включение/выключение режима "В самолёте" отправит подобное сообщение. Эти сообщения не видны/слышны, но если какое-нибудь приложение (как Automation) могут \"слушать\" их и когда они появляются, реагировать каким-либо образом.\n\nЗдесь вы можете настроить broadcast сообщение, которое Automation будет слушать. Вы можете ввести его вручную, скопировать откуда-нибудь или выбрать из списка. Так как этот триггер является очень гибким, я не могу предоставить вам объяснения по каждому из пунктов списка.\n\nПолнота списка не гарантируется, пожалуйста, перейдите по ссылке ниже для ознакомления с документацией Android.\nДополнительно, любое приложение может отправлять свои собственные сообщения, формат которых в документации Android, конечно же отсутствует.\n\nМногие broadcast сообщения для работы требуют специальных разрешений. Я попытался реализовать запрос разрешений там, где я знаю, что они необходимы. Если вы обнаружите, что где-то не происходит запрос разрешения, где по вашему мнению это нобходимо, пожалуйста сообщите мне.\n\n"Не получено"- значит такое сообщение не было получено с момента старта службы Automation. Реакция на некоторые параметры находится в разработке.</string>
|
||||
<string name="broadcastReceivedTitle">Получено сообщение broadcast</string>
|
||||
<string name="logsExplanation">Для предотвращения повышенной нагрузки на хранилище данных вашего устройства, логи по-умолчанию отключены, поэтому если вы обнаружили проблему, пожалуйста включите логи, с уровнем логирования 5, воспроизведите проблему и только после этого прикладывайте лог к письму.</string>
|
||||
<string name="broadcastsShowSuggestions">Примеры</string>
|
||||
<string name="selectBroadcast">Выбрать</string>
|
||||
<string name="lockedWithoutSecurity">заблокировано (только swipe, без PIN)</string>
|
||||
<string name="lockedWithSecurity">заблокировано (с PIN и т.д.)</string>
|
||||
<string name="lockedCommentScreenMustBeOff">Любое состояние блокировки будет обнаружено только когда экран выключен.</string>
|
||||
<string name="emailPretext">Если вы обнаружили проблему или хотите задать вопрос или предложить улучшение, пожалуйста, напишите что-нибудь в теле письма. Не нужно просто отправлять мне скриншоты без текста. Подобные письма будут проигнорированы, за исключением подобных писем, которые часть уже существующей переписки.</string>
|
||||
<string name="sendBroadcast">Отправить broadcast</string>
|
||||
<string name="enterBroadcast">Ввести broadcast действие.</string>
|
||||
<string name="broadcastExplanation">Это действиет позволяет отправить Broadcast сообщение через систему сообщений Android. Их невидно пользователю, но приложения, которые "слушают" определённые сообщения могут реагировать на них определённым образом.</string>
|
||||
<string name="directionStringDoesNotContain">не содержит</string>
|
||||
<string name="runExecutable">Запуск скрипта или файла</string>
|
||||
<string name="path">Путь</string>
|
||||
<string name="parameters">Параметры</string>
|
||||
<string name="chooseExecutable">Выбрать исполняемый файл</string>
|
||||
<string name="runAsRoot">Запуск от root</string>
|
||||
<string name="selectValidExecutable">Выбрать исполняемый файл</string>
|
||||
<string name="fileNotExecutable">Файл не исполняемый</string>
|
||||
<string name="wifiExplanation1">Приложения, реализуемые совместимость с Android Q и выше больше не могут включать/выключать Wi-Fi. Пожалуйста, вините не меня, а Google за это.\n\nВы можете обойти это ограничение получив root права и активировав чекбокс ниже. Так же вы можете скачать это приложение из F-Droid или с моего сайта, потому что для этих версий приложения нет ограничения на совместимость с последним уровнем API.</string>
|
||||
<string name="wifiExplanation2">Когда активирован режим "В самолете" Wi-Fi может быть включен только приложениями с доступом к root правам.</string>
|
||||
<string name="usingRoot">используя root-права</string>
|
||||
<string name="runExecutableExplanation">Здесь вы можете выбрать сценарий или исполняемый файл, который будет выполняться как действие.\n\nНо есть некоторые предварительные условия, с которыми вам придется иметь дело самостоятельно. Google очень усложнил запуск чего-либо, кроме обычных приложений Android.\n\n1. Сценарий должен быть помечен как исполняемый. В обычной системе Android (без root) это на самом деле самая сложная часть.\n\n2. Это также означает, что автоматизация должна иметь возможность выполнять файл, а не только владельца или группу.\n\n3. Если это сценарий, в заголовке скрипта указывается допустимая оболочка.\n\nЕсли вы не можете выполнить вышеуказанные требования, можно в качестве альтернативы попытаться указать оболочку в качестве фактического исполняемого файла (например, /system/bin/sh) и скрипт в качестве параметра. Это сработало, по крайней мере, для одного пользователя.</string>
|
||||
<string name="tetheringActive">раздача интернета активна</string>
|
||||
<string name="tetheringNotActive">раздача интернета не активна</string>
|
||||
<string name="tetheringState">Раздача интернета</string>
|
||||
<string name="enter_a_number">Введите число.</string>
|
||||
<string name="regularExpressionsIfEquals">Если выбрано значение \"равно\", можно ввести регулярное выражение.</string>
|
||||
<string name="duration">продолжительность [мс]</string>
|
||||
<string name="keepDeviceAwake">Держите устройство в режиме сна</string>
|
||||
<string name="wakeLockTimeout">указать время ожидания</string>
|
||||
<string name="wakeLockExplanation">Activate будет держать экран включенным, в то время как деактивация позволит ему выключиться. Для поддержания его включенным вы можете либо ввести продолжительность, после которой он может снова отключиться, либо вы можете держать его включенным на неопределенный срок. В последнем случае вам нужно будет создать еще одно действие keep-awake (в том или ином правиле), в котором вы выберете деактивировать.</string>
|
||||
<string name="mayUseRegularExpressions">Здесь также можно ввести регулярное выражение.</string>
|
||||
<string name="locationRequiredToDetermineWifiName">Чтобы получить SSID Wi-Fi, приложению требуются разрешения на местоположение. Поскольку версия Google не может получить его, вы можете использовать этот триггер только в том случае, если вы не указали SSID. Таким образом, его можно использовать только для определения того, подключен ли Wi-Fi или нет.</string>
|
||||
<string name="withButton">с кнопкой %1$s</string>
|
||||
<string name="bluetooth">Bluetooth</string>
|
||||
<string name="subSystemState">Состояние подсистемы</string>
|
||||
<string name="clickNotificationButton">Нажмите кнопку</string>
|
||||
<string name="simplyDismissNotification">Просто уволить</string>
|
||||
<string name="usb">USB</string>
|
||||
<string name="cable">Кабель</string>
|
||||
<string name="tetheringBluetoothNotPossible">В настоящее время модем Bluetooth не может быть обнаружен. Только другие средства связи активируют этот триггер.</string>
|
||||
<string name="type">тип</string>
|
||||
<string name="startPhoneCall">Номер телефона</string>
|
||||
<string name="android.permission.CALL_PHONE">Номер телефона</string>
|
||||
<string name="makePhoneCallExplanation1">Здесь вы можете ввести номер телефона, который будет звонить без дальнейших запросов. Вы можете использовать это для внесения настроек, таких как внесение изменений в маршрутизацию вызовов и т. Д. Пожалуйста, найдите коды, необходимые для этого, самостоятельно.</string>
|
||||
<string name="endPhoneCall">Завершение телефонного звонка</string>
|
||||
<string name="android.permission.ANSWER_PHONE_CALLS">Завершение телефонного звонка</string>
|
||||
<string name="settingsReferringToRestrictedFeaturesInGoogle">Ваши настройки и/или правила в настоящее время ссылаются на функции, которые не могут быть предоставлены в версии Google Play. Среди прочего, это включает в себя все, что связано с телефонными звонками и текстовыми сообщениями.</string>
|
||||
<string name="setVariable">Задание переменной</string>
|
||||
<string name="deleteVariable">Удалить переменную</string>
|
||||
<string name="VariableKey">Клавиша переменной</string>
|
||||
<string name="variableValue">Значение переменной</string>
|
||||
<string name="setVariableExplanation">Если для переменной задано пустое значение, она будет удалена.</string>
|
||||
<string name="enterVariableKey">Введите ключ для переменной.</string>
|
||||
<string name="checkVariable">Проверить переменную</string>
|
||||
<string name="checkVariableExplanation">Если оставить значение пустым, переменная не должна быть задана для того, чтобы условие возвращало значение true.</string>
|
||||
<string name="variableCheckString">если переменная %1$s равно %2$s</string>
|
||||
<string name="variableCheckStringDeleted">Если переменная %1$s не задана</string>
|
||||
</resources>
|
3
app/src/main/res/values-w1240dp/dimens.xml
Normal file
3
app/src/main/res/values-w1240dp/dimens.xml
Normal file
@ -0,0 +1,3 @@
|
||||
<resources>
|
||||
<dimen name="fab_margin">200dp</dimen>
|
||||
</resources>
|
3
app/src/main/res/values-w600dp/dimens.xml
Normal file
3
app/src/main/res/values-w600dp/dimens.xml
Normal file
@ -0,0 +1,3 @@
|
||||
<resources>
|
||||
<dimen name="fab_margin">48dp</dimen>
|
||||
</resources>
|
@ -3,4 +3,7 @@
|
||||
<dimen name="activity_horizontal_margin">16dp</dimen>
|
||||
<dimen name="activity_vertical_margin">16dp</dimen>
|
||||
<dimen name="default_margin">20dp</dimen>
|
||||
<dimen name="appbar_padding">16dp</dimen>
|
||||
<dimen name="fab_margin">16dp</dimen>
|
||||
<dimen name="appbar_padding_top">8dp</dimen>
|
||||
</resources>
|
||||
|
@ -341,7 +341,8 @@
|
||||
<string name="phoneCall">Phone call</string>
|
||||
<string name="with">with</string>
|
||||
<string name="phoneNumber">Phone number</string>
|
||||
<string name="enterPhoneNumber">Enter phone number. Leave empty for any number.</string>
|
||||
<string name="enterPhoneNumberBlankForAny">Enter phone number. Leave empty for any number.</string>
|
||||
<string name="enterPhoneNumber">Enter phone number.</string>
|
||||
<string name="phoneDirection">Select call\ndirection</string>
|
||||
<string name="any">any</string>
|
||||
<string name="incoming">incoming</string>
|
||||
@ -601,7 +602,8 @@
|
||||
<string name="manageLocations">Create or edit locations</string>
|
||||
<string name="error">Error</string>
|
||||
<string name="featureNotInFdroidVersion">This feature is based on non-free software. Therefore is is not available in the F-Droid version.</string>
|
||||
<string name="settingsReferringToRestrictedFeatures">Your settings and or rules are currently referencing non-free features that cannot be provided in the F-Droid version. That includes detecting your current physical activity.</string>
|
||||
<string name="settingsReferringToRestrictedFeaturesInFdroid">Your settings and or rules are currently referencing non-free features that cannot be provided in the F-Droid version. That includes detecting your current physical activity.</string>
|
||||
<string name="settingsReferringToRestrictedFeaturesInGoogle">Your settings and or rules are currently referencing features that cannot be provided in the Google Play version. Among other things that includes anything related to phone calls and text messages.</string>
|
||||
<string name="publishedOn">published on</string>
|
||||
<string name="displayNewsOnMainScreen">Display application news on main screen</string>
|
||||
<string name="displayNewsOnMainScreenDescription">Announcements about this app only, we\'re probably talking about 1-2 per year, not more.</string>
|
||||
@ -618,7 +620,7 @@
|
||||
<string name="directionStringStartsWith">starts with</string>
|
||||
<string name="directionStringEndsWith">ends with</string>
|
||||
<string name="directionStringNotEquals">not equals</string>
|
||||
<string name="anyApp">Any app</string>
|
||||
<string name="anyApp">any app</string>
|
||||
<string name="notificationTriggerExplanation">This trigger will respond to other applications opening notifications in the notification area (or such being closed). You can specify another application from which the notification has to come from. If you don\'t the notifications from any other application will count. You can also specify strings that must be or must not be in their title or notification body. The comparison is done case-INsensitive.</string>
|
||||
<string name="postsNotification">%1$s posts notification</string>
|
||||
<string name="removedNotification">notification from %1$s removed</string>
|
||||
@ -645,7 +647,7 @@
|
||||
<string name="enterValidAction">Enter a valid action</string>
|
||||
<string name="enterPackageName">Enter a valid package name.</string>
|
||||
<string name="state">State</string>
|
||||
<string name="phoneNumberExplanation">You can enter a specific phone number, but you don\'t have to. If you want to specify one you can either pick one from your address book or enter it manually. In addition you may use regular expressions. To test a regular expression I like this page:</string>
|
||||
<string name="phoneNumberExplanation">You can enter a specific remote phone number, but you don\'t have to. If you want to specify one you can either pick one from your address book or enter it manually. In addition you may use regular expressions. To test a regular expression I like this page:</string>
|
||||
<string name="importConfiguration">Import configuration</string>
|
||||
<string name="exportConfiguration">Export configuration</string>
|
||||
<string name="moreSettings">More settings</string>
|
||||
@ -764,9 +766,9 @@
|
||||
<string name="notificationCloseActionExplanation">If you don\'t specify any criteria this action will close ALL notifications. So it\'s advised to at least specify criteria for at least 1 of application, title or text.</string>
|
||||
<string name="closeNotifications">Close notification(s)</string>
|
||||
<string name="comparisonCaseInsensitive">Comparisons are done case-INsensitive</string>
|
||||
<string name="profileWarning">The settings you can adjust here, can cause that you don\'t notice certain things from your phone anymore. They may even silence your wakeup alarm. So whatever you do - it is recommended you test it.</string>
|
||||
<string name="profileWarning">The settings you can adjust here, can cause that you don\'t notice certain things from your phone anymore. They may even silence your wakeup alarm. So whatever you do - it is highly recommended that you test it - also after Android updates.</string>
|
||||
<string name="ifString">if</string>
|
||||
<string name="emailContactNotice">Email is my preferred method of contact to report bugs, ask questions or make proposals. Go to control center to learn more.</string>
|
||||
<string name="emailContactNotice">Email is my preferred method of contact to report bugs, ask questions or make proposals. Go to control center to learn more.\nMany questions cannot be answered straight away, but require some technical research. So please have some patience.</string>
|
||||
<string name="controlCenter">Control center</string>
|
||||
<string name="sendEmailToDev">Send email to developer</string>
|
||||
<string name="screenIs">screen is %1$s</string>
|
||||
@ -797,4 +799,79 @@
|
||||
<string name="locationNotWorkingOn12">Getting the location does not seem to be working on Android 12 devices currently. If it isn\'t working for you, I\'m sorry. I\'ll try to fix this as soon as I know the cause. So if the donut doesn\'t stop spinning, you know why.</string>
|
||||
<string name="lastProfile">Last profile:</string>
|
||||
<string name="queryAllPackages">Get a list of installed applications</string>
|
||||
<string name="timeFrameDaysHint">If you use a timeframe that stretches over midnight you need to select the following day as well if you want the trigger to apply after midnight.</string>
|
||||
<string name="featureNotInGooglePlayVersion">This feature is not available in the Google Play version anymore.\n\nEvery now and then Google bullies developers. If you want to keep using certain features you have to file paperwork. Unfortunately there\'s a 99% chance that the paperwork gets rejected. It\'s pretty much like in the Asterix comic/movie.\n\nI\'ve spent weeks arguing with them about cases like that in the past, but I kept getting rejections - either by bots or people who are about as intelligent as bots. In the I can decide between the app being removed from the Play Store entirely or remove the feature.\nPlease consider using the APK version from my website or the one from F-Droid if you need those features.</string>
|
||||
<string name="startActivityInsertManually">This limitation concerns only the selection of an app, not the actual start. So you can still enter the name of an application manually if you know it.</string>
|
||||
<string name="deviceStarts">Device starts</string>
|
||||
<string name="serviceStarts">Service starts</string>
|
||||
<string name="deviceIsStarting">device is starting</string>
|
||||
<string name="serviceIsStarting">service is starting</string>
|
||||
<string name="broadcastReceived">broadcast received</string>
|
||||
<string name="broadcastNotReceived">broadcast not received</string>
|
||||
<string name="explanationBroadcastTrigger">Most events on your phone will be \"published\" by broadcasting them throughout the operating system.\nFor example turning on/off airplane mode will trigger such a broadcast. Those broadcasts are not automatically visible/audible, but if an application (like Automation) is interested it can hook up to them. When they occur it will get notified and can react.\n\nYou can define a broadcast event here for which the application will wait. You may enter it manually, copy & paste it from somewhere or pick one from the list of suggestions. As this trigger is meant to be and remain very flexible I cannot provide you with explanations for the items.\n\nThe list of suggestions does not claim to be complete. Please visit the below URL to have a look at the Android documentation.\nAlso any app can send custom events which will not appear in the Android documentation of course.\n\nMany broadcasts require specific permissions in order to work. I try to request permissions where I know they will be required. If you think a permission is required for the action you entered, please let me know.\n\nNot received means there has not been such a broadcast ever since the service has been started. Responding to certain parameters is in development.</string>
|
||||
<string name="broadcastListUrl" translatable="false">https://developer.android.com/reference/android/content/Intent.html</string>
|
||||
<string name="broadcastReceivedTitle">Broadcast received</string>
|
||||
<string name="logsExplanation">To avoid unnecessary wearing of your storage, logs are not saved by default. So if you have a problem please activate logging in settings first and set log level to 5. Then reproduce the problem. Only then logs can be attached.</string>
|
||||
<string name="broadcastsShowSuggestions">Show suggestions</string>
|
||||
<string name="selectBroadcast">Select broadcast</string>
|
||||
<string name="lockedWithoutSecurity">locked (swipe only, no PIN)</string>
|
||||
<string name="lockedWithSecurity">locked (with PIN, etc.)</string>
|
||||
<string name="lockedCommentScreenMustBeOff">Any state of locked will only be detected if the screen is off.</string>
|
||||
<string name="emailPretext">If you have a problem, suggestions or question, please write something in the email. Do not just send me the files with the default mail body. I will ignore those unless we\'re already in a conversation.</string>
|
||||
<string name="sendBroadcast">Send broadcast</string>
|
||||
<string name="enterBroadcast">Enter a broadcast action.</string>
|
||||
<string name="broadcastExplanation">This action allows to send a broadcast across the Android OS messaging system. This is not user-visible, but apps who listen for that specific broadcast can respond to it being sent.</string>
|
||||
<string name="directionStringDoesNotContain">does not contain</string>
|
||||
<string name="runExecutable">Run script or executable</string>
|
||||
<string name="path">Path</string>
|
||||
<string name="parameters">Parameters</string>
|
||||
<string name="chooseExecutable">Choose executable</string>
|
||||
<string name="runAsRoot">Run as root</string>
|
||||
<string name="selectValidExecutable">Select a valid executable file.</string>
|
||||
<string name="fileNotExecutable">The file is not executable.</string>
|
||||
<string name="wifiExplanation1">Apps targeting Android Q or higher cannot turn wifi on or off anymore. Please blame Google for this restriction, not me. You can bypass this restriction by rooting your device and activating the checkbox below. Alternatively download this application from F-Droid or my website as I am not forced to target the latest API level in those versions.</string>
|
||||
<string name="wifiExplanation2">While airplane mode is activated, wifi can only be toggled from applications when using root permissions for that.</string>
|
||||
<string name="usingRoot">using root</string>
|
||||
<string name="runExecutableExplanation">You can select a script or an executable file here that will be executed as an action.\n\nBut there are some prerequisites which you have to deal with on your own. Google has made it very hard to run anything other than regular Android applications.\n\n1. The script needs to be marked as executable. On a regular Android system (without root) this is actually the hard part.\n\n2. That also means Automation must be able to execute the file, not just the owner or the group.\n\n3. If it is a script, a valid shell be specified in the script\'s header.\n\nIf you cannot meet the above requirements, you could alternatively try to specify a shell as the actual executable (like /system/bin/sh) and your script as parameter. That has worked for at least one user.</string>
|
||||
<string name="tetheringActive">tethering is active</string>
|
||||
<string name="tetheringNotActive">tethering is not active</string>
|
||||
<string name="tetheringState">Tethering state</string>
|
||||
<string name="regularExpressionsIfEquals">If \"equals\" is selected, you may enter a regular expression.</string>
|
||||
<string name="enter_a_number">Enter a number.</string>
|
||||
<string name="duration">Duration [ms]</string>
|
||||
<string name="keepDeviceAwake">Keep device awake</string>
|
||||
<string name="wakeLockTimeout">Specify timeout</string>
|
||||
<string name="wakeLockExplanation">Activate will keep the screen on while deactivate will let it turn off. For keeping it on you can either enter a duration after which it may turn off again or you can keep it on indefinitely. In the latter case you would need to create another keep-awake action (in this or another rule) in which you select deactivate.</string>
|
||||
<string name="mayUseRegularExpressions">You may also enter a regular expression here.</string>
|
||||
<string name="simplyDismissNotification">Simply dismiss</string>
|
||||
<string name="clickNotificationButton">Click a button</string>
|
||||
<string name="withButton">with button %1$s</string>
|
||||
<string name="subSystemState">Subsystem state</string>
|
||||
<string name="bluetooth">Bluetooth</string>
|
||||
<string name="locationRequiredToDetermineWifiName">To get the wifi SSID, the app requires location permissions. Because the Google version cannot get that, you can only use this trigger if you do not specify an SSID. So it can only be used to detect if wifi is connected or not.</string>
|
||||
<string name="usb">USB</string>
|
||||
<string name="type">Type</string>
|
||||
<string name="cable">Cable</string>
|
||||
<string name="tetheringBluetoothNotPossible">Bluetooth tethering can currently not be detected. Only the other means of connection will activate this trigger.</string>
|
||||
<string name="startPhoneCall">Call phone number</string>
|
||||
<string name="android.permission.CALL_PHONE">Call phone number</string>
|
||||
<string name="makePhoneCallExplanation1">Here you can enter a phone number that will be called without further prompts. You may use this to make settings like making adjustments to call routing, etc.. Please search for the codes required for this on your own.</string>
|
||||
<string name="endPhoneCall">End phone call</string>
|
||||
<string name="android.permission.ANSWER_PHONE_CALLS">End phone call</string>
|
||||
<string name="setVariable">Set a variable</string>
|
||||
<string name="deleteVariable">Delete variable</string>
|
||||
<string name="VariableKey">Variable key</string>
|
||||
<string name="variableValue">Variable value</string>
|
||||
<string name="setVariableExplanation">If you set a variable to an empty value it will be deleted.</string>
|
||||
<string name="enterVariableKey">Enter a key for the variable.</string>
|
||||
<string name="checkVariable">Check variable</string>
|
||||
<string name="checkVariableExplanation">If you leave the value empty the variable must not be set for the condition to return true.</string>
|
||||
<string name="variableCheckString">if variable %1$s is %2$s</string>
|
||||
<string name="variableCheckStringDeleted">if variable %1$s is not set</string>
|
||||
<string name="messageType">Message type</string>
|
||||
<string name="sms">SMS</string>
|
||||
<string name="mms">MMS</string>
|
||||
<string name="attachment">Attachment</string>
|
||||
<string name="chooseFile">choose file</string>
|
||||
<string name="startAppByStartService">by startService()</string>
|
||||
</resources>
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user