Compare commits

...

22 Commits

Author SHA1 Message Date
e57b888393 Spanish translation 2021-05-13 14:40:23 +02:00
c922f8c7fc Spanish translation 2021-05-13 14:33:44 +02:00
357c7f894f Crash resolved when trying display an unknown translation for a permission 2021-05-13 12:06:15 +02:00
34091a7b73 Spanish translation. 2021-05-13 02:44:10 +02:00
8d26abdede Spanish translation 2021-05-12 22:55:44 +02:00
8d42bb48d2 WG now works. Many small changes and fixes. 2021-05-12 19:41:04 +02:00
f79efa7739 WG now works. Many small changes and fixes. 2021-05-12 17:16:56 +02:00
d257c4ccb0 Miscellaneous changes. 2021-05-11 22:49:41 +02:00
e39f0c2497 startApp changes 2021-05-11 20:00:50 +02:00
327a992cac Synced manifests. 2021-05-11 17:02:06 +02:00
9021b03732 Export/import finished. 2021-05-11 16:53:19 +02:00
514a9ae0e4 Import/export configuration and Spanish translation. 2021-05-10 22:42:16 +02:00
09298bce55 UI changes. 2021-05-10 19:56:54 +02:00
74f50d3e13 Wireguard integration 2021-05-09 23:10:58 +02:00
1946fb6b9f Start app changed 2021-05-09 14:42:24 +02:00
acc0f592d1 Wireguard integration 2021-05-08 22:48:05 +02:00
2e09ea1c90 Start app changed 2021-05-08 19:58:44 +02:00
769f227689 Start app changed 2021-05-08 15:14:31 +02:00
22533fcfee Merge remote-tracking branch 'origin/development' into development 2021-05-08 02:03:18 +02:00
004ca6993a Small fixes and layout corrections. 2021-05-08 02:03:11 +02:00
0bea81a630 Small fixes and layout corrections. 2021-05-08 02:00:57 +02:00
88decce426 Wireguard integration 2021-05-07 23:11:43 +02:00
37 changed files with 1792 additions and 1119 deletions

117
.idea/codeStyles/Project.xml generated Normal file
View File

@ -0,0 +1,117 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<codeStyleSettings language="XML">
<option name="FORCE_REARRANGE_MODE" value="1" />
<indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="4" />
</indentOptions>
<arrangement>
<rules>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:android</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:id</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:name</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>name</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>style</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
<order>ANDROID_ATTRIBUTE_ORDER</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>.*</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
</rules>
</arrangement>
</codeStyleSettings>
</code_scheme>
</component>

5
.idea/codeStyles/codeStyleConfig.xml generated Normal file
View File

@ -0,0 +1,5 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
</state>
</component>

10
.idea/runConfigurations.xml generated Normal file
View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="com.android.tools.idea.compose.preview.runconfiguration.ComposePreviewRunConfigurationProducer" />
</set>
</option>
</component>
</project>

View File

@ -11,8 +11,8 @@ android {
compileSdkVersion 29
buildToolsVersion '29.0.2'
useLibrary 'org.apache.http.legacy'
versionCode 103
versionName "1.6.32"
versionCode 104
versionName "1.6.33"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

View File

@ -63,8 +63,7 @@
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"/>
<!-- Commented out because of Google Play policy -->
<uses-permission android:name="com.wireguard.android.permission.CONTROL_TUNNELS"/>
<uses-feature
android:name="android.hardware.telephony"
@ -77,7 +76,7 @@
android:allowBackup="true"
android:allowClearUserData="true"
android:icon="@drawable/gears"
android:label="@string/title_activity_main"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:networkSecurityConfig="@xml/network_security_config">
@ -96,15 +95,15 @@
android:label="@string/app_name"></activity>
<activity
android:name=".ActivityManagePoi"
android:label="@string/title_activity_main"></activity>
android:label="@string/app_name"></activity>
<activity
android:name=".ActivitySettings"
android:label="@string/title_activity_main"></activity>
android:label="@string/app_name"></activity>
<service
android:name=".AutomationService"
android:exported="false"
android:label="@string/title_activity_main" />
android:label="@string/app_name" />
<receiver android:name=".receivers.StartupIntentReceiver" android:enabled="true" android:exported="true">
<intent-filter>
@ -142,6 +141,8 @@
<activity android:name=".ActivityManageActionSendTextMessage" />
<activity android:name=".ActivityManageActionPlaySound" />
<activity android:name=".ActivityManageTriggerTimeFrame" />
<activity android:name=".ActivityMaintenance" />
<activity android:name=".ActivityTriggerPhoneCall" />
<activity android:name=".ActivityManageActionBrightnessSetting" />
<activity android:name=".ActivityHelp" />
<activity
@ -183,10 +184,23 @@
<activity android:name=".ActivityManageActionStartActivity" />
<activity android:name=".ActivityManageTriggerNfc" />
<activity android:name=".ActivityManageActionSpeakText" />
<activity android:name=".ActivityManageActionPlaySound" />
<activity android:name=".ActivityManageTriggerBluetooth" />
<activity android:name=".ActivityMainProfiles" />
<activity android:name=".ActivityManageProfile" />
<activity android:name=".ActivityVolumeTest" />
<activity android:name=".ActivityPermissions"></activity>
<activity android:name=".ActivityManageTriggerNotification"></activity>
<service
android:name=".receivers.NotificationListener"
android:label="@string/app_name"
android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE" >
<intent-filter>
<action android:name="android.service.notification.NotificationListenerService" />
</intent-filter>
</service>
<service
android:name=".receivers.ActivityDetectionReceiver"
@ -206,18 +220,6 @@
<service android:name=".location.GeofenceIntentService"/>
<activity android:name=".ActivityManageTriggerNotification"></activity>
<service
android:name=".receivers.NotificationListener"
android:label="@string/app_name"
android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE" >
<intent-filter>
<action android:name="android.service.notification.NotificationListenerService" />
</intent-filter>
</service>
<provider
android:name=".FileShareProvider"
android:authorities="com.jens.automation2"

View File

@ -60,6 +60,8 @@
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"/>
<uses-permission android:name="com.wireguard.android.permission.CONTROL_TUNNELS"/>
<uses-feature
android:name="android.hardware.telephony"
@ -72,7 +74,7 @@
android:allowBackup="true"
android:allowClearUserData="true"
android:icon="@drawable/gears"
android:label="@string/title_activity_main"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:networkSecurityConfig="@xml/network_security_config">
@ -91,15 +93,15 @@
android:label="@string/app_name"></activity>
<activity
android:name=".ActivityManagePoi"
android:label="@string/title_activity_main"></activity>
android:label="@string/app_name"></activity>
<activity
android:name=".ActivitySettings"
android:label="@string/title_activity_main"></activity>
android:label="@string/app_name"></activity>
<service
android:name=".AutomationService"
android:exported="false"
android:label="@string/title_activity_main" />
android:label="@string/app_name" />
<receiver android:name=".receivers.StartupIntentReceiver" android:enabled="true" android:exported="true">
<intent-filter>
@ -135,7 +137,10 @@
<activity android:name=".ActivityManageActionTriggerUrl" />
<activity android:name=".ActivityDisplayLongMessage" />
<activity android:name=".ActivityManageActionSendTextMessage" />
<activity android:name=".ActivityManageActionPlaySound" />
<activity android:name=".ActivityManageTriggerTimeFrame" />
<activity android:name=".ActivityMaintenance" />
<activity android:name=".ActivityTriggerPhoneCall" />
<activity android:name=".ActivityManageActionBrightnessSetting" />
<activity android:name=".ActivityHelp" />
<activity
@ -182,6 +187,14 @@
<activity android:name=".ActivityManageProfile" />
<activity android:name=".ActivityVolumeTest" />
<activity android:name=".ActivityPermissions"></activity>
<!-- https://developer.android.com/about/versions/pie/android-9.0-changes-28#apache-p-->
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
<service android:name=".location.GeofenceIntentService"/>
<activity android:name=".ActivityManageTriggerNotification" />
<service
@ -194,8 +207,6 @@
</service>
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
<provider
android:name=".FileShareProvider"
android:authorities="com.jens.automation2"

View File

@ -61,12 +61,14 @@
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"/>
<uses-permission android:name="com.wireguard.android.permission.CONTROL_TUNNELS"/>
<application
android:allowBackup="true"
android:allowClearUserData="true"
android:icon="@drawable/gears"
android:label="@string/title_activity_main"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:networkSecurityConfig="@xml/network_security_config">
@ -85,15 +87,15 @@
android:label="@string/app_name"></activity>
<activity
android:name=".ActivityManagePoi"
android:label="@string/title_activity_main"></activity>
android:label="@string/app_name"></activity>
<activity
android:name=".ActivitySettings"
android:label="@string/title_activity_main"></activity>
android:label="@string/app_name"></activity>
<service
android:name=".AutomationService"
android:exported="false"
android:label="@string/title_activity_main" />
android:label="@string/app_name" />
<receiver android:name=".receivers.StartupIntentReceiver" android:enabled="true" android:exported="true">
<intent-filter>
@ -131,6 +133,8 @@
<activity android:name=".ActivityManageActionSendTextMessage" />
<activity android:name=".ActivityManageActionPlaySound" />
<activity android:name=".ActivityManageTriggerTimeFrame" />
<activity android:name=".ActivityMaintenance" />
<activity android:name=".ActivityTriggerPhoneCall" />
<activity android:name=".ActivityManageActionBrightnessSetting" />
<activity android:name=".ActivityHelp" />
<activity
@ -172,6 +176,7 @@
<activity android:name=".ActivityManageActionStartActivity" />
<activity android:name=".ActivityManageTriggerNfc" />
<activity android:name=".ActivityManageActionSpeakText" />
<activity android:name=".ActivityManageActionPlaySound" />
<activity android:name=".ActivityManageTriggerBluetooth" />
<activity android:name=".ActivityMainProfiles" />
<activity android:name=".ActivityManageProfile" />
@ -200,9 +205,12 @@
<activity android:name=".ActivityPermissions"></activity>
<!-- https://developer.android.com/about/versions/pie/android-9.0-changes-28#apache-p-->
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
<service android:name=".location.GeofenceIntentService"/>
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
<provider
android:name=".FileShareProvider"

View File

@ -15,6 +15,7 @@ import java.util.Locale;
public class Action
{
public static final String actionParameter2Split = "ap2split";
public static final String intentPairSeperator = "intPairSplit";
public enum Action_Enum {
setWifi,
@ -237,6 +238,10 @@ public class Action
else
returnString.append(": " + components[0]);
}
else if(this.getAction().equals(Action_Enum.startOtherActivity))
{
returnString.append(": " + parameter2.replace(Action.intentPairSeperator, "/"));
}
else if(this.getAction().equals(Action_Enum.sendTextMessage))
{
String[] components = parameter2.split(Actions.smsSeparator);
@ -373,7 +378,7 @@ public class Action
Actions.setDisplayRotation(context, getParameter1(), toggleActionIfPossible);
break;
case startOtherActivity:
Actions.startOtherActivity(getParameter2());
Actions.startOtherActivity(getParameter1(), getParameter2());
break;
case waitBeforeNextAction:
Actions.waitBeforeNextAction(Long.parseLong(this.getParameter2()));

View File

@ -56,7 +56,12 @@ public class Actions
private static String suVersion = null;
private static String suVersionInternal = null;
private static List<String> suResult = null;
final static String smsSeparator = "&sms&";
public final static String smsSeparator = "&sms&";
public final static String dummyPackageString = "dummyPkg239asd";
public static final String wireguard_tunnel_up = "com.wireguard.android.action.SET_TUNNEL_UP";
public static final String wireguard_tunnel_down = "com.wireguard.android.action.SET_TUNNEL_DOWN";
public static final String wireguard_tunnel_refresh = "com.wireguard.android.action.REFRESH_TUNNEL_STATES";
public static Boolean setWifi(Context context, Boolean desiredState, boolean toggleActionIfPossible)
{
@ -564,35 +569,61 @@ public class Actions
}
}
public static void startOtherActivity(String param)
public static void startOtherActivity(boolean startByAction, String param)
{
Miscellaneous.logEvent("i", "StartOtherActivity", "Starting other Activity...", 4);
String packageName, className;
String params[] = param.split(";");
packageName = params[0];
className = params[1];
try
{
Miscellaneous.logEvent("i", "StartOtherApp", "Starting " + packageName + " " + className, 3);
Intent externalActivityIntent = new Intent(Intent.ACTION_MAIN);
externalActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
externalActivityIntent.addCategory(Intent.CATEGORY_LAUNCHER);
Intent externalActivityIntent;
if(packageName.equals("dummyPkg"))
externalActivityIntent.setAction(className);
else
externalActivityIntent.setClassName(packageName, className);
int paramsStartIndex;
if(Miscellaneous.doesActivityExist(externalActivityIntent, Miscellaneous.getAnyContext()))
if(!startByAction)
{
// has intent values to deliver
for (int i = 2; i < params.length; i++)
{
String[] singleParam = params[i].split("/");
// selected by activity
String packageName, className;
packageName = params[0];
className = params[1];
Miscellaneous.logEvent("i", "StartOtherApp", "Starting app by activity: " + packageName + " " + className, 3);
paramsStartIndex = 2;
externalActivityIntent = new Intent(Intent.ACTION_MAIN);
externalActivityIntent.addCategory(Intent.CATEGORY_LAUNCHER);
// if(packageName.equals("dummyPkg"))
// externalActivityIntent.setAction(className);
// else
externalActivityIntent.setClassName(packageName, className);
if(!Miscellaneous.doesActivityExist(externalActivityIntent, Miscellaneous.getAnyContext()))
Miscellaneous.logEvent("w", "StartOtherApp", "Activity not found: " + className, 2);
}
else
{
// selected by action
Miscellaneous.logEvent("i", "StartOtherApp", "Starting app by action: " + param, 3);
externalActivityIntent = new Intent();
if(!params[0].equals(dummyPackageString))
externalActivityIntent.setPackage(params[0]);
externalActivityIntent.setAction(params[1]);
}
externalActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// Pack intents
for (int i = 3; i < params.length; i++)
{
String[] singleParam = params[i].split(Action.intentPairSeperator);
/*Class c = Class.forName(singleParam[0]);
for(Method m : c.getMethods())
@ -604,68 +635,79 @@ 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);
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 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("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);
externalActivityIntent.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);
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]);
}
else
Miscellaneous.logEvent("w", "StartOtherApp", "Unknown type of parameter " + singleParam[0] + " found. Name " + singleParam[1] + " and value " + singleParam[2], 3);
}
if(params[2].equals(ActivityManageActionStartActivity.startByActivityString))
autoMationServerRef.startActivity(externalActivityIntent);
}
else
{
Miscellaneous.logEvent("w", "StartOtherApp", "Activity not found: " + className, 2);
}
else
autoMationServerRef.sendBroadcast(externalActivityIntent);
}
catch(ActivityNotFoundException | SecurityException e)
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();
@ -1064,7 +1106,7 @@ public class Actions
if(enable)
desiredState = 1;
if(MobileDataStuff.setMobileNetworkfromLollipop(desiredState, autoMationServerRef))
if(MobileDataStuff.setMobileNetworkFromLollipop(desiredState, autoMationServerRef))
{
Miscellaneous.logEvent("i", "setDataConnectionWithRoot()", Miscellaneous.getAnyContext().getResources().getString(R.string.dataConWithRootSuccess), 2);
return true;
@ -1089,7 +1131,7 @@ public class Actions
}
@SuppressLint("NewApi")
public static boolean setMobileNetworkfromLollipop(int desiredState, Context context) throws Exception
public static boolean setMobileNetworkFromLollipop(int desiredState, Context context) throws Exception
{
String command = null;
int state = 0;

View File

@ -42,8 +42,8 @@ public class ActivityMainScreen extends ActivityGeneric
private static ActivityMainScreen activityMainScreenInstance = null;
private ToggleButton toggleService, tbLockSound;
private Button bShowHelp, bPrivacy, bSettingsErase, bSettingsSetToDefault, bVolumeTest, bAddSoundLockTIme, bShareConfigAndLog;
private TextView tvActivePoi, tvClosestPoi, tvLastRule, tvMainScreenNotePermissions, tvMainScreenNoteFeaturesFromOtherFlavor, tvMainScreenNoteLocationImpossibleBlameGoogle, tvMainScreenNoteNews, tvlockSoundDuration, tvFileStoreLocation;
private Button bShowHelp, bPrivacy, bSettingsErase, bAddSoundLockTIme;
private TextView tvActivePoi, tvClosestPoi, tvLastRule, tvMainScreenNotePermissions, tvMainScreenNoteFeaturesFromOtherFlavor, tvMainScreenNoteLocationImpossibleBlameGoogle, tvMainScreenNoteNews, tvlockSoundDuration;
private ListView lvRuleHistory;
private ArrayAdapter<Rule> ruleHistoryListViewAdapter;
@ -77,11 +77,7 @@ public class ActivityMainScreen extends ActivityGeneric
tvMainScreenNoteLocationImpossibleBlameGoogle = (TextView) findViewById(R.id.tvMainScreenNoteLocationImpossibleBlameGoogle);
tvMainScreenNoteNews = (TextView) findViewById(R.id.tvMainScreenNoteNews);
tvlockSoundDuration = (TextView)findViewById(R.id.tvlockSoundDuration);
tvFileStoreLocation = (TextView)findViewById(R.id.tvFileStoreLocation);
tbLockSound = (ToggleButton) findViewById(R.id.tbLockSound);
bVolumeTest = (Button) findViewById(R.id.bVolumeTest);
bSettingsSetToDefault = (Button) findViewById(R.id.bSettingsSetToDefault);
bShareConfigAndLog = (Button) findViewById(R.id.bShareConfigAndLog);
toggleService = (ToggleButton) findViewById(R.id.tbArmMastListener);
toggleService.setChecked(AutomationService.isMyServiceRunning(this));
toggleService.setOnCheckedChangeListener(new OnCheckedChangeListener()
@ -136,18 +132,8 @@ public class ActivityMainScreen extends ActivityGeneric
@Override
public void onClick(View v)
{
Intent myIntent = new Intent(ActivityMainScreen.this, ActivitySettings.class);
startActivityForResult(myIntent, 6000);
}
});
bVolumeTest.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
Intent intent = new Intent(ActivityMainScreen.this, ActivityVolumeTest.class);
startActivity(intent);
Intent myIntent = new Intent(ActivityMainScreen.this, ActivityMaintenance.class);
startActivity(myIntent);
}
});
@ -184,24 +170,6 @@ public class ActivityMainScreen extends ActivityGeneric
}
});
bSettingsSetToDefault.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
getDefaultSettingsDialog(ActivityMainScreen.this).show();
}
});
bShareConfigAndLog.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
getShareConfigAndLogDialogue(ActivityMainScreen.this).show();
}
});
lvRuleHistory.setOnTouchListener(new OnTouchListener()
{
@Override
@ -264,81 +232,6 @@ public class ActivityMainScreen extends ActivityGeneric
return alertDialog;
}
private static AlertDialog getDefaultSettingsDialog(final Context context)
{
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
alertDialogBuilder.setTitle(context.getResources().getString(R.string.areYouSure));
alertDialogBuilder.setPositiveButton(context.getResources().getString(R.string.yes), new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
if (Settings.initializeSettings(context, true))
Toast.makeText(context, context.getResources().getString(R.string.settingsSetToDefault), Toast.LENGTH_LONG).show();
}
});
alertDialogBuilder.setNegativeButton(context.getResources().getString(R.string.no), null);
AlertDialog alertDialog = alertDialogBuilder.create();
return alertDialog;
}
AlertDialog getShareConfigAndLogDialogue(final Context context)
{
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
alertDialogBuilder.setTitle(context.getResources().getString(R.string.shareConfigAndLogFilesWithDev));
alertDialogBuilder.setMessage(context.getResources().getString(R.string.shareConfigAndLogExplanation));
alertDialogBuilder.setPositiveButton(context.getResources().getString(R.string.yes), new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
File dstZipFile = new File(Miscellaneous.getAnyContext().getCacheDir() + "/" + Settings.zipFileName);
ArrayList<String> srcFilesList = new ArrayList<>();
srcFilesList.add(Miscellaneous.getWriteableFolder() + "/" + XmlFileInterface.settingsFileName);
String logFilePath = Miscellaneous.getWriteableFolder() + "/" + Miscellaneous.logFileName;
if((new File(logFilePath)).exists())
srcFilesList.add(logFilePath);
String logFilePathArchive = Miscellaneous.getWriteableFolder() + "/" + Miscellaneous.logFileName + "-old";
if((new File(logFilePathArchive)).exists())
srcFilesList.add(logFilePathArchive);
String[] srcFiles = srcFilesList.toArray(new String[srcFilesList.size()]);
if(dstZipFile.exists())
dstZipFile.delete();
Miscellaneous.zip(srcFiles, dstZipFile.getAbsolutePath());
/*
Without root the zip file in the cache directory is not directly accessible.
But have to route it through this content provider crap.
*/
String subject = "Automation logs";
StringBuilder emailBody = new StringBuilder();
emailBody.append("Device details" + Miscellaneous.lineSeparator);
emailBody.append("OS version: " + System.getProperty("os.version") + Miscellaneous.lineSeparator);
emailBody.append("API Level: " + android.os.Build.VERSION.SDK + Miscellaneous.lineSeparator);
emailBody.append("Device: " + android.os.Build.DEVICE + Miscellaneous.lineSeparator);
emailBody.append("Model: " + android.os.Build.MODEL + Miscellaneous.lineSeparator);
emailBody.append("Product: " + android.os.Build.PRODUCT);
Uri uri = Uri.parse("content://com.jens.automation2/" + Settings.zipFileName);
Miscellaneous.sendEmail(ActivityMainScreen.this, "android-development@gmx.de", "Automation logs", emailBody.toString(), uri);
}
});
alertDialogBuilder.setNegativeButton(context.getResources().getString(R.string.no), null);
AlertDialog alertDialog = alertDialogBuilder.create();
return alertDialog;
}
public static ActivityMainScreen getActivityMainScreenInstance()
{
return activityMainScreenInstance;
@ -515,34 +408,6 @@ public class ActivityMainScreen extends ActivityGeneric
Settings.considerDone(Settings.constNewsOptInDone);
Settings.writeSettings(Miscellaneous.getAnyContext());
String folder = Miscellaneous.getWriteableFolder();
if(folder != null && folder.length() > 0)
{
activityMainScreenInstance.tvFileStoreLocation.setText(String.format(activityMainScreenInstance.getResources().getString(R.string.filesStoredAt), folder));
activityMainScreenInstance.tvFileStoreLocation.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
Uri selectedUri = Uri.parse(folder);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(selectedUri, "resource/folder");
if (intent.resolveActivityInfo(activityMainScreenInstance.getPackageManager(), 0) != null)
{
activityMainScreenInstance.startActivity(intent);
}
else
{
// if you reach this place, it means there is no any file
// explorer app installed on your device
Toast.makeText(activityMainScreenInstance, activityMainScreenInstance.getResources().getString(R.string.noFileManageInstalled), Toast.LENGTH_LONG).show();
}
}
});
}
}
}
@ -598,16 +463,6 @@ public class ActivityMainScreen extends ActivityGeneric
case ActivityPermissions.requestCodeForPermissions:
updateMainScreen();
break;
case 6000: //settings
Settings.readFromPersistentStorage(this);
if (boundToService && AutomationService.isMyServiceRunning(this))
myAutomationService.serviceInterface(serviceCommands.reloadSettings);
if(AutomationService.isMyServiceRunning(ActivityMainScreen.this))
Toast.makeText(this, getResources().getString(R.string.settingsWillTakeTime), Toast.LENGTH_LONG).show();
break;
}
if (AutomationService.isMyServiceRunning(this))

View File

@ -0,0 +1,353 @@
package com.jens.automation2;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.documentfile.provider.DocumentFile;
import java.io.File;
import java.util.ArrayList;
public class ActivityMaintenance extends Activity
{
final static int requestCodeImport = 1001;
final static int requestCodeExport = 1002;
final static int requestCodeMoreSettings = 6000;
final static String prefsFileName = "com.jens.automation2_preferences.xml";
TextView tvFileStoreLocation;
Button bVolumeTest, bMoreSettings, bSettingsSetToDefault, bShareConfigAndLog, bImportConfiguration, bExportConfiguration;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maintenance);
bVolumeTest = (Button) findViewById(R.id.bVolumeTest);
bVolumeTest.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
Intent intent = new Intent(ActivityMaintenance.this, ActivityVolumeTest.class);
startActivity(intent);
}
});
bShareConfigAndLog = (Button) findViewById(R.id.bShareConfigAndLog);
bShareConfigAndLog.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
getShareConfigAndLogDialogue(ActivityMaintenance.this).show();
}
});
bSettingsSetToDefault = (Button) findViewById(R.id.bSettingsSetToDefault);
bSettingsSetToDefault.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
getDefaultSettingsDialog(ActivityMaintenance.this).show();
}
});
Button bMoreSettings = (Button) findViewById(R.id.bMoreSettings);
bMoreSettings.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
Intent myIntent = new Intent(ActivityMaintenance.this, ActivitySettings.class);
startActivityForResult(myIntent, requestCodeMoreSettings);
}
});
bImportConfiguration = (Button) findViewById(R.id.bImportConfiguration);
bImportConfiguration.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, requestCodeImport);
}
});
bExportConfiguration = (Button) findViewById(R.id.bExportConfiguration);
bExportConfiguration.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, requestCodeExport);
}
});
tvFileStoreLocation = (TextView)findViewById(R.id.tvFileStoreLocation);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
switch(requestCode)
{
case requestCodeMoreSettings: //settings
Settings.readFromPersistentStorage(this);
if (AutomationService.isMyServiceRunning(this))
AutomationService.getInstance().serviceInterface(AutomationService.serviceCommands.reloadSettings);
if (AutomationService.isMyServiceRunning(ActivityMaintenance.this))
Toast.makeText(this, getResources().getString(R.string.settingsWillTakeTime), Toast.LENGTH_LONG).show();
break;
case requestCodeImport:
if(resultCode == RESULT_OK)
{
Uri uriTree = data.getData();
importFiles(uriTree);
}
break;
case requestCodeExport:
if(resultCode == RESULT_OK)
{
Uri uriTree = data.getData();
exportFiles(uriTree);
}
break;
}
}
void importFiles(Uri uriTree)
{
// https://stackoverflow.com/questions/46237558/android-strange-behavior-of-documentfile-inputstream
File dstRules = new File(Miscellaneous.getWriteableFolder() + "/" + XmlFileInterface.settingsFileName);
File dstPrefs = new File(Miscellaneous.getWriteableFolder() + "/../shared_prefs/" + prefsFileName);
DocumentFile directory = DocumentFile.fromTreeUri(this, uriTree);
int applicableFilesFound = 0;
int filesImported = 0;
if(directory.listFiles().length > 0)
{
for (DocumentFile file : directory.listFiles())
{
if (file.getName().equals(XmlFileInterface.settingsFileName))
{
applicableFilesFound++;
if(file.canRead())
{
// import rules, locations, etc.
if (Miscellaneous.copyDocumentFileToFile(file, dstRules))
filesImported++;
else
Toast.makeText(ActivityMaintenance.this, getResources().getString(R.string.rulesImportError), Toast.LENGTH_LONG).show();
}
}
else if (file.getName().equals(prefsFileName))
{
applicableFilesFound++;
if(file.canRead())
{
// import rules, locations, etc.
if (Miscellaneous.copyDocumentFileToFile(file, dstPrefs))
filesImported++;
else
Toast.makeText(ActivityMaintenance.this, getResources().getString(R.string.prefsImportError), Toast.LENGTH_LONG).show();
}
}
}
if(applicableFilesFound > 0)
{
if(filesImported == 0)
Toast.makeText(ActivityMaintenance.this, getResources().getString(R.string.noFilesImported), Toast.LENGTH_LONG).show();
else if(filesImported < applicableFilesFound)
Toast.makeText(ActivityMaintenance.this, getResources().getString(R.string.notAllFilesImported), Toast.LENGTH_LONG).show();
else if (filesImported == applicableFilesFound)
{
Toast.makeText(ActivityMaintenance.this, getResources().getString(R.string.configurationImportedSuccessfully), Toast.LENGTH_LONG).show();
try
{
XmlFileInterface.readFile();
}
catch (Exception e)
{
Miscellaneous.logEvent("e", "Reading import", "Rules re-read failed: " + Log.getStackTraceString(e), 1);
Toast.makeText(ActivityMaintenance.this, getResources().getString(R.string.errorReadingPoisAndRulesFromFile), Toast.LENGTH_LONG).show();
}
Settings.readFromPersistentStorage(ActivityMaintenance.this);
}
else
Toast.makeText(ActivityMaintenance.this, getResources().getString(R.string.noFilesImported), Toast.LENGTH_LONG).show();
}
else
Toast.makeText(ActivityMaintenance.this, getResources().getString(R.string.noApplicableFilesFoundInDirectory), Toast.LENGTH_LONG).show();
}
else
Toast.makeText(ActivityMaintenance.this, getResources().getString(R.string.noApplicableFilesFoundInDirectory), Toast.LENGTH_LONG).show();
}
void exportFiles(Uri uriTree)
{
DocumentFile directory = DocumentFile.fromTreeUri(this, uriTree);
File srcRules = new File(Miscellaneous.getWriteableFolder() + "/" + XmlFileInterface.settingsFileName);
File srcPrefs = new File(Miscellaneous.getWriteableFolder() + "/../shared_prefs/" + prefsFileName);
// Clean up
for(DocumentFile file : directory.listFiles())
{
if(file.getName().equals(XmlFileInterface.settingsFileName) && file.canWrite())
file.delete();
else if(file.getName().equals(prefsFileName) && file.canWrite())
file.delete();
}
DocumentFile dstRules = directory.createFile("text/xml", XmlFileInterface.settingsFileName);
DocumentFile dstPrefs = directory.createFile("text/xml", prefsFileName);
if(dstRules.canWrite() && dstPrefs.canWrite())
{
if(Miscellaneous.copyFileToDocumentFile(srcRules, dstRules) && Miscellaneous.copyFileToDocumentFile(srcPrefs, dstPrefs))
Toast.makeText(ActivityMaintenance.this, getResources().getString(R.string.configurationExportedSuccessfully), Toast.LENGTH_LONG).show();
else
Toast.makeText(ActivityMaintenance.this, getResources().getString(R.string.ConfigurationExportError), Toast.LENGTH_LONG).show();
}
else
Toast.makeText(ActivityMaintenance.this, getResources().getString(R.string.ConfigurationExportError), Toast.LENGTH_LONG).show();
}
private static AlertDialog getDefaultSettingsDialog(final Context context)
{
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
alertDialogBuilder.setTitle(context.getResources().getString(R.string.areYouSure));
alertDialogBuilder.setPositiveButton(context.getResources().getString(R.string.yes), new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
if (Settings.initializeSettings(context, true))
Toast.makeText(context, context.getResources().getString(R.string.settingsSetToDefault), Toast.LENGTH_LONG).show();
}
});
alertDialogBuilder.setNegativeButton(context.getResources().getString(R.string.no), null);
AlertDialog alertDialog = alertDialogBuilder.create();
return alertDialog;
}
AlertDialog getShareConfigAndLogDialogue(final Context context)
{
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
alertDialogBuilder.setTitle(context.getResources().getString(R.string.shareConfigAndLogFilesWithDev));
alertDialogBuilder.setMessage(context.getResources().getString(R.string.shareConfigAndLogExplanation));
alertDialogBuilder.setPositiveButton(context.getResources().getString(R.string.yes), new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
File dstZipFile = new File(Miscellaneous.getAnyContext().getCacheDir() + "/" + Settings.zipFileName);
ArrayList<String> srcFilesList = new ArrayList<>();
srcFilesList.add(Miscellaneous.getWriteableFolder() + "/" + XmlFileInterface.settingsFileName);
srcFilesList.add(Miscellaneous.getWriteableFolder() + "/../shared_prefs/" + prefsFileName);
String logFilePath = Miscellaneous.getWriteableFolder() + "/" + Miscellaneous.logFileName;
if((new File(logFilePath)).exists())
srcFilesList.add(logFilePath);
String logFilePathArchive = Miscellaneous.getWriteableFolder() + "/" + Miscellaneous.logFileName + "-old";
if((new File(logFilePathArchive)).exists())
srcFilesList.add(logFilePathArchive);
String[] srcFiles = srcFilesList.toArray(new String[srcFilesList.size()]);
if(dstZipFile.exists())
dstZipFile.delete();
Miscellaneous.zip(srcFiles, dstZipFile.getAbsolutePath());
/*
Without root the zip file in the cache directory is not directly accessible.
But have to route it through this content provider crap.
*/
String subject = "Automation logs";
StringBuilder emailBody = new StringBuilder();
emailBody.append("Device details" + Miscellaneous.lineSeparator);
emailBody.append("OS version: " + System.getProperty("os.version") + Miscellaneous.lineSeparator);
emailBody.append("API Level: " + android.os.Build.VERSION.SDK + Miscellaneous.lineSeparator);
emailBody.append("Device: " + android.os.Build.DEVICE + Miscellaneous.lineSeparator);
emailBody.append("Model: " + android.os.Build.MODEL + Miscellaneous.lineSeparator);
emailBody.append("Product: " + android.os.Build.PRODUCT);
Uri uri = Uri.parse("content://com.jens.automation2/" + Settings.zipFileName);
Miscellaneous.sendEmail(ActivityMaintenance.this, "android-development@gmx.de", "Automation logs", emailBody.toString(), uri);
}
});
alertDialogBuilder.setNegativeButton(context.getResources().getString(R.string.no), null);
AlertDialog alertDialog = alertDialogBuilder.create();
return alertDialog;
}
@Override
protected void onResume()
{
super.onResume();
String folder = Miscellaneous.getWriteableFolder();
if (folder != null && folder.length() > 0)
{
tvFileStoreLocation.setText(String.format(getResources().getString(R.string.filesStoredAt), folder));
tvFileStoreLocation.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
Uri selectedUri = Uri.parse(folder);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(selectedUri, "resource/folder");
if (intent.resolveActivityInfo(getPackageManager(), 0) != null)
{
startActivity(intent);
}
else
{
// if you reach this place, it means there is no any file
// explorer app installed on your device
Toast.makeText(ActivityMaintenance.this, getResources().getString(R.string.noFileManageInstalled), Toast.LENGTH_LONG).show();
}
}
});
}
}
}

View File

@ -10,6 +10,7 @@ import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.InputType;
@ -22,10 +23,11 @@ import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import com.jens.automation2.Action.Action_Enum;
@ -37,12 +39,21 @@ import java.util.List;
public class ActivityManageActionStartActivity extends Activity
{
/*
This page might qualify as a help page: https://stackoverflow.com/questions/55323947/open-url-in-firefox-for-android-using-intent
*/
ListView lvIntentPairs;
EditText etParameterName, etParameterValue, etSelectedActivity;
Button bSelectApp, bAddIntentPair, bSaveActionStartOtherActivity;
EditText etParameterName, etParameterValue, etPackageName, etActivityOrActionPath;
Button bSelectApp, bAddIntentPair, bSaveActionStartOtherActivity, showStartProgramExamples;
Spinner spinnerParameterType;
boolean edit = false;
ProgressDialog progressDialog = null;
RadioButton rbStartAppSelectByActivity, rbStartAppSelectByAction, rbStartAppByActivity, rbStartAppByBroadcast;
final String urlShowExamples = "https://server47.de/automation/examples_startProgram.html";
final static String startByActivityString = "0";
final static String startByBroadcastString = "1";
private class CustomPackageInfo extends PackageInfo implements Comparable<CustomPackageInfo>
{
@ -71,7 +82,7 @@ public class ActivityManageActionStartActivity extends Activity
private static List<PackageInfo> pInfos = null;
public static Action resultingAction;
private static final String[] supportedIntentTypes = { "boolean", "byte", "char", "double", "float", "int", "long", "short", "String" };
private static final String[] supportedIntentTypes = { "boolean", "byte", "char", "double", "float", "int", "long", "short", "String", "Uri" };
private ArrayList<String> intentPairList = new ArrayList<String>();
ArrayAdapter<String> intentTypeSpinnerAdapter, intentPairAdapter;
@ -267,7 +278,8 @@ public class ActivityManageActionStartActivity extends Activity
public void onClick(DialogInterface dialog, int which)
{
ActivityInfo ai = ActivityManageActionStartActivity.getActivityInfoForPackageNameAndActivityName(packageName, activityArray[which]);
etSelectedActivity.setText(ai.packageName + ";" + ai.name);
etPackageName.setText(ai.packageName);
etActivityOrActionPath.setText(ai.name);
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
@ -279,7 +291,7 @@ public class ActivityManageActionStartActivity extends Activity
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.action_start_activity);
setContentView(R.layout.activity_manage_action_start_activity);
lvIntentPairs = (ListView)findViewById(R.id.lvIntentPairs);
etParameterName = (EditText)findViewById(R.id.etParameterName);
@ -288,7 +300,14 @@ public class ActivityManageActionStartActivity extends Activity
bAddIntentPair = (Button)findViewById(R.id.bAddIntentPair);
bSaveActionStartOtherActivity = (Button)findViewById(R.id.bSaveActionStartOtherActivity);
spinnerParameterType = (Spinner)findViewById(R.id.spinnerParameterType);
etSelectedActivity = (EditText) findViewById(R.id.etSelectedApplication);
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);
@ -324,14 +343,34 @@ public class ActivityManageActionStartActivity extends Activity
Toast.makeText(ActivityManageActionStartActivity.this, getResources().getString(R.string.enterNameForIntentPair), Toast.LENGTH_LONG).show();
return;
}
else if(etParameterName.getText().toString().contains(Action.intentPairSeperator))
{
Toast.makeText(ActivityManageActionStartActivity.this, String.format(getResources().getString(R.string.stringNotAllowed), Action.intentPairSeperator), 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.intentPairSeperator))
{
Toast.makeText(ActivityManageActionStartActivity.this, String.format(getResources().getString(R.string.stringNotAllowed), Action.intentPairSeperator), 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()] + "/" + etParameterName.getText().toString() + "/" + etParameterValue.getText().toString();
String param = supportedIntentTypes[spinnerParameterType.getSelectedItemPosition()] + Action.intentPairSeperator + etParameterName.getText().toString() + Action.intentPairSeperator + etParameterValue.getText().toString();
intentPairList.add(param);
spinnerParameterType.setSelection(0);
@ -345,6 +384,16 @@ public class ActivityManageActionStartActivity extends Activity
}
});
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
@ -397,6 +446,26 @@ public class ActivityManageActionStartActivity extends Activity
}
});
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)
{
@ -407,25 +476,46 @@ public class ActivityManageActionStartActivity extends Activity
private void loadValuesIntoGui()
{
boolean selectionByAction = resultingAction.getParameter1();
rbStartAppSelectByActivity.setChecked(!selectionByAction);
rbStartAppSelectByAction.setChecked(selectionByAction);
String[] params = resultingAction.getParameter2().split(";");
if(params.length >= 2)
rbStartAppByActivity.setChecked(params[2].equals(startByActivityString));
rbStartAppByBroadcast.setChecked(params[2].equals(startByBroadcastString));
int startIndex = -1;
if(!selectionByAction)
{
etSelectedActivity.setText(params[0] + ";" + params[1]);
etPackageName.setText(params[0]);
etActivityOrActionPath.setText(params[1]);
}
else
{
if(!params[0].contains(Actions.dummyPackageString))
etPackageName.setText(params[0]);
if(params.length > 2)
etActivityOrActionPath.setText(params[1]);
}
if (params.length >= 3)
startIndex = 3;
if(startIndex > -1 && params.length > startIndex)
{
intentPairList.clear();
for(int i=startIndex; i<params.length; i++)
{
intentPairList.clear();
if(lvIntentPairs.getVisibility() != View.VISIBLE)
lvIntentPairs.setVisibility(View.VISIBLE);
for(int i=2; i<params.length; i++)
{
if(lvIntentPairs.getVisibility() != View.VISIBLE)
lvIntentPairs.setVisibility(View.VISIBLE);
intentPairList.add(params[i]);
}
updateIntentPairList();
intentPairList.add(params[i]);
}
updateIntentPairList();
}
}
@ -439,39 +529,51 @@ public class ActivityManageActionStartActivity extends Activity
private boolean saveAction()
{
if(etSelectedActivity.getText().toString().length() == 0)
if(rbStartAppSelectByActivity.isChecked())
{
Toast.makeText(ActivityManageActionStartActivity.this, getResources().getString(R.string.selectApplication), Toast.LENGTH_LONG).show();
return false;
if (etPackageName.getText().toString().length() == 0)
{
Toast.makeText(ActivityManageActionStartActivity.this, getResources().getString(R.string.enterPackageName), Toast.LENGTH_LONG).show();
return false;
}
else if (etActivityOrActionPath.getText().toString().length() == 0)
{
Toast.makeText(ActivityManageActionStartActivity.this, getResources().getString(R.string.selectApplication), Toast.LENGTH_LONG).show();
return false;
}
}
// else
// {
// Intent testIntent = new Intent(ActivityManageActionStartActivity.this, etSelectedActivity);
// Intent externalActivityIntent = new Intent(Intent.ACTION_MAIN);
// externalActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// externalActivityIntent.addCategory(Intent.CATEGORY_LAUNCHER);
// externalActivityIntent.setClassName(packageName, className);
//
// boolean activityExists = externalActivityIntent.resolveActivityInfo(getPackageManager(), 0) != null;
// }
if(etSelectedActivity.getText().toString().equals(getResources().getString(R.string.selectApplication)))
else
{
Toast.makeText(this, getResources().getString(R.string.selectApplication), Toast.LENGTH_LONG).show();
return false;
if(etActivityOrActionPath.getText().toString().contains(";"))
{
Toast.makeText(this, getResources().getString(R.string.enterValidAction), Toast.LENGTH_LONG).show();
return false;
}
}
if(resultingAction == null)
resultingAction = new Action();
resultingAction.setParameter1(rbStartAppSelectByAction.isChecked());
resultingAction.setAction(Action_Enum.startOtherActivity);
String parameter2;
String parameter2 = "";
if(etSelectedActivity.getText().toString().contains(";"))
parameter2 = etSelectedActivity.getText().toString();
if(rbStartAppSelectByActivity.isChecked())
parameter2 += etPackageName.getText().toString() + ";" + etActivityOrActionPath.getText().toString();
else
parameter2 = "dummyPkg;" + etSelectedActivity.getText().toString();
{
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;

View File

@ -258,7 +258,7 @@ public class ActivityManageTriggerNotification extends Activity
bSaveTriggerNotification = (Button)findViewById(R.id.bSaveTriggerNotification);
spinnerTitleDirection = (Spinner)findViewById(R.id.spinnerTitleDirection);
spinnerTextDirection = (Spinner)findViewById(R.id.spinnerTextDirection);
tvSelectedApplication = (TextView)findViewById(R.id.etSelectedApplication);
tvSelectedApplication = (TextView)findViewById(R.id.etActivityOrActionPath);
chkNotificationDirection = (CheckBox)findViewById(R.id.chkNotificationDirection);
directions = new String[] {

View File

@ -7,6 +7,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
@ -55,6 +56,7 @@ public class ActivityPermissions extends Activity
public static final String permissionNameCall = "android.permission.PROCESS_OUTGOING_CALLS";
public static final String permissionNameStartService = "android.permission.FOREGROUND_SERVICE";
public static final String permissionNameReadNotifications = "android.permission.BIND_NOTIFICATION_LISTENER_SERVICE";
public static final String permissionNameWireguard = "com.wireguard.android.permission.CONTROL_TUNNELS";
public static ActivityPermissions getInstance()
{
@ -188,14 +190,19 @@ public class ActivityPermissions extends Activity
}
else
{
explanation.append(
explanation.append("<br /><u>");
"<br />" +
"<u>" +
getResources().getString(getResources().getIdentifier(s, "string", getPackageName()))
+ "</u>"
try
{
explanation.append(getResources().getString(getResources().getIdentifier(s, "string", getPackageName())));
}
catch(Resources.NotFoundException e)
{
Miscellaneous.logEvent("w", "ActivityPermissions", "Could not find translation for " + s, 4);
explanation.append(s);
}
+ "<br />");
explanation.append("</u><br />");
for (String reason : getReasonForPermission(s))
explanation.append(reason + "<br />");
@ -218,6 +225,7 @@ public class ActivityPermissions extends Activity
}
ActivityMainScreen.updateMainScreen();
ActivityMainRules.getInstance().updateListView();
}
protected static void addToArrayListUnique(String value, ArrayList<String> list)
@ -534,6 +542,20 @@ public class ActivityPermissions extends Activity
case speakText:
break;
case startOtherActivity:
if(
action.getParameter2().contains(Actions.wireguard_tunnel_up)
||
action.getParameter2().contains(Actions.wireguard_tunnel_down)
||
action.getParameter2().contains(Actions.wireguard_tunnel_refresh)
)
addToArrayListUnique(ActivityPermissions.permissionNameWireguard, requiredPermissions);
// if(
// action.getParameter2().contains("eu.faircode.netguard.START_PORT_FORWARD")
// ||
// action.getParameter2().contains("eu.faircode.netguard.STOP_PORT_FORWARD")
// )
// addToArrayListUnique("net.kollnig.missioncontrol.permission.ADMIN", requiredPermissions);
break;
case triggerUrl:
addToArrayListUnique("android.permission.INTERNET", requiredPermissions);
@ -1066,6 +1088,7 @@ public class ActivityPermissions extends Activity
NotificationManager mNotificationManager = (NotificationManager) Miscellaneous.getAnyContext().getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.cancel(notificationIdPermissions);
ActivityMainScreen.updateMainScreen();
ActivityMainRules.getInstance().updateListView();
this.finish();
}

View File

@ -0,0 +1,16 @@
package com.jens.automation2;
import android.app.Activity;
import android.os.Bundle;
import androidx.annotation.Nullable;
public class ActivityTriggerPhoneCall extends Activity
{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.trigger_phone_call);
}
}

View File

@ -581,11 +581,11 @@ public class AutomationService extends Service implements OnInitListener
if(activePoi == null)
{
PointOfInterest closestPoi = PointOfInterest.getClosestPOI(instance.getLocationProvider().getCurrentLocation());
bodyText = "Active POI: none" + "\n" + "Closest POI: " + 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 = "Active POI: " + activePoi.getName() + lastRuleString;
bodyText = AutomationService.getInstance().getResources().getString(R.string.activePoi) + ": " + activePoi.getName() + lastRuleString;
}
}
catch(NullPointerException e)

View File

@ -26,6 +26,7 @@ import android.util.Log;
import android.widget.Toast;
import com.jens.automation2.location.LocationProvider;
import com.jens.automation2.receivers.NotificationListener;
import com.jens.automation2.receivers.PhoneStatusListener;
import org.apache.http.HttpEntity;
@ -90,6 +91,7 @@ import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import androidx.core.app.NotificationCompat;
import androidx.documentfile.provider.DocumentFile;
import static android.provider.CalendarContract.CalendarCache.URI;
import static com.jens.automation2.AutomationService.NOTIFICATION_CHANNEL_ID;
@ -596,6 +598,26 @@ public class Miscellaneous extends Service
source = source.replace("[ms]", String.valueOf(cal.get(Calendar.MILLISECOND)));
}
if(source.contains("[notificationTitle]"))
{
String notificationTitle = NotificationListener.getLastNotification().getTitle();
if(notificationTitle != null && notificationTitle.length() > 0)
source = source.replace("[notificationTitle]", notificationTitle);
else
Miscellaneous.logEvent("w", "Variable replacement", "notificationTitle was empty.", 3);
}
if(source.contains("[notificationText]"))
{
String notificationText = NotificationListener.getLastNotification().getText();
if(notificationText != null && notificationText.length() > 0)
source = source.replace("[notificationText]", notificationText);
else
Miscellaneous.logEvent("w", "Variable replacement", "notificationText was empty.", 3);
}
// Miscellaneous.logEvent("i", "URL after replace", source);
return source;
@ -1214,6 +1236,122 @@ public class Miscellaneous extends Service
return returnValue;
}
public static boolean copyDocumentFileToFile(DocumentFile src, File dst)
{
InputStream in = null;
OutputStream out = null;
String error = null;
try
{
in = Miscellaneous.getAnyContext().getContentResolver().openInputStream(src.getUri());
out = new FileOutputStream(dst);
byte[] buffer = new byte[1024];
int read;
while ((read = in.read(buffer)) != -1)
{
out.write(buffer, 0, read);
}
in.close();
// write the output file (You have now copied the file)
out.flush();
out.close();
return true;
}
catch (FileNotFoundException fnfe1)
{
error = fnfe1.getMessage();
}
catch (Exception e)
{
error = e.getMessage();
}
return false;
// return error;
}
public static boolean copyFileToDocumentFile(File src, DocumentFile dst)
{
InputStream in = null;
OutputStream out = null;
String error = null;
try
{
in = new FileInputStream(src);
out = Miscellaneous.getAnyContext().getContentResolver().openOutputStream(dst.getUri());
byte[] buffer = new byte[1024];
int read;
while ((read = in.read(buffer)) != -1)
{
out.write(buffer, 0, read);
}
in.close();
// write the output file (You have now copied the file)
out.flush();
out.close();
return true;
}
catch (FileNotFoundException fnfe1)
{
error = fnfe1.getMessage();
}
catch (Exception e)
{
error = e.getMessage();
}
return false;
// return error;
}
/*public static String copyDocumentFile(String inputPath, String inputFile, Uri treeUri)
{
InputStream in = null;
OutputStream out = null;
String error = null;
DocumentFile pickedDir = DocumentFile.fromTreeUri(getActivity(), treeUri);
String extension = inputFile.substring(inputFile.lastIndexOf(".")+1,inputFile.length());
try
{
DocumentFile newFile = pickedDir.createFile("audio/"+extension, inputFile);
out = getActivity().getContentResolver().openOutputStream(newFile.getUri());
in = new FileInputStream(inputPath + inputFile);
byte[] buffer = new byte[1024];
int read;
while ((read = in.read(buffer)) != -1)
{
out.write(buffer, 0, read);
}
in.close();
// write the output file (You have now copied the file)
out.flush();
out.close();
}
catch (FileNotFoundException fnfe1)
{
error = fnfe1.getMessage();
}
catch (Exception e)
{
error = e.getMessage();
}
return error;
}*/
public static boolean googleToBlameForLocation(boolean checkExistingRules)
{
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)

View File

@ -861,45 +861,11 @@ public class XmlFileInterface
if (name.equals("TriggerEvent"))
{
String triggerEventString = readTag(parser, "TriggerEvent");
// if(triggerEventString.equals("pointOfInterest"))
// newTrigger.setTriggerType(Trigger_Enum.pointOfInterest);
// else if(triggerEventString.equals("timeFrame"))
// newTrigger.setTriggerType(Trigger_Enum.timeFrame);
// else if(triggerEventString.equals("charging"))
// newTrigger.setTriggerType(Trigger_Enum.charging);
// else if(triggerEventString.equals("usb_host_connection"))
// newTrigger.setTriggerType(Trigger_Enum.usb_host_connection);
// else if(triggerEventString.equals("batteryLevel"))
// newTrigger.setTriggerType(Trigger_Enum.batteryLevel);
// else if(triggerEventString.equals("speed"))
// newTrigger.setTriggerType(Trigger_Enum.speed);
// else if(triggerEventString.equals("noiseLevel"))
// newTrigger.setTriggerType(Trigger_Enum.noiseLevel);
// else if(triggerEventString.equals("wifiConnection"))
// newTrigger.setTriggerType(Trigger_Enum.wifiConnection);
// else
if(triggerEventString.equals("process_started_stopped") | triggerEventString.equals("process_running"))
if(triggerEventString.equals("process_started_stopped") | triggerEventString.equals("process_running"))
newTrigger.setTriggerType(Trigger_Enum.process_started_stopped);
// else if(triggerEventString.equals("airplaneMode"))
// newTrigger.setTriggerType(Trigger_Enum.airplaneMode);
// else if(triggerEventString.equals("roaming"))
// newTrigger.setTriggerType(Trigger_Enum.roaming);
// else if(triggerEventString.equals("phoneCall"))
// newTrigger.setTriggerType(Trigger_Enum.phoneCall);
// else if(triggerEventString.equals("nfcTag"))
// newTrigger.setTriggerType(Trigger_Enum.nfcTag);
// else if(triggerEventString.equals("notification"))
// newTrigger.setTriggerType(Trigger_Enum.notification);
// else if(triggerEventString.equals("activityDetection"))
// newTrigger.setTriggerType(Trigger_Enum.activityDetection);
// else if(triggerEventString.equals("bluetoothConnection"))
// newTrigger.setTriggerType(Trigger_Enum.bluetoothConnection);
// else if(triggerEventString.equals("headsetPlugged"))
// newTrigger.setTriggerType(Trigger_Enum.headsetPlugged);
// else if(triggerEventString.equals("notification"))
// newTrigger.setTriggerType(Trigger_Enum.notification);
else
newTrigger.setTriggerType(Trigger_Enum.valueOf(triggerEventString));
newTrigger.setTriggerType(Trigger_Enum.valueOf(triggerEventString));
}
else if (name.equals("TriggerParameter1"))
{
@ -1079,17 +1045,6 @@ public class XmlFileInterface
{
String actionNameString = readTag(parser, "ActionName");
// if(actionNameString.equals("setWifi"))
// newAction.setAction(Action_Enum.setWifi);
// else if(actionNameString.equals("setBluetooth"))
// newAction.setAction(Action_Enum.setBluetooth);
// else if(actionNameString.equals("setUsbTethering"))
// newAction.setAction(Action_Enum.setUsbTethering);
// else if(actionNameString.equals("setWifiTethering"))
// newAction.setAction(Action_Enum.setWifiTethering);
// else if(actionNameString.equals("setDisplayRotation"))
// newAction.setAction(Action_Enum.setDisplayRotation);
// *** deprecated
//else
if(actionNameString.equals("turnWifiOn"))
@ -1114,28 +1069,6 @@ public class XmlFileInterface
newAction.setAction(Action_Enum.disableScreenRotation);
// *** deprecated
// else if(actionNameString.equals("triggerUrl"))
// newAction.setAction(Action_Enum.triggerUrl);
// else if(actionNameString.equals("changeSoundProfile"))
// newAction.setAction(Action_Enum.changeSoundProfile);
// else if(actionNameString.equals("startOtherActivity"))
// newAction.setAction(Action_Enum.startOtherActivity);
// else if(actionNameString.equals("waitBeforeNextAction"))
// newAction.setAction(Action_Enum.waitBeforeNextAction);
// else if(actionNameString.equals("wakeupDevice"))
// newAction.setAction(Action_Enum.wakeupDevice);
// else if(actionNameString.equals("setAirplaneMode"))
// newAction.setAction(Action_Enum.setAirplaneMode);
// else if(actionNameString.equals("setDataConnection"))
// newAction.setAction(Action_Enum.setDataConnection);
// else if(actionNameString.equals("speakText"))
// newAction.setAction(Action_Enum.speakText);
// else if(actionNameString.equals("sendTextMessage"))
// newAction.setAction(Action_Enum.sendTextMessage);
// else if(actionNameString.equals("playMusic"))
// newAction.setAction(Action_Enum.playMusic);
// else if(actionNameString.equals("setScreenBrightness"))
// newAction.setAction(Action_Enum.setScreenBrightness);
else
newAction.setAction(Action_Enum.valueOf(actionNameString));
}
@ -1225,6 +1158,33 @@ public class XmlFileInterface
}
}
}
else if(newAction.getAction().equals(Action_Enum.startOtherActivity)) // separator has been changed, convert in old files
{
String newTag;
if(tag.contains(Action.intentPairSeperator)) // already has new format
newTag = tag;
else
newTag = tag.replace("/", Action.intentPairSeperator);
String[] newTagPieces = newTag.split(";");
if(newTagPieces.length < 2 || (!newTagPieces[0].contains(Actions.dummyPackageString) && newTagPieces[1].contains(Action.intentPairSeperator)))
{
newTag = Actions.dummyPackageString + ";" + newTag;
newTagPieces = newTag.split(";");
}
if(newTagPieces.length < 3)
newTag += ";" + ActivityManageActionStartActivity.startByActivityString;
else if(newTagPieces.length >= 3)
{
if(newTagPieces[2].contains(Action.intentPairSeperator))
newTag = newTagPieces[0] + ";" + newTagPieces[1] + ";" + ActivityManageActionStartActivity.startByActivityString + ";" + newTagPieces[2];
}
newAction.setParameter2(newTag);
}
else
newAction.setParameter2(tag);
}

View File

@ -0,0 +1,102 @@
<?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" >
<androidx.appcompat.widget.LinearLayoutCompat
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_height="match_parent"
android:layout_width="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="@style/TextAppearance.AppCompat.Headline"
android:text="@string/settings"
android:layout_marginBottom="@dimen/default_margin"/>
<Button
android:id="@+id/bMoreSettings"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/moreSettings" />
<ImageView
android:layout_width="match_parent"
android:layout_span="2"
android:layout_height="1dp"
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/importExportExplanation" />
<Button
android:id="@+id/bImportConfiguration"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/importConfiguration" />
<Button
android:id="@+id/bExportConfiguration"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/exportConfiguration" />
<ImageView
android:layout_width="match_parent"
android:layout_span="2"
android:layout_height="1dp"
android:layout_margin="@dimen/default_margin"
android:background="#aa000000" />
<Button
android:id="@+id/bVolumeTest"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/volumeTest" />
<ImageView
android:layout_width="match_parent"
android:layout_span="2"
android:layout_height="1dp"
android:layout_margin="@dimen/default_margin"
android:background="#aa000000" />
<Button
android:id="@+id/bSettingsSetToDefault"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/defaultSettings" />
<ImageView
android:layout_width="match_parent"
android:layout_span="2"
android:layout_height="1dp"
android:layout_margin="@dimen/default_margin"
android:background="#aa000000" />
<Button
android:id="@+id/bShareConfigAndLog"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/shareConfigAndLogFilesWithDev" />
<TextView
android:id="@+id/tvFileStoreLocation"
android:layout_marginVertical="@dimen/default_margin"
android:layout_gravity="center_horizontal"
android:gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</androidx.appcompat.widget.LinearLayoutCompat>
</ScrollView>

View File

@ -35,15 +35,145 @@
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:inputType="textMultiLine"
android:text="@string/startAppChoiceNote" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:id="@+id/showStartProgramExamples"
android:layout_marginTop="@dimen/default_margin"
android:layout_span="2"
android:text="@string/openExamplesPage" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:text="@string/startAppSelectionType" />
<RadioGroup
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RadioButton
android:id="@+id/rbStartAppSelectByActivity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:checked="true"
android:text="@string/startAppByActivity" />
<RadioButton
android:id="@+id/rbStartAppSelectByAction"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/startAppByAction" />
</RadioGroup>
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:layout_width="match_parent"
android:layout_span="2"
android:layout_height="1dp"
android:layout_margin="10dp"
android:background="#aa000000" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:text="@string/startAppStartType" />
<RadioGroup
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RadioButton
android:id="@+id/rbStartAppByActivity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:checked="true"
android:text="@string/startAppByStartActivity" />
<RadioButton
android:id="@+id/rbStartAppByBroadcast"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/startAppBySendBroadcast" />
</RadioGroup>
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:layout_width="match_parent"
android:layout_span="2"
android:layout_height="1dp"
android:layout_margin="10dp"
android:background="#aa000000" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<Button
android:id="@+id/bSelectApp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/selectApplication" />
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/packageName" />
<EditText
android:id="@+id/etSelectedApplication"
android:layout_width="wrap_content"
android:id="@+id/etPackageName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textMultiLine"
android:text=""
@ -55,18 +185,18 @@
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:layout_width="wrap_content"
android:layout_height="1dp"
android:layout_margin="10dp"
android:background="#aa000000"
android:visibility="invisible" />
<TextView
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/activityOrActionName" />
<EditText
android:id="@+id/etActivityOrActionPath"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textMultiLine"
android:text="@string/startAppChoiceNote" />
android:text=""
android:textAppearance="?android:attr/textAppearanceMedium" />
</TableRow>
@ -98,6 +228,17 @@
</TableRow>
<TableRow>
<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">
@ -127,7 +268,7 @@
<EditText
android:id="@+id/etParameterName"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</TableRow>

View File

@ -17,7 +17,7 @@
android:background="@color/barBackgroundColor" >
<TextView
android:id="@+id/etSelectedApplication"
android:id="@+id/etActivityOrActionPath"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/general"

View File

@ -306,84 +306,35 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_margin="10dp"
android:layout_marginTop="30dp"
android:gravity="top" >
<Button
android:id="@+id/bShowHelp"
android:layout_gravity="center_vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/showHelp"
android:layout_weight="1" />
<Button
android:id="@+id/bVolumeTest"
android:layout_gravity="center_vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/volumeTest"
android:layout_weight="1" />
<Button
android:id="@+id/bPrivacy"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:enabled="true"
android:text="@string/privacy" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:orientation="vertical"
android:layout_margin="10dp"
android:layout_marginTop="30dp"
android:gravity="center_horizontal" >
<Button
android:id="@+id/bSettings"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:layout_weight="1"
android:text="@string/menu_settings" />
<!-- <Button
android:id="@+id/bSettingsErase"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/eraseSettings" /> -->
<Button
android:id="@+id/bShowHelp"
android:layout_gravity="center_vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/showHelp" />
<Button
android:id="@+id/bSettingsSetToDefault"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/defaultSettings" />
android:id="@+id/bPrivacy"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:enabled="true"
android:text="@string/privacy" />
<Button
android:id="@+id/bSettings"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:text="@string/settings" />
</LinearLayout>
<TextView
android:id="@+id/tvFileStoreLocation"
android:layout_marginVertical="@dimen/default_margin"
android:layout_gravity="center_horizontal"
android:gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/bShareConfigAndLog"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/shareConfigAndLogFilesWithDev" />
</LinearLayout>
</ScrollView>

View File

@ -40,7 +40,7 @@
android:id="@+id/tvRuleTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/profileList"
android:text="@string/profiles"
android:layout_marginLeft="10dp"
android:textAppearance="?android:attr/textAppearanceLarge" />

View File

@ -59,7 +59,7 @@
android:layout_height="wrap_content">
<TextView
android:id="@+id/etSelectedApplication"
android:id="@+id/etActivityOrActionPath"
android:layout_marginHorizontal="@dimen/default_margin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp">

View File

@ -0,0 +1,113 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="@dimen/default_margin"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="@style/TextAppearance.AppCompat.Headline"
android:text="@string/phoneCall" />
<TableLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:shrinkColumns="1"
android:stretchColumns="1" >
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/state" />
<RadioGroup
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/started" />
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/stopped" />
</RadioGroup>
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/phoneDirection" />
<RadioGroup
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/incoming" />
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/outgoing" />
</RadioGroup>
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/phoneNumber" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/phoneNumberExplanation" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/importNumberFromContacts" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/phoneNumberExplanation" />
</TableRow>
</TableLayout>
</androidx.appcompat.widget.LinearLayoutCompat>

View File

@ -1,5 +1,5 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_settings"
android:title="@string/menu_settings"
android:title="@string/settings"
android:orderInCategory="100" />
</menu>

View File

@ -1,8 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="menu_settings">Einstellungen</string>
<string name="app_name">Automation</string>
<string name="title_activity_main">Automation</string>
<string name="ruleActivate">Aktiviere Regel %1$s</string>
<string name="profileActivate">Aktiviere Profil %1$s</string>
<string name="ruleActivateToggle">Aktiviere Regel %1$s im Umschaltmodus</string>
@ -73,7 +71,7 @@
<string name="end">Ende</string>
<string name="save">Speichern</string>
<string name="urlToTrigger">URL, die ausgelöst werden soll:</string>
<string name="urlLegend">Variablen:\nSie können die folgenden Variablen verwenden. Vor dem Auslösen werden sie mit dem entsprechenden Wert Ihres Geräts ersetzt. Die Klammern müssen in den Text mit aufgenommen werden.\n\n[uniqueid] - Die Unique ID Ihres Geräts\n[serialnr] - Die Seriennummer Ihres Geräts\n[latitude] - Ihr gegenwärtiger Breitengrad\n[longitude] - Ihr gegenwärtiger Längengrad\n[phonenr] - Nummer des letzten ein- oder ausgehenden Anrufs\n[d] - Tag des Monats, 2-stellig mit führender Null\n[m] - Monat als Zahl, mit führenden Nullen\n[Y] - Vierstellige Jahreszahl\n[h] - Stunde im 12-Stunden-Format, mit führenden Nullen\n[H] - Stunde im 24-Stunden-Format, mit führenden Nullen\n[i] - Minuten, mit führenden Nullen\n[s] - Sekunden, mit führenden Nullen\n[ms] - milliseconds</string>
<string name="urlLegend">Variablen:\nSie können die folgenden Variablen verwenden. Vor dem Auslösen werden sie mit dem entsprechenden Wert Ihres Geräts ersetzt. Die Klammern müssen in den Text mit aufgenommen werden.\n\n[uniqueid] - Die Unique ID Ihres Geräts\n[serialnr] - Die Seriennummer Ihres Geräts\n[latitude] - Ihr gegenwärtiger Breitengrad\n[longitude] - Ihr gegenwärtiger Längengrad\n[phonenr] - Nummer des letzten ein- oder ausgehenden Anrufs\n[d] - Tag des Monats, 2-stellig mit führender Null\n[m] - Monat als Zahl, mit führenden Nullen\n[Y] - Vierstellige Jahreszahl\n[h] - Stunde im 12-Stunden-Format, mit führenden Nullen\n[H] - Stunde im 24-Stunden-Format, mit führenden Nullen\n[i] - Minuten, mit führenden Nullen\n[s] - Sekunden, mit führenden Nullen\n[ms] - milliseconds\n[notificationTitle] - Titel der letzten Benachrichtigung\n[notificationText] - Text der letzten Benachrichtigung</string>
<string name="wifi">WLAN</string>
<string name="activating">Aktiviere</string>
<string name="deactivating">Deaktiviere</string>
@ -257,7 +255,7 @@
<string name="anotherPoiByThatName">Es gibt bereits einen Ort mit diesem Namen.</string>
<string name="anotherRuleByThatName">Es gibt bereits eine Regel mit diesem Namen.</string>
<string name="startOtherActivity">Programm starten</string>
<string name="selectApplication">Wählen Sie eine Anwendung</string>
<string name="selectApplication">Wählen Sie\neine Anwendung</string>
<string name="selectPackageOfApplication">Wählen Sie ein Paket der Anwendung</string>
<string name="selectActivityToBeStarted">Wählen Sie die Activity des Pakets</string>
<string name="errorStartingOtherActivity">Fehler beim Starten einer anderen Anwendung</string>
@ -464,8 +462,7 @@
<string name="noMapsApplicationFound">Auf Ihrem Gerät konnte keine Kartenanwendung gefunden werden.</string>
<string name="locationEngineNotActive">Positionsbestimmung nicht aktiv.</string>
<string name="addProfile">Profil erstellen</string>
<string name="profileList">Profile</string>
<string name="profile">Profil</string>
<string name="profile">Profil</string>
<string name="soundMode">Tonmodus</string>
<string name="volumes">Lautstärken</string>
<string name="incomingCallsRingtone">Ton für eingehende Anrufe</string>
@ -597,7 +594,7 @@
<string name="filesHaveBeenMovedTo">Automation benutzt jetzt ein anderes Verzeichnis, um Ihre Daten zu speichern. Alle Ihre Automation-Dateien wurden hierhin verschoben: \"%s\". Die Berechtigung für den externen Speicher wird nun nicht mehr benötigt; Sie können Sie entfernen. In einer künftigen Version wird sie entfernt werden.</string>
<string name="locationEngineDisabledShort">Die Position kann nicht mehr bestimmt werden.</string>
<string name="locationEngineDisabledLong">Leider kann die Position nicht mehr bestimmt werden. Großer Dank dafür geht an Google für seine unendliche Weisheit und Großzügigkeit.\\n\\nBeginnend mit Android 10 wurde eine neue Berechtigung eingeführt, die benötigt wird, um als App die Position auch im Hintergrund bestimmen zu können, was, für eine App wie diese, natürlich notwendig ist.\\n\\nWährend ich das grundsätzlich für eine gute Idee halte, gilt das nicht für die Schikanen, die man Entwicklern damit zumutet.\\n\\nWenn man eine App entwickelt, kann man versuchen sich für diese Berechtigung zu qualifizieren, indem man einen Katalog von Bedingungen erfüllt. Leider wurden neue Versionen meiner Anwendung über einen Zeitraum von drei Monaten immer wieder abgelehnt.\\n\\nDas lief auf die immer gleiche Art ab:\\n\\nIch habe eine neue Version eingereicht, die all diese Anforderungen erfüllt hat.\\n\\nGoogles miserabler Entwickler-Support behauptete ich würde sie nicht einhalten.\\n\\nIch habe Beweise geliefert, daß ich alles einhalte.<br />Ich bekam eine Antwort wie "Ich kann Ihnen nicht weiterhelfen.\\n\\nIrgendwann habe ich aufgegeben.\\n\\nDie Folge davon ist nun, daß die Google Play Version keine Positionsbestimmung mehr im Hintergrund durchführen kann. Meine einzige Alternative wäre es gewesen, daß die ganze Anwendung aus dem Store fliegt.\\n\\nDas tut mir sehr leid, aber ich habe mein Bestes gegeben mit einem Kunden\"dienst\" zu diskutieren, der mehrfach beim Turing-Test durchgefallen ist.\\n\\nDie gute Nachricht: Die Anwendung kann es immer noch!\\n\\nAutomation ist nun Open Source Software und kann ab sofort bei F-Droid heruntergeladen werden. F-Droid ist ein freier Appstore, der Ihre Privatsphäre respektiert - statt nur so zu tun wie Google das macht.\\n\\nSichern Sie Ihre Konfiguratinsdatei, deinstallieren Sie dazu diese Anwendung, installieren sie von F-Droid neu, Konfigurationsdatei zurückspielen und fertig.\\n\\nKlicken Sie hier, um mehr herauszufinden:</string>
<string name="filesStoredAt">Konfigurations- und Logdateien werden hier gespeichert: %1$s</string>
<string name="filesStoredAt">Konfigurations- und Logdateien werden hier gespeichert: %1$s. Klicken Sie hier auf diesen Text, um dieses Verzeichnis in einem Datei-Explorer zu öffnen. Leider funktioniert das nur auf gerooteten Geräten.\n\nFür alle anderen Geräte: Benutzen Sie einfach den Export Button, wenn Sie eine Sicherung anlegen wollen.</string>
<string name="directionStringEquals">ist gleich</string>
<string name="directionStringContains">enthält</string>
<string name="directionStringStartsWith">beginnt mit</string>
@ -636,6 +633,36 @@
<string name="ruleActivationComplete">Regel \"%1$s\" wurde fertig ausgeführt.</string>
<string name="addParameters">Parameter hinzufügen</string>
<string name="errorRunningRule">Fehler beim Ausführen einer Regel.</string>
<string name="startAppChoiceNote">Sie können den Pfad einer Aktivität manuell eingeben, aber es wird stark empfohlen den \"Auswählen\" Knopf zu verwenden. Wenn Sie etwas manuell eingeben, behalten Sie bitte im Hinterkopf, daß keine Variablen aufgelöst werden. D.h., wenn Sie z.B. die Kamera starten wollen, indem Sie \"MediaStore.ACTION_IMAGE_CAPTURE\" verwenden, wird das nicht verwenden. Wenn Sie in der Android Dokumentation schauen, werden Sie sehen, daß sich dahinter eigentlich der Wert \"android.media.action.IMAGE_CAPTURE\" verbirgt, der hier direkt eingegeben werden müßte.</string>
<string name="startAppChoiceNote">Hier haben Sie 2 grundsätzliche Optionen:\n\n1. Sie können ein Programm starten, indem Sie eine Activity auswählen.\nStellen Sie sich das so vor, daß Sie ein bestimmtes Fenster einer Anwendung vorauswählen, in das man direkt springt. Behalten Sie im Kopf, daß das nicht immer funktionieren wird. Das liegt daran, daß die Fenster einer Anwendung miteinander interagieren können, sich u.U. Parameter übergeben. Wenn man jetzt ganz kalt in ein bestimmtes Fenster springt, könnte dieses zum Start z.B. bestimmte Parameter erwarten - die fehlen. So könnte es passieren, daß das Fenster zwar versucht zu öffnen, das aber nicht klappt und es somit nie wirlich sichtbar wird. Versuchen Sie\'s trotzdem!\nSie können den Pfad manuell eingeben, sollten aber den Auswählen-Knopf benutzen. Wenn Sie es dennoch manuell eingeben, geben Sie den PackageName ins obere Feld ein und den vollen Pfad der Activity ins untere.\n\n2. Auswahl per Action\nIm Gegensatz zur Auswahl eines bestimmten Fensters, können Sie ein Programm auch über eine Action starten lassen. Stellen Sie sich das so vor als würden Sie in den Wald rufen \"Ich hätte gerne XYZ\" und falls eine Anwendung installiert ist, die das liefern kann, wird sie gestartet. Ein gutes Beispiel wäre zum Beispiel "Browser starten" - es könnten sogar mehrere installiert sein, die das können (aber normalerweise gibts eine, die als Standard eingestellt ist).\nDiese Action müssen Sie manuell eingeben. Der PackageName ist hier optional. Behalten Sie dabei im Auge, daß mögliche Variablen nicht aufgelöst werden. Beispielsweise werden Sie häufig im Internet finden, daß man die Kamera über die Action \"MediaStore.ACTION_IMAGE_CAPTURE\" starten kann. Das ist grundsätzlich nicht richtig, wird aber nicht direkt funktionieren, denn das ist nur eine Variable. Sie müssen dann einen Blick in die Android Dokumentation werfen, wo Sie sehen werden, daß sich hinter dieser Variable eigentlich der Wert \"android.media.action.IMAGE_CAPTURE\" verbirgt. Gibt man diesen in das Feld ein, wird\'s funktionieren.</string>
<string name="cantFindSoundFile">Kann die Audiodatei %1$s nicht finden und daher auch nicht abspielen.</string>
<string name="startAppByActivity">per Activity</string>
<string name="startAppByAction">per Action</string>
<string name="startAppSelectionType">Auswahlmethode</string>
<string name="com.wireguard.android.permission.CONTROL_TUNNELS">Tunnelverbindungen der Wireguard Anwendung steuern</string>
<string name="enterPackageName">Geben Sie einen gültigen Paketnamen ein.</string>
<string name="configurationExportedSuccessfully">Konfiguration erfolgreich exportiert.</string>
<string name="ConfigurationExportError">Beim Exportieren der Konfiguration ist ein Fehler aufgetreten.</string>
<string name="configurationImportedSuccessfully">Konfiguration erfolgreich importiert.</string>
<string name="enterValidAction">Geben Sie eine gültige Action ein.</string>
<string name="exportConfiguration">Konfiguration exportieren</string>
<string name="importConfiguration">Konfiguration importieren</string>
<string name="moreSettings">Mehr Einstellungen</string>
<string name="importExportExplanation">Wenn Sie auf im- oder exportieren klicken, müssen Sie im nächsten Schritt das Verzeichnis auswählen, in das Dateien exportiert oder von dem Dateien importiert werden. Im Falle des Exports können vorhandene Dateien in diesem Ordner überschrieben werden.</string>
<string name="intentDataComment">Wenn Ihr Parameter vom Typ \"Uri\" ist und Sie \"IntentName\" als Name angeben (Groß-/Kleinschreibung ist irrelevant), wird der Parameter nicht als normaler Parameter mit putExtra() angehängt, sondern wird stattdessen mit setData() angehängt.</string>
<string name="noApplicableFilesFoundInDirectory">Keine passenden Dateien im Ordner gefunden.</string>
<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.</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>
<string name="startAppBySendBroadcast">per sendBroadcast()</string>
<string name="startAppByStartActivity">per startActivity()</string>
<string name="startAppStartType">Start-Typ wählen</string>
<string name="state">Status</string>
<string name="stringNotAllowed">Zeichenkette %1$s is nicht erlaubt.</string>
<string name="android.permission.ACTIVITY_RECOGNITION">Aktivitätserkennung</string>
<string name="packageName">Paketname</string>
<string name="activityOrActionName">Acitivity/Action name</string>
</resources>

View File

@ -1,15 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="menu_settings">Configuratión</string>
<string name="app_name">Automation</string>
<string name="title_activity_main">Automation</string>
<string name="ruleActivate">Estoy activando regla %1$s</string>
<string name="profileActivate">Estoy activando perfil %1$s</string>
<string name="ruleActivateToggle">Estoy activando regla %1$s in el modo del inventir</string>
<string name="addPoi">Crear lugar</string>
<string name="addRule">Crear regla</string>
<string name="poiList">Listo de lugares:</string>
<string name="ruleList">Listo del reglas:</string>
<string name="ruleList">Lista de reglas:</string>
<string name="pleaseEnterValidName">Inserta un nombre válido, por favor.</string>
<string name="pleaseSpecifiyTrigger">Inserta al menos un disparador, por favor.</string>
<string name="pleaseSpecifiyAction">Inserta al menos un acción, por favor.</string>
@ -29,549 +27,289 @@
<string name="no">No</string>
<string name="logGotGpsUpdate">He recibido una posición de GPS. Precisión:</string>
<string name="logGotNetworkUpdate">He recibido una posición de network. Precisión:</string>
<string name="pleaseEnterValidLatitude">Please enter a valid latitude.</string>
<string name="pleaseEnterValidLongitude">Please enter a valid longitude.</string>
<string name="pleaseEnterValidRadius">Please enter a valid positive radius.</string>
<string name="selectOneDay">Select at least one day.</string>
<string name="logAttemptingToBindToService">Attempting to bind to service... </string>
<string name="logAttemptingToUnbindFromService">Attempting to unbind from service... </string>
<string name="logBoundToService">Bound to service.</string>
<string name="logUnboundFromService">Unbound from service.</string>
<string name="logServiceAlreadyRunning">Request to start service, but it is already running.</string>
<string name="whatToDoWithRule">Do what with rule?</string>
<string name="whatToDoWithPoi">Do what with location?</string>
<string name="whatToDoWithProfile">Do what with profile?</string>
<string name="delete">delete</string>
<string name="deleteCapital">Delete</string>
<string name="serviceStopped">Automation service stopped.</string>
<string name="logServiceStopping">Stopping service.</string>
<string name="stillGettingPosition">Still getting position</string>
<string name="lastRule">Last Rule:</string>
<string name="at">at</string>
<string name="service">Service:</string>
<string name="getCurrentPosition">Get current location</string>
<string name="savePoi">Save location</string>
<string name="deletePoi">Delete location</string>
<string name="latitude">Latitude</string>
<string name="longitude">Longitude</string>
<string name="ruleName">Rule name</string>
<string name="triggers">Trigger(s)</string>
<string name="triggersComment">and-connected (all have to apply at the same time)</string>
<string name="addTrigger">Add trigger</string>
<string name="actions">Action(s)</string>
<string name="actionsComment">(will be executed in that order)</string>
<string name="addAction">Add action</string>
<string name="saveRule">Save Rule</string>
<string name="monday">Monday</string>
<string name="tuesday">Tuesday</string>
<string name="wednesday">Wednesday</string>
<string name="thursday">Thursday</string>
<string name="friday">Friday</string>
<string name="saturday">Saturday</string>
<string name="sunday">Sunday</string>
<string name="start">Start</string>
<string name="end">End</string>
<string name="save">Save</string>
<string name="urlToTrigger">URL to trigger:</string>
<string name="urlLegend">Variables:\nYou can use the following variables. Upon triggering they will be replaced with the corresponding value on your device. Include the brackets in your text.\n\n[uniqueid] - Your device\'s unique id\n[serialnr] - Your device\'s serial number\n[latitude] - Your device\'s latitude\n[longitude] - Your device\'s longitude\n[phonenr] - Number of last incoming or outgoing call\n[d] - Day of the month, 2 digits with leading zeros\n[m] - Numeric representation of a month, with leading zeros\n[Y] - A full numeric representation of a year, 4 digits\n[h] - 12-hour format of an hour with leading zeros\n[H] - 24-hour format of an hour with leading zeros\n[i] - Minutes with leading zeros\n[s] - Seconds, with leading zeros\n[ms] - milliseconds</string>
<string name="wifi">wifi</string>
<string name="activating">Activating</string>
<string name="deactivating">Deactivating</string>
<string name="bluetoothFailed">Failed to trigger Bluetooth. Does this device have Bluetooth?</string>
<string name="urlTooShort">The url has to have least 10 characters.</string>
<string name="textTooShort">The text has to have least 10 characters.</string>
<string name="selectTypeOfTrigger">Select type of trigger</string>
<string name="entering">entering</string>
<string name="leaving">leaving</string>
<string name="noPoisSpecified">You haven\'t specified any locations. Do that first.</string>
<string name="started">started</string>
<string name="stopped">stopped</string>
<string name="connected">connected</string>
<string name="disconnected">disconnected</string>
<string name="selectPoi">Select location</string>
<string name="selectTypeOfAction">Select type of action</string>
<string name="selectSoundProfile">Select sound profile</string>
<string name="whatToDoWithTrigger">What to do with it trigger?</string>
<string name="whatToDoWithAction">What to do with it action?</string>
<string name="radiusHasToBePositive">Radius has to be a positive number.</string>
<string name="poiStillReferenced">There are still rules that reference this location (%1$s). I can\'t delete it, yet.</string>
<string name="generalSettings">General settings</string>
<string name="startAtSystemBoot">Start at system boot</string>
<string name="onOff">On/Off</string>
<string name="writeLogFile">Write log file</string>
<string name="useTextToSpeechOnNormalSummary">Use TextToSpeech on normal</string>
<string name="useTextToSpeechOnVibrateSummary">Use TextToSpeech on vibrate</string>
<string name="useTextToSpeechOnSilentSummary">Use TextToSpeech on silent</string>
<string name="useTextToSpeechOnNormalTitle">TTS on normal</string>
<string name="useTextToSpeechOnVibrateTitle">TTS on vibrate</string>
<string name="useTextToSpeechOnSilentTitle">TTS on silent</string>
<string name="positioningSettings">Positioning settings</string>
<string name="listenToWifiState">Listen to wifi state changes where possible</string>
<string name="wifiState">Wifi state</string>
<string name="listenToAccelerometerState">Observe device movement where wifi is not available</string>
<string name="accelerometer">Accelerometer</string>
<string name="accelerometerTimer">Use Accelerometer after x minutes without cell mast change</string>
<string name="cellMastIdleTime">Cell mast idle time</string>
<string name="accelerometerThresholdDescription">Threshold for accelerometer movements</string>
<string name="accelerometerThreshold">Accelerometer threshold</string>
<string name="positioningThresholds">Positioning thresholds</string>
<string name="minimumDistanceChangeForGpsLocationUpdates">Minimum distance change for gps location updates</string>
<string name="distanceForGpsUpdate">Distance for gps update [m]</string>
<string name="minimumDistanceChangeForNetworkLocationUpdates">Minimum distance change for network location updates</string>
<string name="distanceForNetworkUpdate">Distance for network update [m]</string>
<string name="satisfactoryAccuracyGps">Satisfactory accuracy when getting location via gps in meters</string>
<string name="gpsAccuracy">GPS accuracy [m]</string>
<string name="satisfactoryAccuracyNetwork">Satisfactory accuracy when getting location via cell towers in meters</string>
<string name="networkAccuracy">Network accuracy [m]</string>
<string name="minimumTimeForLocationUpdates">Minimum time change in seconds for location updates</string>
<string name="timeForUpdate">Time for update [milliseconds]</string>
<string name="soundSettings">Sound settings</string>
<string name="showHelp">Show help</string>
<string name="rules">Rules</string>
<string name="helpTextRules">All triggers in a rule are AND-connected. The rule will only apply if all triggers are met. If you want OR create another rule.</string>
<string name="timeframes">TimeFrames</string>
<string name="helpTextTimeFrame">If you specify a rule with a timeframe you have two choices. You can choose between entering and leaving a timeframe. Either way an action is triggered only once.\nSo if you create a rule that has \"entering timeframe xyz\" as trigger and let it change your sound profile to vibrate that does not mean that the phone will automatically go to ring if the timeframe is over. If you want that you need to specify another rule with another timeframe.</string>
<string name="toggableRules">Toggable rules</string>
<string name="helpTextToggable">Rules have a flag called \"Toggable\". This means that if a rule is executed and afterwards the same triggers apply again the rule will be executed in an opposite mode where applicable. Currently this will only happen in conjunction with NFC tags. If you tap them twice and there\'s a toggable rule associated with it it will do the opposite of the current situation, e.g. deactivate wifi if it\'s currently activated.</string>
<string name="helpTextProcessMonitoring">If you specify a rule with a process monitor the application will check for that process every x seconds (you can change that in settings). I know that can be kind of slow, but continuous monitoring would drain the battery to fast. And there is no broadcast from the OS for that event.</string>
<string name="speedMaximumTimeBetweenLocations">Maximum time between 2 locations for speed determination.</string>
<string name="speedMaximumTime">Time in minutes</string>
<string name="exceeds">exceeds</string>
<string name="dropsBelow">drops below</string>
<string name="settingsCategoryNoiseLevelMeasurements">Noise level measurement</string>
<string name="timeBetweenNoiseLevelMeasurementsSummary">Seconds between noise level measurements</string>
<string name="timeBetweenNoiseLevelMeasurementsTitle">Seconds between noise level measurements</string>
<string name="lengthOfNoiseLevelMeasurementsSummary">Length in seconds for each noise level measurement</string>
<string name="lengthOfNoiseLevelMeasurementsTitle">Length of each noise level measurement</string>
<string name="referenceValueForNoiseLevelMeasurementsSummary">Physical reference value for noise level measurement</string>
<string name="referenceValueForNoiseLevelMeasurementsTitle">Reference for noise measurement</string>
<string name="logLevelSummary">Log level (1=minimum, 5=maximum)</string>
<string name="logLevelTitle">Log level</string>
<string name="ruleActive">Rule active</string>
<string name="triggerPointOfInterest">Location</string>
<string name="triggerTimeFrame">Timeframe</string>
<string name="triggerCharging">Battery charging</string>
<string name="triggerUsb_host_connection">USB connection to a computer</string>
<string name="triggerSpeed">Speed</string>
<string name="triggerNoiseLevel">Background noise level</string>
<string name="actionSetWifi">Wifi</string>
<string name="actionSetBluetooth">Bluetooth</string>
<string name="actionSetUsbTethering">USB Tethering</string>
<string name="actionSetWifiTethering">Wifi Tethering</string>
<string name="actionSetDisplayRotation">Display rotation</string>
<string name="actionTurnWifiOn">turn Wifi on</string>
<string name="actionTurnWifiOff">turn Wifi off</string>
<string name="actionTurnBluetoothOn">turn Bluetooth on</string>
<string name="actionTurnBluetoothOff">turn Bluetooth off</string>
<string name="actionTriggerUrl">Trigger a URL</string>
<string name="actionChangeSoundProfile">Change sound profile</string>
<string name="actionTurnUsbTetheringOn">turn USB Tethering on</string>
<string name="actionTurnUsbTetheringOff">turn USB Tethering off</string>
<string name="actionTurnWifiTetheringOn">turn Wifi Tethering on</string>
<string name="actionTurnWifiTetheringOff">turn Wifi Tethering off</string>
<string name="actionTurnAirplaneModeOn">turn airplane mode on</string>
<string name="actionTurnAirplaneModeOff">turn airplane mode off</string>
<string name="actionEnableScreenRotation">enable screen rotation</string>
<string name="actionDisableScreenRotation">disable screen rotation</string>
<string name="screenRotationEnabled">ScreenRotation enabled.</string>
<string name="screenRotationDisabled">ScreenRotation disabled.</string>
<string name="screenRotationAlreadyEnabled">ScreenRotation was already enabled.</string>
<string name="screenRotationAlreadyDisabled">ScreenRotation was already disabled.</string>
<string name="noPoisDefinedShort">No locations defined.</string>
<string name="activePoi">Active location:</string>
<string name="closestPoi">Closest location:</string>
<string name="overview">Overview</string>
<string name="poi">Location</string>
<string name="pois">Locations</string>
<string name="helpTextPoi">A location is made up of GPS coordinates and a radius. Since positioning via cell towers is rather unprecise (but fast and cheap) do not specify the radius too small. The application will suggest you a minimum radius when you create a new location.</string>
<string name="serviceNotRunning">Service is not running.</string>
<string name="general">General</string>
<string name="generalText">To use this program you must setup rules. Those contain triggers, e.g. if you reach a specified area or you enter a certain time. After that\'s been done click the on/off button on the main screen.</string>
<string name="unknownActionSpecified">Unknown action specified</string>
<string name="errorTriggeringUrl">Error triggering URL</string>
<string name="errorChangingScreenRotation">Error changing screen rotation</string>
<string name="errorDeterminingWifiApState">Error determining wifiAp state</string>
<string name="errorActivatingWifiAp">Error activating wifiAp</string>
<string name="failedToTriggerBluetooth">Failed to trigger Bluetooth. Does this device have Bluetooth?</string>
<string name="logAttemptingDownloadOf">attempting download of</string>
<string name="logErrorGettingConnectionManagerService">Error getting connectionManager service. Not doing anything to UsbTethering.</string>
<string name="logErrorDeterminingCurrentUsbTetheringState">Error determining current UsbTethering state.</string>
<string name="logDetectingTetherableUsbInterface">Detecting tetherable usb interface.</string>
<string name="logClearingBothLocationListeners">Clearing both location listeners.</string>
<string name="logStartingServiceAfterAppUpdate">Starting service after app update.</string>
<string name="logNotStartingServiceAfterAppUpdate">Not starting service after app update.</string>
<string name="logStartingServiceAtPhoneBoot">Starting service at phone boot.</string>
<string name="logNotStartingServiceAtPhoneBoot">Not starting service at phone boot.</string>
<string name="applicationHasBeenUpdated">Application has been updated.</string>
<string name="startServiceAfterAppUpdate">Start service automatically after app update if it has been running before.</string>
<string name="startServiceAfterAppUpdateShort">Start service after update</string>
<string name="wifiConnection">Wifi connection</string>
<string name="wifiName">Wifi name</string>
<string name="enterWifiName">Enter a wifi name. Leave empty for any wifi.</string>
<string name="cancel">Cancel</string>
<string name="ruleDoesntApplyWeAreSlowerThan">Rule doesn\'t apply. We are slower than</string>
<string name="ruleDoesntApplyWeAreFasterThan">Rule doesn\'t apply. We are faster than</string>
<string name="ruleDoesntApplyItsQuieterThan">Rule doesn\'t apply. It\'s quieter than</string>
<string name="ruleDoesntApplyItsLouderThan">Rule doesn\'t apply. It\'s louder than</string>
<string name="ruleDoesntApplyBatteryLowerThan">Rule doesn\'t apply. Battery level is lower than</string>
<string name="ruleDoesntApplyBatteryHigherThan">Rule doesn\'t apply. Battery level is higher than</string>
<string name="ruleDoesntApplyNotTheCorrectSsid">Rule doesn\'t apply. Not the correct SSID (demanded: \"%1$s\", given: \"%2$s\").</string>
<string name="ruleDoesntApplyNoTagLabel">Rule doesn\'t apply. There is no tag label or not tag at all.</string>
<string name="ruleDoesntApplyWrongTagLabel">Rule doesn\'t apply. Wrong tag label.</string>
<string name="ruleIsDeactivatedCantApply">Rule %1$s is deactivated, can\'t apply.</string>
<string name="starting">starting</string>
<string name="stopping">stopping</string>
<string name="connecting">connecting</string>
<string name="disconnecting">disconnecting</string>
<string name="exceeding">exceeding</string>
<string name="droppingBelow">dropping below</string>
<string name="connectedToWifi">connected to wifi \"%1$s\"</string>
<string name="disconnectedFromWifi">disconnected from wifi \"%1$s\"</string>
<string name="anyWifi">any wifi</string>
<string name="cantStopIt">Can\'t stop it.</string>
<string name="settingsCategoryHttp">HTTP(s) Requests</string>
<string name="httpAcceptAllCertificatesTitle">Accept all certificates</string>
<string name="httpAcceptAllCertificatesSummary">Skip validity check of SSL certificates (recommended against activating this)</string>
<string name="httpAttemptsSummary">Number of attempts in case HTTP requests fail for connectivity reasons</string>
<string name="httpAttemptsTitle">Number of HTTP attempts</string>
<string name="httpAttemptsTimeoutSummary">Timeout for HTTP requests [seconds]</string>
<string name="httpAttemptsTimeoutTitle">Timeout [sec]</string>
<string name="httpAttemptGapSummary">Pause before another attempt [seconds]</string>
<string name="httpAttemptGapTitle">Pause [sec]</string>
<string name="runManually">Run manually</string>
<string name="serviceHasToRunForThat">The service has to be running for that.</string>
<string name="gpsComparison">GPS comparison</string>
<string name="gpsComparisonTimeoutStop">Stopping comparison GPS measurement due to timeout.</string>
<string name="timeoutForGpsComparisonsTitle">GPS timeout [sec]</string>
<string name="timeoutForGpsComparisonsSummary">Maximum time in seconds to trying getting a GPS location for comparison. If over last known location will be applied.</string>
<string name="startingGpsTimeout">Starting GPS timeout.</string>
<string name="forcedLocationUpdate">Forced location update</string>
<string name="forcedLocationUpdateLong">Due to timeout in comparison measurement the last best location will be applied.</string>
<string name="rememberLastActivePoiSummary">If you are at a location, restart your device or the application and leave the location the application will run rules accociated to leaving the location upon its next start.</string>
<string name="rememberLastActivePoiTitle">Remember last active location</string>
<string name="muteTextToSpeechDuringCallsTitle">Mute during calls</string>
<string name="muteTextToSpeechDuringCallsSummary">Mute TextToSpeech during calls</string>
<string name="anotherPoiByThatName">There is already another location by that name.</string>
<string name="anotherRuleByThatName">There is already another rule by that name.</string>
<string name="startOtherActivity">Start another program</string>
<string name="selectApplication">Select app</string>
<string name="selectPackageOfApplication">Select package of application</string>
<string name="selectActivityToBeStarted">Select activity of chosen package</string>
<string name="errorStartingOtherActivity">Error starting other activity</string>
<string name="anotherAppIsRunning">Another app is started/stopped</string>
<string name="settingsCategoryProcessMonitoring">Process monitoring</string>
<string name="timeBetweenProcessMonitoringsTitle">Seconds between process monitorings</string>
<string name="timeBetweenProcessMonitoringsSummary">The lower the higher the battery usage</string>
<string name="refreshingProcessList">Refreshing process list.</string>
<string name="processes">Processes</string>
<string name="startingPeriodicProcessMonitoringEngine">Starting periodic process monitoring engine.</string>
<string name="processMonitoring">Process monitoring</string>
<string name="periodicProcessMonitoringIsAlreadyRunning">Periodic process monitoring is already running. Won\'t start it again.</string>
<string name="stoppingPeriodicProcessMonitoringEngine">Stopping periodic process monitoring engine.</string>
<string name="periodicProcessMonitoringIsNotActive">Periodic process monitoring is not active. Can\'t stop it.</string>
<string name="periodicProcessMonitoringStarted">Periodic process monitoring started.</string>
<string name="periodicProcessMonitoringStopped">Periodic process monitoring stopped.</string>
<string name="rearmingProcessMonitoringMessage">Rearming process monitoring message.</string>
<string name="notRearmingProcessMonitoringMessageStopRequested">Not rearming process monitoring message, stop requested.</string>
<string name="messageReceivedStatingProcessMonitoringIsComplete">Message received stating process monitoring is complete.</string>
<string name="appStarted">App started.</string>
<string name="appStopped">App stopped.</string>
<string name="runningApp">Running app</string>
<string name="errorWritingSettingsToPersistentMemory">Error writing settings to persistent memory.</string>
<string name="settings">Settings</string>
<string name="writingSettingsToPersistentMemory">Writing settings to persistent memory.</string>
<string name="refreshingSettingsFromFileToMemory">Refreshing settings from file to memory.</string>
<string name="errorReadingSettings">Error reading settings.</string>
<string name="invalidStuffStoredInSettingsErasing">Invalid stuff stored in settings. Erasing settings...</string>
<string name="initializingSettingsToPersistentMemory">Initializing settings to persistent memory.</string>
<string name="errorInitializingSettingsToPersistentMemory">Error initializing settings to persistent memory.</string>
<string name="settingsErased">Settings erased.</string>
<string name="settingsSetToDefault">Settings set to default.</string>
<string name="batteryLevel">Battery level</string>
<string name="selectSpeed">Select speed</string>
<string name="selectBattery">Select battery level</string>
<string name="applyingSettingsAndRules">Applying settings, rules and locations.</string>
<string name="privacy">Privacy Policy</string>
<string name="privacyConfirmationText">A browser will now open on your device and load the privacy policy from the developer\'s website.</string>
<string name="waitBeforeNextAction">Wait before next action</string>
<string name="wakeupDevice">Wakeup device</string>
<string name="waitBeforeNextActionEnterValue">Enter a value in milliseconds how long it should be waited before next action.</string>
<string name="wakeupDeviceValue">Enter a value in milliseconds how long device should at least stay awake. 0 for default values.</string>
<string name="enterAPositiveValidNonDecimalNumber">Enter a positive valid non-decimal number.</string>
<string name="moveUp">Move up</string>
<string name="moveDown">Move down</string>
<string name="cantMoveUp">Can\'t move item up. It is already at the top.</string>
<string name="cantMoveDown">Can\'t move item down. It is already at the bottom.</string>
<string name="wifiNameSpecifiedCheckingThat">Wifi name specified, checking that.</string>
<string name="wifiNameMatchesRuleWillApply">Wifi name matches. Rule will apply.</string>
<string name="noWifiNameSpecifiedAnyWillDo">No wifi name specified, any will do.</string>
<string name="ruleCheckOf">RuleCheck of %1$s</string>
<string name="airplaneMode">Airplane mode</string>
<string name="activate">Activate</string>
<string name="deactivate">Deactivate</string>
<string name="airplaneModeSdk17Warning">Beginning from Android version 4.2 this feature only works if your device is rooted.</string>
<string name="triggerUrlReplacementPositionError">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">Add Intent pair</string>
<string name="parameterName">Parameter name</string>
<string name="parameterValue">Parameter value</string>
<string name="parameterType">Parameter type</string>
<string name="selectTypeOfIntentPair">Select a type for the intent pair.</string>
<string name="enterNameForIntentPair">Enter a name for the intent pair.</string>
<string name="enterValueForIntentPair">Enter a value for the intent pair.</string>
<string name="whatToDoWithIntentPair">What to do with pair?</string>
<string name="gettingListOfInstalledApplications">Getting list of installed applications...</string>
<string name="timeFrameWhichDays">On which days?</string>
<string name="insideOrOutsideTimeFrames">Inside or outside those timeframes?</string>
<string name="selectToggleDirection">Switch on or off?</string>
<string name="name">Name</string>
<string name="radiusWithUnit">Radius [m]</string>
<string name="status">Status</string>
<string name="actionDataConnection">Data connection</string>
<string name="actionSetDataConnectionOn">turn mobile data on</string>
<string name="actionSetDataConnectionOff">turn mobile data off</string>
<string name="roaming">Roaming</string>
<string name="activated">activated</string>
<string name="deactivated">deactivated</string>
<string name="until">until</string>
<string name="application">Application</string>
<string name="is">is</string>
<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="phoneDirection">Select call direction</string>
<string name="any">any</string>
<string name="incoming">incoming</string>
<string name="outgoing">outgoing</string>
<string name="incomingAdjective">incoming</string>
<string name="outgoingAdjective">outgoing</string>
<string name="anyNumber">any number</string>
<string name="number">number</string>
<string name="nfcTag">NFC tag</string>
<string name="closeTo">close to</string>
<string name="withLabel">with label</string>
<string name="deviceDoesNotHaveNfc">It appears this device does not have NFC.</string>
<string name="nfcReadTag">Read ID from tag</string>
<string name="nfcWriteTag">Write tag</string>
<string name="nfcEnterValidIdentifier">Enter a valid identifier for the tag (like \"Home front door\").</string>
<string name="nfcTagWrittenSuccessfully">Tag written successfully.</string>
<string name="nfcTagWriteError">Error writing tag. Is it in range?</string>
<string name="nfcTagDiscovered">Tag discovered.</string>
<string name="nfcBringTagIntoRange">Bring an NFC tag into range.</string>
<string name="nfcTagFoundWithText">Tag found with text:</string>
<string name="nfcUnsupportedEncoding">Unsupported Encoding:</string>
<string name="nfcNoNdefIntentBut">No NFC NDEF intent, but</string>
<string name="nfcNotSupportedInThisAndroidVersionYet">NFC not supported in this Android version, yet.</string>
<string name="cantRunRule">Cannot run rules.</string>
<string name="cantDownloadTooFewRequestsInSettings">Can\'t download anything. Amount of http requests in settings is lower than 1.</string>
<string name="nfcApplyTagToRule">Apply tag to rule</string>
<string name="nfcTagReadSuccessfully">Tag read successfully.</string>
<string name="nfcValueNotSuitable">Value stored not suitable.</string>
<string name="nfcNoTag">No tag present.</string>
<string name="newNfcId">Write new NFC ID</string>
<string name="useExistingTag">Use existing NFC tag</string>
<string name="newId">New ID:</string>
<string name="currentId">Current ID:</string>
<string name="nfcTagDataNotUsable">Tag data no usable, write anew.</string>
<string name="nfcBringTagIntoRangeToRead">Bring a tag into range to read.</string>
<string name="toggleRule">Toggle rule</string>
<string name="toggling">Toggling</string>
<string name="toggle">toggle</string>
<string name="overlapBetweenPois">Overlap detected to location %1$s of %2$s meters. Reduce radius by at least that.</string>
<string name="noOverLap">No overlap to other locations detected.</string>
<string name="ruleToggable">Rule %1$s is toggable.</string>
<string name="ruleNotToggable">Rule %1$s is not suitable for toggling.</string>
<string name="none">none</string>
<string name="anyLocation">any location</string>
<string name="invalidPoiName">Invalid name for location.</string>
<string name="eraseSettings">Erase settings</string>
<string name="defaultSettings">Default settings</string>
<string name="areYouSure">Are you sure?</string>
<string name="poiCouldBeInRange">At least location %1$s could be in range, if not others in addition.</string>
<string name="noPoiInRelevantRange">No location in relevant range.</string>
<string name="activityDetection">Activity detection</string>
<string name="detectedActivity">Detected activity:</string>
<string name="detectedActivityInVehicle">In vehicle (car/bus)</string>
<string name="detectedActivityOnBicycle">On bicycle</string>
<string name="detectedActivityOnFoot">On foot</string>
<string name="detectedActivityStill">Still</string>
<string name="detectedActivityUnknown">Unknown</string>
<string name="detectedActivityTilting">Tilting</string>
<string name="detectedActivityWalking">Walking</string>
<string name="detectedActivityRunning">Running</string>
<string name="detectedActivityInvalidStatus">Invalid activity</string>
<string name="ruleDoesntApplyActivityGivenButTooLowProbability">Rule doesn\'t apply. Detected activity %1$s given, but too low probability (%2$s %%), required %3$s %%.</string>
<string name="ruleDoesntApplyActivityNotPresent">Rule doesn\'t apply. Required activity %1$s not present.</string>
<string name="selectTypeOfActivity">Select type of activity</string>
<string name="triggerOnlyAvailableIfPlayServicesInstalled">This trigger is only available if Google Play Services is installed.</string>
<string name="activityDetectionFrequencyTitle">Activity detection frequency [sec]</string>
<string name="activityDetectionFrequencySummary">Seconds between attempts to detect activity.</string>
<string name="activityDetectionRequiredProbabilityTitle">Activity detection probability</string>
<string name="activityDetectionRequiredProbabilitySummary">Certainty from which activities are accepted as fact.</string>
<string name="incomingCallFrom">Incoming telephone call from %1$s.</string>
<string name="outgoingCallFrom">Outgoing telephone call to %1$s.</string>
<string name="actionSpeakText">Speak text</string>
<string name="textToSpeak">Text to speak</string>
<string name="toggleNotAllowed">Toggling is currently only allowed for rules that have NFC tags as trigger. See help for further information.</string>
<string name="errorReadingPoisAndRulesFromFile">Error reading locations and rules from file.</string>
<string name="noDataChangedReadingAnyway">It appears no data change has been saved. However there may have been changes in memory that need to be rolled back. Rereading file.</string>
<string name="bluetoothConnection">Bluetooth connection</string>
<string name="bluetoothConnectionTo">Bluetooth connection to %1$s</string>
<string name="bluetoothDisconnectFrom">Bluetooth connection to %1$s torn</string>
<string name="bluetoothDeviceInRange">Bluetooth device %1$s in range.</string>
<string name="bluetoothDeviceOutOfRange">Bluetooth device %1$s out of range.</string>
<string name="anyDevice">any device</string>
<string name="ruleDoesntApplyNotTheCorrectDeviceName">Rule doesn\'t apply. Not the correct bluetooth device name.</string>
<string name="ruleDoesntApplyNotTheCorrectDeviceAddress">Rule doesn\'t apply. Not the correct bluetooth device address.</string>
<string name="noDevice">no device</string>
<string name="selectDeviceFromList">one from list</string>
<string name="connectionToDevice">connection to device</string>
<string name="disconnectionFromDevice">disconnection from device</string>
<string name="deviceInRange">device in range</string>
<string name="deviceOutOfRange">device out of range</string>
<string name="selectDeviceOption">Select a device option.</string>
<string name="selectConnectionOption">Select a connection option.</string>
<string name="ruleDoesntApplyDeviceInRangeButShouldNotBe">Rule doesn\'t apply. Device is in range, but should not be.</string>
<string name="ruleDoesntApplyStateNotCorrect">Rule doesn\'t apply. Wrong state.</string>
<string name="triggerHeadsetPlugged">Headset connection</string>
<string name="actionPlayMusic">Open music player</string>
<string name="headsetConnected">Headset (type: %1$s) connected</string>
<string name="headsetDisconnected">Headset (type: %1$s) disconnected</string>
<string name="headphoneSimple">Headphone</string>
<string name="headphoneMicrophone">Microphone</string>
<string name="headphoneAny">Either</string>
<string name="headphoneSelectType">Select type of headphone</string>
<string name="ruleDoesntApplyWrongHeadphoneType">Rule doesn\'t apply. Wrong headphone type.</string>
<string name="ignoringActivityDetectionUpdateTooSoon">Ignoring activity detection update. Came in sooner that %1$s seconds.</string>
<string name="whatsThis">What\'s this?</string>
<string name="atLeastRuleXisUsingY">At least rule \"%1$s\" is using a trigger of type \"%2$s\".</string>
<string name="privacyLocationingTitle">Only private locationing</string>
<string name="monday">Lunes</string>
<string name="tuesday">Martes</string>
<string name="wednesday">Miercoles</string>
<string name="thursday">Jueves</string>
<string name="friday">Viernes</string>
<string name="saturday">Sabado</string>
<string name="headphoneMicrophone">Microfóno</string>
<string name="whatsThis">Que es eso?</string>
<string name="privacyLocationingTitle">Solo usar localización privada</string>
<string name="privacyLocationingSummary">Avoid locationing methods that may send your location to a provider, e.g. Google. This will use GPS only and may therefore be slow or not work reliably.</string>
<string name="enforcingGps">Private Locationing enabled, enforcing GPS use.</string>
<string name="notEnforcingGps">Private Locationing not enabled, using regular provider search.</string>
<string name="gpsMeasurement">GPS measurement</string>
<string name="gpsMeasurementTimeout">GPS measurement stopped due to timeout.</string>
<string name="cellMastChanged">Cell mast changed: %1$s</string>
<string name="noiseDetectionHint">If you think the noise detection isn\'t working correctly (depending on the value you specify) please keep in mind that every phone is different. You can therefore change \"Reference for noise measurement\" in settings. See http://en.wikipedia.org/wiki/Decibel for more information. You can use the volume tester from the main screen to calibrate your device.</string>
<string name="hint">Hint</string>
<string name="selectNoiseLevel">Select noise level</string>
<string name="poiHasWifiStoppingCellLocationListener">Location has wifi. Stopping CellLocationListener.</string>
<string name="poiHasNoWifiNotStoppingCellLocationListener">Location doesn\'t have wifi. Not stopping CellLocationListener.</string>
<string name="showOnMap">Show on map</string>
<string name="noMapsApplicationFound">No maps application found on your device.</string>
<string name="locationEngineNotActive">Location engine not active.</string>
<string name="addProfile">Add profile</string>
<string name="profileList">Profiles</string>
<string name="profile">Profile</string>
<string name="soundMode">Sound mode</string>
<string name="volumes">Volumes</string>
<string name="incomingCallsRingtone">Tone for incoming calls</string>
<string name="notificationRingtone">Tone for notifications</string>
<string name="hapticFeedback">Haptic feedback (vibrate when touching screen)</string>
<string name="volumeMusicVideoGameMedia">Music, video, game and other media</string>
<string name="volumeRingtoneNotifications">Ringtone and notifications</string>
<string name="volumeAlarms">Alarms</string>
<string name="change">Change</string>
<string name="audibleSelection">Audible selection (sound when making screen selection)</string>
<string name="screenLockUnlockSound">Screen lock/unlock sound</string>
<string name="vibrateWhenRinging">Vibrate when ringing</string>
<string name="profiles">Profiles</string>
<string name="volumeAlarms">Alarmas</string>
<string name="change">modificar</string>
<string name="soundModeNormal">Normal</string>
<string name="soundModeVibrate">Vibrate</string>
<string name="soundModeSilent">Silent</string>
<string name="soundModeVibrate">Vibración</string>
<string name="soundModeSilent">Silencio</string>
<string name="enterAname">Enter a name!</string>
<string name="noChangeSelectedProfileDoesntMakeSense">No change selected. Profile doesn\'t make sense.</string>
<string name="noProfilesCreateOneFirst">There are no profiles in your configuration. Create one first.</string>
<string name="errorActivatingProfile">Error activating profile:</string>
<string name="anotherProfileByThatName">There is already another profile by that name.</string>
<string name="invalidProfileName">Invalid name for profile.</string>
<string name="errorWritingFile">Error writing settings file.</string>
<string name="unknownError">Unknown error.</string>
<string name="noWritableFolderFound">No writable folder found to store config file.</string>
<string name="usbTetheringFailForAboveGingerbread">This will most likely not work as you\'re above Android 2.3. However you could use wifi tethering instead.</string>
<string name="usingNewThreadForRuleExecution">Using new thread for rule activation.</string>
<string name="startNewThreadForRuleExecution">Start new thread for rule activation.</string>
<string name="newThreadRules">New thread</string>
<string name="showIcon">Show icon</string>
<string name="showIconWhenServiceIsRunning">Show icon when service is running (works only below Android 7)</string>
<string name="ruleHistory">Rule history (most recent first):</string>
<string name="someOptionsNotAvailableYet">Some options are disabled as they cannot be used, yet. They will be introduced in a later program version.</string>
<string name="lockSoundChanges">Lock sound changes</string>
<string name="noProfileChangeSoundLocked">Profile will not be activated. Last activated profile was locked.</string>
<string name="currentVolume">Current volume</string>
<string name="enterValidReferenceValue">Enter a valid reference value.</string>
<string name="volumeTest">Volume test</string>
<string name="volumeTesterExplanation">To calculate a dB value for noise monitoring you need to specify a so called physical reference value. Please read Wikipedia for further information. This value is most likely different for every phone. Drag the seekbar to change the defined physical reference value. The higher the reference value the lower the dB value will be. Constant measurings will be performed every %1$s seconds and the results displayed below. Press back when you have found a suitable value.</string>
<string name="settingsWillTakeTime">Some settings will not be applied before certain environment settings change or service is restarted.</string>
<string name="phoneIsRooted">Phone is rooted.</string>
<string name="phoneIsNotRooted">Phone is not rooted.</string>
<string name="dataConWithRootSuccess">Data connection was successfully changed using superuser permissions.</string>
<string name="dataConWithRootFail">Data could not be changed using superuser permissions.</string>
<string name="rootExplanation">You need to root your phone for this function to work. Afterwards you needs to \"run the rule manually\" to show up the superuser permission question. When the superuser popups shows up you need to always allow the application to do that. Otherwise the rule cannot function when the phone is unattended.</string>
<string name="errorWritingConfig">Error writing config. Do you have a writable memory?</string>
<string name="phoneNrReplacementError">I could not insert the last phone nr in the variable. I don\'t have it.</string>
<string name="username">Username</string>
<string name="password">Password</string>
<string name="useAuthentication">Use authentication</string>
<string name="permissionsTitle">Required permissions</string>
<string name="permissionsExplanation">Explanation of required permissions</string>
<string name="username">Nombre de usuario</string>
<string name="ok">Ok</string>
<string name="disabledFeatures">Disabled features</string>
<string name="theFollowingPermissionsHaveBeenDenied">The following permissions have been denied:</string>
<string name="permissionsExplanationGeneric">The app is current running in limited mode and has deactivated some features. To fully function it requires permissions. If you want to use all functionality you have to grant the permissions in the following rights dialogues. If you do not certain rules can not be executed. In the following you are given an explanation for the requested permissions. Click "continue", when you are ready to proceed.</string>
<string name="permissionsExplanationSmall">To enable the feature you just tried to use more permissions are required. Click continue to request them.</string>
<string name="continueText">continue</string>
<string name="rule">Rule</string>
<string name="storeSettings">Read and store settings</string>
<string name="featuresDisabled">: Features are disabled, Automation is running in limited mode. Click here for more information.</string>
<string name="ruleLegend">Green = enabled, red = disabled, yellow = not enough permissions</string>
<string name="systemSettingsNote1">The permission to change some OS settings is required (even simple stuff like turn on bluetooth or wifi). After clicking "continue" a window will popup where you need to enable this for Automation. Then hit your "back" key.</string>
<string name="systemSettingsNote2">Further permissions will be requested in a second dialog afterwards.</string>
<string name="appRequiresPermissiontoAccessExternalStorage">Automation requires access to external storage to read its settings and rules.</string>
<string name="mainScreenPermissionNote">Automation requires more permissions to fully function. Click on this text to find out more and request them.</string>
<string name="invalidDevice">Invalid device</string>
<string name="google_app_id">your app id</string>
<string name="logFileMaxSizeSummary">Maximum log file size in Megabyte. Will be rotated if bigger.</string>
<string name="logFileMaxSizeTitle">Maximum log file size [Mb]</string>
<string name="android.permission.READ_CALL_LOG">Read phone log</string>
<string name="android.permission.READ_CALENDAR">Read calendar entries</string>
<string name="android.permission.ACCESS_FINE_LOCATION">Read exact location</string>
<string name="android.permission.ACCESS_COARSE_LOCATION">Read coarse location</string>
<string name="readLocation">Read location</string>
<string name="android.permission.INTERNET">Send data over a network connection</string>
<string name="android.permission.ACCESS_NETWORK_STATE">Read device\'s network state</string>
<string name="android.permission.ACCESS_WIFI_STATE">Read device\'s wifi state</string>
<string name="android.permission.BLUETOOTH">Change Bluetooth settings</string>
<string name="android.permission.BLUETOOTH_ADMIN">Change Bluetooth settings</string>
<string name="android.permission.NFC">Use NFC module</string>
<string name="android.permission.VIBRATE">Let phone vibrate</string>
<string name="android.permission.WAKE_LOCK">Keep phone on</string>
<string name="android.permission.MODIFY_AUDIO_SETTINGS">Change audio settings</string>
<string name="android.permission.RECORD_AUDIO">Record audio</string>
<string name="android.permission.PROCESS_OUTGOING_CALLS">Detect outgoing calls</string>
<string name="android.permission.MODIFY_PHONE_STATE">Change device settings</string>
<string name="android.permission.READ_PHONE_STATE">Detect phone state</string>
<string name="android.permission.READ_EXTERNAL_STORAGE">Read storage</string>
<string name="android.permission.WRITE_EXTERNAL_STORAGE">Write storage</string>
<string name="android.permission.GET_TASKS">Detect running processes</string>
<string name="android.permission.WRITE_SETTINGS">Change device settings</string>
<string name="android.permission.RECEIVE_BOOT_COMPLETED">Detect device reboot</string>
<string name="android.permission.WRITE_SECURE_SETTINGS">Change device settings</string>
<string name="android.permission.BATTERY_STATS">Read battery state</string>
<string name="android.permission.CHANGE_BACKGROUND_DATA_SETTING">Change data connection</string>
<string name="android.permission.SEND_SMS">Send text messages</string>
<string name="continueText">continuar</string>
<string name="rule">Regla</string>
<string name="android.permission.SEND_SMS">Enviar mensajes SMS</string>
<string name="android.permission.READ_CONTACTS">Read contact data</string>
<string name="android.permission.ACCESS_NOTIFICATION_POLICY">Override do not disturb policy</string>
<string name="theseAreThePermissionsRequired">These are the permissions required:</string>
<string name="ruleXrequiresThis">Rule \"%1$s\" requires this.</string>
<string name="helpTextActivityDetection">This feature can detect if you\'re currently on the go and if it is on foot or in which type of vehicle (to a certain extent). The feature is not fully built into Automation, but is provided by Google Play Services. Technically it does not give a yes/no result, but return a percentage to which level it is sure it detected you\'re status. You can setup the percentage value from which Automation will accept a result. Two remarks: 1) More than 1 status could occur at the same time. For example you might be WALKING inside a driving bus. 2) This sensor is relative cost intensive. If it is possible you might consider using alternatives, e.g. require your car\'s handsfree device to be connected to detect you\'re driving.</string>
<string name="sendTextMessage">Send text message</string>
<string name="textToSend">Text to send</string>
<string name="textMessageAnnotations">You can directly enter a phone number. Alternatively use the contacts option to pick one. But keep in mind: The number will be stored here, not the contact. If you change the phone number of a selected contact you\'ll need to update this rule. It doesn\'t do that by itself.</string>
<string name="ruleXrequiresThis">Regla \"%1$s\" requires this.</string>
<string name="sendTextMessage">Enviar mensaje SMS</string>
<string name="importNumberFromContacts">Import number from contacts</string>
<string name="android9RecordAudioNotice">If you\'re using the noise level trigger: Unfortunately beginning with Android 9 (Pie) Google decided to disallow background applications to use the microphone. So this trigger has no effect anymore and won\'t trigger anything.</string>
<string name="messageNotShownAgain">This message won\'t be shown again.</string>
<string name="chooseActivityHint">In this final selection popup you need to select a specific activity. Simplified this is like a window of the desired application. If you do not know which one it is generally a good idea to pick one that has \"main\" or \"launcher\" in its name.</string>
<string name="edit">Edit</string>
<string name="clickAndHoldForOptions">Klicken und halten Sie ein Objekt für Optionen.</string>
<string name="textToSend">Texto de enviar</string>
<string name="password">Contraseña</string>
<string name="showOnMap">Monstrar en una mapa</string>
<string name="headphoneAny">Igual</string>
<string name="sunday">Domingo</string>
<string name="pleaseEnterValidLatitude">Por favor inserte un grado de latitud válido.</string>
<string name="pleaseEnterValidLongitude">Por favor inserte un grade de longitud válido.</string>
<string name="pleaseEnterValidRadius">Por favor inserte un radio válido.</string>
<string name="selectOneDay">Por favor selectar al menos un dia.</string>
<string name="logAttemptingToBindToService">Intentando de connectar al servicio...</string>
<string name="logAttemptingToUnbindFromService">Intentando de disconnectar del servicio...</string>
<string name="logBoundToService">Connectado al servicio.</string>
<string name="logUnboundFromService">Separado del servicio.</string>
<string name="whatToDoWithRule">Hacer que con la regla?</string>
<string name="whatToDoWithPoi">Hacer que con el lugar?</string>
<string name="whatToDoWithProfile">Hacer que con el perfil?</string>
<string name="delete">borrar</string>
<string name="deleteCapital">Borrar</string>
<string name="serviceStopped">Servicio automation terminado.</string>
<string name="logServiceStopping">Terminando servicio.</string>
<string name="stillGettingPosition">Todavia buscando posición</string>
<string name="lastRule">Ultima regla:</string>
<string name="at">al</string>
<string name="service">Servicio:</string>
<string name="getCurrentPosition">Buscar positión actual</string>
<string name="savePoi">Guardar lugar</string>
<string name="deletePoi">Borrar posición</string>
<string name="latitude">Latitud</string>
<string name="longitude">Longitud</string>
<string name="ruleName">Nombre de regla</string>
<string name="triggers">Disparador(es)</string>
<string name="triggersComment">y-connectado (todo tienen que applicar al mismo tiempo)</string>
<string name="addTrigger">Añadir disparador</string>
<string name="actions">Acción(es)</string>
<string name="actionsComment">(ejecutado in esta orden)</string>
<string name="addAction">Añadir acción</string>
<string name="saveRule">Guardar regla</string>
<string name="start">Inicio</string>
<string name="end">Final</string>
<string name="save">Guardar</string>
<string name="urlToTrigger">URL para ejecutar</string>
<string name="wifi">wifi</string>
<string name="activating">Estoy activando</string>
<string name="deactivating">Estoy desctivando</string>
<string name="entering">entrando</string>
<string name="leaving">saliendo</string>
<string name="noPoisSpecified">Al primer tienes que crear lugares.</string>
<string name="selectPoi">Seleccionar lugar</string>
<string name="selectTypeOfAction">Selecte tipo the acción</string>
<string name="connected">connectado</string>
<string name="stopped">terminado</string>
<string name="started">Commencado</string>
<string name="disconnected">separado</string>
<string name="selectSoundProfile">Selecte perfil de sonido</string>
<string name="whatToDoWithTrigger">Hacer que con el disparador?</string>
<string name="whatToDoWithAction">Hacer que con la acción?</string>
<string name="radiusHasToBePositive">Radio tiene que ser un numero positivo.</string>
<string name="poiStillReferenced">Todavia hay reglas cuales usan este lugar (%1$s). No puedo borrar el.</string>
<string name="generalSettings">Reglajes generales.</string>
<string name="startAtSystemBoot">Inicializar al boot.</string>
<string name="writeLogFile">Guardar un archivo protocolo</string>
<string name="wifiState">Estado wifi</string>
<string name="showHelp">Descripción</string>
<string name="rules">Reglas</string>
<string name="timeframes">Intervalo</string>
<string name="helpTitleEnergySaving">Configuración de ahorro de energia</string>
<string name="speedMaximumTime">Tiempo en minutos</string>
<string name="exceeds">exede</string>
<string name="dropsBelow">es menos que</string>
<string name="triggerPointOfInterest">Lugar</string>
<string name="triggerTimeFrame">Intervalo</string>
<string name="triggerSpeed">Velocidad</string>
<string name="actionSetWifi">Wifi</string>
<string name="actionSetBluetooth">Bluetooth</string>
<string name="actionSetWifiTethering">Enrutador wifi</string>
<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="actionTurnBluetoothOff">desactivar Bluetooth</string>
<string name="actionTriggerUrl">Abrir URL en antecedentes</string>
<string name="actionChangeSoundProfile">Cambiar perfil sonido</string>
<string name="actionTurnUsbTetheringOn">encender enrutador USB</string>
<string name="actionTurnUsbTetheringOff">desactivar enrutador USB</string>
<string name="actionTurnWifiTetheringOn">encender enrutatdor wifi</string>
<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">Lugar activo</string>
<string name="closestPoi">Lugar mas cerca</string>
<string name="poi">Posición</string>
<string name="pois">posiciónes</string>
<string name="serviceNotRunning">Servicio not esta activo</string>
<string name="general">General</string>
<string name="startServiceAfterAppUpdate">Encender servicio después un update si estuve activado</string>
<string name="startServiceAfterAppUpdateShort">Encender servicio después un update</string>
<string name="cancel">Cancelar</string>
<string name="wifiName">Nombre de wifi</string>
<string name="wifiConnection">Coneción a un wifi</string>
<string name="exceeding">exedendo</string>
<string name="droppingBelow">estendo menos que</string>
<string name="anyWifi">algun wifi</string>
<string name="selectApplication">Elega la app</string>
<string name="selectPackageOfApplication">Elega el paquete de la app</string>
<string name="selectActivityToBeStarted">Elega la actividad de la app</string>
<string name="errorStartingOtherActivity">Error encendiendo otra app</string>
<string name="startAppBySendBroadcast">con sendBroadcast()</string>
<string name="startAppByStartActivity">con startActivity()</string>
<string name="stringNotAllowed">String %1$s not esta permitido.</string>
<string name="noFilesImported">No pudo importar archivos.</string>
<string name="noApplicableFilesFoundInDirectory">No pudo encontrar archivos.</string>
<string name="prefsImportError">Hubo un error en importar la configuracion.</string>
<string name="configurationImportedSuccessfully">Importe la configuracion con éxito.</string>
<string name="importConfiguration">Importar configuracion</string>
<string name="exportConfiguration">Exportar configuracion</string>
<string name="startAppSelectionType">Método de elegir applicación</string>
<string name="addParameters">Añade parametrós</string>
<string name="fileDoesNotExist">Archivo no exista.</string>
<string name="selectSoundFile">Elija archivo sonido</string>
<string name="alwaysPlay">siempre tocar</string>
<string name="playSound">Tocar sonido</string>
<string name="direction">dirección</string>
<string name="anyApp">alguna app</string>
<string name="directionStringNotEquals">no es igual a</string>
<string name="directionStringStartsWith">comenza con</string>
<string name="directionStringEndsWith">termina con</string>
<string name="directionStringContains">incluye</string>
<string name="directionStringEquals">es igual a</string>
<string name="text">Texto</string>
<string name="title">Titulo</string>
<string name="notification">Notificaión</string>
<string name="locationDisabled">Localización desactivado</string>
<string name="error">Error</string>
<string name="android.permission.ACCESS_BACKGROUND_LOCATION">Determinar su posición en el contexto</string>
<string name="manageLocations">Crear p editar lugares</string>
<string name="startScreen">Ventana incial</string>
<string name="positioningEngine">Metodo de localización</string>
<string name="deviceDoesNotHaveBluetooth">Este móvil no tiene Bluetooth. Puede continuar pero probablemente no va a funciónar.</string>
<string name="android.permission.READ_CALL_LOG">Leer protocolo de teléfono</string>
<string name="android.permission.READ_CALENDAR">Leer calendario</string>
<string name="android.permission.ACCESS_FINE_LOCATION">Determinar la posición exacta</string>
<string name="android.permission.ACCESS_COARSE_LOCATION">Determinar la posición aproximada</string>
<string name="readLocation">Determinar la posición</string>
<string name="android.permission.INTERNET">Usar la conexión a internet</string>
<string name="android.permission.NFC">Usar NFC</string>
<string name="android.permission.VIBRATE">Vibrar</string>
<string name="android.permission.MODIFY_AUDIO_SETTINGS">Modificar la configuración sonida</string>
<string name="android.permission.RECORD_AUDIO">Grabar audio</string>
<string name="android.permission.PROCESS_OUTGOING_CALLS">Detecar llamados saliendos</string>
<string name="android.permission.READ_PHONE_STATE">Detecar el estado del móvil</string>
<string name="android.permission.READ_EXTERNAL_STORAGE">Leer la memoria</string>
<string name="android.permission.WRITE_EXTERNAL_STORAGE">Escribir a la memoria</string>
<string name="android.permission.WRITE_SETTINGS">Modificar la configuración del móvil</string>
<string name="android.permission.BATTERY_STATS">Determinar el estado de la batteria</string>
<string name="android.permission.CHANGE_BACKGROUND_DATA_SETTING">Modificar la conexión internet</string>
<string name="android.permission.ACCESS_NOTIFICATION_POLICY">Exeder configuración no molestar</string>
<string name="android.permission.WRITE_SECURE_SETTINGS">Escribir a la memoria</string>
<string name="apply">aceptar</string>
<string name="publishedOn">publicitado el</string>
<string name="postsNotification">%1$s crea notificación</string>
<string name="removedNotification">notificación de %1$s removido</string>
<string name="notificationAppears">Notificación aparece</string>
<string name="notificationDisappears">Notificación deaparece</string>
<string name="startAppByActivity">a través de activity</string>
<string name="startAppByAction">a través de action</string>
<string name="enterValidAction">Inserte una action válida</string>
<string name="enterPackageName">Inserte un package válido</string>
<string name="configurationExportedSuccessfully">Exportación completada con éxito</string>
<string name="noFileManageInstalled">No mánager archivo esta instalada</string>
<string name="cantFindSoundFile">No puedo buscar el archivo sonido %1$s, por eso no puedo tocar lo.</string>
<string name="ruleActive">Regla activa</string>
<string name="triggerCharging">Batteria esta cargando</string>
<string name="triggerUsb_host_connection">USB conexión a un computador</string>
<string name="actionSetDisplayRotation">Girar monitor</string>
<string name="actionEnableScreenRotation">activar girar monitor</string>
<string name="actionDisableScreenRotation">desactivar girar monitor</string>
<string name="overview">Sinopsis</string>
<string name="enterWifiName">Inserta el nombre del wifi. Deje vacio para applicar a todos wifis.</string>
<string name="startOtherActivity">Iniciar otra app</string>
<string name="settings">Ajustes</string>
<string name="errorReadingSettings">Error leer ajustes.</string>
<string name="bluetoothConnection">Bluetooth conexión</string>
<string name="bluetoothConnectionTo">Bluetooth conexión to %1$s</string>
<string name="anyDevice">algun aparato</string>
<string name="noDevice">no aparato</string>
<string name="actionPlayMusic">Abrir jugador musica</string>
<string name="profiles">Perfiles</string>
<string name="ruleHistory">Historia de reglas (más ultimas al primero)</string>
<string name="lockSoundChanges">Bloquerar modificaciónes sonidas</string>
<string name="status">Estado</string>
<string name="android.permission.ACCESS_NETWORK_STATE">Determinar el estado de la red</string>
<string name="clickAndHoldForOptions">Clice ý ase un elemento para opciónes</string>
<string name="ruleLegend">Verde = activado, roja = desactivado, amarillo = no sufienctes permisos</string>
<string name="addProfile">Añadir perfil</string>
<string name="profile">Perfil</string>
<string name="invalidProfileName">Nombre invalido</string>
<string name="anotherProfileByThatName">Hay otro perfil con lo mismo nombre.</string>
<string name="errorActivatingProfile">Error activando perfil:</string>
<string name="executeRulesAndProfilesWithSingleClickTitle">Activar reglas/perfiles con 1 clic</string>
<string name="name">Nombre</string>
<string name="useAuthentication">Usar verificación de la autenticidad</string>
<string name="radiusWithUnit">Radio [m]</string>
<string name="volumes">Niveles sonidos</string>
<string name="volumeRingtoneNotifications">Sonido polifónico ý notificaciónes</string>
<string name="notificationRingtone">Sonido polifónico para notificaciónes</string>
<string name="incomingCallsRingtone">Sonido polifónico para llamadas</string>
<string name="batteryLevel">NIvel de la bateria</string>
<string name="selectBattery">Elegir nivel de la bateria</string>
<string name="triggerNoiseLevel">Nivel del rudio fondo</string>
<string name="anotherAppIsRunning">Otra app esta enciendo/terminado</string>
<string name="airplaneMode">Modo vuelo</string>
<string name="triggerHeadsetPlugged">Auriculares conectado</string>
<string name="headsetConnected">Auriculares (tipo: %1$s) conectado</string>
<string name="headsetDisconnected">Auriculares (tipo: %1$s) desconectado</string>
<string name="phoneCall">Llamado</string>
<string name="phoneNumber">Número de teléfono</string>
<string name="enterPhoneNumber">Inserte numbero de teléfono. Vacio para algun número</string>
<string name="phoneDirection">Direción de llamada</string>
<string name="headphoneSimple">Auriculares</string>
<string name="headphoneSelectType">Elegir tipo de los auriculares</string>
<string name="accelerometer">" Acelerómetro "</string>
<string name="gpsAccuracy">GPS exactitud [m]</string>
<string name="soundSettings">Ajustes sonidos</string>
<string name="settingsCategoryNoiseLevelMeasurements">Medición de ruido fondo</string>
<string name="waitBeforeNextAction">Esperar antes de la ación próxima</string>
<string name="wakeupDevice">Desperatar móvil</string>
<string name="textToSpeak">Text para hablar</string>
<string name="state">Estado</string>
<string name="setScreenBrightness">Poner luminosidad del monitor</string>
<string name="brightnessManual">luminosidad manual del monitor</string>
<string name="brightnessAuto">luminosidad automatico</string>
<string name="autoBrightness">Activar luminosidad automatico</string>
<string name="setScreenBrightnessEnterValue">Inserte luminosidad deseada (de 0 a 100).</string>
<string name="autoBrightnessNotice">Si usa luminosidad automatica el valor probablemente no va a durar mucho tiempo.</string>
<string name="actionDataConnection">Datos móviles</string>
<string name="actionSpeakText">Hablar texto</string>
<string name="selectToggleDirection">Activar o desactivar</string>
<string name="activated">activado</string>
<string name="activate">Activar</string>
<string name="deactivate">Desactivar</string>
<string name="deactivated">desactivado</string>
<string name="selectNoiseLevel">Elija nivel del ruido fondo</string>
<string name="selectSpeed">Elegir velocidad</string>
<string name="selectTypeOfActivity">Elija tipo de actividad</string>
<string name="selectTypeOfTrigger">Elija tipo de disparador</string>
<string name="startAppStartType">Elija tipo de comienzo</string>
<string name="android.permission.BLUETOOTH">Cambiar ajusted Bluetooth</string>
<string name="android.permission.BLUETOOTH_ADMIN">Cambiar ajusted Bluetooth</string>
<string name="moreSettings">Mas ajustes</string>
<string name="openExamplesPage">Abrir pagina con ejemplos</string>
<string name="activityOrActionName">Nombre del la\nactivitdad or la action</string>
<string name="packageName">Nombre del paquete</string>
<string name="parameterName">Nombre del parámetro</string>
<string name="parameterValue">Valor del parámetro</string>
<string name="addIntentValue">Añadir pareja intento</string>
<string name="parameterType">Tipo del parámetro</string>
</resources>

View File

@ -253,7 +253,6 @@ Quindi, se si crea una regola che imposta il profilo su vibrazione nell\'interva
<string name="logLevelTitle">Dettaglio del file di log</string>
<string name="longitude">Longitudine</string>
<string name="mainScreenPermissionNote">Automation richiede ulteriori autorizzazioni. Clicca su questo testo per saperne di più e concederle.</string>
<string name="menu_settings">Impostazioni</string>
<string name="messageReceivedStatingProcessMonitoringIsComplete">Il messaggio ricevuto attesta che il monitoraggio del processo è completato.</string>
<string name="minimumDistanceChangeForGpsLocationUpdates">Minimo intervallo (im metri) per l\'aggiornamento GPS </string>
<string name="minimumDistanceChangeForNetworkLocationUpdates">Minima distanza percorsa per aggiornare la posizione della rete.</string>
@ -359,7 +358,6 @@ Selezionare su “Continua” quando si è pronti a procedere.</string>
<string name="processes">Processi</string>
<string name="profile">Profilo</string>
<string name="profileActivate">Attivazione del profilo %1$s</string>
<string name="profileList">Lista alfabetica dei profili</string>
<string name="profiles">Profili</string>
<string name="radiusHasToBePositive">Il raggio deve avere valore positivo.</string>
<string name="radiusSuggestion">metri. Il raggio minimo è +1 ma puoi aumentare.</string>
@ -498,7 +496,6 @@ Selezionare su “Continua” quando si è pronti a procedere.</string>
<string name="timeframes">Intervalli</string>
<string name="timeoutForGpsComparisonsSummary">Massimo tempo in secondi per cercare di individuare la posizione GPS per confront. Allo scadere sarà assunta valida l\'ultima localizzazione rilevata.</string>
<string name="timeoutForGpsComparisonsTitle">GPS timeout [sec]</string>
<string name="title_activity_main">Automation</string>
<string name="toggableRules">Regole “Reversibili”</string>
<string name="toggle">toggle</string>
<string name="toggleNotAllowed">La reversibilità al momento è disponibile solo per le regole che hanno come evento un tag NFC. Consulta l\'help per i dettagli.</string>

View File

@ -1,8 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="menu_settings">Settings</string>
<string name="app_name">Automation</string>
<string name="title_activity_main">Automation</string>
<string name="ruleActivate">Activating rule %1$s</string>
<string name="profileActivate">Activating profile %1$s</string>
<string name="ruleActivateToggle">Activating rule %1$s in Togglemode</string>
@ -73,7 +71,7 @@
<string name="end">End</string>
<string name="save">Save</string>
<string name="urlToTrigger">URL to trigger:</string>
<string name="urlLegend">Variables:\nYou can use the following variables. Upon triggering they will be replaced with the corresponding value on your device. Include the brackets in your text.\n\n[uniqueid] - Your device\'s unique id\n[serialnr] - Your device\'s serial number\n[latitude] - Your device\'s latitude\n[longitude] - Your device\'s longitude\n[phonenr] - Number of last incoming or outgoing call\n[d] - Day of the month, 2 digits with leading zeros\n[m] - Numeric representation of a month, with leading zeros\n[Y] - A full numeric representation of a year, 4 digits\n[h] - 12-hour format of an hour with leading zeros\n[H] - 24-hour format of an hour with leading zeros\n[i] - Minutes with leading zeros\n[s] - Seconds, with leading zeros\n[ms] - milliseconds</string>
<string name="urlLegend">Variables:\nYou can use the following variables. Upon triggering they will be replaced with the corresponding value on your device. Include the brackets in your text.\n\n[uniqueid] - Your device\'s unique id\n[serialnr] - Your device\'s serial number\n[latitude] - Your device\'s latitude\n[longitude] - Your device\'s longitude\n[phonenr] - Number of last incoming or outgoing call\n[d] - Day of the month, 2 digits with leading zeros\n[m] - Numeric representation of a month, with leading zeros\n[Y] - A full numeric representation of a year, 4 digits\n[h] - 12-hour format of an hour with leading zeros\n[H] - 24-hour format of an hour with leading zeros\n[i] - Minutes with leading zeros\n[s] - Seconds, with leading zeros\n[ms] - milliseconds\n[notificationTitle] - title of last notification\n[notificationText] - text of last notification</string>
<string name="wifi">wifi</string>
<string name="activating">Activating</string>
<string name="deactivating">Deactivating</string>
@ -465,7 +463,6 @@
<string name="noMapsApplicationFound">No maps application found on your device.</string>
<string name="locationEngineNotActive">Location engine not active.</string>
<string name="addProfile">Add profile</string>
<string name="profileList">Profiles</string>
<string name="profile">Profile</string>
<string name="soundMode">Sound mode</string>
<string name="volumes">Volumes</string>
@ -610,7 +607,7 @@
<string name="locationDisabled">Location disabled</string>
<string name="locationEngineDisabledShort">Location cannot be determined anymore. Click here to find out why.</string>
<string name="locationEngineDisabledLong">Unfortunately your location cannot be determined anymore. A debt of gratitude is owed to Google for its infinite wisdom and amiableness.\\n\\nLet me explain this further. Starting with Android 10 a new permission was introduced that is needed to determine your location in the background (which of course is required for an app like this). Whilst I consider that a good idea in general the chicanery it involves for developers is not.\\n\\nWhen developing an app you can try to qualify for this permission by abiding to a catalog of requirements. Unfortunately new versions of my app have been rejected over a period of three months. I fulfilled all those requirements, Google\'s shitty development support claimed I would not. After giving them proof that I did after all - I got a response like \"I cannot help you anymore\". Eventually I gave up. \\n\\nAs a consequence the Google Play version can NOT use your location as a trigger anymore. My only alternative option would have been to have this application removed from the store entirely.\\n\\nI\'m very sorry about that, but I\'ve tried my best arguing with a \"support\" that repeatedly failed to pass the Turing test.\\n\\nThe good news: You can still have it all!\\n\\nAutomation is now open source and can be found in F-Droid. That is an app store that really cares about your privacy - rather than just acting like that. Simply backup your config file, uninstall this app, install it again from F-Droid, restore your config file - done.\\n\\nClick here to find out more:</string>
<string name="filesStoredAt">Config and log files are stored in folder %1$s. Click on this text to open a file explorer. Unfortunately this will only work with a rooted device or a debug version. If you want to send me or yourself the config- and logfiles you can use the below button.</string>
<string name="filesStoredAt">Config and log files are stored in folder %1$s. Click on this text to open a file explorer. Unfortunately this will only work on a rooted device.\n\nFOR ALL OTHER DEVICES: Simply use the export button to make a backup.</string>
<string name="notification">Notification</string>
<string name="title">Title</string>
<string name="text">Text</string>
@ -635,8 +632,38 @@
<string name="noFileManageInstalled">No file manager installed.</string>
<string name="shareConfigAndLogFilesWithDev">Share config and log files with developer (via email).</string>
<string name="shareConfigAndLogExplanation">This will start a new email with your config and log files attached as zip file. It will not be sent automatically, you still need to hit \"send\". You can also change the recipient to yourself for example.</string>
<string name="startAppChoiceNote">You can enter an activity path manually, but it\'s recommended to use the \"Select\" button. If you choose to enter something manually keep in mind no variables will be resolved. If you want to start the camera for example \"MediaStore.ACTION_IMAGE_CAPTURE\" will not work. You have to look at the Android documentation and use its value instead which would be \"android.media.action.IMAGE_CAPTURE\".</string>
<string name="startAppChoiceNote">Here you have 2 general options: 1. You can start a program by selecting an activity. Imagine this like preselecting a specific screen/window of an application. Keep in mind this may not always work. This is because the windows of an app might interact with each other, e.g. pass on parameters. When bluntly starting a specific screen that interaction has not happened and the window might close instantly (therefore it\'s never really shown). Try it nevertheless! You can enter an activity path manually, but it\'s recommended to use the \"Select\" button. If you decide to enter it manually enter the app\'s package name in the upper field and the full path of the activity in the lower one. 2. Selection by action In contrast to selecting a specific window you can also start a program by an action. This is like shouting out \"I\'d would like xyz\" and if there\'s an app installed that can help you with that it will be started. A good example would be start browser - you might even have multiple installed (one is usually the default one). You need to enter this manually, PackageName is optional here. Keep in mind no variables will be resolved. If you want to start the camera for example using \"MediaStore.ACTION_IMAGE_CAPTURE\" will not work. You have to take a look at the Android documentation and use this variable\'s actual value instead which in this example would be \"android.media.action.IMAGE_CAPTURE\".</string>
<string name="errorRunningRule">There was an error running a rule.</string>
<string name="cantFindSoundFile">Cannot find sound file %1$s and therefore not play it.</string>
<string name="addParameters">Add parameters</string>
<string name="com.wireguard.android.permission.CONTROL_TUNNELS">Control tunnels of the wireguard app</string>
<string name="startAppSelectionType">Method to\nselect application</string>
<string name="startAppByActivity">by activity</string>
<string name="startAppByAction">by action</string>
<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.</string>
<string name="importConfiguration">Import configuration</string>
<string name="exportConfiguration">Export configuration</string>
<string name="moreSettings">More settings</string>
<string name="configurationExportedSuccessfully">Configuration exported successfully.</string>
<string name="ConfigurationExportError">There was an error while exporting the configuration.</string>
<string name="rulesImportedSuccessfully">Rules and locations have been imported successfully.</string>
<string name="rulesImportError">There was an error importing rules and locations.</string>
<string name="configurationImportedSuccessfully">Configuration imported successfully.</string>
<string name="prefsImportError">There was an error importing the preferences.</string>
<string name="noApplicableFilesFoundInDirectory">No applicable files could be found in that directory.</string>
<string name="noFilesImported">No file could be imported.</string>
<string name="notAllFilesImported">Not all applicable files could be imported.</string>
<string name="importExportExplanation">When clicking import or export you select the directory from which files are imported or exported to. When exporting existing files might get overwritten.</string>
<string name="intentDataComment">If your parameter is of type Uri AND you specify \"IntentData\" as name (lower/upper case is not important), the parameter will not be added as a normal parameter with putExtra(), but will instead be added to the intent with setData().</string>
<string name="stringNotAllowed">String %1$s is not allowed.</string>
<string name="startAppStartType">Select start type</string>
<string name="startAppByStartActivity">by startActivity()</string>
<string name="startAppBySendBroadcast">by sendBroadcast()</string>
<string name="openExamplesPage">Open webpage with examples</string>
<string name="packageName">Package name</string>
<string name="activityOrActionName">Activity/action name</string>
<!-- <string name="net.kollnig.missioncontrol.permission.ADMIN">Control the app Tracker Control</string>-->
</resources>

View File

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

View File

@ -0,0 +1,5 @@
* Konfiguration kann jetzt ex- und importiert werden
* Komponenten vom Hauptbildschirm auf seperaten Bildschirm ausgelagert
* Titel und Text von Benachrichtigungen können jetzt als Variable benutzt werden
* Änderungen in der Programm starten Aktion
* Fortschritte in der Spanisch Übersetzung

View File

@ -39,51 +39,11 @@ Mögliche Aktionen:
* SMS verschicken
* Sounddatei abspielen.
Es ist ziemlich schwierig diese Anwendung über die vielen verschiedenen Geräte sowie die vielen Änderungen an Android Versionen am Funktionen zu halten. Ich kann vieles im Emulator testen, aber eben nicht alles.
Wenn also eine bestimmte Funktion nicht so tut wie sie sollte - lassen Sie es mich wissen. Über die Jahre habe ich noch alle Fehler behoben, die mir gemeldet wurden. Aber dafür bin ich auf Ihre Mithilfe angewiesen.
Es ist ziemlich schwierig diese Anwendung über die vielen verschiedenen Geräte sowie die vielen Änderungen an Android Versionen am Laufen zu halten. Ich kann vieles im Emulator testen, aber eben nicht alles.
Wenn also eine bestimmte Funktion nicht so tut wie sie sollte - lassen Sie es mich wissen. Über die Jahre habe ich noch alle Fehler behoben, die mir vernünftig gemeldet wurden. Aber dafür bin ich auf Ihre Mithilfe angewiesen.
Ein Wort zu den vielen Berechtigungen....
Spenden sind nicht die einzige Möglichkeit mich zu motivieren :-)
* Wer mir etwas Gutes tun will, kann die Anwendung auch im Play Store bewerten.
* Außerdem ist Hilfe bei der Übersetzung willkommen. Englisch, Spanisch und Deutsch kann ich selbst. Aber sonst ist alles gern gesehen.
Es liegt in der Natur einer Anwendung wie dieser, daß sie ziemlich viele Berechtigungen benötigt. Allerdings sind praktisch alle davon optional, und werden nur angefragt, wenn Sie eine Regel erstellen, die das erfordert.
Gehen wir sie mal schnell durch:
ACCESS_NETWORK_STATE, CHANGE_NETWORK_STATE: Dinge wie Flugmodus oder Roaming prüfen.
ACCESS_WIFI_STATE, CHANGE_WIFI_STATE: WLAN ein-/ausschalten
INTERNET
Das wird aus drei Gründen benötigt:
- Sie verwenden eine Ortungsmethode, die Mobilfunktürme verwenden (Standardeinstellung)
- Sie verwenden URL aufrufen als Aktion
- Sie aktivieren den Newsdownload in den Einstellungen
BLUETOOTH, BLUETOOTH_ADMIN: Bluetooth Verbindungen prüfen oder Bluetooth ein-/ausschalten
NFC: NFC Tags als Auslöser verwenden
Location (ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION, ACCESS_BACKGROUND_LOCATION): Das sollte selbsterklärend sein - verwenden Sie Orte oder Geschwindigkeit als Auslöser?
PROCESS_OUTGOING_CALLS: Sie können ausgehende Anrufen als Auslöser verwenden. Z.B. "wenn die Frau anruft, dann..."
SEND_SMS: Sie können SMS verschicken lassen. Hier kann eine Zielnummer direkt eingegeben werden oder optional eine aus den Kontakten ausgewählt werden, was uns zu READ_CONTACTS bringt
READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE: Wenn Sie die Anwendung vor März 2021 installiert haben, war das nötig, um die Konfigurationsdatei zu speichern (unter sdcard). Seitdem ist sie nicht mehr notwendig. Die Berechtigung ist noch da, um bei Benutzern, die noch nicht geupdatet haben, ein Migrieren der Dateien zu ermöglichen. Weiterhin ist das Lesen jetzt notwendig, um eine Sounddatei abzuspielen.
GET_TASKS: Für den Auslöser, der prüft, ob eine andere Anwendung läuft.
BATTERY_STATS: Akkustand lesen.
MODIFY_AUDIO_SETTINGS, ACCESS_NOTIFICATION_POLICY:
Für höhere Android Versionen ist das nötig, um Toneinstellungen wie Klingeltöne zu ändern.
https://stackoverflow.com/questions/43123650/android-request-access-notification-policy-and-mute-phone/43127589#43127589
ACCESS_NOTIFICATION_POLICY wird auch verwendet, um für den entsprechenden Auslöser Benachrichtigungen anderer Anwendungen lesen zu können.
RECORD_AUDIO: Für den Auslöser "Hintergrundlautstärke" notwendig. Nebenbei - meine persönliche Anwendung dafür ist: Mein Telefon stellt sich morgens auf laut. Während der Woche ist das recht fr<66>h. Was ist aber, wenn ich einen Tag frei habe? Hierzu wird als zusätzliche Bedingung die Hintergrundlautstärke ausgewertet, um festzustellen, ob ich wirklich schon wach bin. Leider hat Google diese Funktion mit Android 8 deaktiviert.
READ_PHONE_STATE: https://developer.android.com/reference/android/Manifest.permission#READ_PHONE_STATE
RECEIVE_BOOT_COMPLETED, FOREGROUND_SERVICE, WAKE_LOCK: Den Dienst automatisch beim Systemstart starten.
WRITE_SETTINGS: Systemeinstellungen ändern.
ACCESS_SUPERUSER: root ist komplett optional. In der (weiter zurückliegenden) Vergangenheit war es möglich Dinge wie das Ein-/Ausschalten des USB Routers mit normalen Funktionen zu steuern. Leider ist das schon lange nur noch mit Root-Rechten möglich. D.h. root ist nur für wenige Funktionen notwendig.
Erklärungen zu den vielen Berechtigungen können hier abgerufen werden: https://server47.de/automation/permissions_de.html

View File

@ -0,0 +1,5 @@
* Configuration can now be exported and imported
* Moved some things from main screen to separate screen
* Notification title and text can be used as variable
* Changes in start other app action
* Progressed in Spanish translation

View File

@ -40,50 +40,10 @@ Supported actions:
* Play sound file
It's quite hard to keep this app working across the many different hardwares as well as the many changes Android undergoes over the versions. I can test it in the emulator, but that cannot show all bugs.
So if a certain feature is not working on your device - let me know. Over the years I have fixed almost all bugs that have been reported to me. But for that I'm dependend on your input.
So if a certain feature is not working on your device - let me know. Over the years I have fixed almost all bugs that have been reasonably reported to me. But for that I'm dependend on your input.
A word about the many permissions....
Donations are not the only way to motivate me :-)
* If you want to suport me, can also review the app on Google Play.
* Furthermore I can always use help in translating the app. English, German and some Spanish are among my own skills. But everything else is more than welcome.
It lies in the nature of this type of application that it requires a lot of permissions. However most of them are entirely optional and are not requested unless one of the rules you created needs it.
Let's go through them quickly:
ACCESS_NETWORK_STATE, CHANGE_NETWORK_STATE: Check or change things like airplane mode, roaming.
ACCESS_WIFI_STATE, CHANGE_WIFI_STATE: Turn wifi on or off
INTERNET
That's required for any of these 3 reasons:
- You are using a locationing method that utilizes CellTowers (default setting)
- You are using triggerUrl as action
- You activate downloading news in settings
BLUETOOTH, BLUETOOTH_ADMIN: Check bluetooth connections or toggle BT on or off.
NFC: Use NFC tags if you created a rule that uses that.
Location (ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION, ACCESS_BACKGROUND_LOCATION): This should be self-explanatory - are you using a rule with locations or speed as trigger?
PROCESS_OUTGOING_CALLS: You can use current calls as trigger. E.g. if wife calls....
SEND_SMS: You can have SMS sent as action. If you choose to do so you can enter the destination number manually or optionally pick one of your contacts which brings us to READ_CONTACTS
READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE: If you initially installed the app after March 2021 this is not required. In the past the app used to store its config file on the regular storage like "sdcard". The permission is still in there to ensure the app is also still working for legacy users. There the app will migrate the files to the new location. Reading is also required if you want to play sound files.
GET_TASKS: For trigger "check if another app is running"
BATTERY_STATS: Check battery level as trigger
MODIFY_AUDIO_SETTINGS, ACCESS_NOTIFICATION_POLICY:
From higher versions on this is required to be able to change, e.g. the ringtone or generally the sound settings.
https://stackoverflow.com/questions/43123650/android-request-access-notification-policy-and-mute-phone/43127589#43127589
ACCESS_NOTIFICATION_POLICY is also included for the trigger that reads other apps' notifications.
RECORD_AUDIO: For trigger "check background noise". Btw - my use case for this is: My phone will turn on sounds in the morning. During the week that is quite early. But what if I have a day off? Then it will monitor the background noise as an additional condition. If there's noise it's fairly certain I'm actually awake. Unfortunately Google deactivated this feature with Android 8.
READ_PHONE_STATE: https://developer.android.com/reference/android/Manifest.permission#READ_PHONE_STATE
RECEIVE_BOOT_COMPLETED, FOREGROUND_SERVICE, WAKE_LOCK: Start the service automatically and keep it running
WRITE_SETTINGS: Change system settings
ACCESS_SUPERUSER: root is entirely optional. In the (far) past it used be possible to activate/deactivate USB tethering with regular API calls. But a long time ago this started to be possible using root only. So long story short: It's only necessary for some specific features.
Explanation of the many permissions can be found here: https://server47.de/automation/permissions_en.html

View File

@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip