Compare commits
38 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 7e72dfd19a | |||
| 23223480e5 | |||
| e3e2a87b5e | |||
| 4cea4391eb | |||
| 63150ed8f6 | |||
| d986fcdf4d | |||
| ea57dd01e5 | |||
| 6f1f112d98 | |||
| 549c4f109e | |||
| d63841dd27 | |||
| 4913f9236b | |||
| 8f6e376231 | |||
| 9ff121e82a | |||
| ccf87dbef0 | |||
| b510811b18 | |||
| c1619e67ec | |||
| 1c22a3386b | |||
| b83b6568ca | |||
| 4a90b36f6a | |||
| fd90b14bdc | |||
| 91fdef99c3 | |||
| 63264fcf9b | |||
| 2758ef180d | |||
| 3d2b48706d | |||
| e52ce4cd30 | |||
| bbb477fc77 | |||
| 4478006109 | |||
| d117484143 | |||
| f7d8389668 | |||
| 4282c53372 | |||
| 35e2a1158d | |||
| 66e86e66b3 | |||
| 4c4a355ff5 | |||
| 07011b2053 | |||
| fdcdaf53c9 | |||
| 55a1c24753 | |||
| ca88fbfb07 | |||
| 3497d7b8ea |
+15
-15
@@ -3,16 +3,16 @@ plugins {
|
||||
}
|
||||
|
||||
android {
|
||||
compileSdkVersion 34
|
||||
compileSdkVersion 36
|
||||
|
||||
defaultConfig {
|
||||
applicationId "com.jens.automation2"
|
||||
minSdkVersion 16
|
||||
compileSdkVersion 34
|
||||
buildToolsVersion '34.0.0'
|
||||
minSdkVersion 19
|
||||
compileSdkVersion 36
|
||||
buildToolsVersion '36.0.0'
|
||||
useLibrary 'org.apache.http.legacy'
|
||||
versionCode 144
|
||||
versionName "1.8.3"
|
||||
versionCode 148
|
||||
versionName "1.8.7"
|
||||
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
@@ -36,7 +36,7 @@ android {
|
||||
{
|
||||
dimension "version"
|
||||
versionNameSuffix "-googlePlay"
|
||||
targetSdkVersion 34
|
||||
targetSdkVersion 36
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -63,25 +63,25 @@ android {
|
||||
checkReleaseBuilds false
|
||||
}
|
||||
namespace 'com.jens.automation2'
|
||||
buildToolsVersion '34.0.0'
|
||||
buildToolsVersion '36.0.0'
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation 'org.jetbrains:annotations:15.0'
|
||||
implementation 'org.jetbrains:annotations:26.1.0'
|
||||
googlePlayFlavorImplementation 'com.google.firebase:firebase-appindexing:20.0.0'
|
||||
googlePlayFlavorImplementation 'com.google.android.gms:play-services-location:18.0.0'
|
||||
googlePlayFlavorImplementation 'com.google.android.gms:play-services-location:20.0.0'
|
||||
|
||||
apkFlavorImplementation 'com.google.firebase:firebase-appindexing:20.0.0'
|
||||
apkFlavorImplementation 'com.google.android.gms:play-services-location:18.0.0'
|
||||
apkFlavorImplementation 'com.google.android.gms:play-services-location:20.0.0'
|
||||
|
||||
implementation 'com.linkedin.dexmaker:dexmaker:2.28.1'
|
||||
implementation 'org.apache.commons:commons-lang3:3.0'
|
||||
implementation 'com.linkedin.dexmaker:dexmaker:2.28.6'
|
||||
implementation 'org.apache.commons:commons-lang3:3.20.0'
|
||||
|
||||
//implementation "androidx.security:security-crypto:1.0.0"
|
||||
//implementation "androidx.security:security-identity-credential:1.0.0-alpha02"
|
||||
implementation 'androidx.appcompat:appcompat:1.4.2'
|
||||
implementation 'com.google.android.material:material:1.6.1'
|
||||
testImplementation 'junit:junit:4'
|
||||
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
|
||||
testImplementation 'junit:junit:4.13.2'
|
||||
androidTestImplementation 'androidx.test.ext:junit:1.2.1'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
|
||||
}
|
||||
@@ -70,11 +70,11 @@
|
||||
<uses-permission android:name="android.permission.CALL_PHONE" />
|
||||
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" />
|
||||
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
|
||||
<uses-permission android:name="android.hardware.sensor.proximity"/>
|
||||
<uses-permission android:name="android.permission.READ_CALL_LOG" />
|
||||
<uses-permission android:name="android.permission.READ_CALENDAR" />
|
||||
<uses-permission
|
||||
android:name="android.permission.WRITE_SECURE_SETTINGS"
|
||||
tools:ignore="ProtectedPermissions" />
|
||||
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
|
||||
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" tools:ignore="ProtectedPermissions" />
|
||||
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>
|
||||
<!--android:maxSdkVersion="32" />
|
||||
<uses-permission android:name="android.permission.USE_EXACT_ALARM" />-->
|
||||
@@ -112,16 +112,6 @@
|
||||
android:name="google_analytics_ssaid_collection_enabled"
|
||||
android:value="false" />
|
||||
|
||||
<activity
|
||||
android:name=".ActivityMainScreen"
|
||||
android:label="@string/app_name"></activity>
|
||||
<activity
|
||||
android:name=".ActivityManagePoi"
|
||||
android:label="@string/app_name"></activity>
|
||||
<activity
|
||||
android:name=".ActivitySettings"
|
||||
android:label="@string/app_name"></activity>
|
||||
|
||||
<service
|
||||
android:name=".AutomationService"
|
||||
android:exported="false"
|
||||
@@ -166,6 +156,9 @@
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
|
||||
<activity android:name=".ActivityMainScreen" android:label="@string/app_name" />
|
||||
<activity android:name=".ActivityManagePoi" android:label="@string/app_name" />
|
||||
<activity android:name=".ActivitySettings" android:label="@string/app_name" />
|
||||
<activity android:name=".ActivityManageRule" />
|
||||
<activity android:name=".ActivityManageActionTriggerUrl" />
|
||||
<activity android:name=".ActivityDisplayLongMessage" />
|
||||
@@ -223,7 +216,6 @@
|
||||
</intent-filter>
|
||||
-->
|
||||
|
||||
|
||||
<!--
|
||||
<meta-data
|
||||
android:name="android.nfc.action.TECH_DISCOVERED"
|
||||
@@ -236,15 +228,16 @@
|
||||
<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=".ActivityManageTriggerWifi" />
|
||||
<activity android:name=".ActivityVolumeTest" />
|
||||
<activity android:name=".ActivityPermissions"></activity>
|
||||
<activity android:name=".ActivityPermissions" />
|
||||
<activity android:name=".ActivityManageTriggerNotification" />
|
||||
<activity android:name=".ActivityManageTriggerCalendar" />
|
||||
<activity android:name=".ActivityManageTriggerProximity" />
|
||||
<activity android:name=".ActivityManageActionSetSystemSetting" />
|
||||
|
||||
<service
|
||||
android:name=".receivers.NotificationListener"
|
||||
@@ -257,7 +250,6 @@
|
||||
|
||||
</service>
|
||||
|
||||
<activity android:name=".ActivityPermissions" />
|
||||
|
||||
<!-- 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"/>
|
||||
|
||||
@@ -514,8 +514,6 @@ public class Rule implements Comparable<Rule>
|
||||
protected boolean activateInternally(AutomationService automationService)
|
||||
{
|
||||
boolean isActuallyToggleable = isActuallyToggable();
|
||||
|
||||
// boolean notLastActive = getLastActivatedRule() == null || !getLastActivatedRule().equals(Rule.this);
|
||||
boolean doToggle = ruleToggle && isActuallyToggleable;
|
||||
|
||||
String message;
|
||||
@@ -556,7 +554,8 @@ public class Rule implements Comparable<Rule>
|
||||
{
|
||||
try
|
||||
{
|
||||
Rule.this.getActionSet().get(i).run(automationService, doToggle);
|
||||
Miscellaneous.logEvent("i", "RuleExecution", "Running action " + Rule.this.getActionSet().get(i).toStringShort() + " of rule " + Rule.this.getName(), 5);
|
||||
Rule.this.getActionSet().get(i).run(automationService, doToggle);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
@@ -593,10 +592,7 @@ public class Rule implements Comparable<Rule>
|
||||
public void activate(AutomationService automationService, boolean force)
|
||||
{
|
||||
ActivateRuleTask task = new ActivateRuleTask();
|
||||
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
|
||||
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, automationService, force);
|
||||
else
|
||||
task.execute(automationService, force);
|
||||
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, automationService, force);
|
||||
}
|
||||
|
||||
public static ArrayList<Rule> findRuleCandidates(Trigger.Trigger_Enum triggerType)
|
||||
|
||||
@@ -68,11 +68,11 @@
|
||||
<uses-permission android:name="android.permission.CALL_PHONE" />
|
||||
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" />
|
||||
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
|
||||
<uses-permission android:name="android.hardware.sensor.proximity"/>
|
||||
<uses-permission android:name="android.permission.READ_CALL_LOG" />
|
||||
<uses-permission android:name="android.permission.READ_CALENDAR" />
|
||||
<uses-permission
|
||||
android:name="android.permission.WRITE_SECURE_SETTINGS"
|
||||
tools:ignore="ProtectedPermissions" />
|
||||
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
|
||||
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" tools:ignore="ProtectedPermissions" />
|
||||
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>
|
||||
<!--android:maxSdkVersion="32" />
|
||||
<uses-permission android:name="android.permission.USE_EXACT_ALARM" />-->
|
||||
@@ -110,16 +110,6 @@
|
||||
android:name="google_analytics_ssaid_collection_enabled"
|
||||
android:value="false" />
|
||||
|
||||
<activity
|
||||
android:name=".ActivityMainScreen"
|
||||
android:label="@string/app_name"></activity>
|
||||
<activity
|
||||
android:name=".ActivityManagePoi"
|
||||
android:label="@string/app_name"></activity>
|
||||
<activity
|
||||
android:name=".ActivitySettings"
|
||||
android:label="@string/app_name"></activity>
|
||||
|
||||
<service
|
||||
android:name=".AutomationService"
|
||||
android:exported="false"
|
||||
@@ -164,6 +154,9 @@
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
|
||||
<activity android:name=".ActivityMainScreen" android:label="@string/app_name" />
|
||||
<activity android:name=".ActivityManagePoi" android:label="@string/app_name" />
|
||||
<activity android:name=".ActivitySettings" android:label="@string/app_name" />
|
||||
<activity android:name=".ActivityManageRule" />
|
||||
<activity android:name=".ActivityManageActionTriggerUrl" />
|
||||
<activity android:name=".ActivityDisplayLongMessage" />
|
||||
@@ -221,7 +214,6 @@
|
||||
</intent-filter>
|
||||
-->
|
||||
|
||||
|
||||
<!--
|
||||
<meta-data
|
||||
android:name="android.nfc.action.TECH_DISCOVERED"
|
||||
@@ -234,15 +226,16 @@
|
||||
<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=".ActivityManageTriggerWifi" />
|
||||
<activity android:name=".ActivityVolumeTest" />
|
||||
<activity android:name=".ActivityPermissions"></activity>
|
||||
<activity android:name=".ActivityPermissions" />
|
||||
<activity android:name=".ActivityManageTriggerNotification" />
|
||||
<activity android:name=".ActivityManageTriggerCalendar" />
|
||||
<activity android:name=".ActivityManageTriggerProximity" />
|
||||
<activity android:name=".ActivityManageActionSetSystemSetting" />
|
||||
|
||||
<service
|
||||
android:name=".receivers.NotificationListener"
|
||||
@@ -255,7 +248,6 @@
|
||||
|
||||
</service>
|
||||
|
||||
<activity android:name=".ActivityPermissions" />
|
||||
|
||||
<!-- 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"/>
|
||||
|
||||
@@ -487,8 +487,6 @@ public class Rule implements Comparable<Rule>
|
||||
protected boolean activateInternally(AutomationService automationService)
|
||||
{
|
||||
boolean isActuallyToggleable = isActuallyToggable();
|
||||
|
||||
// boolean notLastActive = getLastActivatedRule() == null || !getLastActivatedRule().equals(Rule.this);
|
||||
boolean doToggle = ruleToggle && isActuallyToggleable;
|
||||
|
||||
String message;
|
||||
@@ -529,6 +527,7 @@ public class Rule implements Comparable<Rule>
|
||||
{
|
||||
try
|
||||
{
|
||||
Miscellaneous.logEvent("i", "RuleExecution", "Running action " + Rule.this.getActionSet().get(i).toStringShort() + " of rule " + Rule.this.getName(), 5);
|
||||
Rule.this.getActionSet().get(i).run(automationService, doToggle);
|
||||
}
|
||||
catch(Exception e)
|
||||
@@ -566,10 +565,7 @@ public class Rule implements Comparable<Rule>
|
||||
public void activate(AutomationService automationService, boolean force)
|
||||
{
|
||||
ActivateRuleTask task = new ActivateRuleTask();
|
||||
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
|
||||
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, automationService, force);
|
||||
else
|
||||
task.execute(automationService, force);
|
||||
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, automationService, force);
|
||||
}
|
||||
|
||||
public static ArrayList<Rule> findRuleCandidates(Trigger.Trigger_Enum triggerType)
|
||||
|
||||
@@ -66,13 +66,13 @@
|
||||
<uses-permission android:name="com.wireguard.android.permission.CONTROL_TUNNELS"/>
|
||||
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
|
||||
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
|
||||
<uses-permission
|
||||
android:name="android.permission.WRITE_SECURE_SETTINGS"
|
||||
tools:ignore="ProtectedPermissions" />
|
||||
<uses-permission android:name="android.hardware.sensor.proximity"/>
|
||||
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
|
||||
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" tools:ignore="ProtectedPermissions" />
|
||||
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>
|
||||
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||
<!--android:maxSdkVersion="32" />
|
||||
<uses-permission android:name="android.permission.USE_EXACT_ALARM" />-->
|
||||
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||
<uses-permission android:name="com.termux.permission.RUN_COMMAND" />
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
|
||||
|
||||
@@ -94,21 +94,11 @@
|
||||
android:name="google_analytics_ssaid_collection_enabled"
|
||||
android:value="false" />
|
||||
|
||||
<activity
|
||||
android:name=".ActivityMainScreen"
|
||||
android:label="@string/app_name"></activity>
|
||||
<activity
|
||||
android:name=".ActivityManagePoi"
|
||||
android:label="@string/app_name"></activity>
|
||||
<activity
|
||||
android:name=".ActivitySettings"
|
||||
android:label="@string/app_name"></activity>
|
||||
|
||||
<service
|
||||
android:name=".AutomationService"
|
||||
android:exported="false"
|
||||
android:label="@string/app_name"
|
||||
android:foregroundServiceType="specialUse">
|
||||
android:foregroundServiceType="specialUse" >
|
||||
<property
|
||||
android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
|
||||
android:value="Automating things on the device" />
|
||||
@@ -154,6 +144,9 @@
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
|
||||
<activity android:name=".ActivityMainScreen" android:label="@string/app_name" />
|
||||
<activity android:name=".ActivityManagePoi" android:label="@string/app_name" />
|
||||
<activity android:name=".ActivitySettings" android:label="@string/app_name" />
|
||||
<activity android:name=".ActivityManageRule" />
|
||||
<activity android:name=".ActivityManageActionTriggerUrl" />
|
||||
<activity android:name=".ActivityDisplayLongMessage" />
|
||||
@@ -210,7 +203,6 @@
|
||||
</intent-filter>
|
||||
-->
|
||||
|
||||
|
||||
<!--
|
||||
<meta-data
|
||||
android:name="android.nfc.action.TECH_DISCOVERED"
|
||||
@@ -228,9 +220,11 @@
|
||||
<activity android:name=".ActivityManageProfile" />
|
||||
<activity android:name=".ActivityManageTriggerWifi" />
|
||||
<activity android:name=".ActivityVolumeTest" />
|
||||
<activity android:name=".ActivityPermissions"></activity>
|
||||
<activity android:name=".ActivityPermissions" />
|
||||
<activity android:name=".ActivityManageTriggerNotification" />
|
||||
<activity android:name=".ActivityManageTriggerCalendar" />
|
||||
<activity android:name=".ActivityManageTriggerProximity" />
|
||||
<activity android:name=".ActivityManageActionSetSystemSetting" />
|
||||
|
||||
<service
|
||||
android:name=".receivers.NotificationListener"
|
||||
|
||||
@@ -514,8 +514,6 @@ public class Rule implements Comparable<Rule>
|
||||
protected boolean activateInternally(AutomationService automationService)
|
||||
{
|
||||
boolean isActuallyToggleable = isActuallyToggable();
|
||||
|
||||
// boolean notLastActive = getLastActivatedRule() == null || !getLastActivatedRule().equals(Rule.this);
|
||||
boolean doToggle = ruleToggle && isActuallyToggleable;
|
||||
|
||||
String message;
|
||||
@@ -556,6 +554,7 @@ public class Rule implements Comparable<Rule>
|
||||
{
|
||||
try
|
||||
{
|
||||
Miscellaneous.logEvent("i", "RuleExecution", "Running action " + Rule.this.getActionSet().get(i).toStringShort() + " of rule " + Rule.this.getName(), 5);
|
||||
Rule.this.getActionSet().get(i).run(automationService, doToggle);
|
||||
}
|
||||
catch(Exception e)
|
||||
@@ -593,10 +592,7 @@ public class Rule implements Comparable<Rule>
|
||||
public void activate(AutomationService automationService, boolean force)
|
||||
{
|
||||
ActivateRuleTask task = new ActivateRuleTask();
|
||||
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
|
||||
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, automationService, force);
|
||||
else
|
||||
task.execute(automationService, force);
|
||||
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, automationService, force);
|
||||
}
|
||||
|
||||
public static ArrayList<Rule> findRuleCandidates(Trigger.Trigger_Enum triggerType)
|
||||
|
||||
@@ -8,6 +8,7 @@ import android.widget.Toast;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.net.URLEncoder;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Locale;
|
||||
@@ -58,7 +59,8 @@ public class Action
|
||||
copyToClipboard,
|
||||
setLocationService,
|
||||
sendTextMessage,
|
||||
takeScreenshot;
|
||||
takeScreenshot,
|
||||
setSystemSetting;
|
||||
|
||||
public String getFullName(Context context)
|
||||
{
|
||||
@@ -130,6 +132,8 @@ public class Action
|
||||
return context.getResources().getString(R.string.takeScreenshot);
|
||||
case setLocationService:
|
||||
return context.getResources().getString(R.string.setLocationServiceCapital);
|
||||
case setSystemSetting:
|
||||
return context.getResources().getString(R.string.setSystemSettingCapital);
|
||||
default:
|
||||
return "Unknown";
|
||||
}
|
||||
@@ -493,7 +497,7 @@ public class Action
|
||||
&&
|
||||
!action.toString().equals("turnUsbTetheringOff")
|
||||
) // exclusion for deprecated types
|
||||
actionTypesList.add(action.getFullName(context));
|
||||
actionTypesList.add(action.getFullName(context));
|
||||
}
|
||||
|
||||
return (String[])actionTypesList.toArray(new String[actionTypesList.size()]);
|
||||
@@ -635,6 +639,10 @@ public class Action
|
||||
case setLocationService:
|
||||
Actions.setLocationService(Integer.parseInt(this.getParameter2()), AutomationService.getInstance());
|
||||
break;
|
||||
case setSystemSetting:
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1)
|
||||
Actions.setSystemSetting(this.getParameter2(), AutomationService.getInstance());
|
||||
break;
|
||||
default:
|
||||
Miscellaneous.logEvent("w", "Action", context.getResources().getString(R.string.unknownActionSpecified), 3);
|
||||
break;
|
||||
@@ -682,8 +690,8 @@ public class Action
|
||||
try
|
||||
{
|
||||
url = Miscellaneous.replaceVariablesInText(url, context);
|
||||
if(!StringUtils.isEmpty(params))
|
||||
params = Miscellaneous.replaceVariablesInText(params, context);
|
||||
// if(!StringUtils.isEmpty(params))
|
||||
// params = URLEncoder.encode(Miscellaneous.replaceVariablesInText(params, context), "UTF-8");
|
||||
|
||||
Actions myAction = new Actions();
|
||||
|
||||
@@ -722,7 +730,7 @@ public class Action
|
||||
if(parameters.length >= 3)
|
||||
{
|
||||
urlUsername = parameters[1];
|
||||
urlPassword = parameters[2];
|
||||
urlPassword = parameters[2];
|
||||
|
||||
if(parameters.length >= 4)
|
||||
method = parameters[3];
|
||||
@@ -731,14 +739,24 @@ public class Action
|
||||
{
|
||||
// has params
|
||||
String[] paramPairs = parameters[4].split(Action.actionParameters2SeparatorOuter);
|
||||
String value = "";
|
||||
for(String pair : paramPairs)
|
||||
{
|
||||
String[] pieces = pair.split(Action.actionParameters2SeparatorInner);
|
||||
if(pieces.length == 2)
|
||||
httpParams.put(pieces[0], pieces[1]);
|
||||
|
||||
try
|
||||
{
|
||||
value = Miscellaneous.replaceVariablesInText(pieces[1], Miscellaneous.getAnyContext());
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
value = "error";
|
||||
}
|
||||
|
||||
if(pieces.length == 2)
|
||||
httpParams.put(pieces[0], value);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
String response = httpErrorDefaultText;
|
||||
@@ -751,10 +769,10 @@ public class Action
|
||||
Miscellaneous.logEvent("i", "HTTP Request", "Attempt " + String.valueOf(attempts++) + " of " + String.valueOf(Settings.httpAttempts), 3);
|
||||
|
||||
// Either thorough checking or no encryption
|
||||
if(!Settings.httpAcceptAllCertificates || !urlString.toLowerCase(Locale.getDefault()).contains("https"))
|
||||
// if(!Settings.httpAcceptAllCertificates || !urlString.toLowerCase(Locale.getDefault()).contains("https"))
|
||||
response = Miscellaneous.downloadURL(urlString, urlUsername, urlPassword, method, httpParams);
|
||||
else
|
||||
response = Miscellaneous.downloadUrlWithoutCertificateChecking(urlString, urlUsername, urlPassword, method, httpParams);
|
||||
// else
|
||||
// response = Miscellaneous.downloadUrlWithoutCertificateChecking(urlString, urlUsername, urlPassword, method, httpParams);
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
@@ -12,6 +12,7 @@ import android.bluetooth.BluetoothDevice;
|
||||
import android.bluetooth.BluetoothProfile;
|
||||
import android.content.ActivityNotFoundException;
|
||||
import android.content.ComponentName;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.media.AudioManager;
|
||||
@@ -115,22 +116,18 @@ public class Actions
|
||||
public static void closeNotification(Action action)
|
||||
{
|
||||
NotificationManager nm = (NotificationManager) Miscellaneous.getAnyContext().getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
// for(StatusBarNotification n : nm.getActiveNotifications())
|
||||
// {
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
|
||||
{
|
||||
String[] params = action.getParameter2().split(Action.actionParameter2Split);
|
||||
String[] params = action.getParameter2().split(Action.actionParameter2Split, -1);
|
||||
|
||||
String myApp = params[0];
|
||||
String myTitleDir = params[1];
|
||||
String requiredTitle = params[2];
|
||||
String myTextDir = params[3];
|
||||
String requiredText = "";
|
||||
String requiredText = params[4];
|
||||
String method = ActivityManageActionCloseNotification.dismissRegularString;
|
||||
|
||||
if (params.length >= 5)
|
||||
requiredText = params[4];
|
||||
|
||||
if (params.length >= 6 && !params[5].equals(ActivityManageActionCloseNotification.dismissRegularString))
|
||||
method = params[5];
|
||||
|
||||
@@ -196,7 +193,6 @@ public class Actions
|
||||
Miscellaneous.logEvent("i", "NotificationCloseCheck", "NotificationListener instance is null. Can\'t close notification.", 3);
|
||||
}
|
||||
}
|
||||
// }
|
||||
}
|
||||
|
||||
public static void sendBroadcast(Context context, String action)
|
||||
@@ -255,6 +251,32 @@ public class Actions
|
||||
|
||||
}
|
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
|
||||
public static boolean setSystemSetting(String parameter2, AutomationService instance)
|
||||
{
|
||||
Miscellaneous.logEvent("i", "Variable", "Setting system setting: " + parameter2, 4);
|
||||
|
||||
boolean result = false;
|
||||
|
||||
ContentResolver cr = instance.getContentResolver();
|
||||
|
||||
//"String", "Long", "Int", "Float" };
|
||||
String[] parts = parameter2.split(Action.actionParameter2Split);
|
||||
|
||||
if (parts[0].equalsIgnoreCase("String"))
|
||||
result = android.provider.Settings.Global.putString(cr, parts[1], parts[2]);
|
||||
else if (parts[0].equalsIgnoreCase("Long"))
|
||||
result = android.provider.Settings.Global.putLong(cr, parts[1], Long.parseLong(parts[2]));
|
||||
else if (parts[0].equalsIgnoreCase("Int"))
|
||||
result = android.provider.Settings.Global.putInt(cr, parts[1], Integer.parseInt(parts[2]));
|
||||
else if (parts[0].equalsIgnoreCase("Float"))
|
||||
result = android.provider.Settings.Global.putFloat(cr, parts[1], Float.parseFloat(parts[2]));
|
||||
|
||||
Miscellaneous.logEvent("i", "Variable", "Result of system setting change: " + String.valueOf(result), 4);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static class WifiStuff
|
||||
{
|
||||
public static Boolean setWifi(Context context, Boolean desiredState, String parameter2, boolean toggleActionIfPossible)
|
||||
@@ -962,33 +984,58 @@ public class Actions
|
||||
|
||||
public static void vibrate(boolean parameter1, String parameter2)
|
||||
{
|
||||
String vibrateDurations[] = parameter2.split(Action.vibrateSeparator);
|
||||
String[] vibrateDurations = parameter2.split(Action.vibrateSeparator);
|
||||
|
||||
int counter = 1;
|
||||
for (String vibrate : vibrateDurations)
|
||||
{
|
||||
if (counter % 2 != 0)
|
||||
{
|
||||
Vibrator vibrator = (Vibrator) Miscellaneous.getAnyContext().getSystemService(Context.VIBRATOR_SERVICE);
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
|
||||
vibrator.vibrate(VibrationEffect.createOneShot(Long.parseLong(vibrate), VibrationEffect.DEFAULT_AMPLITUDE));
|
||||
else
|
||||
vibrator.vibrate(Long.parseLong(vibrate));
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
Thread.sleep(Long.parseLong(vibrate));
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Miscellaneous.logEvent("e", "VibrateSleep", Log.getStackTraceString(e), 5);
|
||||
}
|
||||
}
|
||||
|
||||
counter++;
|
||||
Vibrator vibrator = (Vibrator) Miscellaneous.getAnyContext().getSystemService(Context.VIBRATOR_SERVICE);
|
||||
|
||||
if(ActivityPermissions.havePermission(Manifest.permission.VIBRATE, Miscellaneous.getAnyContext()))
|
||||
Miscellaneous.logEvent("i", "Vibrate", "Have permission.", 3);
|
||||
|
||||
if(vibrator != null && vibrator.hasVibrator())
|
||||
{
|
||||
for (String vibrateDuration : vibrateDurations)
|
||||
{
|
||||
vibrator.cancel();
|
||||
|
||||
if (counter % 2 != 0)
|
||||
{
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
|
||||
{
|
||||
VibrationEffect ve = VibrationEffect.createOneShot(Long.parseLong(vibrateDuration), VibrationEffect.DEFAULT_AMPLITUDE);
|
||||
vibrator.vibrate(ve);
|
||||
}
|
||||
else
|
||||
vibrator.vibrate(Long.parseLong(vibrateDuration));
|
||||
|
||||
// Wait for the vibration to complete.
|
||||
try
|
||||
{
|
||||
Thread.sleep(Long.parseLong(vibrateDuration));
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Miscellaneous.logEvent("e", "VibrateSleep", Log.getStackTraceString(e), 5);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
Thread.sleep(Long.parseLong(vibrateDuration));
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Miscellaneous.logEvent("e", "VibrateSleep", Log.getStackTraceString(e), 5);
|
||||
}
|
||||
}
|
||||
|
||||
counter++;
|
||||
}
|
||||
}
|
||||
else
|
||||
Miscellaneous.logEvent("w", "Vibrate", "Device doesn't have vibrator.", 3);
|
||||
}
|
||||
|
||||
public void useDownloadedWebpage(String result)
|
||||
@@ -1097,7 +1144,9 @@ public class Actions
|
||||
|
||||
if (!packageName.equals(dummyPackageString))
|
||||
{
|
||||
externalApplicationIntent.setPackage(packageName);
|
||||
if(!packageName.isEmpty())
|
||||
externalApplicationIntent.setPackage(packageName);
|
||||
|
||||
if (!StringUtils.isEmpty(className))
|
||||
externalApplicationIntent.setClassName(packageName, className);
|
||||
}
|
||||
@@ -1118,10 +1167,12 @@ public class Actions
|
||||
{
|
||||
if (Miscellaneous.isNumeric(startupType))
|
||||
externalApplicationIntent = packParametersIntoIntent(externalApplicationIntent, params, 4);
|
||||
else
|
||||
externalApplicationIntent = packParametersIntoIntent(externalApplicationIntent, params, 3);
|
||||
// else
|
||||
// externalApplicationIntent = packParametersIntoIntent(externalApplicationIntent, params, 3);
|
||||
}
|
||||
|
||||
Miscellaneous.logEvent("i", "StartOtherApp", "Starting other app with intent: " + externalApplicationIntent.toString() + " / " + externalApplicationIntent.getDataString(), 5);
|
||||
|
||||
if (startupType.equals(ActivityManageActionStartActivity.startByActivityString))
|
||||
automationServerRef.startActivity(externalApplicationIntent);
|
||||
else if (startupType.equals(ActivityManageActionStartActivity.startByServiceString))
|
||||
@@ -1207,7 +1258,6 @@ public class Actions
|
||||
{
|
||||
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with value " + singleParam[2] + " as standard data parameter.", 3);
|
||||
intent.setData(Uri.parse(Miscellaneous.replaceVariablesInText(singleParam[2], context)));
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1756,7 +1806,7 @@ public class Actions
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Miscellaneous.logEvent("e", "setData", "Error changing network type: " + Log.getStackTraceString(e), 2);
|
||||
Miscellaneous.logEvent("e", "setData", "Error setting data connection: " + Log.getStackTraceString(e), 2);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -128,9 +128,9 @@ public class ActivityMainScreen extends ActivityGeneric
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
String privacyPolicyUrl = "https://server47.de/donate";
|
||||
String donationUrl = "https://server47.de/donate";
|
||||
|
||||
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(privacyPolicyUrl));
|
||||
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(donationUrl));
|
||||
startActivity(browserIntent);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -5,6 +5,7 @@ import android.app.TabActivity;
|
||||
import android.content.Intent;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.Resources;
|
||||
import android.nfc.NfcAdapter;
|
||||
import android.os.Bundle;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.widget.TabHost;
|
||||
@@ -61,22 +62,24 @@ public class ActivityMainTabLayout extends TabActivity
|
||||
tabHost.setCurrentTab(Settings.startScreen);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void onResume()
|
||||
{
|
||||
super.onResume();
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
// Miscellaneous.logEvent("i", "NFC", "ActivityMainTabLayout.onResume().", 5);
|
||||
NfcReceiver.checkIntentForNFC(this, getIntent());
|
||||
// NfcReceiver.checkIntentForNFC(this, new Intent(this.getApplicationContext(), this.getClass()));
|
||||
if(!(getIntent().getAction().isEmpty()) && getIntent().getAction().equals(NfcAdapter.ACTION_NDEF_DISCOVERED))
|
||||
{
|
||||
NfcReceiver.checkIntentForNFC(this, getIntent());
|
||||
moveTaskToBack(true);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onNewIntent(Intent intent)
|
||||
{
|
||||
// Miscellaneous.logEvent("i", "NFC", "ActivityMainTabLayout.onNewIntent().", 5);
|
||||
// setIntent(intent);
|
||||
|
||||
NfcReceiver.checkIntentForNFC(this, intent);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,157 @@
|
||||
package com.jens.automation2;
|
||||
|
||||
import android.Manifest;
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.text.InputType;
|
||||
import android.text.method.LinkMovementMethod;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
import android.widget.Spinner;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
public class ActivityManageActionSetSystemSetting extends Activity
|
||||
{
|
||||
Spinner spinnerSettingDataType;
|
||||
EditText etSettingName, etSettingValue;
|
||||
Button bSaveSetSystemSetting;
|
||||
TextView tvSetSystemSettingExamples, tvSetSystemSettingNoticeWriteSecureSettings;
|
||||
|
||||
ArrayAdapter<String> settingDataTypeSpinnerAdapter;
|
||||
protected final static String[] dataTypes = { "String", "Long", "Int", "Float" };
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
Miscellaneous.setUiTheme(this);
|
||||
this.setContentView(R.layout.activity_manage_action_set_system_setting);
|
||||
|
||||
spinnerSettingDataType = (Spinner) findViewById(R.id.spinnerSettingDataType);
|
||||
etSettingName = (EditText)findViewById(R.id.etSettingName);
|
||||
etSettingValue = (EditText)findViewById(R.id.etSettingValue);
|
||||
bSaveSetSystemSetting = (Button)findViewById(R.id.bSaveSetSystemSetting);
|
||||
tvSetSystemSettingExamples = (TextView)findViewById(R.id.tvSetSystemSettingExamples);
|
||||
tvSetSystemSettingNoticeWriteSecureSettings = (TextView)findViewById(R.id.tvSetSystemSettingNoticeWriteSecureSettings);
|
||||
|
||||
settingDataTypeSpinnerAdapter = new ArrayAdapter<String>(this, R.layout.text_view_for_poi_listview_mediumtextsize, dataTypes);
|
||||
spinnerSettingDataType.setAdapter(settingDataTypeSpinnerAdapter);
|
||||
settingDataTypeSpinnerAdapter.notifyDataSetChanged();
|
||||
|
||||
tvSetSystemSettingExamples.setMovementMethod(LinkMovementMethod.getInstance());
|
||||
|
||||
if(ActivityPermissions.havePermission(Manifest.permission.WRITE_SECURE_SETTINGS, ActivityManageActionSetSystemSetting.this))
|
||||
tvSetSystemSettingNoticeWriteSecureSettings.setVisibility(View.GONE);
|
||||
else
|
||||
tvSetSystemSettingNoticeWriteSecureSettings.setVisibility(View.VISIBLE);
|
||||
|
||||
spinnerSettingDataType.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
|
||||
{
|
||||
@Override
|
||||
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l)
|
||||
{
|
||||
if(dataTypes[i].equalsIgnoreCase("String"))
|
||||
etSettingValue.setInputType(InputType.TYPE_CLASS_TEXT);
|
||||
else if(dataTypes[i].equalsIgnoreCase("Float"))
|
||||
etSettingValue.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL);
|
||||
else
|
||||
etSettingValue.setInputType(InputType.TYPE_CLASS_NUMBER);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNothingSelected(AdapterView<?> adapterView)
|
||||
{
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
bSaveSetSystemSetting.setOnClickListener(new OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
if(etSettingName.getText().toString().isEmpty())
|
||||
{
|
||||
Toast.makeText(getBaseContext(), getResources().getString(R.string.enterAname), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
|
||||
if(etSettingValue.getText().toString().isEmpty())
|
||||
{
|
||||
Toast.makeText(getBaseContext(), getResources().getString(R.string.enterAvalue), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
String selectedDataType = dataTypes[spinnerSettingDataType.getSelectedItemPosition()];
|
||||
if(
|
||||
selectedDataType.equalsIgnoreCase("Int")
|
||||
||
|
||||
selectedDataType.equalsIgnoreCase("Long")
|
||||
)
|
||||
{
|
||||
if(Miscellaneous.isNumericDecimal(etSettingValue.getText().toString()) || !Miscellaneous.isNumeric(etSettingValue.getText().toString()))
|
||||
{
|
||||
Toast.makeText(ActivityManageActionSetSystemSetting.this, getResources().getString(R.string.enter_a_number), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if(selectedDataType.equalsIgnoreCase("Float"))
|
||||
{
|
||||
if(!Miscellaneous.isNumeric(etSettingValue.getText().toString()))
|
||||
{
|
||||
Toast.makeText(ActivityManageActionSetSystemSetting.this, getResources().getString(R.string.enter_a_number), Toast.LENGTH_LONG).show();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Intent returnIntent = new Intent();
|
||||
|
||||
String param2Data = dataTypes[spinnerSettingDataType.getSelectedItemPosition()] + Action.actionParameter2Split + etSettingName.getText().toString() + Action.actionParameter2Split + etSettingValue.getText().toString();
|
||||
|
||||
returnIntent.putExtra(ActivityManageRule.intentNameActionParameter1, false);
|
||||
returnIntent.putExtra(ActivityManageRule.intentNameActionParameter2, param2Data);
|
||||
|
||||
setResult(RESULT_OK, returnIntent);
|
||||
finish();
|
||||
}
|
||||
});
|
||||
|
||||
if(getIntent().hasExtra(ActivityManageRule.intentNameActionParameter2))
|
||||
{
|
||||
// dataType, setting name, setting value
|
||||
String[] components = getIntent().getStringExtra(ActivityManageRule.intentNameActionParameter2).split(Action.actionParameter2Split);
|
||||
|
||||
int position = Miscellaneous.arraySearchIndexOf(dataTypes, components[0], false, true);
|
||||
|
||||
if(position >= 0)
|
||||
{
|
||||
spinnerSettingDataType.setSelection(position);
|
||||
etSettingName.setText(components[1]);
|
||||
etSettingValue.setText(components[2]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void updateListView()
|
||||
{
|
||||
Miscellaneous.logEvent("i", "ListView", "Attempting to update spinnerSettingDataType", 4);
|
||||
try
|
||||
{
|
||||
if(spinnerSettingDataType.getAdapter() == null)
|
||||
spinnerSettingDataType.setAdapter(settingDataTypeSpinnerAdapter);
|
||||
|
||||
settingDataTypeSpinnerAdapter.notifyDataSetChanged();
|
||||
}
|
||||
catch(NullPointerException e)
|
||||
{}
|
||||
}
|
||||
}
|
||||
@@ -96,8 +96,6 @@ public class ActivityManageActionStartActivity extends Activity
|
||||
spinnerParameterType.setAdapter(intentTypeSpinnerAdapter);
|
||||
intentTypeSpinnerAdapter.notifyDataSetChanged();
|
||||
|
||||
// etClassName.setEnabled(false);
|
||||
|
||||
intentPairAdapter = new ArrayAdapter<String>(this, R.layout.text_view_for_poi_listview_mediumtextsize, intentPairList);
|
||||
bSelectApp.setOnClickListener(new OnClickListener()
|
||||
{
|
||||
|
||||
@@ -19,6 +19,7 @@ import android.widget.EditText;
|
||||
import android.widget.ListView;
|
||||
import android.widget.RadioButton;
|
||||
import android.widget.TableLayout;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
@@ -38,6 +39,7 @@ public class ActivityManageActionTriggerUrl extends Activity
|
||||
CheckBox chkTriggerUrlUseAuthentication;
|
||||
RadioButton rbTriggerUrlMethodGet, rbTriggerUrlMethodPost;
|
||||
TableLayout tlTriggerUrlAuthentication;
|
||||
TextView tvHttpParameterExplanation;
|
||||
ArrayAdapter<String> httpParametersAdapter;
|
||||
|
||||
private ArrayList<String> httpParamsList = new ArrayList<>();
|
||||
@@ -46,9 +48,6 @@ public class ActivityManageActionTriggerUrl extends Activity
|
||||
public static final String methodGet = "GET";
|
||||
public static final String methodPost = "POST";
|
||||
|
||||
// public static boolean edit = false;
|
||||
// public static Action resultingAction = null;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
@@ -70,6 +69,7 @@ public class ActivityManageActionTriggerUrl extends Activity
|
||||
etParameterName = (EditText) findViewById(R.id.etParameterName);
|
||||
etParameterValue = (EditText)findViewById(R.id.etParameterValue);
|
||||
bAddHttpParam = (Button)findViewById(R.id.bAddHttpParam);
|
||||
tvHttpParameterExplanation = (TextView)findViewById(R.id.tvHttpParameterExplanation);
|
||||
|
||||
etParameterName.setEnabled(false);
|
||||
etParameterValue.setEnabled(false);
|
||||
@@ -88,6 +88,8 @@ public class ActivityManageActionTriggerUrl extends Activity
|
||||
}
|
||||
});
|
||||
|
||||
tvHttpParameterExplanation.setText(String.format(getResources().getString(R.string.httpParametersExplanation), Miscellaneous.httpMainData, Miscellaneous.doNoEncodingString));
|
||||
|
||||
httpParametersAdapter = new ArrayAdapter<String>(this, R.layout.text_view_for_poi_listview_mediumtextsize, httpParamsList);
|
||||
|
||||
bSaveTriggerUrl.setOnClickListener(new OnClickListener()
|
||||
|
||||
@@ -2,10 +2,13 @@ package com.jens.automation2;
|
||||
|
||||
import android.Manifest;
|
||||
import android.app.Activity;
|
||||
import android.app.ProgressDialog;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.Looper;
|
||||
import android.os.VibrationEffect;
|
||||
import android.os.Vibrator;
|
||||
import android.view.View;
|
||||
@@ -22,6 +25,7 @@ public class ActivityManageActionVibrate extends Activity
|
||||
{
|
||||
TextView etVibratePattern;
|
||||
Button bTestVibratePattern, bSaveVibratePattern;
|
||||
ProgressDialog pdPleaseWait = null;
|
||||
|
||||
@Override
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState)
|
||||
@@ -60,7 +64,20 @@ public class ActivityManageActionVibrate extends Activity
|
||||
if (ActivityPermissions.havePermission(Manifest.permission.VIBRATE, ActivityManageActionVibrate.this))
|
||||
{
|
||||
String pattern = etVibratePattern.getText().toString();
|
||||
Actions.vibrate(false, pattern);
|
||||
|
||||
String[] patternArray = pattern.split(",");
|
||||
long sum = 0;
|
||||
for(String element : patternArray)
|
||||
sum += Long.parseLong(element);
|
||||
|
||||
if(sum <= 2000)
|
||||
Actions.vibrate(false, pattern);
|
||||
else
|
||||
{
|
||||
pdPleaseWait = ProgressDialog.show(ActivityManageActionVibrate.this, null, getResources().getString(R.string.pleaseWait));
|
||||
VibrateTask vt = new VibrateTask();
|
||||
vt.execute(pattern);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -84,4 +101,22 @@ public class ActivityManageActionVibrate extends Activity
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
class VibrateTask extends AsyncTask<String, Void, Void>
|
||||
{
|
||||
@Override
|
||||
protected Void doInBackground(String... strings)
|
||||
{
|
||||
String pattern = (String)strings[0];
|
||||
Actions.vibrate(false, pattern);
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPostExecute(Void unused)
|
||||
{
|
||||
pdPleaseWait.dismiss();
|
||||
super.onPostExecute(unused);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -36,14 +36,14 @@ public class ActivityManageActionWifi extends Activity
|
||||
|
||||
Intent input = getIntent();
|
||||
if(input.hasExtra(ActivityManageRule.intentNameActionParameter1))
|
||||
{
|
||||
rbActionWifiOn.setChecked(input.getBooleanExtra(ActivityManageRule.intentNameActionParameter1, true));
|
||||
rbActionWifiOff.setChecked(!input.getBooleanExtra(ActivityManageRule.intentNameActionParameter1, true));
|
||||
}
|
||||
|
||||
if(input.hasExtra(ActivityManageRule.intentNameActionParameter2))
|
||||
chkWifiRunAsRoot.setChecked(Boolean.parseBoolean(input.getStringExtra(ActivityManageRule.intentNameActionParameter2)));
|
||||
|
||||
// if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
|
||||
// Miscellaneous.messageBox(getResources().getString(R.string.app_name), getResources().getString(R.string.android10WifiToggleNotice), ActivityManageActionWifi.this).show();
|
||||
|
||||
if(getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.Q)
|
||||
tvWifiExplanation1.setVisibility(View.VISIBLE);
|
||||
else
|
||||
|
||||
@@ -147,6 +147,10 @@ public class ActivityManageRule extends Activity
|
||||
final static int requestCodeTriggerCalendarEventEdit = 834;
|
||||
final static int requestCodeTriggerChargingAdd = 835;
|
||||
final static int requestCodeTriggerChargingEdit = 836;
|
||||
final static int requestCodeTriggerProximityAdd = 837;
|
||||
final static int requestCodeTriggerProximityEdit = 838;
|
||||
final static int requestCodeActionSetSystemSettingAdd = 839;
|
||||
final static int requestCodeActionSetSystemSettingEdit = 840;
|
||||
|
||||
public static ActivityManageRule getInstance()
|
||||
{
|
||||
@@ -164,7 +168,6 @@ public class ActivityManageRule extends Activity
|
||||
Miscellaneous.setUiTheme(this);
|
||||
setContentView(R.layout.activity_manage_specific_rule);
|
||||
|
||||
|
||||
context = this;
|
||||
instance = this;
|
||||
|
||||
@@ -365,6 +368,12 @@ public class ActivityManageRule extends Activity
|
||||
chargingStateEditor.putExtra(intentNameTriggerParameter2, selectedTrigger.getTriggerParameter2());
|
||||
startActivityForResult(chargingStateEditor, requestCodeTriggerChargingEdit);
|
||||
break;
|
||||
case proximity:
|
||||
Intent proximityEditor = new Intent(ActivityManageRule.this, ActivityManageTriggerProximity.class);
|
||||
proximityEditor.putExtra(intentNameTriggerParameter1, selectedTrigger.getTriggerParameter());
|
||||
proximityEditor.putExtra(intentNameTriggerParameter2, selectedTrigger.getTriggerParameter2());
|
||||
startActivityForResult(proximityEditor, requestCodeTriggerProximityEdit);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -503,6 +512,12 @@ public class ActivityManageRule extends Activity
|
||||
actionSetLocationServiceIntent.putExtra(intentNameActionParameter2, a.getParameter2());
|
||||
startActivityForResult(actionSetLocationServiceIntent, requestCodeActionSetLocationServiceEdit);
|
||||
break;
|
||||
case setSystemSetting:
|
||||
Intent actionSetSystemSettingIntent = new Intent(context, ActivityManageActionSetSystemSetting.class);
|
||||
// actionSetSystemSettingIntent.putExtra(intentNameActionParameter1, a.getParameter1());
|
||||
actionSetSystemSettingIntent.putExtra(intentNameActionParameter2, a.getParameter2());
|
||||
startActivityForResult(actionSetSystemSettingIntent, requestCodeActionSetSystemSettingEdit);
|
||||
break;
|
||||
default:
|
||||
Miscellaneous.logEvent("w", "Edit action", "Editing of action type " + a.getAction().toString() + " not implemented, yet.", 4);
|
||||
break;
|
||||
@@ -543,7 +558,7 @@ public class ActivityManageRule extends Activity
|
||||
public void onClick(View v)
|
||||
{
|
||||
// Open help popup
|
||||
Miscellaneous.messageBox(getResources().getString(R.string.whatsThis), getResources().getString(R.string.helpTextToggable), ActivityManageRule.this).show();
|
||||
Miscellaneous.messageBox(getResources().getString(R.string.whatsThis), getResources().getString(R.string.helpTextToggleable), ActivityManageRule.this).show();
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -727,6 +742,13 @@ public class ActivityManageRule extends Activity
|
||||
startActivityForResult(triggerChargingIntent, requestCodeTriggerChargingAdd);
|
||||
return;
|
||||
}
|
||||
else if(triggerType == Trigger_Enum.proximity)
|
||||
{
|
||||
newTrigger.setTriggerType(Trigger_Enum.proximity);
|
||||
Intent triggerProximityIntent = new Intent(myContext, ActivityManageTriggerProximity.class);
|
||||
startActivityForResult(triggerProximityIntent, requestCodeTriggerProximityAdd);
|
||||
return;
|
||||
}
|
||||
else if(triggerType == Trigger_Enum.musicPlaying)
|
||||
booleanChoices = new String[]{getResources().getString(R.string.started), getResources().getString(R.string.stopped)};
|
||||
else if(triggerType == Trigger_Enum.usb_host_connection)
|
||||
@@ -1488,19 +1510,43 @@ public class ActivityManageRule extends Activity
|
||||
this.refreshTriggerList();
|
||||
}
|
||||
}
|
||||
else if(requestCode == requestCodeTriggerProximityAdd)
|
||||
{
|
||||
if(resultCode == RESULT_OK)
|
||||
{
|
||||
newTrigger.setTriggerParameter(data.getBooleanExtra(ActivityManageRule.intentNameTriggerParameter1, false));
|
||||
newTrigger.setTriggerParameter2(data.getStringExtra(ActivityManageRule.intentNameTriggerParameter2));
|
||||
newTrigger.setParentRule(ruleToEdit);
|
||||
ruleToEdit.getTriggerSet().add(newTrigger);
|
||||
this.refreshTriggerList();
|
||||
}
|
||||
}
|
||||
else if(requestCode == requestCodeTriggerChargingEdit)
|
||||
{
|
||||
if(resultCode == RESULT_OK)
|
||||
{
|
||||
Trigger responseTimeFrame = new Trigger();
|
||||
responseTimeFrame.setTriggerType(Trigger_Enum.charging);
|
||||
responseTimeFrame.setTriggerParameter(data.getBooleanExtra(intentNameTriggerParameter1, true));
|
||||
responseTimeFrame.setTriggerParameter2(data.getStringExtra(intentNameTriggerParameter2));
|
||||
responseTimeFrame.setParentRule(ruleToEdit);
|
||||
ruleToEdit.getTriggerSet().set(editIndex, responseTimeFrame);
|
||||
Trigger chargingStateTrigger = new Trigger();
|
||||
chargingStateTrigger.setTriggerType(Trigger_Enum.charging);
|
||||
chargingStateTrigger.setTriggerParameter(data.getBooleanExtra(intentNameTriggerParameter1, true));
|
||||
chargingStateTrigger.setTriggerParameter2(data.getStringExtra(intentNameTriggerParameter2));
|
||||
chargingStateTrigger.setParentRule(ruleToEdit);
|
||||
ruleToEdit.getTriggerSet().set(editIndex, chargingStateTrigger);
|
||||
this.refreshTriggerList();
|
||||
}
|
||||
}
|
||||
else if(requestCode == requestCodeTriggerProximityEdit)
|
||||
{
|
||||
if(resultCode == RESULT_OK)
|
||||
{
|
||||
Trigger proximityTrigger = new Trigger();
|
||||
proximityTrigger.setTriggerType(Trigger_Enum.proximity);
|
||||
proximityTrigger.setTriggerParameter(data.getBooleanExtra(intentNameTriggerParameter1, true));
|
||||
proximityTrigger.setTriggerParameter2(data.getStringExtra(intentNameTriggerParameter2));
|
||||
proximityTrigger.setParentRule(ruleToEdit);
|
||||
ruleToEdit.getTriggerSet().set(editIndex, proximityTrigger);
|
||||
this.refreshTriggerList();
|
||||
}
|
||||
}
|
||||
else if(requestCode == requestCodeActionStartActivityAdd)
|
||||
{
|
||||
// manage start of other activity
|
||||
@@ -2179,6 +2225,32 @@ public class ActivityManageRule extends Activity
|
||||
this.refreshActionList();
|
||||
}
|
||||
}
|
||||
else if(requestCode == requestCodeActionSetSystemSettingAdd)
|
||||
{
|
||||
if(resultCode == RESULT_OK)
|
||||
{
|
||||
newAction.setParentRule(ruleToEdit);
|
||||
// newAction.setParameter1(data.getBooleanExtra(intentNameActionParameter1, false));
|
||||
newAction.setParameter2(data.getStringExtra(intentNameActionParameter2));
|
||||
ruleToEdit.getActionSet().add(newAction);
|
||||
this.refreshActionList();
|
||||
}
|
||||
}
|
||||
else if(requestCode == requestCodeActionSetSystemSettingEdit)
|
||||
{
|
||||
if(resultCode == RESULT_OK)
|
||||
{
|
||||
ruleToEdit.getActionSet().get(editIndex).setParentRule(ruleToEdit);
|
||||
// ruleToEdit.getActionSet().get(editIndex).setParameter1(data.getBooleanExtra(intentNameActionParameter1, false));
|
||||
|
||||
if(data.hasExtra(intentNameActionParameter2))
|
||||
{
|
||||
ruleToEdit.getActionSet().get(editIndex).setParameter2(data.getStringExtra(intentNameActionParameter2));
|
||||
}
|
||||
|
||||
this.refreshActionList();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected AlertDialog getActionTypeDialog()
|
||||
@@ -2264,6 +2336,9 @@ public class ActivityManageRule extends Activity
|
||||
if(ActivityPermissions.isServiceAvailable(Miscellaneous.getAnyContext(), "MyAccessibilityService"))
|
||||
items.add(new Item(typesLong[i].toString(), R.drawable.copier));
|
||||
}
|
||||
else if(types[i].toString().equals(Action_Enum.setSystemSetting.toString()))
|
||||
{ items.add(new Item(typesLong[i].toString(), R.drawable.gears_small));
|
||||
}
|
||||
else
|
||||
items.add(new Item(typesLong[i].toString(), R.drawable.placeholder));
|
||||
}
|
||||
@@ -2502,6 +2577,12 @@ public class ActivityManageRule extends Activity
|
||||
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionLocationService.class);
|
||||
startActivityForResult(intent, requestCodeActionSetLocationServiceAdd);
|
||||
}
|
||||
else if(actionTypes[which].toString().equals(Action_Enum.setSystemSetting.toString()))
|
||||
{
|
||||
newAction.setAction(Action_Enum.setSystemSetting);
|
||||
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionSetSystemSetting.class);
|
||||
startActivityForResult(intent, requestCodeActionSetSystemSettingAdd);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
package com.jens.automation2;
|
||||
|
||||
import android.Manifest;
|
||||
import android.app.Activity;
|
||||
import android.bluetooth.BluetoothDevice;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
@@ -16,17 +18,20 @@ import android.widget.Spinner;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.jens.automation2.receivers.BluetoothReceiver;
|
||||
|
||||
public class ActivityManageTriggerBluetooth extends Activity
|
||||
{
|
||||
final static int requestPermissionCodeBluetoothConnect = 4711;
|
||||
protected static Trigger editedBluetoothTrigger;
|
||||
RadioButton radioAnyBluetoothDevice, radioNoDevice, radioDeviceFromList, radioBluetoothConnected, radioBluetoothDisconnected, radioBluetoothInRange, radioBluetoothOutRange;
|
||||
Button bSaveBluetoothTrigger;
|
||||
Spinner spinnerBluetoothDevices;
|
||||
TextView tvBluetoothNotPresentNotice;
|
||||
|
||||
ArrayAdapter<String> bluetoothDevicesSpinnerAdapter;
|
||||
ArrayAdapter<String> bluetoothDevicesSpinnerAdapter = null;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
@@ -46,8 +51,6 @@ public class ActivityManageTriggerBluetooth extends Activity
|
||||
bSaveBluetoothTrigger = (Button)findViewById(R.id.bSaveBluetoothTrigger);
|
||||
spinnerBluetoothDevices = (Spinner)findViewById(R.id.spinnerBluetoothDevices);
|
||||
tvBluetoothNotPresentNotice = (TextView)findViewById(R.id.tvBluetoothNotPresentNotice);
|
||||
|
||||
bluetoothDevicesSpinnerAdapter = new ArrayAdapter<String>(this, R.layout.text_view_for_poi_listview_mediumtextsize, BluetoothReceiver.getAllPairedBluetoothDevicesStrings());
|
||||
|
||||
if(!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH))
|
||||
tvBluetoothNotPresentNotice.setVisibility(View.VISIBLE);
|
||||
@@ -75,17 +78,37 @@ public class ActivityManageTriggerBluetooth extends Activity
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
refreshBluetoothDeviceSpinner();
|
||||
spinnerBluetoothDevices.setEnabled(false);
|
||||
|
||||
if(Miscellaneous.getTargetSDK(ActivityManageTriggerBluetooth.this) >= 31 && !ActivityPermissions.havePermission(Manifest.permission.BLUETOOTH_CONNECT, ActivityManageTriggerBluetooth.this))
|
||||
requestPermissions(new String[] {Manifest.permission.BLUETOOTH_CONNECT }, requestPermissionCodeBluetoothConnect);
|
||||
else
|
||||
refreshBluetoothDeviceSpinner();
|
||||
|
||||
spinnerBluetoothDevices.setEnabled(false);
|
||||
|
||||
if(editedBluetoothTrigger.getBluetoothDeviceAddress() != null && editedBluetoothTrigger.getBluetoothDeviceAddress().length() > 0)
|
||||
loadVariableIntoGui();
|
||||
}
|
||||
|
||||
protected void refreshBluetoothDeviceSpinner()
|
||||
|
||||
@Override
|
||||
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
|
||||
{
|
||||
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||
|
||||
if(requestCode == requestPermissionCodeBluetoothConnect)
|
||||
{
|
||||
if(permissions[0].equals(Manifest.permission.BLUETOOTH_CONNECT) && grantResults[0] == PackageManager.PERMISSION_GRANTED)
|
||||
refreshBluetoothDeviceSpinner();
|
||||
}
|
||||
}
|
||||
|
||||
protected void refreshBluetoothDeviceSpinner()
|
||||
{
|
||||
Miscellaneous.logEvent("i", "Spinner", "Attempting to update spinnerBluetoothDevices", 4);
|
||||
|
||||
if(bluetoothDevicesSpinnerAdapter == null)
|
||||
bluetoothDevicesSpinnerAdapter = new ArrayAdapter<String>(this, R.layout.text_view_for_poi_listview_mediumtextsize, BluetoothReceiver.getAllPairedBluetoothDevicesStrings());
|
||||
|
||||
if(spinnerBluetoothDevices.getAdapter() == null)
|
||||
{
|
||||
spinnerBluetoothDevices.setAdapter(bluetoothDevicesSpinnerAdapter);
|
||||
|
||||
@@ -191,7 +191,7 @@ public class ActivityManageTriggerNfc extends Activity
|
||||
@Override
|
||||
protected void onPause()
|
||||
{
|
||||
/**
|
||||
/*
|
||||
* Call this before onPause, otherwise an IllegalArgumentException is thrown as well.
|
||||
*/
|
||||
disableForegroundDispatch(this);
|
||||
@@ -203,7 +203,7 @@ public class ActivityManageTriggerNfc extends Activity
|
||||
protected void onResume()
|
||||
{
|
||||
super.onResume();
|
||||
/**
|
||||
/*
|
||||
* It's important, that the activity is in the foreground (resumed). Otherwise
|
||||
* an IllegalStateException is thrown.
|
||||
*/
|
||||
@@ -237,10 +237,18 @@ public class ActivityManageTriggerNfc extends Activity
|
||||
if(currentStatus == 0)
|
||||
{
|
||||
generatedId = NfcReceiver.readTag(discoveredTag);
|
||||
if(generatedId != null && generatedId.length() > 0)
|
||||
tvCurrentNfcId.setText(generatedId);
|
||||
if(generatedId != null && generatedId.length() > 0)
|
||||
{
|
||||
tvCurrentNfcId.setText(generatedId);
|
||||
bReadNfcTag.setEnabled(true);
|
||||
bUseValueCurrentlyStored.setEnabled(true);
|
||||
}
|
||||
else
|
||||
tvCurrentNfcId.setText(getResources().getString(R.string.nfcTagDataNotUsable));
|
||||
{
|
||||
tvCurrentNfcId.setText(getResources().getString(R.string.nfcTagDataNotUsable));
|
||||
bReadNfcTag.setEnabled(false);
|
||||
bUseValueCurrentlyStored.setEnabled(false);
|
||||
}
|
||||
}
|
||||
else if(currentStatus == 1)
|
||||
{
|
||||
|
||||
@@ -0,0 +1,172 @@
|
||||
package com.jens.automation2;
|
||||
|
||||
import android.Manifest;
|
||||
import android.app.Activity;
|
||||
import android.app.AlertDialog;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.hardware.Sensor;
|
||||
import android.hardware.SensorEvent;
|
||||
import android.hardware.SensorEventListener;
|
||||
import android.hardware.SensorManager;
|
||||
import android.net.wifi.ScanResult;
|
||||
import android.net.wifi.WifiConfiguration;
|
||||
import android.net.wifi.WifiManager;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.text.Editable;
|
||||
import android.text.TextWatcher;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.Button;
|
||||
import android.widget.CompoundButton;
|
||||
import android.widget.EditText;
|
||||
import android.widget.RadioButton;
|
||||
import android.widget.SeekBar;
|
||||
import android.widget.Spinner;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.core.app.ActivityCompat;
|
||||
|
||||
import com.google.android.material.slider.RangeSlider;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class ActivityManageTriggerProximity extends Activity
|
||||
{
|
||||
TextView tvTriggerProximityHint, tvProximityCurrentValue;
|
||||
Button bTriggerProximitySave;
|
||||
RangeSlider rsProximity;
|
||||
SeekBar sbProximityTest;
|
||||
|
||||
SensorManager sensorManager;
|
||||
Sensor proximitySensor;
|
||||
|
||||
@Override
|
||||
protected void onCreate(@Nullable Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
Miscellaneous.setDisplayLanguage(this);
|
||||
|
||||
/*
|
||||
A modern theme is required for this activity because of the RangeSlider.
|
||||
The value configured in settings is ignored.
|
||||
*/
|
||||
this.setTheme(R.style.AppThemeMaterial);
|
||||
|
||||
setContentView(R.layout.activity_manage_trigger_proximity);
|
||||
|
||||
rsProximity = (RangeSlider) findViewById(R.id.rsProximity);
|
||||
sbProximityTest = (SeekBar) findViewById(R.id.sbProximityTest);
|
||||
tvTriggerProximityHint = (TextView) findViewById(R.id.tvTriggerProximityHint);
|
||||
tvProximityCurrentValue = (TextView) findViewById(R.id.tvProximityCurrentValue);
|
||||
bTriggerProximitySave = (Button) findViewById(R.id.bTriggerProximitySave);
|
||||
|
||||
sbProximityTest.setEnabled(false);
|
||||
tvTriggerProximityHint.setVisibility(View.GONE);
|
||||
|
||||
bTriggerProximitySave.setOnClickListener(new View.OnClickListener()
|
||||
{
|
||||
@Override
|
||||
public void onClick(View v)
|
||||
{
|
||||
Intent response = new Intent();
|
||||
|
||||
response.putExtra(ActivityManageRule.intentNameTriggerParameter2, String.valueOf(rsProximity.getValues().get(0)) + Trigger.triggerParameter2Split + String.valueOf(rsProximity.getValues().get(1)));
|
||||
setResult(RESULT_OK, response);
|
||||
finish();
|
||||
}
|
||||
});
|
||||
|
||||
if(getIntent().hasExtra(ActivityManageRule.intentNameTriggerParameter2))
|
||||
{
|
||||
String[] values = getIntent().getStringExtra(ActivityManageRule.intentNameTriggerParameter2).split(Trigger.triggerParameter2Split);
|
||||
rsProximity.setValues(Float.parseFloat(values[0]), Float.parseFloat(values[1]));
|
||||
}
|
||||
else
|
||||
rsProximity.setValues(0f, 10f);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume()
|
||||
{
|
||||
super.onResume();
|
||||
startPreview();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause()
|
||||
{
|
||||
super.onPause();
|
||||
stopPreview();
|
||||
}
|
||||
|
||||
void startPreview()
|
||||
{
|
||||
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
|
||||
|
||||
// from sensor service we are
|
||||
// calling proximity sensor
|
||||
proximitySensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
|
||||
|
||||
// handling the case if the proximity
|
||||
// sensor is not present in users device.
|
||||
if (proximitySensor == null)
|
||||
{
|
||||
tvTriggerProximityHint.setVisibility(View.VISIBLE);
|
||||
finish();
|
||||
}
|
||||
else
|
||||
{
|
||||
// registering our sensor with sensor manager.
|
||||
sensorManager.registerListener(proximitySensorEventListener, proximitySensor, SensorManager.SENSOR_DELAY_NORMAL);
|
||||
}
|
||||
}
|
||||
|
||||
void stopPreview()
|
||||
{
|
||||
if(proximitySensor != null)
|
||||
sensorManager.unregisterListener(proximitySensorEventListener);
|
||||
}
|
||||
|
||||
SensorEventListener proximitySensorEventListener = new SensorEventListener()
|
||||
{
|
||||
@Override
|
||||
public void onSensorChanged(SensorEvent sensorEvent)
|
||||
{
|
||||
// check if the sensor type is proximity sensor.
|
||||
if (sensorEvent.sensor.getType() == Sensor.TYPE_PROXIMITY)
|
||||
{
|
||||
sbProximityTest.setProgress((int)sensorEvent.values[0]);
|
||||
tvProximityCurrentValue.setText((String.valueOf(sensorEvent.values[0])));
|
||||
|
||||
// if (sensorEvent.values[0] == 0)
|
||||
// {
|
||||
// here we are setting our status to our textview..
|
||||
// if sensor event return 0 then object is closed
|
||||
// to sensor else object is away from sensor.
|
||||
// sensorStatusTV.setText("Near");
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// sensorStatusTV.setText("Away");
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAccuracyChanged(Sensor sensor, int i)
|
||||
{
|
||||
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -46,8 +46,8 @@ public class ActivityManageTriggerTimeFrame extends Activity
|
||||
|
||||
setContentView(R.layout.activity_manage_trigger_timeframe);
|
||||
|
||||
if(Build.VERSION.SDK_INT == 34)
|
||||
Miscellaneous.messageBox(getResources().getString(R.string.info), getResources().getString(R.string.Android14TimePickerHint), ActivityManageTriggerTimeFrame.this).show();
|
||||
// if(Build.VERSION.SDK_INT == 34)
|
||||
// Miscellaneous.messageBox(getResources().getString(R.string.info), getResources().getString(R.string.Android14TimePickerHint), ActivityManageTriggerTimeFrame.this).show();
|
||||
|
||||
startPicker = (TimePicker)findViewById(R.id.tpTimeFrameStart);
|
||||
stopPicker = (TimePicker)findViewById(R.id.tpTimeFrameStop);
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.jens.automation2;
|
||||
|
||||
import android.Manifest;
|
||||
import android.app.Activity;
|
||||
import android.app.AlarmManager;
|
||||
import android.app.AlertDialog;
|
||||
import android.app.NotificationManager;
|
||||
import android.app.admin.DevicePolicyManager;
|
||||
@@ -27,6 +28,8 @@ import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.core.content.ContextCompat;
|
||||
|
||||
import com.jens.automation2.receivers.NotificationListener;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -66,6 +69,7 @@ public class ActivityPermissions extends Activity
|
||||
public final static String permissionNameWireguard = "com.wireguard.android.permission.CONTROL_TUNNELS";
|
||||
public final static String permissionNameGoogleActivityDetection = "com.google.android.gms.permission.ACTIVITY_RECOGNITION";
|
||||
public final static String permissionNameSuperuser = "android.permission.ACCESS_SUPERUSER";
|
||||
public final static String permissionNameProximity = "android.hardware.sensor.proximity";
|
||||
|
||||
public static ActivityPermissions getInstance()
|
||||
{
|
||||
@@ -277,6 +281,19 @@ public class ActivityPermissions extends Activity
|
||||
return false;
|
||||
}
|
||||
|
||||
public static int getAmountOfRulesWhichLackPermissions(Context context)
|
||||
{
|
||||
int rulesWhichLackPermissions = 0;
|
||||
|
||||
for(Rule r : Rule.getRuleCollection())
|
||||
{
|
||||
if(!ActivityPermissions.havePermissionsForRule(r, context))
|
||||
rulesWhichLackPermissions++;
|
||||
}
|
||||
|
||||
return rulesWhichLackPermissions;
|
||||
}
|
||||
|
||||
public static boolean havePermission(String s, Context context)
|
||||
{
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
|
||||
@@ -315,9 +332,20 @@ public class ActivityPermissions extends Activity
|
||||
{
|
||||
return haveAccessibilityAccess(Miscellaneous.getAnyContext());
|
||||
}
|
||||
else if(s.equals(Manifest.permission.SCHEDULE_EXACT_ALARM) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)
|
||||
{
|
||||
/*
|
||||
It appears like as long as targetSdk has not been raised, this check
|
||||
will return true even if the slider in the settings for that
|
||||
permission is not enabled.
|
||||
*/
|
||||
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
|
||||
return alarmManager.canScheduleExactAlarms();
|
||||
}
|
||||
else
|
||||
{
|
||||
int res = context.checkCallingOrSelfPermission(s);
|
||||
// int res = context.checkCallingOrSelfPermission(s);
|
||||
int res = ContextCompat.checkSelfPermission(context, s);
|
||||
return (res == PackageManager.PERMISSION_GRANTED);
|
||||
}
|
||||
}
|
||||
@@ -521,6 +549,8 @@ public class ActivityPermissions extends Activity
|
||||
addToArrayListUnique(Manifest.permission.BLUETOOTH_ADMIN, requiredPermissions);
|
||||
addToArrayListUnique(Manifest.permission.BLUETOOTH, requiredPermissions);
|
||||
addToArrayListUnique(Manifest.permission.ACCESS_NETWORK_STATE, requiredPermissions);
|
||||
if(Build.VERSION.SDK_INT >= 31)
|
||||
addToArrayListUnique(Manifest.permission.BLUETOOTH_CONNECT, requiredPermissions);
|
||||
break;
|
||||
case charging:
|
||||
// addToArrayListUnique(Manifest.permission.READ_PHONE_STATE, requiredPermissions);
|
||||
@@ -572,8 +602,8 @@ public class ActivityPermissions extends Activity
|
||||
break;
|
||||
case timeFrame:
|
||||
if(Build.VERSION.SDK_INT >= 31 && Miscellaneous.getTargetSDK(Miscellaneous.getAnyContext()) >= 31
|
||||
// ||
|
||||
// Build.VERSION.SDK_INT >= 33
|
||||
||
|
||||
Build.VERSION.SDK_INT >= 34 //https://developer.android.com/about/versions/14/changes/schedule-exact-alarms
|
||||
)
|
||||
addToArrayListUnique(Manifest.permission.SCHEDULE_EXACT_ALARM, requiredPermissions);
|
||||
break;
|
||||
@@ -603,6 +633,10 @@ public class ActivityPermissions extends Activity
|
||||
if(Build.VERSION.SDK_INT >= 31 && Miscellaneous.getTargetSDK(Miscellaneous.getAnyContext()) >= 31)
|
||||
addToArrayListUnique(Manifest.permission.SCHEDULE_EXACT_ALARM, requiredPermissions);
|
||||
break;
|
||||
// Proximity permission cannot be requested, but is always granted.
|
||||
case proximity:
|
||||
// addToArrayListUnique(ActivityPermissions.permissionNameProximity, requiredPermissions);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -761,6 +795,7 @@ public class ActivityPermissions extends Activity
|
||||
addToArrayListUnique(Manifest.permission.BIND_ACCESSIBILITY_SERVICE, requiredPermissions);
|
||||
break;
|
||||
case setLocationService:
|
||||
case setSystemSetting:
|
||||
addToArrayListUnique(Manifest.permission.WRITE_SECURE_SETTINGS, requiredPermissions);
|
||||
break;
|
||||
case setScreenBrightness:
|
||||
@@ -892,12 +927,8 @@ public class ActivityPermissions extends Activity
|
||||
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
|
||||
break;
|
||||
case Manifest.permission.BLUETOOTH_ADMIN:
|
||||
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.bluetoothConnection))
|
||||
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
|
||||
for(String ruleName : getRulesUsing(Action.Action_Enum.setBluetooth))
|
||||
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
|
||||
break;
|
||||
case Manifest.permission.BLUETOOTH:
|
||||
case Manifest.permission.BLUETOOTH_CONNECT:
|
||||
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.bluetoothConnection))
|
||||
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
|
||||
for(String ruleName : getRulesUsing(Action.Action_Enum.setBluetooth))
|
||||
@@ -1008,11 +1039,18 @@ public class ActivityPermissions extends Activity
|
||||
case Manifest.permission.WRITE_SECURE_SETTINGS:
|
||||
for(String ruleName : getRulesUsing(Action.Action_Enum.setLocationService))
|
||||
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
|
||||
for(String ruleName : getRulesUsing(Action.Action_Enum.setSystemSetting))
|
||||
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
|
||||
break;
|
||||
case Manifest.permission.READ_CALENDAR:
|
||||
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.calendarEvent))
|
||||
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
|
||||
break;
|
||||
// Proximity permission cannot be requested, but is always granted.
|
||||
// case ActivityPermissions.permissionNameProximity:
|
||||
// for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.proximity))
|
||||
// usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
|
||||
// break;
|
||||
}
|
||||
|
||||
return usingElements;
|
||||
@@ -1030,7 +1068,7 @@ public class ActivityPermissions extends Activity
|
||||
required permissions have been granted.
|
||||
*/
|
||||
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
// super.onActivityResult(requestCode, resultCode, data);
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
|
||||
{
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package com.jens.automation2;
|
||||
|
||||
import static android.app.PendingIntent.FLAG_IMMUTABLE;
|
||||
|
||||
import android.Manifest;
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.ActivityManager;
|
||||
@@ -178,6 +180,17 @@ public class AutomationService extends Service implements OnInitListener
|
||||
Rule.getRuleCollection().size() == 0
|
||||
)
|
||||
{
|
||||
if(
|
||||
Rule.getRuleCollection().size() > 0
|
||||
&&
|
||||
Rule.getRuleCollection().size() == ActivityPermissions.getAmountOfRulesWhichLackPermissions(Miscellaneous.getAnyContext())
|
||||
)
|
||||
{
|
||||
Miscellaneous.logEvent("w", "AutomationService", "Don't have complete permissions for any defined rule. Not starting service.", 1);
|
||||
Toast.makeText(context, context.getResources().getString(R.string.serviceWontStartPermissions), Toast.LENGTH_LONG).show();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (startAtBoot)
|
||||
{
|
||||
/*
|
||||
@@ -502,7 +515,12 @@ public class AutomationService extends Service implements OnInitListener
|
||||
if(Miscellaneous.googleToBlameForLocation(true))
|
||||
{
|
||||
Intent intent = new Intent(AutomationService.this, ActivityMainTabLayout.class);
|
||||
PendingIntent pi = PendingIntent.getActivity(AutomationService.this, 0, intent, 0);
|
||||
PendingIntent pi;
|
||||
|
||||
// if(Miscellaneous.getTargetSDK(AutomationService.this) >= Build.VERSION_CODES.S)
|
||||
pi = PendingIntent.getActivity(AutomationService.this, 0, intent, FLAG_IMMUTABLE);
|
||||
// else
|
||||
// pi = PendingIntent.getActivity(AutomationService.this, 0, intent, 0);
|
||||
|
||||
Miscellaneous.logEvent("w", "Features disabled", "Background location disabled because Google to blame.", 5);
|
||||
|
||||
|
||||
@@ -92,11 +92,11 @@ import java.security.KeyManagementException;
|
||||
import java.security.KeyStore;
|
||||
import java.security.MessageDigest;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.SecureRandom;
|
||||
import java.security.cert.CertificateException;
|
||||
import java.security.cert.X509Certificate;
|
||||
import java.text.DateFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.time.LocalDate;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
@@ -127,10 +127,36 @@ import eu.chainfire.libsuperuser.Shell;
|
||||
public class Miscellaneous extends Service
|
||||
{
|
||||
protected static String writeableFolderStringCache = null;
|
||||
protected final static String http_error_string = "HTTP_ERROR";
|
||||
protected final static String last_trigger_url_result_string = "last_trigger_url_result";
|
||||
protected final static String httpMainData = "httpMainData";
|
||||
protected final static String doNoEncodingString = "NoEncoding";
|
||||
protected final static String httpEncoding = "UTF-8";
|
||||
public static Context startupContext;
|
||||
|
||||
public static final String lineSeparator = System.getProperty("line.separator");
|
||||
|
||||
|
||||
public static class TrustAllCertificates implements X509TrustManager
|
||||
{
|
||||
@Override
|
||||
public void checkClientTrusted(X509Certificate[] chain, String authType)
|
||||
{
|
||||
// Do nothing (trust all clients)
|
||||
}
|
||||
|
||||
@Override
|
||||
public void checkServerTrusted(X509Certificate[] chain, String authType)
|
||||
{
|
||||
// Do nothing (trust all servers)
|
||||
}
|
||||
|
||||
@Override
|
||||
public X509Certificate[] getAcceptedIssuers()
|
||||
{
|
||||
return new X509Certificate[0]; // No accepted issuers
|
||||
}
|
||||
}
|
||||
|
||||
public static String downloadURL(String url, String username, String password, String method, Map<String, String> httpParams)
|
||||
{
|
||||
HttpClient httpclient = new DefaultHttpClient();
|
||||
@@ -145,12 +171,24 @@ public class Miscellaneous extends Service
|
||||
HttpURLConnection connection;
|
||||
|
||||
if(url.toLowerCase().contains("https"))
|
||||
{
|
||||
connection = (HttpsURLConnection) urlObject.openConnection();
|
||||
}
|
||||
{
|
||||
connection = (HttpsURLConnection) urlObject.openConnection();
|
||||
if(Settings.httpAcceptAllCertificates)
|
||||
{
|
||||
SSLContext sslContext = SSLContext.getInstance("TLS"); // Use "TLS" (not "SSL" which is outdated)
|
||||
sslContext.init(
|
||||
null, // No KeyManager (client authentication not needed)
|
||||
new TrustManager[]{new TrustAllCertificates()}, // Use our trust manager
|
||||
new SecureRandom() // Secure random number generator
|
||||
);
|
||||
((HttpsURLConnection)connection).setSSLSocketFactory(sslContext.getSocketFactory());
|
||||
((HttpsURLConnection)connection).setHostnameVerifier((hostname, session) -> true); // Trust all hostnames
|
||||
|
||||
}
|
||||
}
|
||||
else
|
||||
connection = (HttpURLConnection) urlObject.openConnection();
|
||||
|
||||
|
||||
// Add http simple authentication if specified
|
||||
if(username != null && password != null)
|
||||
{
|
||||
@@ -162,9 +200,10 @@ public class Miscellaneous extends Service
|
||||
else if(method.equals(ActivityManageActionTriggerUrl.methodPost))
|
||||
connection.setRequestMethod("POST");
|
||||
|
||||
if(httpParams.size() > 0)
|
||||
if(httpParams.size() > 0)
|
||||
{
|
||||
connection.setRequestMethod("POST");
|
||||
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
|
||||
connection.setDoInput(true);
|
||||
connection.setDoOutput(true);
|
||||
|
||||
@@ -174,8 +213,8 @@ public class Miscellaneous extends Service
|
||||
paramPairs.add(new BasicNameValuePair(key, httpParams.get(key)));
|
||||
|
||||
OutputStream os = connection.getOutputStream();
|
||||
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
|
||||
writer.write(getQuery(paramPairs));
|
||||
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, httpEncoding));
|
||||
writer.write(getQuery(paramPairs, method));
|
||||
writer.flush();
|
||||
writer.close();
|
||||
}
|
||||
@@ -199,27 +238,58 @@ public class Miscellaneous extends Service
|
||||
// immediate deallocation of all system resources
|
||||
httpclient.getConnectionManager().shutdown();
|
||||
if(errorFound)
|
||||
return "httpError";
|
||||
return http_error_string;
|
||||
else
|
||||
return responseBody.toString();
|
||||
}
|
||||
}
|
||||
|
||||
private static String getQuery(List<NameValuePair> params) throws UnsupportedEncodingException
|
||||
private static String getQuery(List<NameValuePair> params, String method) throws UnsupportedEncodingException
|
||||
{
|
||||
StringBuilder result = new StringBuilder();
|
||||
|
||||
boolean first = true;
|
||||
|
||||
for (NameValuePair pair : params)
|
||||
{
|
||||
if (first)
|
||||
first = false;
|
||||
else
|
||||
result.append("&");
|
||||
if (method.equals(ActivityManageActionTriggerUrl.methodGet))
|
||||
{
|
||||
if (first)
|
||||
first = false;
|
||||
else
|
||||
result.append("&");
|
||||
}
|
||||
else if (pair.getName().startsWith(httpMainData))
|
||||
continue; // if post and main data skip lookup run
|
||||
|
||||
result.append(pair.getName());
|
||||
|
||||
result.append(URLEncoder.encode(pair.getName(), "UTF-8"));
|
||||
result.append("=");
|
||||
result.append(URLEncoder.encode(pair.getValue(), "UTF-8"));
|
||||
|
||||
if (pair.getName().endsWith(doNoEncodingString))
|
||||
result.append(URLEncoder.encode(pair.getValue(), httpEncoding));
|
||||
else
|
||||
result.append(pair.getValue());
|
||||
}
|
||||
|
||||
/*
|
||||
If method is POST and there's a httpMainData field, we transfer
|
||||
this one at the end without parameter name and equals sign.
|
||||
*/
|
||||
if (method.equals(ActivityManageActionTriggerUrl.methodPost))
|
||||
{
|
||||
for (NameValuePair pair : params)
|
||||
{
|
||||
if (pair.getName().startsWith(httpMainData))
|
||||
{
|
||||
if (pair.getName().endsWith(doNoEncodingString))
|
||||
result.append(pair.getValue());
|
||||
else
|
||||
result.append(URLEncoder.encode(pair.getValue(), httpEncoding));
|
||||
|
||||
return result.toString();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result.toString();
|
||||
@@ -274,8 +344,8 @@ public class Miscellaneous extends Service
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
Miscellaneous.logEvent("e", "HTTP error", Log.getStackTraceString(e), 3);
|
||||
return "httpError";
|
||||
Miscellaneous.logEvent("e", "HTTP error", Log.getStackTraceString(e), 3);
|
||||
return http_error_string;
|
||||
}
|
||||
// finally
|
||||
// {
|
||||
@@ -818,7 +888,7 @@ public class Miscellaneous extends Service
|
||||
String notificationTitle = NotificationListener.getLastNotification().getTitle();
|
||||
|
||||
if (notificationTitle != null && notificationTitle.length() > 0)
|
||||
source = source.replace("[notificationTitle]", escapeStringForUrl(notificationTitle));
|
||||
source = source.replace("[notificationTitle]", notificationTitle);
|
||||
else
|
||||
{
|
||||
source = source.replace("[notificationTitle]", "notificationTitle unknown");
|
||||
@@ -839,7 +909,8 @@ public class Miscellaneous extends Service
|
||||
String notificationText = NotificationListener.getLastNotification().getText();
|
||||
|
||||
if (notificationText != null && notificationText.length() > 0)
|
||||
source = source.replace("[notificationText]", escapeStringForUrl(notificationText));
|
||||
//source = source.replace("[notificationText]", escapeStringForUrl(notificationText));
|
||||
source = source.replace("[notificationText]", notificationText);
|
||||
else
|
||||
{
|
||||
source = source.replace("[notificationText]", "notificationText unknown");
|
||||
@@ -853,15 +924,15 @@ public class Miscellaneous extends Service
|
||||
}
|
||||
}
|
||||
|
||||
if(source.contains("[last_trigger_url_result]"))
|
||||
if(source.contains("[" + last_trigger_url_result_string + "]"))
|
||||
{
|
||||
try
|
||||
{
|
||||
source = source.replace("[last_trigger_url_result]", AutomationService.getInstance().getVariableMap().get("last_trigger_url_result"));
|
||||
source = source.replace("[" + last_trigger_url_result_string + "]", AutomationService.getInstance().getVariableMap().get(last_trigger_url_result_string));
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Miscellaneous.logEvent("w", "Variable replacement", "Error replacing variable last_trigger_url_result.", 3);
|
||||
Miscellaneous.logEvent("w", "Variable replacement", "Error replacing variable " + last_trigger_url_result_string + ".", 3);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2076,6 +2147,50 @@ public class Miscellaneous extends Service
|
||||
return formattedDate;
|
||||
}
|
||||
|
||||
public static int arraySearchIndexOf(String[] haystack, String needle, boolean caseSensitive, boolean matchFullLine)
|
||||
{
|
||||
if(matchFullLine)
|
||||
{
|
||||
if(caseSensitive)
|
||||
{
|
||||
for (int i = 0; i < haystack.length; i++)
|
||||
{
|
||||
if (haystack[i].equals(needle))
|
||||
return i;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < haystack.length; i++)
|
||||
{
|
||||
if (haystack[i].toLowerCase().equals(needle.toLowerCase()))
|
||||
return i;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(caseSensitive)
|
||||
{
|
||||
for (int i = 0; i < haystack.length; i++)
|
||||
{
|
||||
if (haystack[i].contains(needle))
|
||||
return i;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < haystack.length; i++)
|
||||
{
|
||||
if (haystack[i].toLowerCase().contains(needle.toLowerCase()))
|
||||
return i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
public static boolean arraySearch(String[] haystack, String needle, boolean caseSensitive, boolean matchFullLine)
|
||||
{
|
||||
if(matchFullLine)
|
||||
|
||||
@@ -544,57 +544,91 @@ public class Profile implements Comparable<Profile>
|
||||
AudioManager am = (AudioManager) Miscellaneous.getAnyContext().getSystemService(Context.AUDIO_SERVICE);
|
||||
|
||||
if(changeSoundMode)
|
||||
Actions.setSound(context, soundMode);
|
||||
{
|
||||
Miscellaneous.logEvent("i", "Profile", "Setting sound mode to " + String.valueOf(soundMode), 4);
|
||||
Actions.setSound(context, soundMode);
|
||||
}
|
||||
|
||||
if(changeDndMode)
|
||||
Actions.setDoNotDisturb(context, dndMode);
|
||||
{
|
||||
Miscellaneous.logEvent("i", "Profile", "Setting DND mode to " + String.valueOf(dndMode), 4);
|
||||
Actions.setDoNotDisturb(context, dndMode);
|
||||
}
|
||||
|
||||
if(changeVolumeMusicVideoGameMedia)
|
||||
am.setStreamVolume(AudioManager.STREAM_MUSIC, volumeMusic, AudioManager.FLAG_PLAY_SOUND);
|
||||
{
|
||||
Miscellaneous.logEvent("i", "Profile", "Setting media volume to " + String.valueOf(volumeMusic), 4);
|
||||
am.setStreamVolume(AudioManager.STREAM_MUSIC, volumeMusic, AudioManager.FLAG_PLAY_SOUND);
|
||||
}
|
||||
|
||||
if(changeVolumeNotifications)
|
||||
am.setStreamVolume(AudioManager.STREAM_NOTIFICATION, volumeNotifications, AudioManager.FLAG_PLAY_SOUND);
|
||||
{
|
||||
Miscellaneous.logEvent("i", "Profile", "Setting notification volume to " + String.valueOf(volumeNotifications), 4);
|
||||
am.setStreamVolume(AudioManager.STREAM_NOTIFICATION, volumeNotifications, AudioManager.FLAG_PLAY_SOUND);
|
||||
}
|
||||
|
||||
if(Build.VERSION.SDK_INT >= 34)
|
||||
{
|
||||
if (changeVolumeRingtones)
|
||||
am.setStreamVolume(AudioManager.STREAM_RING, volumeRingtones, AudioManager.FLAG_PLAY_SOUND);
|
||||
{
|
||||
Miscellaneous.logEvent("i", "Profile", "Setting ring volume to " + String.valueOf(volumeRingtones), 4);
|
||||
am.setStreamVolume(AudioManager.STREAM_RING, volumeRingtones, AudioManager.FLAG_PLAY_SOUND);
|
||||
}
|
||||
}
|
||||
|
||||
if(changeVolumeAlarms)
|
||||
am.setStreamVolume(AudioManager.STREAM_ALARM, volumeAlarms, AudioManager.FLAG_PLAY_SOUND);
|
||||
{
|
||||
Miscellaneous.logEvent("i", "Profile", "Setting alarm volume to " + String.valueOf(volumeAlarms), 4);
|
||||
am.setStreamVolume(AudioManager.STREAM_ALARM, volumeAlarms, AudioManager.FLAG_PLAY_SOUND);
|
||||
}
|
||||
|
||||
if(changeIncomingCallsRingtone)
|
||||
if(incomingCallsRingtone != null)
|
||||
applyRingTone(incomingCallsRingtone, RingtoneManager.TYPE_RINGTONE, context);
|
||||
|
||||
{
|
||||
if (incomingCallsRingtone != null)
|
||||
{
|
||||
Miscellaneous.logEvent("i", "Profile", "Setting ringtone " + incomingCallsRingtone, 4);
|
||||
applyRingTone(incomingCallsRingtone, RingtoneManager.TYPE_RINGTONE, context);
|
||||
}
|
||||
}
|
||||
|
||||
if(changeVibrateWhenRinging)
|
||||
{
|
||||
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
|
||||
{
|
||||
Miscellaneous.logEvent("i", "Profile", "Setting vibrate when ringing to " + String.valueOf(vibrateWhenRinging?1:0), 4);
|
||||
android.provider.Settings.System.putInt(context.getContentResolver(), "vibrate_when_ringing", vibrateWhenRinging?1:0);
|
||||
}
|
||||
else
|
||||
{
|
||||
Miscellaneous.logEvent("i", "Profile", "Setting vibrate when ringing to " + String.valueOf(vibrateWhenRinging), 4);
|
||||
|
||||
if (vibrateWhenRinging)
|
||||
am.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER, AudioManager.VIBRATE_SETTING_ON);
|
||||
am.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER, AudioManager.VIBRATE_SETTING_ON);
|
||||
else
|
||||
am.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER, AudioManager.VIBRATE_SETTING_OFF);
|
||||
}
|
||||
}
|
||||
|
||||
if(changeNotificationRingtone)
|
||||
if(notificationRingtone != null)
|
||||
applyRingTone(notificationRingtone, RingtoneManager.TYPE_NOTIFICATION, context);
|
||||
{
|
||||
if (notificationRingtone != null)
|
||||
{
|
||||
Miscellaneous.logEvent("i", "Profile", "Setting notification ringtone to " + String.valueOf(notificationRingtone), 4);
|
||||
applyRingTone(notificationRingtone, RingtoneManager.TYPE_NOTIFICATION, context);
|
||||
}
|
||||
}
|
||||
|
||||
if(changeScreenLockUnlockSound)
|
||||
{
|
||||
Miscellaneous.logEvent("i", "Profile", "Setting lockscreen sounds enabled to " + String.valueOf(screenLockUnlockSound ? 1 : 0), 4);
|
||||
android.provider.Settings.System.putInt(context.getContentResolver(), "lockscreen_sounds_enabled" , screenLockUnlockSound ? 1 : 0);
|
||||
}
|
||||
|
||||
if(changeAudibleSelection)
|
||||
{
|
||||
if(audibleSelection)
|
||||
Miscellaneous.logEvent("i", "Profile", "Setting audible selection to " + String.valueOf(audibleSelection ? 1 : 0), 4);
|
||||
|
||||
if(audibleSelection)
|
||||
android.provider.Settings.System.putInt(context.getContentResolver(), android.provider.Settings.System.SOUND_EFFECTS_ENABLED, 1); // enable
|
||||
else
|
||||
android.provider.Settings.System.putInt(context.getContentResolver(), android.provider.Settings.System.SOUND_EFFECTS_ENABLED, 0); // dissable
|
||||
@@ -602,7 +636,9 @@ public class Profile implements Comparable<Profile>
|
||||
|
||||
if(changeHapticFeedback)
|
||||
{
|
||||
if(hapticFeedback)
|
||||
Miscellaneous.logEvent("i", "Profile", "Setting haptic feedback to " + String.valueOf(hapticFeedback ? 1 : 0), 4);
|
||||
|
||||
if(hapticFeedback)
|
||||
android.provider.Settings.System.putInt(context.getContentResolver(), android.provider.Settings.System.HAPTIC_FEEDBACK_ENABLED, 1); // enable
|
||||
else
|
||||
android.provider.Settings.System.putInt(context.getContentResolver(), android.provider.Settings.System.HAPTIC_FEEDBACK_ENABLED, 0); // disable
|
||||
@@ -614,7 +650,8 @@ public class Profile implements Comparable<Profile>
|
||||
}
|
||||
finally
|
||||
{
|
||||
Miscellaneous.logEvent("i", "Profile", "Checking for applicable rules after profile " + this.getName() + " has been activated.", 2);
|
||||
Miscellaneous.logEvent("i", "Profile", "Profile activation complete: " + this.getName(), 3);
|
||||
Miscellaneous.logEvent("i", "Profile", "Checking for applicable rules after profile " + this.getName() + " has been activated.", 3);
|
||||
List<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger.Trigger_Enum.profileActive);
|
||||
for(int i=0; i<ruleCandidates.size(); i++)
|
||||
{
|
||||
|
||||
@@ -19,6 +19,7 @@ import com.jens.automation2.receivers.MediaPlayerListener;
|
||||
import com.jens.automation2.receivers.NoiseListener;
|
||||
import com.jens.automation2.receivers.PhoneStatusListener;
|
||||
import com.jens.automation2.receivers.ProcessListener;
|
||||
import com.jens.automation2.receivers.ProximityReceiver;
|
||||
import com.jens.automation2.receivers.ScreenStateReceiver;
|
||||
import com.jens.automation2.receivers.SubSystemStateReceiver;
|
||||
import com.jens.automation2.receivers.TetheringReceiver;
|
||||
@@ -215,6 +216,9 @@ public class ReceiverCoordinator
|
||||
|
||||
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.calendarEvent) && ActivityPermissions.isPermissionDeclaredInManifest(AutomationService.getInstance(), Manifest.permission.READ_CALENDAR) && ActivityPermissions.havePermission(Manifest.permission.READ_CALENDAR, AutomationService.getInstance()))
|
||||
CalendarReceiver.startCalendarReceiver(AutomationService.getInstance());
|
||||
|
||||
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.proximity))
|
||||
ProximityReceiver.startProximityReceiver(AutomationService.getInstance());
|
||||
}
|
||||
|
||||
public static void stopAllReceivers()
|
||||
@@ -234,6 +238,7 @@ public class ReceiverCoordinator
|
||||
DeviceOrientationListener.getInstance().stopListener(AutomationService.getInstance());
|
||||
TetheringReceiver.getInstance().stopListener(AutomationService.getInstance());
|
||||
SubSystemStateReceiver.getInstance().stopListener(AutomationService.getInstance());
|
||||
ProximityReceiver.stopProximityReceiver();
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
@@ -26,6 +26,7 @@ import com.jens.automation2.receivers.NoiseListener;
|
||||
import com.jens.automation2.receivers.NotificationListener;
|
||||
import com.jens.automation2.receivers.PhoneStatusListener;
|
||||
import com.jens.automation2.receivers.ProcessListener;
|
||||
import com.jens.automation2.receivers.ProximityReceiver;
|
||||
import com.jens.automation2.receivers.ScreenStateReceiver;
|
||||
import com.jens.automation2.receivers.TetheringReceiver;
|
||||
|
||||
@@ -67,6 +68,7 @@ public class Trigger
|
||||
tethering,
|
||||
subSystemState,
|
||||
checkVariable,
|
||||
proximity,
|
||||
calendarEvent,
|
||||
phoneCall; //phoneCall always needs to be at the very end because of Google's shitty so called privacy
|
||||
|
||||
@@ -128,6 +130,8 @@ public class Trigger
|
||||
return context.getResources().getString(R.string.subSystemState);
|
||||
case checkVariable:
|
||||
return context.getResources().getString(R.string.checkVariable);
|
||||
case proximity:
|
||||
return context.getResources().getString(R.string.proximity);
|
||||
case calendarEvent:
|
||||
return context.getResources().getString(R.string.calendarEventCapital);
|
||||
default:
|
||||
@@ -291,6 +295,10 @@ public class Trigger
|
||||
if(!checkCalendarEvent(false))
|
||||
result = false;
|
||||
break;
|
||||
case proximity:
|
||||
if(!checkProximity())
|
||||
result = false;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -323,17 +331,17 @@ public class Trigger
|
||||
{
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
|
||||
{
|
||||
String[] params = this.getTriggerParameter2().split(triggerParameter2Split);
|
||||
String[] params = this.getTriggerParameter2().split(triggerParameter2Split, -1);
|
||||
|
||||
String myApp = params[0];
|
||||
String myTitleDir = params[1];
|
||||
String requiredTitle = params[2];
|
||||
String myTextDir = params[3];
|
||||
String requiredText;
|
||||
if (params.length >= 5)
|
||||
requiredText = params[4];
|
||||
else
|
||||
requiredText = "";
|
||||
// String requiredText;
|
||||
// if (params.length >= 5)
|
||||
String requiredText = params[4];
|
||||
// else
|
||||
// requiredText = "";
|
||||
|
||||
if(this.getTriggerParameter())
|
||||
{
|
||||
@@ -671,13 +679,11 @@ public class Trigger
|
||||
{
|
||||
if(Miscellaneous.isRegularExpression(conditions[1]))
|
||||
{
|
||||
if (map.get(conditions[0]).matches(conditions[1]))
|
||||
return this.getTriggerParameter();
|
||||
return (map.get(conditions[0]).matches(conditions[1]) == this.getTriggerParameter());
|
||||
}
|
||||
else
|
||||
{
|
||||
if (map.get(conditions[0]).equals(conditions[1]))
|
||||
return this.getTriggerParameter();
|
||||
return (map.get(conditions[0]).equals(conditions[1]) == this.getTriggerParameter());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -825,6 +831,27 @@ public class Trigger
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean checkProximity()
|
||||
{
|
||||
try
|
||||
{
|
||||
float currentLevel = ProximityReceiver.getProximityLevel();
|
||||
String[] values = this.getTriggerParameter2().split(Trigger.triggerParameter2Split);
|
||||
float part1 = Float.parseFloat(values[0]);
|
||||
float part2 = Float.parseFloat(values[1]);
|
||||
|
||||
// Are we within the defined scope?
|
||||
if(part1 <= currentLevel && currentLevel <= part2)
|
||||
return true;
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
Miscellaneous.logEvent("e", "checkProximity()", Log.getStackTraceString(e), 1);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean checkBluetooth()
|
||||
{
|
||||
Miscellaneous.logEvent("i", Miscellaneous.getAnyContext().getResources().getString(R.string.ruleCheckOf), String.format("Checking for bluetooth...", this.getParentRule().getName()), 4);
|
||||
@@ -1213,6 +1240,12 @@ public class Trigger
|
||||
|
||||
public boolean hasStateNotAppliedSinceLastRuleExecution()
|
||||
{
|
||||
/*
|
||||
There is no easy event to tell when a tag has been disconnected again.
|
||||
*/
|
||||
if(getTriggerType().equals(Trigger_Enum.nfcTag))
|
||||
return true;
|
||||
|
||||
if(getParentRule().getLastExecution() == null)
|
||||
{
|
||||
Miscellaneous.logEvent("i", "Trigger", "Trigger " + this.toString() + " of rule " + getParentRule().getName() + " has NOT applied since the parent rule\'s last activation.", 4);
|
||||
@@ -1962,6 +1995,10 @@ public class Trigger
|
||||
returnString.append(")");
|
||||
|
||||
break;
|
||||
case proximity:
|
||||
String[] parts = triggerParameter2.split(triggerParameter2Split);
|
||||
returnString.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.proximityText), parts[0], parts[1]));
|
||||
break;
|
||||
default:
|
||||
returnString.append("error");
|
||||
break;
|
||||
|
||||
@@ -711,7 +711,7 @@ public class XmlFileInterface
|
||||
|
||||
private static Rule readRule(XmlPullParser parser) throws XmlPullParserException, IOException
|
||||
{
|
||||
/* FILE EXAMPE:
|
||||
/* FILE EXAMPLE:
|
||||
* *****************
|
||||
* <Automation>
|
||||
* <PointOfInterestCollection>
|
||||
@@ -1095,7 +1095,7 @@ public class XmlFileInterface
|
||||
|
||||
private static Action readAction(XmlPullParser parser) throws IOException, XmlPullParserException
|
||||
{
|
||||
/* FILE EXAMPE:
|
||||
/* FILE EXAMPLE:
|
||||
* *****************
|
||||
* <Automation>
|
||||
* <PointOfInterestCollection>
|
||||
|
||||
@@ -363,10 +363,10 @@ public class CellLocationChangedReceiver extends PhoneStateListener
|
||||
// Miscellaneous.logEvent("i", "cellReceiver", "Not starting cellLocationListener because we have no data connection.", 4);
|
||||
}
|
||||
else
|
||||
Miscellaneous.logEvent("w", "cellReceiver", "Wanted to activate CellLocationChangedReceiver, but Wifi-Receiver says not to.", 4);
|
||||
Miscellaneous.logEvent("w", "cellReceiver", "Wanted to activate CellLocationChangedReceiver, but Wifi-Receiver says not to.", 5);
|
||||
}
|
||||
else
|
||||
Miscellaneous.logEvent("i", "cellReceiver", "Not starting cellLocationListener because Airplane mode is active or SIM_STATE is not ready.", 4);
|
||||
Miscellaneous.logEvent("i", "cellReceiver", "Not starting cellLocationListener because Airplane mode is active or SIM_STATE is not ready.", 5);
|
||||
}
|
||||
}
|
||||
catch(Exception ex)
|
||||
|
||||
@@ -64,36 +64,36 @@ public class SensorActivity implements SensorEventListener
|
||||
{
|
||||
}
|
||||
|
||||
public void onSensorChanged(SensorEvent event)
|
||||
{
|
||||
// Device has been moved
|
||||
public void onSensorChanged(SensorEvent event)
|
||||
{
|
||||
// Device has been moved
|
||||
|
||||
float x = event.values[0];
|
||||
float y = event.values[1];
|
||||
float z = event.values[2];
|
||||
float x = event.values[0];
|
||||
float y = event.values[1];
|
||||
float z = event.values[2];
|
||||
|
||||
if(mInitialized)
|
||||
{
|
||||
deltaX = Math.abs(lastX-x);
|
||||
deltaY = Math.abs(lastY-y);
|
||||
deltaZ = Math.abs(lastZ-z);
|
||||
//Wenn das jetzt einen gewissen Grenzwert übersteigt, müßten wir den CellListener wieder aktivieren
|
||||
if(deltaX > Settings.accelerometerMovementThreshold | deltaY > Settings.accelerometerMovementThreshold | deltaZ > Settings.accelerometerMovementThreshold)
|
||||
{
|
||||
String text = "Device has been moved. " + String.valueOf(deltaX)+" / "+String.valueOf(deltaY)+" / "+String.valueOf(deltaZ);
|
||||
Miscellaneous.logEvent("i", "Accelerometer", text, 5);
|
||||
CellLocationChangedReceiver.resetFollowUpdate();
|
||||
CellLocationChangedReceiver.startCellLocationChangedReceiver();
|
||||
if(mInitialized)
|
||||
{
|
||||
deltaX = Math.abs(lastX-x);
|
||||
deltaY = Math.abs(lastY-y);
|
||||
deltaZ = Math.abs(lastZ-z);
|
||||
// If that exceeds a certain delta we need to start CellLocationListener again
|
||||
if(deltaX > Settings.accelerometerMovementThreshold | deltaY > Settings.accelerometerMovementThreshold | deltaZ > Settings.accelerometerMovementThreshold)
|
||||
{
|
||||
String text = "Device has been moved. " + String.valueOf(deltaX)+" / "+String.valueOf(deltaY)+" / "+String.valueOf(deltaZ);
|
||||
Miscellaneous.logEvent("i", "Accelerometer", text, 5);
|
||||
CellLocationChangedReceiver.resetFollowUpdate();
|
||||
CellLocationChangedReceiver.startCellLocationChangedReceiver();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
lastX = x;
|
||||
lastY = y;
|
||||
lastZ = z;
|
||||
mInitialized = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
lastX = x;
|
||||
lastY = y;
|
||||
lastZ = z;
|
||||
mInitialized = true;
|
||||
}
|
||||
}
|
||||
|
||||
protected static void startAccelerometerReceiver()
|
||||
{
|
||||
|
||||
@@ -300,7 +300,7 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList
|
||||
@Override
|
||||
public Trigger_Enum[] getMonitoredTrigger()
|
||||
{
|
||||
// actually monitores several
|
||||
// actually monitors several
|
||||
return new Trigger_Enum[] { Trigger_Enum.batteryLevel, Trigger_Enum.charging, Trigger_Enum.usb_host_connection };
|
||||
}
|
||||
}
|
||||
@@ -7,6 +7,7 @@ import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.jens.automation2.ActivityPermissions;
|
||||
import com.jens.automation2.AutomationService;
|
||||
@@ -149,8 +150,6 @@ public class BluetoothReceiver extends BroadcastReceiver implements AutomationLi
|
||||
{
|
||||
return lhs.getName().compareTo(rhs.getName());
|
||||
}
|
||||
|
||||
;
|
||||
});
|
||||
}
|
||||
catch(NullPointerException e)
|
||||
@@ -159,6 +158,12 @@ public class BluetoothReceiver extends BroadcastReceiver implements AutomationLi
|
||||
|
||||
returnArray = new BluetoothDevice[] {};
|
||||
}
|
||||
catch(SecurityException se)
|
||||
{
|
||||
Toast.makeText(Miscellaneous.getAnyContext(), Miscellaneous.getAnyContext().getResources().getString(R.string.permissionRequiredBluetooth), Toast.LENGTH_SHORT).show();
|
||||
|
||||
returnArray = new BluetoothDevice[] {};
|
||||
}
|
||||
|
||||
return returnArray;
|
||||
}
|
||||
|
||||
@@ -136,7 +136,12 @@ public class ConnectivityReceiver extends BroadcastReceiver implements Automatio
|
||||
// Airplane mode status has changed.
|
||||
Miscellaneous.logEvent("i", "Connectivity", "Airplane mode changed.", 2);
|
||||
boolean isAirplaneMode = isAirplaneMode(context);
|
||||
automationServiceRef.getLocationProvider().handleAirplaneMode(isAirplaneMode);
|
||||
|
||||
/*
|
||||
If the user doesn't have any locations this service is probably off and therefore null.
|
||||
*/
|
||||
if(automationServiceRef.getLocationProvider() != null)
|
||||
automationServiceRef.getLocationProvider().handleAirplaneMode(isAirplaneMode);
|
||||
|
||||
ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.airplaneMode);
|
||||
// ArrayList<Rule> ruleCandidates = Rule.findRuleCandidatesByAirplaneMode(isAirplaneMode);
|
||||
|
||||
@@ -34,11 +34,11 @@ public class DeviceOrientationListener implements SensorEventListener, Automatio
|
||||
static int sensorValueCounter = 0;
|
||||
|
||||
// Gravity rotational data
|
||||
float gravity[];
|
||||
float[] gravity;
|
||||
// Magnetic rotational data
|
||||
float magnetic[]; //for magnetic rotational data
|
||||
float accels[] = new float[3];
|
||||
float mags[] = new float[3];
|
||||
float[] magnetic; //for magnetic rotational data
|
||||
float[] accels = new float[3];
|
||||
float[] mags = new float[3];
|
||||
float[] values = new float[3];
|
||||
boolean hasMagneticSensor=false;
|
||||
|
||||
|
||||
@@ -8,10 +8,10 @@ import android.nfc.NdefMessage;
|
||||
import android.nfc.NdefRecord;
|
||||
import android.nfc.NfcAdapter;
|
||||
import android.nfc.Tag;
|
||||
import android.nfc.tech.IsoDep;
|
||||
import android.nfc.tech.Ndef;
|
||||
import android.nfc.tech.NdefFormatable;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Build;
|
||||
import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
|
||||
@@ -36,18 +36,8 @@ public class NfcReceiver
|
||||
public static NfcAdapter getNfcAdapter(Context context)
|
||||
{
|
||||
if(nfcAdapter == null)
|
||||
{
|
||||
if(Build.VERSION.SDK_INT <= 10)
|
||||
{
|
||||
// NFC not supported until after Gingerbread.
|
||||
Miscellaneous.logEvent("w", "NFC", context.getResources().getString(R.string.nfcNotSupportedInThisAndroidVersionYet), 3);
|
||||
return null;
|
||||
}
|
||||
else
|
||||
{
|
||||
nfcAdapter = NfcAdapter.getDefaultAdapter(context);
|
||||
}
|
||||
}
|
||||
nfcAdapter = NfcAdapter.getDefaultAdapter(context);
|
||||
|
||||
return nfcAdapter;
|
||||
}
|
||||
|
||||
@@ -66,9 +56,9 @@ public class NfcReceiver
|
||||
if(action == null)
|
||||
{
|
||||
Miscellaneous.logEvent("i", "NFC", "action=null", 5);
|
||||
return;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if(action.equals(NfcAdapter.ACTION_NDEF_DISCOVERED))
|
||||
{
|
||||
Miscellaneous.logEvent("i", "NFC", "ACTION_NDEF_DISCOVERED", 4);
|
||||
@@ -91,28 +81,6 @@ public class NfcReceiver
|
||||
new NdefReaderTask().execute(tag);
|
||||
}
|
||||
}
|
||||
// else if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action))
|
||||
// {
|
||||
//
|
||||
// // In case we would still use the Tech Discovered Intent
|
||||
// Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
|
||||
// String[] techList = tag.getTechList();
|
||||
// String searchedTech = Ndef.class.getName();
|
||||
//
|
||||
// for (String tech : techList)
|
||||
// {
|
||||
// if (searchedTech.equals(tech))
|
||||
// {
|
||||
// new NdefReaderTask().execute(tag);
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// // No NFC NDEF intent
|
||||
// Miscellaneous.logEvent("w", "NFC", context.getResources().getString(R.string.nfcNoNdefIntentBut) + " " + action + ".", 5);
|
||||
// }
|
||||
}
|
||||
|
||||
@SuppressLint("NewApi")
|
||||
@@ -307,7 +275,7 @@ public class NfcReceiver
|
||||
{
|
||||
format.connect();
|
||||
format.format(completeMessageToWrite);
|
||||
Miscellaneous.logEvent("i", "NFC", "Done writing tag.", 2);
|
||||
Miscellaneous.logEvent("i", "NFC", "Done writing tag.", 2);
|
||||
return true;
|
||||
}
|
||||
catch(IOException e)
|
||||
@@ -322,7 +290,7 @@ public class NfcReceiver
|
||||
Miscellaneous.logEvent("e", "NFC", "Error writing tag: " + Log.getStackTraceString(e), 2);
|
||||
}
|
||||
|
||||
return false;
|
||||
return false;
|
||||
}
|
||||
|
||||
public static boolean checkNfcRequirements(Context context, boolean showErrorMessage)
|
||||
@@ -334,15 +302,7 @@ public class NfcReceiver
|
||||
|
||||
return false;
|
||||
}
|
||||
else if(Build.VERSION.SDK_INT <= 10)
|
||||
{
|
||||
// NFC not supported until after Gingerbread.
|
||||
if(showErrorMessage)
|
||||
Toast.makeText(context, context.getResources().getString(R.string.nfcNotSupportedInThisAndroidVersionYet), Toast.LENGTH_LONG).show();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -100,7 +100,7 @@ public class NotificationListener extends NotificationListenerService// implemen
|
||||
|
||||
synchronized boolean checkNotification(boolean created, StatusBarNotification sbn)
|
||||
{
|
||||
//TODO: Merge with functino in Trigger class
|
||||
//TODO: Merge with function in Trigger class
|
||||
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT)
|
||||
{
|
||||
lastNotification = convertNotificationToSimpleNotification(created, sbn);
|
||||
|
||||
@@ -0,0 +1,162 @@
|
||||
package com.jens.automation2.receivers;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.hardware.Sensor;
|
||||
import android.hardware.SensorEvent;
|
||||
import android.hardware.SensorEventListener;
|
||||
import android.hardware.SensorManager;
|
||||
|
||||
import com.jens.automation2.ActivityPermissions;
|
||||
import com.jens.automation2.AutomationService;
|
||||
import com.jens.automation2.Miscellaneous;
|
||||
import com.jens.automation2.Rule;
|
||||
import com.jens.automation2.Trigger.Trigger_Enum;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class ProximityReceiver implements AutomationListenerInterface
|
||||
{
|
||||
public static AutomationService automationServiceRef = null;
|
||||
static float proximityLevel = -1; // initialize with a better value than this
|
||||
static boolean proximityReceiverActive = false;
|
||||
|
||||
SensorManager sensorManager;
|
||||
Sensor proximitySensor;
|
||||
|
||||
static ProximityReceiver proximityReceiverInstance = null;
|
||||
|
||||
public static float getProximityLevel()
|
||||
{
|
||||
return proximityLevel;
|
||||
}
|
||||
|
||||
public static void startProximityReceiver(final AutomationService automationServiceRef)
|
||||
{
|
||||
if(!proximityReceiverActive)
|
||||
{
|
||||
ProximityReceiver.automationServiceRef = automationServiceRef;
|
||||
|
||||
if(proximityReceiverInstance == null)
|
||||
proximityReceiverInstance = new ProximityReceiver();
|
||||
|
||||
proximityReceiverInstance.startListener(automationServiceRef);
|
||||
|
||||
proximityReceiverActive = true;
|
||||
}
|
||||
}
|
||||
public static void stopProximityReceiver()
|
||||
{
|
||||
if(proximityReceiverActive)
|
||||
{
|
||||
if(proximityReceiverInstance != null)
|
||||
{
|
||||
proximityReceiverInstance = null;
|
||||
}
|
||||
|
||||
proximityReceiverActive = false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void startListener(AutomationService automationService)
|
||||
{
|
||||
if(!proximityReceiverActive)
|
||||
{
|
||||
ProximityReceiver.automationServiceRef = automationServiceRef;
|
||||
|
||||
sensorManager = (SensorManager) automationService.getSystemService(Context.SENSOR_SERVICE);
|
||||
|
||||
// from sensor service we are
|
||||
// calling proximity sensor
|
||||
proximitySensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
|
||||
|
||||
// handling the case if the proximity
|
||||
// sensor is not present in users device.
|
||||
if (proximitySensor == null)
|
||||
{
|
||||
Miscellaneous.logEvent("w", "No proximity sensor", "Device doesn\'t seem to have a proximity sensor.", 4);
|
||||
}
|
||||
else
|
||||
{
|
||||
// registering our sensor with sensor manager.
|
||||
sensorManager.registerListener(proximitySensorEventListener, proximitySensor, SensorManager.SENSOR_DELAY_NORMAL);
|
||||
}
|
||||
|
||||
proximityReceiverActive = true;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stopListener(AutomationService automationService)
|
||||
{
|
||||
if(proximityReceiverActive)
|
||||
{
|
||||
if(proximityReceiverInstance != null)
|
||||
{
|
||||
if(proximitySensor != null)
|
||||
sensorManager.unregisterListener(proximitySensorEventListener);
|
||||
|
||||
proximityReceiverInstance = null;
|
||||
}
|
||||
|
||||
proximityReceiverActive = false;
|
||||
}
|
||||
}
|
||||
|
||||
SensorEventListener proximitySensorEventListener = new SensorEventListener()
|
||||
{
|
||||
@Override
|
||||
public void onSensorChanged(SensorEvent sensorEvent)
|
||||
{
|
||||
// check if the sensor type is proximity sensor.
|
||||
if (sensorEvent.sensor.getType() == Sensor.TYPE_PROXIMITY)
|
||||
{
|
||||
proximityLevel = (int)sensorEvent.values[0];
|
||||
|
||||
Miscellaneous.logEvent("i", "Proximity", String.valueOf(proximityLevel), 5);
|
||||
|
||||
// if (sensorEvent.values[0] == 0)
|
||||
// {
|
||||
//// sensorStatusTV.setText("Near");
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
//// sensorStatusTV.setText("Away");
|
||||
// }
|
||||
|
||||
ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.proximity);
|
||||
for(Rule oneRule : ruleCandidates)
|
||||
{
|
||||
if(oneRule.getsGreenLight(automationServiceRef))
|
||||
oneRule.activate(automationServiceRef, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAccuracyChanged(Sensor sensor, int i)
|
||||
{
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
public static boolean haveAllPermission()
|
||||
{
|
||||
return ActivityPermissions.havePermission(ActivityPermissions.permissionNameProximity, Miscellaneous.getAnyContext());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isListenerRunning()
|
||||
{
|
||||
return proximityReceiverActive;
|
||||
}
|
||||
@Override
|
||||
public Trigger_Enum[] getMonitoredTrigger()
|
||||
{
|
||||
// actually monitors several
|
||||
return new Trigger_Enum[] { Trigger_Enum.proximity };
|
||||
}
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 4.0 KiB |
@@ -147,7 +147,7 @@
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="10dp"
|
||||
android:text="@string/toggableRules"
|
||||
android:text="@string/toggleableRules"
|
||||
android:textAppearance="?android:attr/textAppearanceLarge" />
|
||||
</LinearLayout>
|
||||
|
||||
@@ -160,7 +160,7 @@
|
||||
android:id="@+id/tvToggableHelpText"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/helpTextToggable" />
|
||||
android:text="@string/helpTextToggleable" />
|
||||
</LinearLayout>
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,155 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_margin="@dimen/default_margin" >
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical" >
|
||||
|
||||
<TableLayout
|
||||
android:id="@+id/tlTriggerUrlAuthentication"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:visibility="gone">
|
||||
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/username" />
|
||||
|
||||
<EditText
|
||||
android:id="@+id/etTriggerUrlUsername"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:ems="10"
|
||||
android:enabled="false"
|
||||
android:inputType="text" >
|
||||
|
||||
</EditText>
|
||||
</TableRow>
|
||||
|
||||
<TableRow>
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/password" />
|
||||
|
||||
<EditText
|
||||
android:id="@+id/etTriggerUrlPassword"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:ems="10"
|
||||
android:enabled="false"
|
||||
android:inputType="textPassword" >
|
||||
|
||||
</EditText>
|
||||
</TableRow>
|
||||
</TableLayout>
|
||||
|
||||
<TableLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:stretchColumns="1"
|
||||
android:shrinkColumns="1" >
|
||||
|
||||
<TableRow
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_span="2"
|
||||
android:textSize="25dp"
|
||||
android:textStyle="bold"
|
||||
android:layout_marginBottom="@dimen/default_margin"
|
||||
android:text="@string/addParameters" />
|
||||
|
||||
</TableRow>
|
||||
|
||||
<TableRow
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/type" />
|
||||
|
||||
<Spinner
|
||||
android:id="@+id/spinnerSettingDataType"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
</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/settingName" />
|
||||
|
||||
<EditText
|
||||
android:id="@+id/etSettingName"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
</TableRow>
|
||||
|
||||
<TableRow
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/textView2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/settingValue" />
|
||||
|
||||
<EditText
|
||||
android:id="@+id/etSettingValue"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
</TableRow>
|
||||
|
||||
</TableLayout>
|
||||
|
||||
<ImageView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1dp"
|
||||
android:layout_margin="10dp"
|
||||
android:background="#aa000000" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvSetSystemSettingExamples"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/default_margin"
|
||||
android:text="@string/examplesWriteSecureSettings" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvSetSystemSettingNoticeWriteSecureSettings"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/default_margin"
|
||||
android:text="@string/writeSecureSettingsNotice" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/bSaveSetSystemSetting"
|
||||
android:layout_marginTop="15dp"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/save" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</ScrollView>
|
||||
@@ -140,6 +140,17 @@
|
||||
|
||||
</TableRow>
|
||||
|
||||
<TableRow>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvHttpParameterExplanation"
|
||||
android:layout_span="2"
|
||||
android:layout_marginBottom="@dimen/default_margin"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
</TableRow>
|
||||
|
||||
<TableRow
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
@@ -0,0 +1,112 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:orientation="vertical"
|
||||
android:layout_margin="@dimen/default_margin">
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/proximity"
|
||||
android:textAppearance="@style/TextAppearance.AppCompat.Headline"
|
||||
android:layout_marginBottom="@dimen/default_margin" />
|
||||
|
||||
<TableLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:shrinkColumns="1"
|
||||
android:stretchColumns="1" >
|
||||
|
||||
<TableRow>
|
||||
|
||||
<TextView
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:paddingRight="@dimen/default_margin"
|
||||
android:text="@string/state"/>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<com.google.android.material.slider.RangeSlider
|
||||
android:id="@+id/rsProximity"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:valueFrom="0"
|
||||
android:valueTo="10"
|
||||
android:stepSize="0.1"
|
||||
android:theme="@style/AppThemeCompat" />
|
||||
|
||||
<RelativeLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/close"
|
||||
android:layout_alignParentLeft="true"/>
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/far"
|
||||
android:layout_alignParentRight="true"/>
|
||||
|
||||
</RelativeLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</TableRow>
|
||||
|
||||
</TableLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvTriggerProximityHint"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginVertical="@dimen/default_margin"
|
||||
android:textColor="@color/red"
|
||||
android:text="@string/deviceDoesntHaveProximitySensor" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="@dimen/default_margin"
|
||||
android:text="@string/testArea"
|
||||
android:textAppearance="@style/TextAppearance.AppCompat.Headline" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginVertical="@dimen/default_margin"
|
||||
android:text="@string/proximitySensorHint" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/testAreaProximityComment" />
|
||||
|
||||
<SeekBar
|
||||
android:id="@+id/sbProximityTest"
|
||||
android:layout_marginTop="@dimen/default_margin"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/tvProximityCurrentValue"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/bTriggerProximitySave"
|
||||
android:layout_marginTop="@dimen/default_margin"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/save" />
|
||||
|
||||
</androidx.appcompat.widget.LinearLayoutCompat>
|
||||
@@ -124,8 +124,8 @@
|
||||
<string name="timeframes">Zeiträume</string>
|
||||
<string name="helpTextTimeFrame">Wenn Sie eine Regel mit einem Zeitraum erstellen, haben Sie zwei Möglichkeiten. Sie können wählen, ob der Auslöser besagt, daß der Zeitraum entweder verlassen ODER betreten wird. In jedem Fall wird die Regel nur einmal ausgelöst. Wenn eine Regel z.B. besagt \"betrete timeframe xyz\" und das Klingeltonprofil in Vibration ändert, bedeutet das NICHT, daß das Gerät hinterher automatisch wieder zum normalen Klingelprofil zurückschaltet. Wenn das erwünscht ist, muß eine weitere Regel mit einem Folgezeitraum erstellen werden.</string>
|
||||
<string name="helpTextSound">Auf dem Hauptbildschirm können Sie die Funktion Tonänderunugen sperren benutzen, um vorrübergehend regelbasierte Tonänderungen zu deaktivieren. Z.B. könnten Sie in einer Situation oder an einem Ort sein, wo Klingeltöne normalerweise in Ordnung sind, aber dieses eine Mal würde es stören. Die Funktion wird automatisch wieder deaktiviert nachdem die eingestellte Zeit abgelaufen ist. Klicken Sie den + Knopf, um die angezeigte Zeit zur Frist hinzuzufügen. Sobald es aktiv ist, können Sie es mit dem Schalter rechts wieder abschalten (und so regelbasierte Tonänderungen wieder ermöglichen).</string>
|
||||
<string name="toggableRules">Unschaltbare Regeln</string>
|
||||
<string name="helpTextToggable">Regeln haben eine Einstellung namens \"Umkehrbar\". Das bedeutet: Wurde eine Regel ausgeführt und anschließend treten dieselben Auslöser wieder ein, wird die Regel nochmal in umgekehrter Weise ausgeführt, wo es möglich ist. Gegenwärtig funktioniert das nur im Zusammenspiel mit NFC Tags. Wenn Sie einen Tag zwei Mal berühren und es eine umkehrbare Regel zu diesem Tag gibt, wird das Programm das Gegenteil von gegenwärtigen Zustand tun, z.B. WLAN ausschalten, wenn es gegenwärtig eingeschaltet ist.</string>
|
||||
<string name="toggleableRules">Unschaltbare Regeln</string>
|
||||
<string name="helpTextToggleable">Regeln haben eine Einstellung namens \"Umkehrbar\". Das bedeutet: Wurde eine Regel ausgeführt und anschließend treten dieselben Auslöser wieder ein, wird die Regel nochmal in umgekehrter Weise ausgeführt, wo es möglich ist. Gegenwärtig funktioniert das nur im Zusammenspiel mit NFC Tags. Wenn Sie einen Tag zwei Mal berühren und es eine umkehrbare Regel zu diesem Tag gibt, wird das Programm das Gegenteil von gegenwärtigen Zustand tun, z.B. WLAN ausschalten, wenn es gegenwärtig eingeschaltet ist.</string>
|
||||
<string name="helpTextProcessMonitoring">Wenn Sie eine Regel mit einer Prozess Überwachung erstellen, wird die Anwendung in regelmäßigen Abständen nach diesem Prozess schauen. Wie häufig können Sie in den Einstellungen festlegen. Das mag zwar in vielen Fällen langsam reagieren, aber eine permanente Überwachung würde zuviel Akkuleistung kosten. Und das Betriebssystem stellt dafür keinen Broadcast zur Verfügung.</string>
|
||||
<string name="helpTitleEnergySaving">Energiespareinstellungen</string>
|
||||
<string name="helpTextEnergySaving">Viele Gerätehersteller versuchen Energie zu sparen, indem die Hintergrundaktivitäten vieler Anwendungen eingeschränkt werden. Unglücklicherweise führt das häufig dazu, dass diese Anwendungen nicht mehr zufällig funktionieren; das gilt auch für Automation. Schauen Sie sich <a href="https://dontkillmyapp.com/">diese Seite</a> an, um herauszufinden, wie Sie Automation auf Ihrem Gerät von dieser Behandlung ausschließen können.</string>
|
||||
@@ -302,7 +302,6 @@
|
||||
<string name="nfcTagFoundWithText">Tag gefunden mit Bezeichner:</string>
|
||||
<string name="nfcUnsupportedEncoding">Nicht unterstützte Kodierung:</string>
|
||||
<string name="nfcNoNdefIntentBut">Kein NFC NDEF intent, sondern</string>
|
||||
<string name="nfcNotSupportedInThisAndroidVersionYet">NFC wird in dieser Android Version noch nicht unterstützt.</string>
|
||||
<string name="cantRunRule">Regeln können nicht ausgeführt werden.</string>
|
||||
<string name="nfcApplyTagToRule">Aktuellen Tag in Regel übernehmen</string>
|
||||
<string name="nfcTagReadSuccessfully">Tag erfolgreich gelesen.</string>
|
||||
@@ -856,6 +855,7 @@
|
||||
<string name="notCharging">nicht laden</string>
|
||||
<string name="triggerChargingComment">Der Typ wird nur ausgewertet, wenn das Gerät aufgeladen wird. Wenn \"Nicht laden\" ausgewählt ist, wird es bei jedem vorherigen Ladetyp ausgelöst. Wenn Sie dies auswerten möchten, sollten Sie die Verwendung der Variablen trigger/action in Betracht ziehen.</string>
|
||||
<string name="helpTextProfiles">Ein Profil ist eine Sammlung von Einstellungen für Klingeltöne, Lautstärke und andere audiobezogene Einstellungen, die Sie über Regeln oder manuell anwenden können.\\n\\nEs ist auch möglich, das zuletzt aktivierte Profil als Auslöser abzufragen. Im Normalfall wird nur abgefragt, ob das Profil das zuletzt aktivierte war (unabhängig davon, ob in der Zwischenzeit bestimmte Audioeinstellungen geändert wurden). Sie können aber auch die einzelnen Einstellungen vergleichen lassen.</string>
|
||||
<string name="serviceWontStartPermissions">Für keine Regel liegen vollständige Berechtigungen vor. Der Dienst kann nicht starten.</string>
|
||||
<string name="serviceWontStartNoActivatedRules">Es sind keine aktivierten Regeln definiert. Der Dienst wird nicht gestartet.</string>
|
||||
<string name="importChooseFolderNotice">Versuchen Sie im folgenden Dialog nicht, bestimmte Dateien auszuwählen, sondern wählen Sie den Ordner aus, in dem sich die Automation-Sicherungsdateien befinden. Wenn die Schaltfläche \"Auswählen\" deaktiviert ist, haben Sie eine Android-Einschränkung gefunden. Versuchen Sie in diesem Fall zuerst, die Dateien in ein Unterverzeichnis zu verschieben.</string>
|
||||
<string name="matches">stimmt überein</string>
|
||||
@@ -867,4 +867,25 @@
|
||||
<string name="version143StartOtherActivityHint">In Version 1.8.2 war es notwendig, die Art und Weise, wie Aktionen zum Starten anderer Programme gespeichert werden, zu überarbeiten. Die Kompatibilität konnte nicht sichergestellt werden. Bitte überprüfen und bearbeiten Sie Ihre Aktionen zum Starten anderer Aktivitäten, um sicherzustellen, dass sie noch funktionieren.</string>
|
||||
<string name="disable">Deaktivieren</string>
|
||||
<string name="enable">Aktivieren</string>
|
||||
<string name="uiThemeClassic">Klassisches UI-Thema</string>
|
||||
<string name="uiThemeCompat">Materialdesign-UI-Thema</string>
|
||||
<string name="permissionForegroundServiceTypeSpecialUseRequired">Berechtigung FOREGROUND_SERVICE_TYPE_SPECIAL_USE ist erforderlich, um zu starten.</string>
|
||||
<string name="uiTheme">Thema der grafischen Oberfläche</string>
|
||||
<string name="uiThemeSummary">Das Thema der grafischen Oberfläche. Anwendungs-Neustart ist notwendig.</string>
|
||||
<string name="proximity">Nähe</string>
|
||||
<string name="testArea">Testfeld</string>
|
||||
<string name="testAreaProximityComment">Nähern Sie sich Ihrem Gerät, um zu sehen, wie es sich verhält.</string>
|
||||
<string name="deviceDoesntHaveProximitySensor">Ihr Gerät scheint über keinen Näherungssensor zu verfügen.</string>
|
||||
<string name="proximitySensorHint">Der Näherungssensor verhält sich auf jedem Gerät anders. Auf manchen gibt er nur nah nah oder entfernt als binäre Werte zurück. Auf anderen liefert er granularere Werte. Sie können diesen Tester verwenden, um zu sehen, wie er sich auf Ihrem Gerät verhält.</string>
|
||||
<string name="close">nah</string>
|
||||
<string name="far">entfernt</string>
|
||||
<string name="proximityText">Nähe ist zwischen \"%1$s\" und \"%2$s\"</string>
|
||||
<string name="pleaseWait">Bitte warten.</string>
|
||||
<string name="permissionRequiredBluetooth">Bluetooth Berechtigung ist notwendig, um diese Regel zu editieren. Beantragen Sie die Berechtigung vom Hauptbildschirm aus.</string>
|
||||
<string name="settingName">Einstellungs-Name</string>
|
||||
<string name="settingValue">Einstellungs-Wert</string>
|
||||
<string name="enterAvalue">Geben Sie einen Wert ein.</string>
|
||||
<string name="setSystemSettingCapital">Systemeinstellung setzen</string>
|
||||
<string name="examplesWriteSecureSettings">Ich führe keine Liste möglicher Einstellungen. Bitte finden Sie diese Einstellungen selbst. Siehe <a href="https://developer.android.com/reference/android/provider/Settings.Secure">hier</a> für einige (unvollständige) Beispiele.</string>
|
||||
<string name="httpParametersExplanation">Beginnt ein Parametername mit %1$s, während die Methode POST ist, wird er nicht wie die anderen Parameter (mit Schlüssel=Wert) übertragen, sondern als Hauptdaten übertragen. Wenn der Parameter mit 2 % endet, wird keine Codierung durchgeführt.</string>
|
||||
</resources>
|
||||
@@ -411,7 +411,7 @@
|
||||
<string name="outgoing">saliendo</string>
|
||||
<string name="noKnownWifis">No hay wifis conocidos en su dispositivo.</string>
|
||||
<string name="helpTextTimeFrame">Si crea una regla con un periodo tiene dos opciones. Puede elegir entre entrar o salir de un periodo. En todo caso la regla será ejecutada solo una vez. Si crea una regla con una condición \"entrar periodo xyz\" y por ejemplo la acción \"poner el dispositivo en vibración\", el dispositivo NO va a cambiar a sonido de llamada automaticamente despues del periodo. Si desea esto tiene que crear otra regla con otro periodo.</string>
|
||||
<string name="toggableRules">Reglas reversibles</string>
|
||||
<string name="toggleableRules">Reglas reversibles</string>
|
||||
<string name="helpTextPoi">Un sitio consiste de coordinadas GPS y un radio. Porque la localización vía red móvil terrestre es relativamente imprecisa (pero rápida y barata) no especifiqué el radio demasiado corto. La aplicación va a sugerir un radio minimo cuando cree un nuevo sitio.</string>
|
||||
<string name="generalText">Para usar este programa tiene que crear reglas. Ellos tienen condiciones, por ejemplo \"está en un sitio\" o \"está en un periodo\". Despues cliquee el on/off boton en la pantalla principal.</string>
|
||||
<string name="muteTextToSpeechDuringCallsSummary">Poner TextToSpeech en muto mientras dura las llamadas</string>
|
||||
@@ -443,7 +443,6 @@
|
||||
<string name="nfcTagFoundWithText">Tag encontrado con etiqueta:</string>
|
||||
<string name="nfcUnsupportedEncoding">No hay soporte para este codigo:</string>
|
||||
<string name="nfcNoNdefIntentBut">No NFC NDEF intent, pero</string>
|
||||
<string name="nfcNotSupportedInThisAndroidVersionYet">NFC sin soporto en esta version Android, todavia no.</string>
|
||||
<string name="cantRunRule">No puedo ejecutar reglas.</string>
|
||||
<string name="nfcApplyTagToRule">Aplicar este tag a regla</string>
|
||||
<string name="nfcTagReadSuccessfully">Tag escritoso con éxito.</string>
|
||||
@@ -521,7 +520,7 @@
|
||||
<string name="hint">Pista</string>
|
||||
<string name="hapticFeedback">Sensación tactil (vibracion cuando toca la pantalla)</string>
|
||||
<string name="helpTextSound">En la pantalla principal puede usar \"bloquear cambios de sonido\" para temporalmente evitar, basado en la norma, cambios de sonido. Por ejemplo podría estar en una situación o en un sitio donde un tono de llamada está bien, pero esta vez no es oportuno. La función se desactiva automaticamente despues del tiempo configurado. Cliquee el \"+\" boton para adicionar mas tiempo. Se puede desactivar la función antes tambien usando el boton interruptor (en consecuencia reactivar cambios de sonido, basados en normas).</string>
|
||||
<string name="helpTextToggable">Las normas tienen una configuracion que se llama \\\"reversible\\\". Significa si una norma es ejecutada y despues las mismas condiciones aplican, la norma es ejecutada de forma reversible donde sea posible. Actualmente solo funciona con la condición NFC. Si toca el tag dos veces, y hay una norma reversible con este tag, la aplicación va a hacer lo contrario de la situación actual, por ejemplo desactivar wifi cuando está activo.</string>
|
||||
<string name="helpTextToggleable">Las normas tienen una configuracion que se llama \\\"reversible\\\". Significa si una norma es ejecutada y despues las mismas condiciones aplican, la norma es ejecutada de forma reversible donde sea posible. Actualmente solo funciona con la condición NFC. Si toca el tag dos veces, y hay una norma reversible con este tag, la aplicación va a hacer lo contrario de la situación actual, por ejemplo desactivar wifi cuando está activo.</string>
|
||||
<string name="helpTextProcessMonitoring">Si crea una norma con vigilancia del proceso, la aplicación va a revisar periodicamente si el proceso está activo. Puede ajustar la frecuencia en la configuración. Puede relentizar la reacción, pero la vigilancia permanente gasta mucha bateria. No hay un broadcast del sistema operativo para este evento.</string>
|
||||
<string name="helpTextEnergySaving">Muchos fabricantes intentan conservar energia limitando las actividades de segundo plano de otras apps. Desafortunadamente el resultado es que esas aplicaciones no funcionan por completo. Automation está entre ellas. Vease <a href="https://dontkillmyapp.com/">esta pagina</a> para determinar como excluir Automation de tales medidas.</string>
|
||||
<string name="speedMaximumTimeBetweenLocations">Tiempo maximo entre 2 sitios para determinar la velocidad.</string>
|
||||
@@ -855,6 +854,7 @@
|
||||
<string name="notCharging">no cargando</string>
|
||||
<string name="triggerChargingComment">El tipo solo se evaluará si el dispositivo se está cargando. Si se elige no cargar, se disparará en cualquier tipo de carga anterior. Si desea evaluar eso, considere la posibilidad de usar las variables trigger/action.</string>
|
||||
<string name="helpTextProfiles">Un perfil es una colección de ajustes para tonos de llamada, volúmenes y otros ajustes relacionados con el audio que puede aplicar desde reglas o aplicarlo manualmente.\\n\\nTambién es posible consultar el último perfil activado como disparador. En el caso normal, solo consultará si el perfil fue el último activado (independientemente de si se han cambiado configuraciones de audio específicas mientras tanto). Pero también puede comparar los ajustes individuales.</string>
|
||||
<string name="serviceWontStartPermissions">No tengo permisos completos para ninguna regla definida. El servicio no empieza.</string>
|
||||
<string name="serviceWontStartNoActivatedRules">No se han definido reglas activadas. El servicio no se inicia.</string>
|
||||
<string name="importChooseFolderNotice">En el siguiente diálogo, no intente seleccionar archivos específicos, sino que elija la carpeta en la que residen los archivos de copia de seguridad de Automation. Si el botón Elegir está desactivado, ha encontrado una limitación de Android. En ese caso, intente mover los archivos a un subdirectorio primero.</string>
|
||||
<string name="matches">coincide</string>
|
||||
@@ -866,4 +866,25 @@
|
||||
<string name="version143StartOtherActivityHint">En la versión 1.8.2 fue necesario revisar la forma en que se guardaban las acciones para iniciar otros programas. No se pudo garantizar la compatibilidad. Compruebe y edite sus acciones de inicio de otras actividades para asegurarse de que siguen funcionando.</string>
|
||||
<string name="disable">Desactivar</string>
|
||||
<string name="enable">Activar</string>
|
||||
<string name="uiThemeClassic">Tema clásico de la interfaz</string>
|
||||
<string name="uiThemeCompat">Tema de la interfaz de usuario de diseño de materiales</string>
|
||||
<string name="permissionForegroundServiceTypeSpecialUseRequired">Se requiere permiso FOREGROUND_SERVICE_TYPE_SPECIAL_USE para empezar.</string>
|
||||
<string name="uiTheme">Tema de la interfaz</string>
|
||||
<string name="uiThemeSummary">El tema de la interfaz gráfica de usuario. Se requiere solicitud.</string>
|
||||
<string name="proximity">Proximidad</string>
|
||||
<string name="testArea">Zona de pruebas</string>
|
||||
<string name="testAreaProximityComment">Acércate a tu dispositivo para comprobar cómo reacciona.</string>
|
||||
<string name="deviceDoesntHaveProximitySensor">Tu dispositivo no parece tener sensor de proximidad.</string>
|
||||
<string name="proximitySensorHint">El sensor de proximidad funciona de forma diferente en cada modelo de dispositivo. En algunos solo informa valores binarios cercanos o lejanos, en otros puede mostrar valores más granulares. Puedes usar este tester para ver cómo se comporta en tu dispositivo.</string>
|
||||
<string name="close">cerca</string>
|
||||
<string name="far">lejos</string>
|
||||
<string name="proximityText">La proximidad está entre \"%1$s\" y \"%2$s\"</string>
|
||||
<string name="pleaseWait">Espera.</string>
|
||||
<string name="permissionRequiredBluetooth">Se requiere permiso Bluetooth para editar esta regla. Solicita permisos desde la pantalla principal primero.</string>
|
||||
<string name="settingName">Nombre de la configuratión</string>
|
||||
<string name="settingValue">Valor de la configuración</string>
|
||||
<string name="enterAvalue">Introduce un valor.</string>
|
||||
<string name="setSystemSettingCapital">Establecer configuración del sistema</string>
|
||||
<string name="examplesWriteSecureSettings">No llevo una lista de posibles configuraciones. Por favor, busca <a href="https://developer.android.com/reference/android/provider/Settings.Secure">esas</a> configuraciones por tu cuenta. Véase aquí algunos ejemplos (incompletos).</string>
|
||||
<string name="httpParametersExplanation">Si el nombre de algún parámetro comienza por %1$s mientras el método es POST, no se transmitirá como los otros parámetros (con clave=valor), sino que se transferirá como datos principales. Si el parámetro termina en %2$s, no se realizará ninguna codificación.</string>
|
||||
</resources>
|
||||
@@ -124,8 +124,8 @@
|
||||
<string name="timeframes">Délais d’éxécution</string>
|
||||
<string name="helpTextTimeFrame">Si vous créez une règle avec une période d’éxécution vous avez deux options. Vous pouvez choisir d’éxécuter dans la période OU hors de la période. Quel que soit votre choix l’action ne sera déclenchée qu’une seule fois. Si vous créez une règle avec pour déclencheur \« dans la période xyz \» qui modifie votre profil audio en le passant en mode vibreur cela ne signifie pas que votre téléphone repassera automatiquement en mode sonnerie à la fin de la période. Si vous souhaitez le faire vous devez définir une autre règle avec une autre période.</string>
|
||||
<string name="helpTextSound">Sur l’écran principal vous pouvez utiliser le verrouillage des modifications audio pour temporairement ne pas utiliser les règles de changement des paramètres audio. Par exemple vous pouvez êtes dans un lieu où à un moment où les sonneries peuvent être dérangeantes. Cette fonctionnalité se désactivera automatiquement une fois le temps configuré écoulé. Appuyez sur le bouton + 15 min pour ajouter la durée souhaitée. Une fois activé vous pouvez le désactiver en appuyant sur le bouton \« OUI \» (la règle de gestion des paramètres audio sera de nouveau active).</string>
|
||||
<string name="toggableRules">Inverser la règle</string>
|
||||
<string name="helpTextToggable">Les règles ont une option appelée \« Inversion \». Si une règle est exécutée et que les mêmes déclencheurs s’appliquent à nouveau, la règle sera exécutée dans le sens opposé. Pour l’instant, cela n’est possible qu\'avec les étiquettes NFC : si vous les touchez deux fois et que l’option est activée, cela fera l’inverse des actions demandées. Par exemple désactiver le wifi s’il est actuellement actif.</string>
|
||||
<string name="toggleableRules">Inverser la règle</string>
|
||||
<string name="helpTextToggleable">Les règles ont une option appelée \« Inversion \». Si une règle est exécutée et que les mêmes déclencheurs s’appliquent à nouveau, la règle sera exécutée dans le sens opposé. Pour l’instant, cela n’est possible qu\'avec les étiquettes NFC : si vous les touchez deux fois et que l’option est activée, cela fera l’inverse des actions demandées. Par exemple désactiver le wifi s’il est actuellement actif.</string>
|
||||
<string name="helpTextProcessMonitoring">Si vous spécifiez une règle avec une surveillance de processus, l’application vérifira ce processus toutes les x secondes (vous pouvez modifier cette variable dans les réglages). Cela peut être un peu lent, mais un contrôle continu viderait la batterie trop vite, et il n’y a pas de transmission de l’OS pour cet événement.</string>
|
||||
<string name="helpTitleEnergySaving">Économie d’énergie</string>
|
||||
<string name="helpTextEnergySaving">Beaucoup de marques d’appareils Android essaient d’économiser en limitant les activités des applications en arrière-plan. Malheureusement cela signifie souvent ques ces applications ne fonctionnent pas correctement, Automation en fait partie. Consultez cette <a href="https://dontkillmyapp.com/">page web</a> pour savoir comment exclure Automation de ces restrictions.</string>
|
||||
@@ -305,7 +305,6 @@
|
||||
<string name="nfcTagFoundWithText">Étiquette trouvée :</string>
|
||||
<string name="nfcUnsupportedEncoding">Codage non pris en charge :</string>
|
||||
<string name="nfcNoNdefIntentBut">Aucun NFC NDEF atteint, mais</string>
|
||||
<string name="nfcNotSupportedInThisAndroidVersionYet">NFC non pris en charge dans cette version Android.</string>
|
||||
<string name="cantRunRule">Impossible d’éxécuter les règles.</string>
|
||||
<string name="nfcApplyTagToRule">Affecter l’étiquette à la règle</string>
|
||||
<string name="nfcTagReadSuccessfully">Succès de lecture de l’étiquette.</string>
|
||||
@@ -855,6 +854,7 @@
|
||||
<string name="notCharging">Ne charge pas</string>
|
||||
<string name="triggerChargingComment">Le type ne sera évalué que si l\'appareil est en charge. Si l\'option Ne pas charger est sélectionnée, elle se déclenchera à n\'importe quel type de charge précédent. Si vous souhaitez évaluer cela, envisagez d\'utiliser les variables déclencheur/action.</string>
|
||||
<string name="helpTextProfiles">Un profil est un ensemble de paramètres pour les sonneries, les volumes et d\'autres paramètres liés à l\'audio que vous pouvez faire appliquer à partir de règles ou appliquer manuellement.\\n\\nIl est également possible d\'interroger le dernier profil activé en tant que déclencheur. Dans le cas normal, il ne demandera que si le profil était le dernier activé (indépendamment si des paramètres audio spécifiques ont été modifiés entre-temps). Mais vous pouvez également comparer les différents paramètres.</string>
|
||||
<string name="serviceWontStartPermissions">Je n\'ai pas les autorisations complètes pour une règle définie. Le service ne démarre pas.</string>
|
||||
<string name="serviceWontStartNoActivatedRules">Aucune règle activée n\'a été définie. Le service ne démarre pas.</string>
|
||||
<string name="version143StartOtherActivityHint">Dans la version 1.8.2, il était nécessaire de revoir la façon dont les actions pour démarrer d\'autres programmes étaient enregistrées. La compatibilité n\'a pas pu être assurée. Veuillez vérifier et modifier vos actions de démarrage d\'autres activités pour vous assurer qu\'elles fonctionnent toujours.</string>
|
||||
<string name="importChooseFolderNotice">Dans la boîte de dialogue suivante, n\'essayez pas de sélectionner des fichiers spécifiques, mais choisissez le dossier dans lequel résident les fichiers de sauvegarde Automation. Si le bouton de sélection est désactivé, vous avez trouvé une limitation Android. Dans ce cas, essayez d\'abord de déplacer les fichiers dans un sous-répertoire.</string>
|
||||
@@ -866,4 +866,25 @@
|
||||
<string name="screenBrightGoogleComment">Parce que quelqu\'un chez Google semble avoir fumé quelque chose, le réglage de la luminosité de l\'écran se comporte très bizarrement pour certaines versions d\'Android. Ce comportement n\'a rien à voir avec ce que vous pensez qu\'il fait selon leur propre documentation. J\'ai essayé de m\'y adapter du mieux que j\'ai pu, mais je ne m\'attends pas à des réglages très précis. Cela signifie que le paramètre résultant peut s\'écarter un peu de ce que vous configurez ici.</string>
|
||||
<string name="disable">Désactiver</string>
|
||||
<string name="enable">Activer</string>
|
||||
<string name="uiThemeClassic">Thème Classic UI</string>
|
||||
<string name="uiThemeCompat">Thème de l\'interface utilisateur de conception de matériaux</string>
|
||||
<string name="pleaseWait">Veuillez patienter.</string>
|
||||
<string name="permissionRequiredBluetooth">Permission Bluetooth requise pour modifier cette règle. Demande d\'abord les permissions depuis l\'écran principal.</string>
|
||||
<string name="settingName">Nom de l\'univers</string>
|
||||
<string name="settingValue">Setting value</string>
|
||||
<string name="enterAvalue">Saisissez une valeur.</string>
|
||||
<string name="setSystemSettingCapital">Définir le système</string>
|
||||
<string name="permissionForegroundServiceTypeSpecialUseRequired">Une autorisation FOREGROUND_SERVICE_TYPE_SPECIAL_USE est requise pour commencer.</string>
|
||||
<string name="uiTheme">Thème UI</string>
|
||||
<string name="uiThemeSummary">Le thème de l\'interface graphique utilisateur. Demande obligatoire.</string>
|
||||
<string name="proximity">Proximité</string>
|
||||
<string name="testArea">Zone d\'essai</string>
|
||||
<string name="testAreaProximityComment">Approchez votre appareil pour tester sa réaction.</string>
|
||||
<string name="deviceDoesntHaveProximitySensor">Votre appareil ne semble pas avoir de capteur de proximité.</string>
|
||||
<string name="proximitySensorHint">Le capteur de proximité fonctionne différemment selon les modèles d\'appareils. Sur certains, il affiche simplement des valeurs binaires proches ou éloignées, sur d\'autres, il peut rapporter des valeurs plus granulaires. Vous pouvez utiliser ce testeur pour voir comment il se comporte sur votre appareil.</string>
|
||||
<string name="close">proche</string>
|
||||
<string name="far">loin</string>
|
||||
<string name="proximityText">La proximité se situe entre \"%1$s\" et \"%2$s\"</string>
|
||||
<string name="examplesWriteSecureSettings">Je ne tiens pas de liste des réglages possibles. Veuillez trouver ces réglages vous-même. Voir <a href="https://developer.android.com/reference/android/provider/Settings.Secure">ici</a> pour quelques exemples (incomplets).</string>
|
||||
<string name="httpParametersExplanation">Si un nom de paramètre commence par %1$s alors que la méthode est POST, il ne sera pas transmis comme les autres paramètres (avec clé=valeur), mais transféré comme données principales. Si le paramètre se termine par %2$s, aucun codage ne sera effectué.</string>
|
||||
</resources>
|
||||
|
||||
@@ -231,7 +231,7 @@
|
||||
<string name="helpTextRules">Gli eventi di attivazione sono in AND logico. La regola sarà eseguita solo se tutti gli eventi sono soddisfatti. Per l\'OR logico basta creare un\'altra regola.\nI termini trigger e condizione vengono utilizzati come sinonimi. Tutte sono condizioni, ma l\'ultima a soddisfare il valore richiesto potrebbe essere chiamata trigger perché è il pezzo finale del puzzle per causare l\'esecuzione di una regola.\nSe si desidera salvare determinate variabili da una regola e valutarle in un\'altra regola, eseguire il checkout del trigger/azione della variabile.</string>
|
||||
<string name="helpTextSound">Nello schermo principale puoi bloccare temporaneamente i cambi ai suoni per evitare l\'esecuzione di regole che facciano cambi alle attività sonore. Per esempio, potresti essere in una situatione o in un luogo dove normalmente ascoltare il suono di una suoneria è ok, ma in questa occasione bisognerebbe evitarlo. Questa funzione si disattiverà automaticamente non appena sia trascorso il tempo selezionato. Fai Click sul bottone + per raggiungere la quantità di tempo desiderata. Una volta attiva, questa si può disattivare nuovamente usando il pulsante di attivazione (e in questo modo, si riattiveranno le regole basate su cambi sonori).</string>
|
||||
<string name="helpTextTimeFrame">Se si specifica una regola con un intervallo temporale si hanno due scelte. È possibile scegliere se si desidera attivare la regola all\'interno o all\'esterno dell\'intervallo di tempo. In entrambi i casi l\'azione verrà eseguita una sola volta. Quindi, se si crea una regola che imposta il profilo su vibrazione nell\'intervallo temporale xyz, il telefono, passato allo stato vibrazione, rimarrà definitivamente in tale stato anche dopo lo scadere dell\'intervallo di tempo. Se si desidera che ciò avvenga è necessario specificare un\'altra regola con un altro periodo di tempo.</string>
|
||||
<string name="helpTextToggable">Le regole hanno un segno di spunta chiamato "Reversibile". Ciò significa che, se una regola viene eseguita al verificarsi di un evento e poi quest\'ultimo si verifica una seconda volta, il comando della regola verrà eseguito una ulteriore volta in modalità inversa, se possibile. Attualmente questo avverrà solo in combinazione con etichette NFC. Se le si tocca due volte la regola associata invertirà la situazione attuale. Per esempio una regola “Reversibile” può disattivare il WiFi se attivo e viceversa attivarlo se non attivo.</string>
|
||||
<string name="helpTextToggleable">Le regole hanno un segno di spunta chiamato "Reversibile". Ciò significa che, se una regola viene eseguita al verificarsi di un evento e poi quest\'ultimo si verifica una seconda volta, il comando della regola verrà eseguito una ulteriore volta in modalità inversa, se possibile. Attualmente questo avverrà solo in combinazione con etichette NFC. Se le si tocca due volte la regola associata invertirà la situazione attuale. Per esempio una regola “Reversibile” può disattivare il WiFi se attivo e viceversa attivarlo se non attivo.</string>
|
||||
<string name="helpTitleEnergySaving">Risparmio energetico</string>
|
||||
<string name="hint">Suggerimento</string>
|
||||
<string name="httpAcceptAllCertificatesSummary">Salta il controllo dei certificati SSL (si consiglia di non attivarlo)</string>
|
||||
@@ -300,7 +300,6 @@
|
||||
<string name="nfcEnterValidIdentifier">Inserire un nome valido per l\'etichetta (come "Porta d\'ingresso di casa").</string>
|
||||
<string name="nfcNoNdefIntentBut">Nessun Intent NFC NDEF, ma</string>
|
||||
<string name="nfcNoTag">Nessuna etichetta rilevata.</string>
|
||||
<string name="nfcNotSupportedInThisAndroidVersionYet">NFC non ancora supportato in questa versione di Android.</string>
|
||||
<string name="nfcReadTag">Leggi ID dall\'etichetta</string>
|
||||
<string name="nfcTag">Etichetta NFC</string>
|
||||
<string name="nfcTagDataNotUsable">Dati dell\'etichetta non leggibili, si prega di riscriverli.</string>
|
||||
@@ -524,7 +523,7 @@
|
||||
<string name="timeoutForGpsComparisonsTitle">Timeout del GPS [sec]</string>
|
||||
<string name="title">Titolo</string>
|
||||
<string name="to">a</string>
|
||||
<string name="toggableRules">Regole reversibili</string>
|
||||
<string name="toggleableRules">Regole reversibili</string>
|
||||
<string name="toggle">reversibile</string>
|
||||
<string name="toggleNotAllowed">La reversibilità al momento è disponibile solo per le regole che hanno come evento una etichetta NFC. Consulta l\'aiuto per i dettagli.</string>
|
||||
<string name="toggleRule">Regola Reversibile</string>
|
||||
@@ -856,6 +855,7 @@
|
||||
<string name="notCharging">non in carica</string>
|
||||
<string name="triggerChargingComment">Il tipo verrà valutato solo se il dispositivo è in carica. Se si sceglie di non caricare, si attiverà a qualsiasi tipo di ricarica precedente. Se si desidera valutarlo, prendere in considerazione l\'utilizzo delle variabili trigger/action.</string>
|
||||
<string name="helpTextProfiles">Un profilo è una raccolta di impostazioni per suonerie, volumi e altre impostazioni relative all\'audio che è possibile applicare dalle regole o applicare manualmente.\\n\\nÈ anche possibile eseguire una query per l\'ultimo profilo attivato come trigger. In caso normale, chiederà solo se il profilo è stato l\'ultimo attivato (indipendentemente dal fatto che nel frattempo siano state modificate impostazioni audio specifiche). Ma è anche possibile confrontare le singole impostazioni.</string>
|
||||
<string name="serviceWontStartPermissions">Non ho permessi completi per nessuna regola definita. Il servizio non parte.</string>
|
||||
<string name="serviceWontStartNoActivatedRules">Nessuna regola attivata definita. Il servizio non si avvia.</string>
|
||||
<string name="importChooseFolderNotice">Nella finestra di dialogo seguente non tentare di selezionare file specifici, ma scegliere la cartella in cui risiedono i file di backup di Automazione. Se il pulsante di selezione è disabilitato, hai trovato una limitazione di Android. In tal caso, prova prima a spostare i file in una sottodirectory.</string>
|
||||
<string name="matches">corrisponde</string>
|
||||
@@ -867,4 +867,25 @@
|
||||
<string name="version143StartOtherActivityHint">Nella versione 1.8.2 è stato necessario rivedere il modo in cui venivano salvate le azioni per avviare altri programmi. La compatibilità non poteva essere garantita. Controlla e modifica le azioni di avvio di altre attività per assicurarti che funzionino ancora.</string>
|
||||
<string name="disable">Disabilitare</string>
|
||||
<string name="enable">Abilitare</string>
|
||||
<string name="uiThemeClassic">Tema classico dell\'interfaccia utente</string>
|
||||
<string name="uiThemeCompat">Tema dell\'interfaccia utente per il design del materiale</string>
|
||||
<string name="testArea">Area di prova</string>
|
||||
<string name="testAreaProximityComment">Avvicinati al tuo dispositivo per testare come reagisce.</string>
|
||||
<string name="deviceDoesntHaveProximitySensor">Il tuo dispositivo non sembra avere un sensore di prossimità.</string>
|
||||
<string name="proximitySensorHint">Il sensore di prossimità funziona in modo diverso su ogni modello di dispositivo. In alcuni riportano solo valori binari vicini o lontani, in altri possono riportare valori più granulari. Puoi usare questo tester per vedere come si comporta sul tuo dispositivo.</string>
|
||||
<string name="close">chiude</string>
|
||||
<string name="far">lontano</string>
|
||||
<string name="proximityText">La vicinanza è tra \"%1$s\" e \"%2$s\"</string>
|
||||
<string name="pleaseWait">Attendere prego.</string>
|
||||
<string name="permissionRequiredBluetooth">È necessario il permesso Bluetooth per modificare questa regola. Richiedi prima i permessi dalla schermata principale.</string>
|
||||
<string name="settingName">Nome dell\'ambientazione</string>
|
||||
<string name="settingValue">Valore di impostazione</string>
|
||||
<string name="enterAvalue">Inserisci un valore.</string>
|
||||
<string name="setSystemSettingCapital">Impostazione del sistema</string>
|
||||
<string name="permissionForegroundServiceTypeSpecialUseRequired">È necessario il permesso FOREGROUND_SERVICE_TYPE_SPECIAL_USE per iniziare.</string>
|
||||
<string name="uiTheme">Tema UI</string>
|
||||
<string name="uiThemeSummary">Il tema dell\'interfaccia grafica utente. Domanda necessaria.</string>
|
||||
<string name="proximity">Vicinanza</string>
|
||||
<string name="examplesWriteSecureSettings">Non tengo una lista di possibili impostazioni. Per favore, trova queste impostazioni da solo. Vedi <a href="https://developer.android.com/reference/android/provider/Settings.Secure">qui</a> per alcuni esempi (incompleti).</string>
|
||||
<string name="httpParametersExplanation">Se un nome di parametro inizia con %1$s mentre il metodo è POST, non verrà trasmesso come gli altri parametri (con chiave=valore), ma trasferito come dato principale. Se il parametro termina con %2$s, non verrà eseguita alcuna codifica.</string>
|
||||
</resources>
|
||||
|
||||
@@ -122,8 +122,8 @@
|
||||
<string name="timeframes">Tijdsbestek</string>
|
||||
<string name="helpTextTimeFrame">Als je een regel opgeeft met een tijdsbestek heb je twee keuzes. Je kunt kiezen tussen het binnengaan OF het verlaten van een tijdframe. In beide gevallen wordt een regel slechts eenmaal getriggerd. Dus als je een regel maakt met als trigger "ingaan tijdvak xyz" en je laat je geluidsprofiel veranderen in trillen dan betekent dat niet dat de telefoon automatisch gaat rinkelen als het tijdvak voorbij is. Als je dat wilt moet je een andere regel specificeren met een ander tijdsbestek.</string>
|
||||
<string name="helpTextSound">Op het hoofdscherm kunt u vergrendelingsgeluiden gebruiken om op regels gebaseerde geluidsveranderingen tijdelijk te vermijden. U kunt bijvoorbeeld in een situatie of plaats zijn waar ringtones normaal gesproken ok zijn, maar deze ene keer zou het storend zijn. De functie zal automatisch worden uitgeschakeld zodra de ingestelde tijd is verstreken. Klik op de + knop om de ingestelde tijd toe te voegen. Zodra het actief is kunt u het weer deactiveren met de toggle knop (en op die manier op regels gebaseerde geluidsveranderingen weer inschakelen).</string>
|
||||
<string name="toggableRules">Schakelbare regels</string>
|
||||
<string name="helpTextToggable">Regels hebben een vlag genaamd "Toggable". Dit betekent dat als een regel wordt uitgevoerd en daarna dezelfde triggers opnieuw van toepassing zijn, de regel zal worden uitgevoerd in een tegenovergestelde modus indien van toepassing. Momenteel gebeurt dit alleen in combinatie met NFC tags. Als je er twee keer op tikt en er is een toggable regel aan verbonden, zal het het tegenovergestelde doen van de huidige situatie, bv. wifi uitschakelen als het momenteel geactiveerd is.</string>
|
||||
<string name="toggleableRules">Schakelbare regels</string>
|
||||
<string name="helpTextToggleable">Regels hebben een vlag genaamd "Toggable". Dit betekent dat als een regel wordt uitgevoerd en daarna dezelfde triggers opnieuw van toepassing zijn, de regel zal worden uitgevoerd in een tegenovergestelde modus indien van toepassing. Momenteel gebeurt dit alleen in combinatie met NFC tags. Als je er twee keer op tikt en er is een toggable regel aan verbonden, zal het het tegenovergestelde doen van de huidige situatie, bv. wifi uitschakelen als het momenteel geactiveerd is.</string>
|
||||
<string name="helpTextProcessMonitoring">Als je een regel opgeeft met een procesmonitor, zal de applicatie elke x seconden controleren of er een proces is (je kunt dat in de instellingen wijzigen). Ik weet dat dit traag kan zijn, maar continu monitoren zou de batterij te snel leegmaken. En er is geen uitzending van het OS voor die gebeurtenis.</string>
|
||||
<string name="helpTitleEnergySaving">Energiebesparing</string>
|
||||
<string name="helpTextEnergySaving">Veel fabrikanten van Android-toestellen proberen energie te besparen door de achtergrondactiviteit van draaiende apps te beperken. Helaas leidt dat er vaak toe dat die apps niet goed werken, Automation is daar één van. Zie dit om uit te vinden hoe je Automation kunt uitsluiten van deze maatregelen.</string>
|
||||
@@ -300,7 +300,6 @@
|
||||
<string name="nfcTagFoundWithText">Tag gevonden met tekst:</string>
|
||||
<string name="nfcUnsupportedEncoding">Niet ondersteunde codering:</string>
|
||||
<string name="nfcNoNdefIntentBut">Geen NFC NDEF bedoeling, maar</string>
|
||||
<string name="nfcNotSupportedInThisAndroidVersionYet">NFC nog niet ondersteund in deze Android versie.</string>
|
||||
<string name="cantRunRule">Kan regels niet uitvoeren.</string>
|
||||
<string name="nfcApplyTagToRule">Pas Tag toe op regel</string>
|
||||
<string name="nfcTagReadSuccessfully">Tag succesvol gelezen.</string>
|
||||
@@ -854,6 +853,7 @@
|
||||
<string name="notCharging">laadt niet op</string>
|
||||
<string name="triggerChargingComment">Het type wordt alleen geëvalueerd als het apparaat wordt opgeladen. Als er niet wordt gekozen voor opladen, wordt het geactiveerd bij elk eerder oplaadtype. Als je dat wilt evalueren, overweeg dan om de variabelen trigger/actie te gebruiken.</string>
|
||||
<string name="helpTextProfiles">Een profiel is een verzameling instellingen voor beltonen, volumes en andere audiogerelateerde instellingen die u kunt laten toepassen vanuit regels of handmatig kunt toepassen.\\n\\nHet is ook mogelijk om het laatst geactiveerde profiel als trigger op te vragen. In het normale geval zal het alleen opvragen of het profiel het laatst geactiveerde profiel was (ongeacht of specifieke audio-instellingen in de tussentijd zijn gewijzigd). Maar u kunt ook de individuele instellingen laten vergelijken.</string>
|
||||
<string name="serviceWontStartPermissions">Je hebt geen volledige rechten voor een bepaalde regel. De service start niet.</string>
|
||||
<string name="serviceWontStartNoActivatedRules">Er zijn geen geactiveerde regels gedefinieerd. De service wordt niet gestart.</string>
|
||||
<string name="importChooseFolderNotice">Probeer in het volgende dialoogvenster geen specifieke bestanden te selecteren, maar kies de map waarin de back-upbestanden van Automation zich bevinden. Als de keuzeknop is uitgeschakeld, hebt u een Android-beperking gevonden. Probeer in dat geval de bestanden eerst naar een submap te verplaatsen.</string>
|
||||
<string name="matches">komt overeen</string>
|
||||
@@ -865,4 +865,25 @@
|
||||
<string name="version143StartOtherActivityHint">In versie 1.8.2 was het nodig om de manier waarop acties om andere programma\'s te starten werden opgeslagen, te herzien. De compatibiliteit kon niet worden gegarandeerd. Controleer en bewerk je acties om andere activiteiten te starten om er zeker van te zijn dat ze nog steeds werken.</string>
|
||||
<string name="disable">Uitschakelen</string>
|
||||
<string name="enable">Inschakelen</string>
|
||||
<string name="uiThemeClassic">Klassiek UI-thema</string>
|
||||
<string name="uiThemeCompat">Materiaalontwerp UI-thema</string>
|
||||
<string name="permissionForegroundServiceTypeSpecialUseRequired">Toestemming FOREGROUND_SERVICE_TYPE_SPECIAL_USE is vereist om te beginnen.</string>
|
||||
<string name="uiTheme">UI-thema</string>
|
||||
<string name="uiThemeSummary">Het thema van de grafische gebruikersinterface. Aanvraag vereist.</string>
|
||||
<string name="proximity">Nabijheid</string>
|
||||
<string name="testArea">Testgebied</string>
|
||||
<string name="testAreaProximityComment">Benader je apparaat om te testen hoe het reageert.</string>
|
||||
<string name="deviceDoesntHaveProximitySensor">Je apparaat lijkt geen nabijheidssensor te hebben.</string>
|
||||
<string name="proximitySensorHint">De nabijheidssensor werkt bij elk apparaatmodel anders. Bij sommige rapporteert het alleen dichtbij of ver als binaire waarden, bij andere kan het meer gedetailleerde waarden weergeven. Je kunt deze tester gebruiken om te zien hoe hij zich op jouw apparaat gedraagt.</string>
|
||||
<string name="close">Sluiten</string>
|
||||
<string name="far">ver</string>
|
||||
<string name="proximityText">De nabijheid ligt tussen \"%1$s\" en \"%2$s\"</string>
|
||||
<string name="pleaseWait">Een ogenblik geduld.</string>
|
||||
<string name="permissionRequiredBluetooth">Bluetooth-toestemming vereist om deze regel te wijzigen. Vraag eerst om toestemming op het hoofdscherm.</string>
|
||||
<string name="settingName">Naam van de instelling</string>
|
||||
<string name="settingValue">Waarde van de instelling</string>
|
||||
<string name="enterAvalue">Voer een waarde in.</string>
|
||||
<string name="setSystemSettingCapital">Setsysteeminstelling</string>
|
||||
<string name="examplesWriteSecureSettings">Ik houd geen lijst bij met mogelijke instellingen. Zoek die instellingen zelf op. Zie <a href="https://developer.android.com/reference/android/provider/Settings.Secure">hier</a> voor enkele (onvolledige) voorbeelden.</string>
|
||||
<string name="httpParametersExplanation">Als een parameternaam begint met %1$s terwijl de methode POST is, wordt deze niet verzonden zoals de andere parameters (met sleutel=waarde), maar als hoofddata overgedragen. Als de parameter eindigt op %2 s, wordt er geen codering uitgevoerd.</string>
|
||||
</resources>
|
||||
|
||||
@@ -129,8 +129,8 @@
|
||||
<string name="timeframes">Ramy czasowe</string>
|
||||
<string name="helpTextTimeFrame">Jeśli określisz regułę z przedziałem czasowym, masz dwie możliwości. Możesz wybrać między wprowadzeniem LUB opuszczeniem przedziału czasowego. Tak czy inaczej reguła jest uruchamiana tylko raz. Więc jeśli utworzysz regułę, która jako wyzwalacz ma „wprowadzanie przedziału czasowego xyz” i pozwolisz jej zmienić profil dźwiękowy na wibracje, nie oznacza to, że telefon automatycznie zadzwoni, gdy przedział czasowy się skończy. Jeśli chcesz, musisz określić inną regułę z innym przedziałem czasowym.</string>
|
||||
<string name="helpTextSound">On the main screen you can use lock sound changes to temporarily avoid rule based sound changes. E.g. you may be in a situation or place where usually ringtones are ok, but this one time it would be disturbing. The feature will automatically deactivate once the configured time has elapsed. Click the + button to add the given amount of time. Once it is active you may deactivate it again using the toggle button (and that way enable rule based sound changes again).</string>
|
||||
<string name="toggableRules">Zasady naprzemienności</string>
|
||||
<string name="helpTextToggable">Reguły mają flagę o nazwie \"Toggable\". Oznacza to, że jeśli reguła zostanie wykonana, a następnie ponownie zostaną zastosowane te same wyzwalacze, reguła zostanie wykonana w odwrotnym trybie, jeśli ma to zastosowanie. Obecnie będzie to miało miejsce tylko w połączeniu z tagami NFC. Jeśli stukniesz je dwukrotnie i jest z nimi powiązana reguła, którą można przełączać, zrobi to odwrotnie niż w obecnej sytuacji, np. dezaktywuj Wi-Fi, jeśli jest aktualnie włączone.</string>
|
||||
<string name="toggleableRules">Zasady naprzemienności</string>
|
||||
<string name="helpTextToggleable">Reguły mają flagę o nazwie \"Toggable\". Oznacza to, że jeśli reguła zostanie wykonana, a następnie ponownie zostaną zastosowane te same wyzwalacze, reguła zostanie wykonana w odwrotnym trybie, jeśli ma to zastosowanie. Obecnie będzie to miało miejsce tylko w połączeniu z tagami NFC. Jeśli stukniesz je dwukrotnie i jest z nimi powiązana reguła, którą można przełączać, zrobi to odwrotnie niż w obecnej sytuacji, np. dezaktywuj Wi-Fi, jeśli jest aktualnie włączone.</string>
|
||||
<string name="helpTextProcessMonitoring">Jeśli określisz regułę za pomocą monitora procesu, aplikacja będzie sprawdzać ten proces co x sekund (możesz to zmienić w ustawieniach). Wiem, że może to być trochę powolne, ale ciągłe monitorowanie spowodowałoby zbyt szybkie wyczerpanie baterii. I nie ma transmisji z systemu operacyjnego dla tego wydarzenia.</string>
|
||||
<string name="helpTitleEnergySaving">Oszczędzanie energii</string>
|
||||
<string name="helpTextEnergySaving">Wielu producentów urządzeń z systemem Android stara się oszczędzać energię, ograniczając działanie uruchomionych aplikacji w tle. Niestety często powoduje to, że te aplikacje nie działają poprawnie, wśród nich jest Automation. Zobacz tę <a href="https://dontkillmyapp.com/">webpage</a>, aby dowiedzieć się, jak wykluczyć automatyzację z tych środków.</string>
|
||||
@@ -365,7 +365,6 @@
|
||||
<string name="nfcTagFoundWithText">Znaleziono tag z tekstem:</string>
|
||||
<string name="nfcUnsupportedEncoding">Nieobsługiwane kodowanie:</string>
|
||||
<string name="nfcNoNdefIntentBut"> Brak intencji NFC NDEF, ale</string>
|
||||
<string name="nfcNotSupportedInThisAndroidVersionYet">NFC nie jest jeszcze obsługiwane w tej wersji Androida.</string>
|
||||
<string name="cantRunRule">Nie można uruchomić reguł.</string>
|
||||
<string name="cantDownloadTooFewRequestsInSettings" translatable="false">Can\'t download anything. Amount of http requests in settings is lower than 1.</string>
|
||||
<string name="nfcApplyTagToRule">Zastosuj tag do reguły</string>
|
||||
@@ -953,6 +952,7 @@
|
||||
<string name="notCharging">Nie ładuje się</string>
|
||||
<string name="triggerChargingComment">Typ zostanie oceniony tylko wtedy, gdy urządzenie się ładuje. Jeśli nie zostanie wybrane ładowanie, zostanie uruchomione przy dowolnym poprzednim typie ładowania. Jeśli chcesz to ocenić, rozważ użycie zmiennych trigger/action.</string>
|
||||
<string name="helpTextProfiles">Profil jest zbiorem ustawień dzwonków, głośności i innych ustawień związanych z dźwiękiem, które można zastosować z reguł lub zastosować ręcznie.\\n\\nMożliwe jest również zapytanie o ostatnio aktywowany profil jako wyzwalacz. W normalnym przypadku zapyta tylko, czy profil był ostatnio aktywowany (niezależnie od tego, czy określone ustawienia dźwięku zostały zmienione w międzyczasie). Ale możesz także porównać poszczególne ustawienia.</string>
|
||||
<string name="serviceWontStartPermissions">Nie mam pełnych uprawnień do żadnej zdefiniowanej reguły. Usługa nie chce się uruchomić.</string>
|
||||
<string name="serviceWontStartNoActivatedRules">Nie zdefiniowano aktywowanych reguł. Usługa nie uruchamia się.</string>
|
||||
<string name="importChooseFolderNotice">W następnym oknie dialogowym nie próbuj wybierać określonych plików, ale wybierz folder, w którym znajdują się pliki kopii zapasowej usługi Automation. Jeśli przycisk wyboru jest wyłączony, oznacza to, że znalazłeś ograniczenie systemu Android. W takim przypadku spróbuj najpierw przenieść pliki do podkatalogu.</string>
|
||||
<string name="matches">pasuje</string>
|
||||
@@ -964,4 +964,25 @@
|
||||
<string name="version143StartOtherActivityHint">W wersji 1.8.2 konieczne było poprawienie sposobu zapisywania akcji uruchamiających inne programy. Nie można było zapewnić kompatybilności. Sprawdź i edytuj czynności związane z uruchamianiem innych aktywności, aby upewnić się, że nadal działają.</string>
|
||||
<string name="disable">Wyłączać</string>
|
||||
<string name="enable">Umożliwiać</string>
|
||||
<string name="uiThemeClassic">Klasyczny motyw UI</string>
|
||||
<string name="uiThemeCompat">Motyw UI projektowania materiałów</string>
|
||||
<string name="permissionForegroundServiceTypeSpecialUseRequired">Do rozpoczęcia FOREGROUND_SERVICE_TYPE_SPECIAL_USE wymagana jest zgoda.</string>
|
||||
<string name="uiTheme">Motyw UI</string>
|
||||
<string name="uiThemeSummary">Motyw graficzny interfejsu użytkownika. Wymagana aplikacja.</string>
|
||||
<string name="proximity">Bliskość</string>
|
||||
<string name="testArea">Obszar testowy</string>
|
||||
<string name="testAreaProximityComment">Podejdź do urządzenia, aby sprawdzić, jak reaguje.</string>
|
||||
<string name="deviceDoesntHaveProximitySensor">Twoje urządzenie nie wydaje się mieć czujnika zbliżeniowego.</string>
|
||||
<string name="proximitySensorHint">Czujnik zbliżeniowy działa inaczej w każdym modelu urządzenia. W niektórych pokazuje tylko wartości binarne bliskie lub daleko, w innych może podawać bardziej szczegółowe wartości. Możesz użyć tego testera, aby zobaczyć, jak zachowuje się na Twoim urządzeniu.</string>
|
||||
<string name="close">bliski</string>
|
||||
<string name="far">daleko</string>
|
||||
<string name="proximityText">Odległość mieści się między \"%1$s\" a \"%2$s\"</string>
|
||||
<string name="pleaseWait">Czekaj.</string>
|
||||
<string name="permissionRequiredBluetooth">Wymagane uprawnienia Bluetooth do edycji tej zasady. Najpierw poproś o uprawnienia z ekranu głównego.</string>
|
||||
<string name="settingName">Nazwa osadzenia</string>
|
||||
<string name="settingValue">Wartość ustalająca</string>
|
||||
<string name="enterAvalue">Wprowadź wartość.</string>
|
||||
<string name="setSystemSettingCapital">Ustawienia systemu zbiorów</string>
|
||||
<string name="examplesWriteSecureSettings">Nie prowadzę listy możliwych ustawień wyboru. Proszę, znajdź te ustawienia samodzielnie. Zobacz <a href="https://developer.android.com/reference/android/provider/Settings.Secure">tutaj</a> dla niektórych (niepełnych) przykładów.</string>
|
||||
<string name="httpParametersExplanation">Jeśli nazwa parametru zaczyna się od %1$s, a metoda to POST, nie zostanie przesłana jak pozostałe parametry (z klucz=wartością), lecz przeniesiona jako dane główne. Jeśli parametr kończy się na %2$s, nie zostanie wykonane kodowanie.</string>
|
||||
</resources>
|
||||
|
||||
@@ -124,8 +124,8 @@
|
||||
<string name="timeframes">Временные интервалы</string>
|
||||
<string name="helpTextTimeFrame">Если вы указываете правило с временными интервалами, у вас есть два варианта. Вы можете выбрать между началом ИЛИ окончанием временного интервала. Правило срабатывает только один раз. Поэтому, если вы создадите правило с "начало временного интервала" в качестве триггера и позволите ему изменить ваш звуковой профиль на вибрацию, это не означает, что телефон автоматически перейдет в обычный режим, когда временной интервал закончится. Если вам это необходимо,создайте другое правило с другим временным интервалом.</string>
|
||||
<string name="helpTextSound">На главном экране есть возможность заблокировать изменение уровня громкости вызова сконфигурированными правилами, например, вы можете быть в ситуации или месте, где необходим обычный режим звука, но в настоящее время его использовать нельзя. Эта функция автоматически отключится по истечении заданного времени. Нажмите кнопку +, чтобы задать необходимый период времени. После включения, вы можете вручную выключить его с помощью кнопки переключения (и таким образом снова включить изменения громкости звука).</string>
|
||||
<string name="toggableRules">Переключаемые правила</string>
|
||||
<string name="helpTextToggable">Правила имеют флаг "Переключаемый". Это означает, что если правило выполняется, а затем те же самые триггеры применяются снова, то правило будет выполняться в противоположное состояние, если это возможно. В настоящее время это будет происходить только с NFC-метками. Если вы поднесете телефон к NFC-метке повтороно и с ними будет связано правило с флагом “Переключаемый”, оно будет выполнять противоположное текущему состоянию действие, например, Wi-Fi будет отключен, если он в данный момент включен.</string>
|
||||
<string name="toggleableRules">Переключаемые правила</string>
|
||||
<string name="helpTextToggleable">Правила имеют флаг "Переключаемый". Это означает, что если правило выполняется, а затем те же самые триггеры применяются снова, то правило будет выполняться в противоположное состояние, если это возможно. В настоящее время это будет происходить только с NFC-метками. Если вы поднесете телефон к NFC-метке повтороно и с ними будет связано правило с флагом “Переключаемый”, оно будет выполнять противоположное текущему состоянию действие, например, Wi-Fi будет отключен, если он в данный момент включен.</string>
|
||||
<string name="helpTextProcessMonitoring">Если вы создадите правило мониторинга процесса, приложение будет проверять наличие этого процесса каждые x секунд (период может быть изменён в настройках). Увеличение периода мониторинга приведёт к задержке срабатывания правила, но частый мониторинг повышает потребление батареи. И Android не отправляет широковещательные сообщения такого рода.</string>
|
||||
<string name="helpTitleEnergySaving">Энергосбережение</string>
|
||||
<string name="speedMaximumTimeBetweenLocations">Максимальное время между 2 местоположениями для определения скорости.</string>
|
||||
@@ -334,8 +334,7 @@
|
||||
<string name="nfcTagFoundWithText">Найдена метка с текстом:</string>
|
||||
<string name="nfcUnsupportedEncoding">Неподдерживаемая кодировка:</string>
|
||||
<string name="nfcNoNdefIntentBut">Нет NFC NDEF Intent, но</string>
|
||||
<string name="nfcNotSupportedInThisAndroidVersionYet">NFC пока не поддерживается в этой версии Android.</string>
|
||||
<string name="cantRunRule">Не удается запустить правила.</string>
|
||||
<string name="cantRunRule">Не удается запустить правила.</string>
|
||||
<string name="cantDownloadTooFewRequestsInSettings" translatable="false">Не получается загрузить. Количество http запросов в настройках меньше 1.</string>
|
||||
<string name="nfcApplyTagToRule">Применить метку к правилу</string>
|
||||
<string name="nfcTagReadSuccessfully">Метка прочитана успешно.</string>
|
||||
@@ -913,7 +912,8 @@
|
||||
<string name="notCharging">не заряжается</string>
|
||||
<string name="triggerChargingComment">Тип будет оцениваться только в том случае, если устройство заряжается. Если зарядка не выбрана, он будет срабатывать при любом предыдущем типе зарядки. Если вы хотите это оценить, подумайте об использовании переменных trigger/action.</string>
|
||||
<string name="helpTextProfiles">Профиль — это набор настроек рингтонов, громкости и других настроек, связанных со звуком, которые можно применить из правил или вручную.\\n\\nТакже в качестве триггера можно запросить последний активированный профиль. В обычном случае он будет запрашивать только то, был ли профиль последним активированным (независимо от того, были ли за это время изменены определенные настройки звука). Но вы также можете сравнить отдельные настройки.</string>
|
||||
<string name="serviceWontStartNoActivatedRules">Активированные правила не определены. Служба не запускается.</string>
|
||||
<string name="serviceWontStartPermissions">У меня нет полных разрешений на какие-либо определённые правила. Обслуживание не начинается.</string>
|
||||
<string name="serviceWontStartNoActivatedRules">Активированные правила не определены. Служба не запускается.</string>
|
||||
<string name="importChooseFolderNotice">В следующем диалоговом окне не пытайтесь выбрать конкретные файлы, а выберите папку, в которой находятся файлы резервных копий автоматизации. Если кнопка выбора отключена, вы обнаружили ограничение Android. В этом случае попробуйте сначала переместить файлы в подкаталог.</string>
|
||||
<string name="matches">Шутки</string>
|
||||
<string name="doesNotMatch">не совпадает</string>
|
||||
@@ -924,4 +924,25 @@
|
||||
<string name="version143StartOtherActivityHint">В версии 1.8.2 необходимо было пересмотреть способ сохранения действий для запуска других программ. Совместимость обеспечить не удалось. Пожалуйста, проверьте и отредактируйте действия запуска других действий, чтобы убедиться, что они все еще работают.</string>
|
||||
<string name="disable">Отключить</string>
|
||||
<string name="enable">Давать возможность</string>
|
||||
<string name="uiThemeClassic">Классическая тема интерфейса</string>
|
||||
<string name="uiThemeCompat">Тема интерфейса дизайна материалов</string>
|
||||
<string name="permissionForegroundServiceTypeSpecialUseRequired">Для запуска требуется разрешение FOREGROUND_SERVICE_TYPE_SPECIAL_USE.</string>
|
||||
<string name="uiTheme">Тема интерфейса</string>
|
||||
<string name="uiThemeSummary">Тема графического пользовательского интерфейса. Требуется подача заявления.</string>
|
||||
<string name="proximity">Близость</string>
|
||||
<string name="testArea">Зона испытаний</string>
|
||||
<string name="testAreaProximityComment">Подойдите к своему устройству, чтобы проверить, как оно реагирует.</string>
|
||||
<string name="deviceDoesntHaveProximitySensor">Похоже, у вашего устройства нет датчика близости.</string>
|
||||
<string name="proximitySensorHint">Датчик близости работает по-разному на каждой модели устройства. В некоторых он показывает только близкие или далёкие бинарные значения, в других — более детализированные. Вы можете использовать этот тестер, чтобы посмотреть, как он ведёт себя на вашем устройстве.</string>
|
||||
<string name="close">закрыть</string>
|
||||
<string name="far">Далеко</string>
|
||||
<string name="proximityText">Близость находится между «%1$s» и «%2$s».</string>
|
||||
<string name="pleaseWait">Подождите.</string>
|
||||
<string name="permissionRequiredBluetooth">Для редактирования этого правила требуется разрешение на Bluetooth. Сначала запросите разрешения на главном экране.</string>
|
||||
<string name="settingName">Название сеттинга</string>
|
||||
<string name="settingValue">Значение сеттинга</string>
|
||||
<string name="enterAvalue">Введите значение.</string>
|
||||
<string name="setSystemSettingCapital">Настройка системы множества</string>
|
||||
<string name="examplesWriteSecureSettings">Я не веду список возможных настроек. Пожалуйста, найдите эти настройки сами. См. <a href="https://developer.android.com/reference/android/provider/Settings.Secure">здесь</a> некоторые (неполные) примеры.</string>
|
||||
<string name="httpParametersExplanation">Если имя любого параметра начинается с %1$s, а метод — POST, оно не будет передаваться как другие параметры (с ключом =значением), а передаваться как основные данные. Если параметр заканчивается на %2$s, кодирование не выполняется.</string>
|
||||
</resources>
|
||||
|
||||
@@ -115,8 +115,8 @@
|
||||
<string name="timeframes">时间范围</string>
|
||||
<string name="helpTextTimeFrame">指定时间范围规则时有两种选择。您可以选择进入或离开时间范围。无论哪种方式,规则都只会触发一次。因此,如果您创建一个使用触发器“进入时间范围 XYZ”的规则,让它将响铃模式更改为振动,这并不意味着手机会在时间范围结束时自动更改为响铃。如果想要的话,您需要指定另一个规则,使用另一个时间范围。</string>
|
||||
<string name="helpTextSound">在主屏幕上,您可以使用“锁定声音更改”来暂时禁用基于规则的声音更改。例如,您可能在通常允许响铃的情况或地点,但这一次响铃会打扰。一旦配置的时间过去,此功能将自动停用。点击 + 按钮以添加给定的时间。当此功能启用时,您可以使用切换按钮将其停用(即重新启用基于规则的声音更改)。</string>
|
||||
<string name="toggableRules">可切换规则</string>
|
||||
<string name="helpTextToggable">规则有一个称为“可切换”的设置。它的意思是执行规则后,相同触发器再次触发时,规则会以相反方式再次执行(如果适用的话)。目前这只能和 NFC 标签一起使用。如果在关联了可切换规则时触碰两次标签,就会执行与当前状态相反的操作,例如 WLAN 当前开启时将其关闭。</string>
|
||||
<string name="toggleableRules">可切换规则</string>
|
||||
<string name="helpTextToggleable">规则有一个称为“可切换”的设置。它的意思是执行规则后,相同触发器再次触发时,规则会以相反方式再次执行(如果适用的话)。目前这只能和 NFC 标签一起使用。如果在关联了可切换规则时触碰两次标签,就会执行与当前状态相反的操作,例如 WLAN 当前开启时将其关闭。</string>
|
||||
<string name="helpTextProcessMonitoring">如果指定了使用进程监控的规则,这个应用就会每 X 秒检查一次该进程(X 可以在设置中更改)。我知道这可能有点慢,但持续监控会很快耗尽电池电量。并且该事件没有来自操作系统的广播。</string>
|
||||
<string name="helpTitleEnergySaving">节能</string>
|
||||
<string name="helpTextEnergySaving">很多 Android 设备制造商试图通过限制应用的后台活动来节省电量。不幸的是,这通常会导致这些应用无法正常工作,Automation 就是其中之一。请看这个<a href="https://dontkillmyapp.com/">网页</a>,查找如何从这些限制中排除 Automation。</string>
|
||||
@@ -296,7 +296,6 @@
|
||||
<string name="nfcTagFoundWithText">找到标签,文本为:</string>
|
||||
<string name="nfcUnsupportedEncoding">不支持的编码:</string>
|
||||
<string name="nfcNoNdefIntentBut">没有 NFC NDEF Intent,但是</string>
|
||||
<string name="nfcNotSupportedInThisAndroidVersionYet">此 Android 版本尚不支持 NFC。</string>
|
||||
<string name="cantRunRule">无法运行规则。</string>
|
||||
<string name="nfcApplyTagToRule">将标签应用到规则</string>
|
||||
<string name="nfcTagReadSuccessfully">标签读取成功。</string>
|
||||
@@ -854,6 +853,7 @@
|
||||
<string name="notCharging">不充电</string>
|
||||
<string name="triggerChargingComment">仅当设备正在充电时,才会评估类型。如果未选择充电,它将以任何以前的充电类型点火。如果要对此进行评估,请考虑使用变量 trigger/action。</string>
|
||||
<string name="helpTextProfiles">配置文件是铃声、音量和其他音频相关设置的集合,您可以从规则中应用这些设置,也可以手动应用。\\n\\n还可以查询上次激活的配置文件作为触发器。在正常情况下,它只会查询配置文件是否是上次激活的配置文件(无论在此期间是否更改了特定的音频设置)。但您也可以比较各个设置。</string>
|
||||
<string name="serviceWontStartPermissions">没有对任何定义规则拥有完全权限。服务启动不了。</string>
|
||||
<string name="serviceWontStartNoActivatedRules">未定义已激活的规则。服务无法启动。</string>
|
||||
<string name="importChooseFolderNotice">在下面的对话框中,不要尝试选择特定文件,而是选择 Automation 备份文件所在的文件夹。如果禁用了 choose 按钮,则表示您发现了 Android 限制。在这种情况下,请先尝试将文件移动到子目录。</string>
|
||||
<string name="matches">吉贝斯</string>
|
||||
@@ -865,4 +865,25 @@
|
||||
<string name="version143StartOtherActivityHint">在 1.8.2 版本中,有必要修改保存启动其他程序的作的方式。无法确保兼容性。请检查并编辑您的启动其他活动作,以确保它们仍在工作。</string>
|
||||
<string name="disable">禁用</string>
|
||||
<string name="enable">使</string>
|
||||
<string name="uiThemeClassic">经典界面主题</string>
|
||||
<string name="uiThemeCompat">材质设计UI主题</string>
|
||||
<string name="permissionForegroundServiceTypeSpecialUseRequired">开始需要获得FOREGROUND_SERVICE_TYPE_SPECIAL_USE许可。</string>
|
||||
<string name="uiTheme">UI主题</string>
|
||||
<string name="uiThemeSummary">图形用户界面的主题。需要申请。</string>
|
||||
<string name="proximity">邻近</string>
|
||||
<string name="testArea">测试区</string>
|
||||
<string name="testAreaProximityComment">靠近你的设备测试它的反应。</string>
|
||||
<string name="deviceDoesntHaveProximitySensor">你的设备似乎没有接近传感器。</string>
|
||||
<string name="proximitySensorHint">接近传感器在不同型号上的工作方式不同。有些系统只显示近或远的二进制值,有些则可能报告更细致的数值。你可以用这个测试器看看它在设备上的表现。</string>
|
||||
<string name="close">关闭</string>
|
||||
<string name="far">远</string>
|
||||
<string name="proximityText">距离介于\"%1$s\"到\"%2$s\"之间。</string>
|
||||
<string name="pleaseWait">请稍候。</string>
|
||||
<string name="permissionRequiredBluetooth">编辑此规则需获得蓝牙权限。先从主界面请求权限。</string>
|
||||
<string name="settingName">设定名称</string>
|
||||
<string name="settingValue">设定值</string>
|
||||
<string name="enterAvalue">输入一个数值。</string>
|
||||
<string name="setSystemSettingCapital">集合系统设置</string>
|
||||
<string name="examplesWriteSecureSettings">我没有列出可能的设置。请自己找到这些设置。请参见(此处)一些 <a href="https://developer.android.com/reference/android/provider/Settings.Secure">不完整的</a> 示例。</string>
|
||||
<string name="httpParametersExplanation">如果参数名以 %1$s 开头且方法为 POST,则不会像其他参数(key=value)那样传输,而是作为主数据传输。如果参数以 %2$s 结尾,则不会进行编码。</string>
|
||||
</resources>
|
||||
@@ -12,6 +12,7 @@
|
||||
<string name="pleaseSpecifiyTrigger">Please specify at least one trigger.</string>
|
||||
<string name="pleaseSpecifiyAction">Please specify at least one action.</string>
|
||||
<string name="serviceWontStart">No rules defined. Service won\'t start.</string>
|
||||
<string name="serviceWontStartPermissions">Don\'t have full permissions for any defined rule. Service won\'t start.</string>
|
||||
<string name="serviceWontStartNoActivatedRules">No activated rules defined. Service won\'t start.</string>
|
||||
<string name="serviceStarted">Automation Service started.</string>
|
||||
<string name="version">Version %1$s.</string>
|
||||
@@ -130,8 +131,8 @@
|
||||
<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 OR leaving a timeframe. Either way a rule is triggered only once. So 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="helpTextSound">On the main screen you can use lock sound changes to temporarily avoid rule based sound changes. E.g. you may be in a situation or place where usually ringtones are ok, but this one time it would be disturbing. The feature will automatically deactivate once the configured time has elapsed. Click the + button to add the given amount of time. Once it is active you may deactivate it again using the toggle button (and that way enable rule based sound changes again).</string>
|
||||
<string name="toggableRules">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="toggleableRules">Toggleable rules</string>
|
||||
<string name="helpTextToggleable">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 toggleable 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="helpTitleEnergySaving">Energy saving</string>
|
||||
<string name="helpTextEnergySaving">Many Android device manufacturers try to save energy by limiting the background activity of running apps. Unfortunately that often results in those apps not working properly, Automation is amongst these. See this <a href="https://dontkillmyapp.com/">webpage</a> on how to find out how to exclude Automation from those measures.</string>
|
||||
@@ -366,7 +367,6 @@
|
||||
<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" translatable="false">Can\'t download anything. Amount of http requests in settings is lower than 1.</string>
|
||||
<string name="nfcApplyTagToRule">Apply tag to rule</string>
|
||||
@@ -834,7 +834,7 @@
|
||||
<string name="wifiExplanation1">Apps targeting Android Q or higher cannot turn wifi on or off anymore. Please blame Google for this restriction, not me. You can bypass this restriction by rooting your device and activating the checkbox below. Alternatively download this application from F-Droid or my website as I am not forced to target the latest API level in those versions.</string>
|
||||
<string name="wifiExplanation2">While airplane mode is activated, wifi can only be toggled from applications when using root permissions for that.</string>
|
||||
<string name="usingRoot">using root</string>
|
||||
<string name="runExecutableExplanation">You can select a script or an executable file here that will be executed as an action.\n\nBut there are some prerequisites which you have to deal with on your own. Google has made it very hard to run anything other than regular Android applications.\n\n1. The script needs to be marked as executable. On a regular Android system (without root) this is actually the hard part.\n\n2. That also means Automation must be able to execute the file, not just the owner or the group.\n\n3. If it is a script, a valid shell be specified in the script\'s header.\n\nIf you cannot meet the above requirements, you could alternatively try to specify a shell as the actual executable (like /system/bin/sh) and your script as parameter. That has worked for at least one user.</string>
|
||||
<string name="runExecutableExplanation">You can select a script or an executable file here that will be executed as an action.\n\nBut there are some prerequisites which you have to deal with on your own. Google has made it very hard to run anything other than regular Android applications.\n\n1. The script needs to be marked as executable. On a regular Android system (without root) this is actually the hard part.\n\n2. That also means Automation must be able to execute the file, not just the owner or the group.\n\n3. If it is a script, a valid shell must be specified in the script\'s header.\n\nIf you cannot meet the above requirements, you could alternatively try to specify a shell as the actual executable (like /system/bin/sh) and your script as parameter. That has worked for at least one user.</string>
|
||||
<string name="tetheringActive">tethering is active</string>
|
||||
<string name="tetheringNotActive">tethering is not active</string>
|
||||
<string name="tetheringState">Tethering state</string>
|
||||
@@ -962,4 +962,20 @@
|
||||
<string name="permissionForegroundServiceTypeSpecialUseRequired">Permission FOREGROUND_SERVICE_TYPE_SPECIAL_USE is required to start.</string>
|
||||
<string name="uiTheme">UI theme</string>
|
||||
<string name="uiThemeSummary">The theme of the graphical user interface. Application required.</string>
|
||||
<string name="proximity">Proximity</string>
|
||||
<string name="testArea">Test area</string>
|
||||
<string name="testAreaProximityComment">Approach your device to test how it reacts.</string>
|
||||
<string name="deviceDoesntHaveProximitySensor">Your device doesn\'t seem to have a proximity sensor.</string>
|
||||
<string name="proximitySensorHint">The proximity sensor works differently on every device model. On some it just reports close or far as binary values, on others it may report more granular values. You can use this tester to see how it behaves on your device.</string>
|
||||
<string name="close">close</string>
|
||||
<string name="far">far</string>
|
||||
<string name="proximityText">proximity is between \"%1$s\" and \"%2$s\"</string>
|
||||
<string name="pleaseWait">Please wait.</string>
|
||||
<string name="permissionRequiredBluetooth">Bluetooth permission required to edit this rule. Request permissions from the main screen first.</string>
|
||||
<string name="settingName">Setting name</string>
|
||||
<string name="settingValue">Setting value</string>
|
||||
<string name="enterAvalue">Enter a value.</string>
|
||||
<string name="setSystemSettingCapital">Set system setting</string>
|
||||
<string name="examplesWriteSecureSettings">I do not keep a list of possible settings. Please find those settings on your own. See <a href="https://developer.android.com/reference/android/provider/Settings.Secure">here</a> for some (incomplete) examples.</string>
|
||||
<string name="httpParametersExplanation">If any parameter name starts with %1$s while method is POST, it will not be transmitted like the other parameters (with key=value), but transferred as main data. If the parameter ends with %2$s, no encoding will be performed.</string>
|
||||
</resources>
|
||||
+3
-3
@@ -2,10 +2,10 @@
|
||||
buildscript {
|
||||
repositories {
|
||||
google()
|
||||
jcenter()
|
||||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:7.2.2'
|
||||
classpath 'com.android.tools.build:gradle:8.13.2'
|
||||
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
// in the individual module build.gradle files
|
||||
@@ -15,7 +15,7 @@ buildscript {
|
||||
allprojects {
|
||||
repositories {
|
||||
google()
|
||||
jcenter()
|
||||
mavenCentral()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
* Fixed: Crash in Play Store version when starting the service
|
||||
* Fixed: trigger url result was not stored correctly in a variable
|
||||
* Fixed: In case of HTTP errors during trigger url actions, the return value in the variable was not set according to documentation.
|
||||
* Fixed: Crash when clicking +/- when creating/editing TimeFrame trigger
|
||||
* Fixed: Permission BLUETOOTH_CONNECT requested for Bluetooth trigger editor in Google Play version
|
||||
* Fixed: Airplane mode trigger didn't work if no locations where defined.
|
||||
* Fixed: Vibrate action didn't work on some devices
|
||||
* Fixed: Variable trigger didn't always compare correctly.
|
||||
* Fixed: Permission check for ability to schedule exact timers
|
||||
* Fixed: Crash in Google Play version
|
||||
* Fixed: Added waiting period for vibrations and separate thread for trying a sequence.
|
||||
* Fixed: Buttons in NFC screen weren't enabled.
|
||||
* Fixed: NFC tag triggers didn't cause a second execution if a tag was removed and presented again.
|
||||
* Fixed: Package name in startActivity action was incorrectly set to an empty String instead of leaving it as null. That sometimes caused startActivity to have no effect.
|
||||
* Added Possibility to select UI theme, hence enabling modern UI designs
|
||||
@@ -0,0 +1,5 @@
|
||||
* Behoben: Die Set-WiFi-Aktion war beim Bearbeiten der Aktion nicht korrekt vorausgefüllt.
|
||||
* Behoben: Die Startprüfungen des Dienstes verbesserten sich, wenn keine Regeln mit vollständigen Berechtigungen vorhanden waren.
|
||||
* Behoben: Bluetooth-Berechtigung android.permission.BLUETOOTH_CONNECT ebenfalls zum Bearbeiten des Bluetooth-Triggers angefordert.
|
||||
* Behoben: URLs aus Benachrichtigungen öffneten sich nicht, wenn sie in einer Regel als Variable verwendet wurden.
|
||||
* Hinzugefügt: Aktion zur Änderung von Systemeinstellungen
|
||||
@@ -0,0 +1,2 @@
|
||||
* Hinzugefügt: Weitere Optionen für die Trigger-URL-Aktion hinzugefügt.
|
||||
* Hinzugefügt: Gradle und Bibliotheken aktualisiert.
|
||||
@@ -0,0 +1 @@
|
||||
* Geändert: MinSdk auf 19 erhöht, benötigt mindestens Android 4.4
|
||||
@@ -1,4 +1,15 @@
|
||||
* Fixed: Crash in Play Store version when starting the service
|
||||
* Fixed: trigger url result was not stored correctly in a variable
|
||||
* Fixed: In case of HTTP errors during trigger url actions, the return value in the variable was not set according to documentation.
|
||||
* Fixed: Crash when clicking +/- when creating/editing TimeFrame trigger
|
||||
* Fixed: Permission BLUETOOTH_CONNECT requested for Bluetooth trigger editor in Google Play version
|
||||
* Fixed: Airplane mode trigger didn't work if no locations where defined.
|
||||
* Fixed: Vibrate action didn't work on some devices
|
||||
* Fixed: Variable trigger didn't always compare correctly.
|
||||
* Fixed: Permission check for ability to schedule exact timers
|
||||
* Fixed: Crash in Google Play version
|
||||
* Fixed: Added waiting period for vibrations and separate thread for trying a sequence.
|
||||
* Fixed: Buttons in NFC screen weren't enabled.
|
||||
* Fixed: NFC tag triggers didn't cause a second execution if a tag was removed and presented again.
|
||||
* Fixed: Package name in startActivity action was incorrectly set to an empty String instead of leaving it as null. That sometimes caused startActivity to have no effect.
|
||||
* Added Possibility to select UI theme, hence enabling modern UI designs
|
||||
@@ -0,0 +1,5 @@
|
||||
* Fixed: Set-wifi action wasn't correctly pre-filled-out when editing action.
|
||||
* Fixed: Service startup checks improved when no rules with full permissions were present.
|
||||
* Fixed: Bluetooth permission android.permission.BLUETOOTH_CONNECT requested, also for editing Bluetooth trigger.
|
||||
* Fixed: URLs from notifications wouldn't open when used in a rule as a variable.
|
||||
* Added: Action to change system settings
|
||||
@@ -0,0 +1,2 @@
|
||||
* Added: Added further options to the trigger url action.
|
||||
* Added: Gradle and libraries updated.
|
||||
@@ -0,0 +1 @@
|
||||
* Changed: Raised minSdk to 19, requiring at minimum Android 4.4
|
||||
@@ -64,8 +64,8 @@ Supported actions:
|
||||
* Change location setting
|
||||
* Send text message
|
||||
|
||||
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 reasonably reported to me. But for that I'm dependend on your input.
|
||||
It's quite hard to keep this app working across the many different devices 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 reasonably reported to me. But for that I'm dependent on your input.
|
||||
|
||||
If you have a problem and think about contacting me please
|
||||
- update to the latest version first and see if your problem persists there, too.
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
* Corregido: Fallo en la versión de Play Store al iniciar el servicio
|
||||
* Corregido: el resultado de la URL de disparo no se almacenó correctamente en una variable
|
||||
* Corregido: En caso de errores HTTP durante las acciones de la URL de disparo, el valor de retorno en la variable no se estableció según la documentación.
|
||||
* Corregido: Se cierra al hacer clic +/- al crear/editar el disparador TimeFrame
|
||||
* Corregido: Se solicita permiso BLUETOOTH_CONNECT para el editor de disparos Bluetooth en la versión de Google Play
|
||||
* Corregido: El disparador en modo avión no funcionaba si no se definían ubicaciones.
|
||||
* Corregido: La acción vibratoria no funcionó en algunos dispositivos
|
||||
* Corregido: El disparador variable no siempre se comparaba correctamente.
|
||||
* Corregido: Comprobación de permisos para la capacidad de programar temporizadores exactos
|
||||
* Corregido: Bloqueo en la versión de Google Play
|
||||
* Corregido: Se añadió el periodo de espera para vibraciones y un hilo separado para probar una secuencia.
|
||||
* Corregido: Los botones en la pantalla NFC no estaban activados.
|
||||
* Corregido: Los disparadores de etiquetas NFC no provocaban una segunda ejecución si una etiqueta se eliminaba y se mostraba de nuevo.
|
||||
* Corregido: El nombre del paquete en la acción startActivity se estableció incorrectamente como una cadena vacía en lugar de dejarla como nula. Eso a veces hacía que startActivity no tuviera ningún efecto.
|
||||
* Se añadió la posibilidad de seleccionar el tema de la interfaz, permitiendo así diseños modernos de interfazes
|
||||
@@ -0,0 +1,5 @@
|
||||
* Corregido: La acción set-wifi no estaba correctamente pre-rellenada al editar la acción.
|
||||
* Corregido: Las comprobaciones de inicio de servicio mejoraron cuando no había reglas con permisos completos.
|
||||
* Corregido: se solicita permiso Bluetooth android.permission.BLUETOOTH_CONNECT también para editar el disparador Bluetooth.
|
||||
* Corregido: Las URLs de notificaciones no se abrían cuando se usaban en una regla como variable.
|
||||
* Añadido: Acción para cambiar la configuración del sistema
|
||||
@@ -0,0 +1,2 @@
|
||||
* Añadido: Se añadieron más opciones a la acción de disparar URL.
|
||||
* Añadido: Gradle y bibliotecas actualizadas.
|
||||
@@ -0,0 +1 @@
|
||||
* Cambiado: Subido minSdk a 19, requiriendo al mínimo Android 4.4
|
||||
@@ -0,0 +1,15 @@
|
||||
* Corrigé : plantage dans la version Play Store lors du lancement du service
|
||||
* Corrigé : le résultat de l'URL de déclenchement n'a pas été correctement stocké dans une variable
|
||||
* Corrigé : En cas d'erreurs HTTP lors des actions d'URL de déclenchement, la valeur de retour dans la variable n'a pas été définie selon la documentation.
|
||||
* Corrigé : Plantage lors du clic +/- lors de la création/modification du déclencheur TimeFrame
|
||||
* Corrigé : Permission BLUETOOTH_CONNECT demandée pour l'éditeur de déclencheurs Bluetooth dans la version Google Play
|
||||
* Corrigé : Le déclencheur en mode avion ne fonctionnait pas si aucun emplacement n'était défini.
|
||||
* Corrigé : L'action vibrante ne fonctionnait pas sur certains appareils
|
||||
* Corrigé : Le déclencheur variable ne correspondait pas toujours correctement.
|
||||
* Corrigé : Vérification des permissions pour la possibilité de programmer des minuteurs exacts
|
||||
* Corrigé : plantage dans la version Google Play
|
||||
* Corrigé : Délai d'attente ajouté pour les vibrations et fil séparé pour essayer une séquence.
|
||||
* Corrigé : Les boutons de l'écran NFC n'étaient pas activés.
|
||||
* Corrigé : Les déclencheurs de balises NFC ne provoquaient pas une seconde exécution si une balise était retirée et présentée à nouveau.
|
||||
* Corrigé : Le nom du paquet dans l'action startActivity a été incorrectement défini sur une chaîne vide au lieu de la laisser nulle. Cela empêchait parfois startActivity d'avoir aucun effet.
|
||||
* Possibilité supplémentaire de sélectionner le thème de l'interface utilisateur, permettant ainsi des conceptions modernes d'interfaces utilisateur
|
||||
@@ -0,0 +1,5 @@
|
||||
* Corrigé : L'action set-wifi n'était pas correctement préremplie lors de l'édition de l'action.
|
||||
* Corrigé : Les vérifications de démarrage de service se sont améliorées lorsqu'aucune règle avec des autorisations complètes n'était présente.
|
||||
* Corrigé : autorisation Bluetooth android.permission.BLUETOOTH_CONNECT demandée, également pour modifier le déclencheur Bluetooth.
|
||||
* Corrigé : Les URL issues des notifications ne s'ouvraient pas lorsqu'elles étaient utilisées dans une règle comme variable.
|
||||
* Ajouté : Action pour modifier les paramètres système
|
||||
@@ -0,0 +1,2 @@
|
||||
* Ajouté : Ajout d'options supplémentaires à l'action de déclenchement de l'URL.
|
||||
* Ajouté : Gradle et bibliothèques mises à jour.
|
||||
@@ -0,0 +1 @@
|
||||
* Modifié : Portée du minSdk à 19, nécessitant au minimum Android 4.4
|
||||
@@ -0,0 +1,15 @@
|
||||
* Corretto: crash nella versione Play Store all'avvio del servizio
|
||||
* Corretto: il risultato dell'URL di trigger non è stato memorizzato correttamente in una variabile
|
||||
* Corretto: In caso di errori HTTP durante le azioni dell'URL di trigger, il valore di ritorno nella variabile non è stato impostato secondo la documentazione.
|
||||
* Corretto: crash quando clicca +/- quando si crea/modifica il trigger TimeFrame
|
||||
* Corretto: Richiesta BLUETOOTH_CONNECT permesso per l'editor di trigger Bluetooth nella versione di Google Play
|
||||
* Corretto: il trigger della modalità aereo non funzionava se non erano definite le località.
|
||||
* Corretto: l'azione vibratoria non funzionava su alcuni dispositivi
|
||||
* Corretto: Il grilletto variabile non sempre si confrontava correttamente.
|
||||
* Corretto: Controllo dei permessi per la possibilità di programmare timer esatti
|
||||
* Corretto: crash nella versione Google Play
|
||||
* Corretto: Periodo di attesa aggiunto per le vibrazioni e thread separato per provare una sequenza.
|
||||
* Corretto: I pulsanti nello schermo NFC non erano attivati.
|
||||
* Corretto: i trigger dei tag NFC non causavano una seconda esecuzione se un tag veniva rimosso e presentato di nuovo.
|
||||
* Correto: Il nome del pacchetto nell'azione startActivity era impostato erroneamente come una stringa vuota invece di lasciarla come null. Questo a volte causava che startActivity non avesse alcun effetto.
|
||||
* Aggiunta la possibilità di selezionare il tema UI, permettendo così design moderni di UI
|
||||
@@ -0,0 +1,5 @@
|
||||
* Corretto: l'azione set-wifi non era correttamente pre-compilata durante l'azione di montaggio.
|
||||
* Corretto: I controlli di avvio del servizio sono migliorati quando non erano presenti regole con permessi completi.
|
||||
* Corretto: android.permission.BLUETOOTH_CONNECT richiesto il permesso Bluetooth, anche per modificare il trigger Bluetooth.
|
||||
* Corretto: gli URL delle notifiche non si aprivano quando venivano usati in una regola come variabile.
|
||||
* Aggiunto: Azione per modificare le impostazioni di sistema
|
||||
@@ -0,0 +1,2 @@
|
||||
* Aggiunto: Aggiunte ulteriori opzioni all'azione di trigger URL.
|
||||
* Aggiunto: Gradle e biblioteche aggiornate.
|
||||
@@ -0,0 +1 @@
|
||||
* Modificato: Aumentato il minSdk a 19, richiedendo almeno Android 4.4
|
||||
@@ -0,0 +1,15 @@
|
||||
* Opgelost: Crash in Play Store-versie bij het starten van de dienst
|
||||
* Opgelost: trigger-urlresultaat werd niet correct opgeslagen in een variabele
|
||||
* Opgelost: In geval van HTTP-fouten tijdens trigger-url-acties werd de returnwaarde in de variabele niet ingesteld volgens de documentatie.
|
||||
* Opgelost: Crash bij het klikken op +/- bij het maken/bewerken van de TimeFrame-trigger
|
||||
* Opgelost: Toestemming BLUETOOTH_CONNECT gevraagd voor Bluetooth trigger-editor in de Google Play-versie
|
||||
* Opgelost: De vliegtuigmodus-trigger werkte niet als er geen locaties werden gedefinieerd.
|
||||
* Vast: Vibratieactie werkte niet op sommige apparaten
|
||||
* Opgelost: Variabele trigger vergeleken niet altijd correct.
|
||||
* Opgelost: Toestemmingscontrole voor de mogelijkheid om exacte timers te plannen
|
||||
* Opgelost: Crash in de Google Play-versie
|
||||
* Opgelost: Wachttijd toegevoegd voor trillingen en aparte draad voor het proberen van een sequentie.
|
||||
* Opgelost: Knoppen in het NFC-scherm waren niet ingeschakeld.
|
||||
* Opgelost: NFC-tag-triggers veroorzaakten geen tweede uitvoering als een tag werd verwijderd en opnieuw werd weergegeven.
|
||||
* Opgelost: Pakketnaam in de startActivity-actie werd verkeerd ingesteld op een lege string in plaats van deze als null te laten. Dat zorgde er soms voor dat startActivity geen effect had.
|
||||
* Mogelijkheid toegevoegd om UI-thema te selecteren, waardoor moderne UI-ontwerpen mogelijk zijn
|
||||
@@ -0,0 +1,5 @@
|
||||
* Opgelost: De set-wifi-actie was niet correct vooraf ingevuld bij het bewerken.
|
||||
* Opgelost: Service-opstartcontroles verbeterden wanneer er geen regels met volledige rechten aanwezig waren.
|
||||
* Opgelost: Bluetooth-toestemming android.permission.BLUETOOTH_CONNECT aangevraagd, ook voor het bewerken van de Bluetooth-trigger.
|
||||
* Opgelost: URL's van meldingen openden niet wanneer ze als variabele in een regel werden gebruikt.
|
||||
* Toegevoegd: Actie om systeeminstellingen te wijzigen
|
||||
@@ -0,0 +1,2 @@
|
||||
* Toegevoegd: Extra opties toegevoegd aan de trigger-urlactie.
|
||||
* Toegevoegd: Gradle en bibliotheken bijgewerkt.
|
||||
@@ -0,0 +1 @@
|
||||
* Gewijzigd: minSdk verhoogd naar 19, minimaal Android 4.4 vereist
|
||||
@@ -0,0 +1,15 @@
|
||||
* Naprawiono: Awaria w wersji ze sklepu Play podczas uruchamiania usługi
|
||||
* Naprawione: wynik URL wyzwalacza nie został poprawnie zapisany w zmiennej
|
||||
* Naprawione: W przypadku błędów HTTP podczas akcji trigger url, wartość zwrotu w zmiennej nie była ustalana zgodnie z dokumentacją.
|
||||
* Naprawione: Crash po kliknięciu +/- podczas tworzenia/edytowania wyzwalacza TimeFrame
|
||||
* Naprawiono: Wymagano BLUETOOTH_CONNECT zgody na edytor wyzwalaczy Bluetooth w wersji Google Play
|
||||
* Naprawione: Wyzwalacz trybu samolotowego nie działał, jeśli nie były zdefiniowane żadne lokalizacje.
|
||||
* Naprawione: Wibracja nie działała na niektórych urządzeniach
|
||||
* Naprawione: Zmienny spust nie zawsze się poprawnie porównywał.
|
||||
* Naprawione: Sprawdzenie zgody na możliwość dokładnego harmonogramowania timerów
|
||||
* Naprawiono: Awaria w wersji Google Play
|
||||
* Naprawione: Dodano okres oczekiwania na wibracje i osobny wątek do próby sekwencji.
|
||||
* Naprawione: Przyciski na ekranie NFC nie były włączone.
|
||||
* Naprawiono: wyzwalacze tagów NFC nie powodowały drugiego uruchomienia, jeśli tag został usunięty i ponownie wyświetlony.
|
||||
* Naprawione: Nazwa pakietu w akcji startActivity została błędnie ustawiona na pusty ciąg znaków zamiast pozostawić go jako null. Czasami powodowało to, że startActivity nie miało żadnego wpływu.
|
||||
* Dodana możliwość wyboru motywu UI, co umożliwia nowoczesne projekty UI
|
||||
@@ -0,0 +1,5 @@
|
||||
* Naprawiono: Akcja set-wifi nie była poprawnie wypełniona podczas edycji.
|
||||
* Naprawiono: Poprawiono kontrole uruchamiania usług, gdy nie było reguł z pełnymi uprawnieniami.
|
||||
* Naprawiono: żądanie android.permission.BLUETOOTH_CONNECT uprawnień do Bluetooth również do edycji wyzwalacza Bluetooth.
|
||||
* Naprawiono: adresy URL z powiadomień nie otwierały się, gdy były używane w regułzie jako zmienna.
|
||||
* Dodano: Akcja zmiany ustawień systemu
|
||||
@@ -0,0 +1,2 @@
|
||||
* Dodano: Dodano dodatkowe opcje akcji trigger url.
|
||||
* Dodano: Zaktualizowano Gradle i biblioteki.
|
||||
@@ -0,0 +1 @@
|
||||
* Zmieniono: Podniesiono minSdk do 19, wymagając co najmniej Androida 4.4
|
||||
@@ -0,0 +1,15 @@
|
||||
* Исправлено: вылеты в версии Play Store при запуске сервиса
|
||||
* Исправлено: результат URL-триггера был некорректно сохранён в переменной
|
||||
* Исправлено: в случае ошибок HTTP во время действий триггера URL возвратное значение в переменной не было установлено согласно документации.
|
||||
* Исправлено: вылеты при нажатии +/- при создании/редактировании триггера TimeFrame
|
||||
* Исправлено: запро BLUETOOTH_CONNECT шено разрешение на редактор триггеров Bluetooth в версии Google Play
|
||||
* Исправлено: триггер режима самолёта не работал, если локации не были определены.
|
||||
* Исправлено: вибрация не работала на некоторых устройствах
|
||||
* Исправлено: Переменный триггер не всегда совпадал правильно.
|
||||
* Исправлено: проверка разрешения на возможность распланировать точные таймеры
|
||||
* Исправлено: сбой в версии Google Play
|
||||
* Исправлено: добавлен период ожидания вибраций и отдельная резьба для пробы последовательности.
|
||||
* Исправлено: кнопки на экране NFC не были включены.
|
||||
* Исправлено: триггеры NFC-тегов не вызывали второе выполнение при удалении и повторном представлении тега.
|
||||
* Исправлено: имя пакета в действии startActivity было неправильно установлено на пустую строку вместо того, чтобы оставить её как null. Иногда это не приводило к тому, что startActivity не действовала.
|
||||
* Добавлена возможность выбора темы интерфейса, что позволило создать современные дизайны интерфейса
|
||||
@@ -0,0 +1,5 @@
|
||||
* Исправлено: действие set-wifi было некорректно заполнено при редактировании.
|
||||
* Исправлено: Проверки запуска сервиса улучшились, когда не было правил с полными правами.
|
||||
* Исправлено: android.permission.BLUETOOTH_CONNECT запрошён Bluetooth-разрешение, также для редактирования Bluetooth-триггера.
|
||||
* Исправлено: URL-адреса уведомлений не открывались при использовании в правиле как переменной.
|
||||
* Добавлено: действие по изменению настроек системы
|
||||
@@ -0,0 +1,2 @@
|
||||
* Добавлено: добавлены дополнительные опции к действию триггера URL.
|
||||
* Добавлено: обновлены Gradle и библиотеки.
|
||||
@@ -0,0 +1 @@
|
||||
* Изменено: minSdk повышен до 19, требуется минимум Android 4.4
|
||||
@@ -0,0 +1,15 @@
|
||||
* 已修复:启动服务时 Play 商店版本崩溃
|
||||
* 已修复:触发URL结果未正确存储在变量中
|
||||
* 已修复:在触发 URL作中出现 HTTP 错误时,文档中未设置变量的返回值。
|
||||
* 已修复:创建/编辑时间框架触发器时点击 +/- 时会崩溃
|
||||
* 已修复:BLUETOOTH_CONNECT请求在 Google Play 版本中使用蓝牙触发编辑器的权限
|
||||
* 已修复:如果没有指定位置,飞行模式触发器无法使用。
|
||||
* 已修复:振动动作在某些设备上无法使用
|
||||
* 修正:可变触发器并不总是能正确比较。
|
||||
* 已修复:权限检查以确定准确定时器
|
||||
* 已修复:Google Play版本崩溃
|
||||
* 修正:增加了振动等待时间,并有单独的线程用于尝试序列。
|
||||
* 已修复:NFC屏幕中的按钮未被启用。
|
||||
* 修正:如果标签被移除并再次呈现,NFC标签触发不会导致第二次执行。
|
||||
* 已修复:startActivity 动作中的包名错误地设置为空字符串,而不是保持空。这有时会导致startActivity没有效果。
|
||||
* 增加了选择UI主题的功能,从而实现了现代UI设计
|
||||
@@ -0,0 +1,5 @@
|
||||
* 已修复:编辑作时,设置-wifi动作没有正确预先填写。
|
||||
* 修复:在没有完全权限规则存在时,服务启动检查得到了改进。
|
||||
* 已修复:请求蓝牙权限android.permission.BLUETOOTH_CONNECT,也用于编辑蓝牙触发器。
|
||||
* 已修复:通知中的URL作为变量在规则中使用时无法打开。
|
||||
* 新增:更改系统设置的作
|
||||
@@ -0,0 +1,2 @@
|
||||
* 新增:为触发URL动作增加了更多选项。
|
||||
* 新增:Gradle及图书馆更新。
|
||||
@@ -0,0 +1 @@
|
||||
* 更改:将 minSDK 提升至 19,至少要求 Android 4.4
|
||||
+4
-1
@@ -16,4 +16,7 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
|
||||
# https://developer.android.com/topic/libraries/support-library/androidx-rn
|
||||
android.useAndroidX=true
|
||||
# Automatically convert third-party libraries to use AndroidX
|
||||
android.enableJetifier=true
|
||||
android.enableJetifier=true
|
||||
android.defaults.buildfeatures.buildconfig=true
|
||||
android.nonTransitiveRClass=false
|
||||
android.nonFinalResIds=false
|
||||
+1
-1
@@ -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-7.3.3-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
|
||||
|
||||
Reference in New Issue
Block a user