Compare commits

..

No commits in common. "master" and "development-stable" have entirely different histories.

311 changed files with 1919 additions and 14992 deletions

2
.gitignore vendored
View File

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

View File

@ -8,11 +8,11 @@ android {
defaultConfig { defaultConfig {
applicationId "com.jens.automation2" applicationId "com.jens.automation2"
minSdkVersion 16 minSdkVersion 16
compileSdkVersion 33 compileSdkVersion 31
buildToolsVersion '29.0.2' buildToolsVersion '29.0.2'
useLibrary 'org.apache.http.legacy' useLibrary 'org.apache.http.legacy'
versionCode 142 versionCode 120
versionName "1.8.1" versionName "1.7.6"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
} }
@ -36,15 +36,9 @@ android {
{ {
dimension "version" dimension "version"
versionNameSuffix "-googlePlay" versionNameSuffix "-googlePlay"
targetSdkVersion 33 targetSdkVersion 30
} }
/*
targetSdkVersion is kept at 28 for as long as possible.
If raised wifi cannot be switched on or off anymore without root permissions.
In the Google version I'm forced to raise the value regularly.
*/
fdroidFlavor fdroidFlavor
{ {
dimension "version" dimension "version"
@ -78,9 +72,9 @@ dependencies {
//implementation "androidx.security:security-crypto:1.0.0" //implementation "androidx.security:security-crypto:1.0.0"
//implementation "androidx.security:security-identity-credential:1.0.0-alpha02" //implementation "androidx.security:security-identity-credential:1.0.0-alpha02"
implementation 'androidx.appcompat:appcompat:1.4.2' implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'com.google.android.material:material:1.6.1' implementation 'com.google.android.material:material:1.3.0'
testImplementation 'junit:junit:4' testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
} }

View File

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

View File

@ -1,7 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest <manifest xmlns:android="http://schemas.android.com/apk/res/android">
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<supports-screens <supports-screens
android:anyDensity="true" android:anyDensity="true"
@ -52,6 +50,7 @@
<uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" />
<!-- <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />-->
<uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.NFC" /> <uses-permission android:name="android.permission.NFC" />
@ -67,18 +66,6 @@
<uses-permission android:name="com.wireguard.android.permission.CONTROL_TUNNELS"/> <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.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/> <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-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.SCHEDULE_EXACT_ALARM"/>
<!--android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.USE_EXACT_ALARM" />-->
<uses-feature <uses-feature
android:name="android.hardware.telephony" android:name="android.hardware.telephony"
@ -96,7 +83,7 @@
<application <application
android:allowBackup="true" android:allowBackup="true"
android:allowClearUserData="true" android:allowClearUserData="true"
android:icon="@drawable/ic_launcher" android:icon="@drawable/gears"
android:label="@string/app_name" android:label="@string/app_name"
android:theme="@style/AppTheme" android:theme="@style/AppTheme"
android:networkSecurityConfig="@xml/network_security_config"> android:networkSecurityConfig="@xml/network_security_config">
@ -139,7 +126,6 @@
</intent-filter> </intent-filter>
</receiver> </receiver>
<receiver android:name=".receivers.PackageReplacedReceiver" <receiver android:name=".receivers.PackageReplacedReceiver"
android:exported="true"
android:enabled="true"> android:enabled="true">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MY_PACKAGE_REPLACED" /> <action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
@ -148,11 +134,9 @@
<receiver android:name=".receivers.DateTimeListener" /> <receiver android:name=".receivers.DateTimeListener" />
<receiver android:name=".receivers.ConnectivityReceiver" /> <receiver android:name=".receivers.ConnectivityReceiver" />
<receiver android:name=".receivers.TimeZoneListener" /> <receiver android:name=".receivers.TimeZoneListener" />
<receiver android:name=".receivers.CalendarReceiver" />
<receiver <receiver
android:name=".DeviceAdmin" android:name=".DeviceAdmin"
android:exported="true"
android:description="@string/app_name" android:description="@string/app_name"
android:label="@string/app_name" android:label="@string/app_name"
android:permission= "android.permission.BIND_DEVICE_ADMIN" > android:permission= "android.permission.BIND_DEVICE_ADMIN" >
@ -182,21 +166,8 @@
<activity android:name=".ActivityManageActionVibrate" /> <activity android:name=".ActivityManageActionVibrate" />
<activity android:name=".ActivityManageActionControlMedia" /> <activity android:name=".ActivityManageActionControlMedia" />
<activity android:name=".ActivityManageActionSendBroadcast" /> <activity android:name=".ActivityManageActionSendBroadcast" />
<activity android:name=".ActivityManageActionRunExecutable" />
<activity android:name=".ActivityManageActionWifi" />
<activity android:name=".ActivityManageTriggerTethering" />
<activity android:name=".ActivityManageActionWakeLock" />
<activity android:name=".ActivityManageTriggerSubSystemState" />
<activity android:name=".ActivityManageActionMakePhoneCall" />
<activity android:name=".ActivityManageActionSetVariable" />
<activity android:name=".ActivityManageTriggerCheckVariable" />
<activity android:name=".ActivityManageActionCopyToClipboard" />
<activity android:name=".ActivityManageActionLocationService" />
<activity android:name=".ActivityManageTriggerCharging" />
<activity <activity
android:name=".ActivityMainTabLayout" android:name=".ActivityMainTabLayout"
android:exported="true"
android:launchMode="singleTask"> android:launchMode="singleTask">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
@ -242,11 +213,9 @@
<activity android:name=".ActivityVolumeTest" /> <activity android:name=".ActivityVolumeTest" />
<activity android:name=".ActivityPermissions"></activity> <activity android:name=".ActivityPermissions"></activity>
<activity android:name=".ActivityManageTriggerNotification" /> <activity android:name=".ActivityManageTriggerNotification" />
<activity android:name=".ActivityManageTriggerCalendar" />
<service <service
android:name=".receivers.NotificationListener" android:name=".receivers.NotificationListener"
android:exported="true"
android:label="@string/app_name" android:label="@string/app_name"
android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE" > android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE" >
<intent-filter> <intent-filter>
@ -278,17 +247,6 @@
android:exported="true" android:exported="true"
/> />
<service android:name=".MyAccessibilityService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/config_accessibility_service" />
</service>
</application> </application>
</manifest> </manifest>

View File

@ -18,7 +18,7 @@ public class MyGoogleApiClient
public com.google.android.gms.appindexing.Action getIndexApiAction() public com.google.android.gms.appindexing.Action getIndexApiAction()
{ {
Thing object = new Thing.Builder() Thing object = new Thing.Builder()
.setName("ActivityMainScreen Page") .setName("ActivityMainScreen Page") // TODO: Define a title for the content shown.
// TODO: Make sure this auto-generated URL is correct. // TODO: Make sure this auto-generated URL is correct.
.setUrl(Uri.parse("http://[ENTER-YOUR-URL-HERE]")) .setUrl(Uri.parse("http://[ENTER-YOUR-URL-HERE]"))
.build(); .build();

View File

@ -10,12 +10,9 @@ import android.os.Looper;
import android.util.Log; import android.util.Log;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.Nullable;
import com.google.android.gms.location.DetectedActivity; import com.google.android.gms.location.DetectedActivity;
import com.jens.automation2.receivers.ActivityDetectionReceiver; import com.jens.automation2.receivers.ActivityDetectionReceiver;
import com.jens.automation2.receivers.BroadcastListener; import com.jens.automation2.receivers.BroadcastListener;
import com.jens.automation2.receivers.CalendarReceiver;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
@ -110,7 +107,7 @@ public class Rule implements Comparable<Rule>
} }
public void setName(String name) public void setName(String name)
{ {
this.name = name.trim(); this.name = name;
} }
public static void readFromFile() public static void readFromFile()
@ -350,17 +347,8 @@ public class Rule implements Comparable<Rule>
if(oneTrigger.getTriggerType().equals(Trigger.Trigger_Enum.timeFrame)) if(oneTrigger.getTriggerType().equals(Trigger.Trigger_Enum.timeFrame))
{ {
if(oneTrigger.getTimeFrame().repetition > 0) if(oneTrigger.getTimeFrame().repetition > 0)
{
if(this.getLastExecution() != null)
{
Calendar now = Calendar.getInstance();
if (this.getLastExecution().getTimeInMillis() + oneTrigger.getTimeFrame().getRepetition() * 1000 <= now.getTimeInMillis())
return true; return true;
} }
else
return true;
}
}
else if(oneTrigger.getTriggerType().equals(Trigger.Trigger_Enum.broadcastReceived)) else if(oneTrigger.getTriggerType().equals(Trigger.Trigger_Enum.broadcastReceived))
{ {
return oneTrigger.getTriggerParameter() == BroadcastListener.getInstance().hasBroadcastOccurredSince(oneTrigger.getTriggerParameter2(), getLastExecution()); return oneTrigger.getTriggerParameter() == BroadcastListener.getInstance().hasBroadcastOccurredSince(oneTrigger.getTriggerParameter2(), getLastExecution());
@ -376,19 +364,14 @@ public class Rule implements Comparable<Rule>
{ {
if(hasNotAppliedSinceLastExecution()) if(hasNotAppliedSinceLastExecution())
{ {
Miscellaneous.logEvent("i", "getsGreenLight()", "Rule \"" + getName() + "\" applies and has flipped since its last execution.", 4); Miscellaneous.logEvent("i", "getsGreenLight()", "Rule " + getName() + " applies and has flipped since its last execution.", 4);
return true;
}
else if(hasTriggerOfType(Trigger.Trigger_Enum.calendarEvent) && CalendarReceiver.mayRuleStillBeActivatedForPendingCalendarEvents(this))
{
Miscellaneous.logEvent("i", "getsGreenLight()", "Rule \"" + getName() + "\" applies, has not flipped since its last execution, but may still be executed for other calendar events.", 4);
return true; return true;
} }
else else
Miscellaneous.logEvent("i", "getsGreenLight()", "Rule \"" + getName() + "\" has not flipped since its last execution.", 4); Miscellaneous.logEvent("i", "getsGreenLight()", "Rule " + getName() + " has not flipped since its last execution.", 4);
} }
else else
Miscellaneous.logEvent("i", "getsGreenLight()", "Rule \"" + getName() + "\" does not apply.", 4); Miscellaneous.logEvent("i", "getsGreenLight()", "Rule " + getName() + " does not apply.", 4);
return false; return false;
} }
@ -397,7 +380,7 @@ public class Rule implements Comparable<Rule>
{ {
if(AutomationService.getInstance() == null) if(AutomationService.getInstance() == null)
{ {
Miscellaneous.logEvent("i", "RuleCheck", "Automation service not running. Rule \"" + getName() + "\" cannot apply.", 3); Miscellaneous.logEvent("i", "RuleCheck", "Automation service not running. Rule " + getName() + " cannot apply.", 3);
return false; return false;
} }
@ -409,11 +392,11 @@ public class Rule implements Comparable<Rule>
return false; return false;
} }
Miscellaneous.logEvent("i", String.format(context.getResources().getString(R.string.ruleCheckOf), this.getName()), String.format("Rule \"%1$s\" generally applies currently. Checking if it's really due, yet will be done separately.", this.getName()), 3); Miscellaneous.logEvent("i", String.format(context.getResources().getString(R.string.ruleCheckOf), this.getName()), String.format("Rule %1$s generally applies currently. Checking if it's really due, yet will be done separately.", this.getName()), 3);
return true; return true;
} }
Miscellaneous.logEvent("i", String.format(context.getResources().getString(R.string.ruleCheckOf), this.getName()), String.format(context.getResources().getString(R.string.ruleIsDeactivatedCantApply), this.getName()), 4); Miscellaneous.logEvent("i", String.format(context.getResources().getString(R.string.ruleCheckOf), this.getName()), String.format(context.getResources().getString(R.string.ruleIsDeactivatedCantApply), this.getName()), 3);
return false; return false;
} }
@ -484,8 +467,6 @@ public class Rule implements Comparable<Rule>
{ {
AutomationService service = AutomationService.getInstance(); AutomationService service = AutomationService.getInstance();
service.speak(messages[0], false); service.speak(messages[0], false);
if(Settings.showToasts)
Toast.makeText(service, messages[0], Toast.LENGTH_LONG).show(); Toast.makeText(service, messages[0], Toast.LENGTH_LONG).show();
super.onProgressUpdate(messages); super.onProgressUpdate(messages);
@ -515,7 +496,7 @@ public class Rule implements Comparable<Rule>
{ {
boolean isActuallyToggleable = isActuallyToggable(); boolean isActuallyToggleable = isActuallyToggable();
// boolean notLastActive = getLastActivatedRule() == null || !getLastActivatedRule().equals(Rule.this); boolean notLastActive = getLastActivatedRule() == null || !getLastActivatedRule().equals(Rule.this);
boolean doToggle = ruleToggle && isActuallyToggleable; boolean doToggle = ruleToggle && isActuallyToggleable;
String message; String message;
@ -529,29 +510,6 @@ public class Rule implements Comparable<Rule>
if(Settings.startNewThreadForRuleActivation) if(Settings.startNewThreadForRuleActivation)
publishProgress(message); publishProgress(message);
/*
Make a note of Rule/CalendarEvent executed combinations
*/
if(Rule.this.hasTriggerOfType(Trigger.Trigger_Enum.calendarEvent))
{
for(CalendarReceiver.CalendarEvent event : CalendarReceiver.getApplyingCalendarEvents(Rule.this))
{
if(!CalendarReceiver.hasEventBeenUsedInRule(Rule.this, event))
{
/*
Record only the first calendar event that matched because the rule may
be executed once for every matching event.
*/
Miscellaneous.logEvent("i", "Rule", "Executing this rule run for calender event: " + event, 5);
CalendarReceiver.addUsedPair(new CalendarReceiver.RuleEventPair(Rule.this, event));
break;
}
}
}
/*
Run actions one after another
*/
for(int i = 0; i< Rule.this.getActionSet().size(); i++) for(int i = 0; i< Rule.this.getActionSet().size(); i++)
{ {
try try
@ -811,71 +769,4 @@ public class Rule implements Comparable<Rule>
return null; return null;
} }
@Override
public boolean equals(@Nullable Object obj)
{
return this.getName().equals(((Rule)obj).getName());
}
public boolean hasTriggerOfType(Trigger.Trigger_Enum queryType)
{
for(Trigger t : getTriggerSet())
{
if(t.getTriggerType().equals(queryType))
return true;
}
return false;
}
public boolean hasActionOfType(Action.Action_Enum queryType)
{
for(Action a : getActionSet())
{
if(a.getAction().equals(queryType))
return true;
}
return false;
}
public int getAmountOfTriggersForType(Trigger.Trigger_Enum type)
{
int amount = 0;
for(Trigger t : getTriggerSet())
{
if(t.getTriggerType().equals(type))
amount++;
}
return amount;
}
public int getAmountOfActionsForType(Action.Action_Enum type)
{
int amount = 0;
for(Action a : getActionSet())
{
if(a.getAction().equals(type))
amount++;
}
return amount;
}
public static int getAmountOfActivatedRules()
{
int amount = 0;
for(Rule r : Rule.getRuleCollection())
{
if(r.isRuleActive())
amount++;
}
return amount;
}
} }

View File

@ -1,7 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest <manifest xmlns:android="http://schemas.android.com/apk/res/android">
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<supports-screens <supports-screens
android:anyDensity="true" android:anyDensity="true"
@ -52,6 +50,7 @@
<uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" />
<!-- <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />-->
<uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.NFC" /> <uses-permission android:name="android.permission.NFC" />
@ -65,17 +64,6 @@
<uses-permission android:name="com.wireguard.android.permission.CONTROL_TUNNELS"/> <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.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/> <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-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.SCHEDULE_EXACT_ALARM"/>
<!--android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.USE_EXACT_ALARM" />-->
<uses-feature <uses-feature
android:name="android.hardware.telephony" android:name="android.hardware.telephony"
@ -93,7 +81,7 @@
<application <application
android:allowBackup="true" android:allowBackup="true"
android:allowClearUserData="true" android:allowClearUserData="true"
android:icon="@drawable/ic_launcher" android:icon="@drawable/gears"
android:label="@string/app_name" android:label="@string/app_name"
android:theme="@style/AppTheme" android:theme="@style/AppTheme"
android:networkSecurityConfig="@xml/network_security_config"> android:networkSecurityConfig="@xml/network_security_config">
@ -136,7 +124,6 @@
</intent-filter> </intent-filter>
</receiver> </receiver>
<receiver android:name=".receivers.PackageReplacedReceiver" <receiver android:name=".receivers.PackageReplacedReceiver"
android:exported="true"
android:enabled="true"> android:enabled="true">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MY_PACKAGE_REPLACED" /> <action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
@ -145,11 +132,9 @@
<receiver android:name=".receivers.DateTimeListener" /> <receiver android:name=".receivers.DateTimeListener" />
<receiver android:name=".receivers.ConnectivityReceiver" /> <receiver android:name=".receivers.ConnectivityReceiver" />
<receiver android:name=".receivers.TimeZoneListener" /> <receiver android:name=".receivers.TimeZoneListener" />
<receiver android:name=".receivers.CalendarReceiver" />
<receiver <receiver
android:name=".DeviceAdmin" android:name=".DeviceAdmin"
android:exported="true"
android:description="@string/app_name" android:description="@string/app_name"
android:label="@string/app_name" android:label="@string/app_name"
android:permission= "android.permission.BIND_DEVICE_ADMIN" > android:permission= "android.permission.BIND_DEVICE_ADMIN" >
@ -179,21 +164,8 @@
<activity android:name=".ActivityManageActionVibrate" /> <activity android:name=".ActivityManageActionVibrate" />
<activity android:name=".ActivityManageActionControlMedia" /> <activity android:name=".ActivityManageActionControlMedia" />
<activity android:name=".ActivityManageActionSendBroadcast" /> <activity android:name=".ActivityManageActionSendBroadcast" />
<activity android:name=".ActivityManageActionRunExecutable" />
<activity android:name=".ActivityManageActionWifi" />
<activity android:name=".ActivityManageTriggerTethering" />
<activity android:name=".ActivityManageActionWakeLock" />
<activity android:name=".ActivityManageTriggerSubSystemState" />
<activity android:name=".ActivityManageActionMakePhoneCall" />
<activity android:name=".ActivityManageActionSetVariable" />
<activity android:name=".ActivityManageTriggerCheckVariable" />
<activity android:name=".ActivityManageActionCopyToClipboard" />
<activity android:name=".ActivityManageActionLocationService" />
<activity android:name=".ActivityManageTriggerCharging" />
<activity <activity
android:name=".ActivityMainTabLayout" android:name=".ActivityMainTabLayout"
android:exported="true"
android:launchMode="singleTask"> android:launchMode="singleTask">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
@ -239,11 +211,9 @@
<activity android:name=".ActivityVolumeTest" /> <activity android:name=".ActivityVolumeTest" />
<activity android:name=".ActivityPermissions"></activity> <activity android:name=".ActivityPermissions"></activity>
<activity android:name=".ActivityManageTriggerNotification" /> <activity android:name=".ActivityManageTriggerNotification" />
<activity android:name=".ActivityManageTriggerCalendar" />
<service <service
android:name=".receivers.NotificationListener" android:name=".receivers.NotificationListener"
android:exported="true"
android:label="@string/app_name" android:label="@string/app_name"
android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE" > android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE" >
<intent-filter> <intent-filter>
@ -263,17 +233,6 @@
android:exported="true" android:exported="true"
/> />
<service android:name=".MyAccessibilityService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/config_accessibility_service" />
</service>
</application> </application>
</manifest> </manifest>

View File

@ -10,10 +10,7 @@ import android.os.Looper;
import android.util.Log; import android.util.Log;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.Nullable;
import com.jens.automation2.receivers.BroadcastListener; import com.jens.automation2.receivers.BroadcastListener;
import com.jens.automation2.receivers.CalendarReceiver;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date; import java.util.Date;
@ -107,7 +104,7 @@ public class Rule implements Comparable<Rule>
} }
public void setName(String name) public void setName(String name)
{ {
this.name = name.trim(); this.name = name;
} }
public static void readFromFile() public static void readFromFile()
@ -347,17 +344,8 @@ public class Rule implements Comparable<Rule>
if(oneTrigger.getTriggerType().equals(Trigger.Trigger_Enum.timeFrame)) if(oneTrigger.getTriggerType().equals(Trigger.Trigger_Enum.timeFrame))
{ {
if(oneTrigger.getTimeFrame().repetition > 0) if(oneTrigger.getTimeFrame().repetition > 0)
{
if(this.getLastExecution() != null)
{
Calendar now = Calendar.getInstance();
if (this.getLastExecution().getTimeInMillis() + oneTrigger.getTimeFrame().getRepetition() * 1000 <= now.getTimeInMillis())
return true; return true;
} }
else
return true;
}
}
else if(oneTrigger.getTriggerType().equals(Trigger.Trigger_Enum.broadcastReceived)) else if(oneTrigger.getTriggerType().equals(Trigger.Trigger_Enum.broadcastReceived))
{ {
return oneTrigger.getTriggerParameter() == BroadcastListener.getInstance().hasBroadcastOccurredSince(oneTrigger.getTriggerParameter2(), getLastExecution()); return oneTrigger.getTriggerParameter() == BroadcastListener.getInstance().hasBroadcastOccurredSince(oneTrigger.getTriggerParameter2(), getLastExecution());
@ -373,19 +361,14 @@ public class Rule implements Comparable<Rule>
{ {
if(hasNotAppliedSinceLastExecution()) if(hasNotAppliedSinceLastExecution())
{ {
Miscellaneous.logEvent("i", "getsGreenLight()", "Rule \"" + getName() + "\" applies and has flipped since its last execution.", 4); Miscellaneous.logEvent("i", "getsGreenLight()", "Rule " + getName() + " applies and has flipped since its last execution.", 4);
return true;
}
else if(hasTriggerOfType(Trigger.Trigger_Enum.calendarEvent) && CalendarReceiver.mayRuleStillBeActivatedForPendingCalendarEvents(this))
{
Miscellaneous.logEvent("i", "getsGreenLight()", "Rule \"" + getName() + "\" applies, has not flipped since its last execution, but may still be executed for other calendar events.", 4);
return true; return true;
} }
else else
Miscellaneous.logEvent("i", "getsGreenLight()", "Rule \"" + getName() + "\" has not flipped since its last execution.", 4); Miscellaneous.logEvent("i", "getsGreenLight()", "Rule " + getName() + " has not flipped since its last execution.", 4);
} }
else else
Miscellaneous.logEvent("i", "getsGreenLight()", "Rule \"" + getName() + "\" does not apply.", 4); Miscellaneous.logEvent("i", "getsGreenLight()", "Rule " + getName() + " does not apply.", 4);
return false; return false;
} }
@ -394,7 +377,7 @@ public class Rule implements Comparable<Rule>
{ {
if(AutomationService.getInstance() == null) if(AutomationService.getInstance() == null)
{ {
Miscellaneous.logEvent("i", "RuleCheck", "Automation service not running. Rule \"" + getName() + "\" cannot apply.", 3); Miscellaneous.logEvent("i", "RuleCheck", "Automation service not running. Rule " + getName() + " cannot apply.", 3);
return false; return false;
} }
@ -406,11 +389,11 @@ public class Rule implements Comparable<Rule>
return false; return false;
} }
Miscellaneous.logEvent("i", String.format(context.getResources().getString(R.string.ruleCheckOf), this.getName()), String.format("Rule \"%1$s\" generally applies currently. Checking if it's really due, yet will be done separately.", this.getName()), 3); Miscellaneous.logEvent("i", String.format(context.getResources().getString(R.string.ruleCheckOf), this.getName()), String.format("Rule %1$s generally applies currently. Checking if it's really due, yet will be done separately.", this.getName()), 3);
return true; return true;
} }
Miscellaneous.logEvent("i", String.format(context.getResources().getString(R.string.ruleCheckOf), this.getName()), String.format(context.getResources().getString(R.string.ruleIsDeactivatedCantApply), this.getName()), 4); Miscellaneous.logEvent("i", String.format(context.getResources().getString(R.string.ruleCheckOf), this.getName()), String.format(context.getResources().getString(R.string.ruleIsDeactivatedCantApply), this.getName()), 3);
return false; return false;
} }
@ -457,8 +440,6 @@ public class Rule implements Comparable<Rule>
{ {
AutomationService service = AutomationService.getInstance(); AutomationService service = AutomationService.getInstance();
service.speak(messages[0], false); service.speak(messages[0], false);
if(Settings.showToasts)
Toast.makeText(service, messages[0], Toast.LENGTH_LONG).show(); Toast.makeText(service, messages[0], Toast.LENGTH_LONG).show();
super.onProgressUpdate(messages); super.onProgressUpdate(messages);
@ -488,7 +469,7 @@ public class Rule implements Comparable<Rule>
{ {
boolean isActuallyToggleable = isActuallyToggable(); boolean isActuallyToggleable = isActuallyToggable();
// boolean notLastActive = getLastActivatedRule() == null || !getLastActivatedRule().equals(Rule.this); boolean notLastActive = getLastActivatedRule() == null || !getLastActivatedRule().equals(Rule.this);
boolean doToggle = ruleToggle && isActuallyToggleable; boolean doToggle = ruleToggle && isActuallyToggleable;
String message; String message;
@ -502,29 +483,6 @@ public class Rule implements Comparable<Rule>
if(Settings.startNewThreadForRuleActivation) if(Settings.startNewThreadForRuleActivation)
publishProgress(message); publishProgress(message);
/*
Make a note of Rule/CalendarEvent executed combinations
*/
if(Rule.this.hasTriggerOfType(Trigger.Trigger_Enum.calendarEvent))
{
for(CalendarReceiver.CalendarEvent event : CalendarReceiver.getApplyingCalendarEvents(Rule.this))
{
if(!CalendarReceiver.hasEventBeenUsedInRule(Rule.this, event))
{
/*
Record only the first calendar event that matched because the rule may
be executed once for every matching event.
*/
Miscellaneous.logEvent("i", "Rule", "Executing this rule run for calender event: " + event, 5);
CalendarReceiver.addUsedPair(new CalendarReceiver.RuleEventPair(Rule.this, event));
break;
}
}
}
/*
Run actions one after another
*/
for(int i = 0; i< Rule.this.getActionSet().size(); i++) for(int i = 0; i< Rule.this.getActionSet().size(); i++)
{ {
try try
@ -784,71 +742,4 @@ public class Rule implements Comparable<Rule>
return null; return null;
} }
@Override
public boolean equals(@Nullable Object obj)
{
return this.getName().equals(((Rule)obj).getName());
}
public boolean hasTriggerOfType(Trigger.Trigger_Enum queryType)
{
for(Trigger t : getTriggerSet())
{
if(t.getTriggerType().equals(queryType))
return true;
}
return false;
}
public boolean hasActionOfType(Action.Action_Enum queryType)
{
for(Action a : getActionSet())
{
if(a.getAction().equals(queryType))
return true;
}
return false;
}
public int getAmountOfTriggersForType(Trigger.Trigger_Enum type)
{
int amount = 0;
for(Trigger t : getTriggerSet())
{
if(t.getTriggerType().equals(type))
amount++;
}
return amount;
}
public int getAmountOfActionsForType(Action.Action_Enum type)
{
int amount = 0;
for(Action a : getActionSet())
{
if(a.getAction().equals(type))
amount++;
}
return amount;
}
public static int getAmountOfActivatedRules()
{
int amount = 0;
for(Rule r : Rule.getRuleCollection())
{
if(r.isRuleActive())
amount++;
}
return amount;
}
} }

View File

@ -1,7 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest <manifest xmlns:android="http://schemas.android.com/apk/res/android">
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<supports-screens <supports-screens
android:anyDensity="true" android:anyDensity="true"
@ -51,6 +49,7 @@
<uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" />
<!-- <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />-->
<uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.NFC" /> <uses-permission android:name="android.permission.NFC" />
@ -65,19 +64,11 @@
<uses-permission android:name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"/> <uses-permission android:name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"/>
<uses-permission android:name="com.wireguard.android.permission.CONTROL_TUNNELS"/> <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.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.permission.SCHEDULE_EXACT_ALARM"/>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<!--android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.USE_EXACT_ALARM" />-->
<application <application
android:allowBackup="true" android:allowBackup="true"
android:allowClearUserData="true" android:allowClearUserData="true"
android:icon="@drawable/crane" android:icon="@drawable/gears"
android:label="@string/app_name" android:label="@string/app_name"
android:theme="@style/AppTheme" android:theme="@style/AppTheme"
android:networkSecurityConfig="@xml/network_security_config"> android:networkSecurityConfig="@xml/network_security_config">
@ -107,9 +98,7 @@
android:exported="false" android:exported="false"
android:label="@string/app_name" /> android:label="@string/app_name" />
<receiver android:name=".receivers.StartupIntentReceiver" <receiver android:name=".receivers.StartupIntentReceiver" android:enabled="true" android:exported="true">
android:enabled="true"
android:exported="true">
<intent-filter> <intent-filter>
<!--<action android:name="android.intent.action.SCREEN_ON" />--> <!--<action android:name="android.intent.action.SCREEN_ON" />-->
<!--<action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />--> <!--<action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />-->
@ -122,7 +111,6 @@
</intent-filter> </intent-filter>
</receiver> </receiver>
<receiver android:name=".receivers.PackageReplacedReceiver" <receiver android:name=".receivers.PackageReplacedReceiver"
android:exported="true"
android:enabled="true"> android:enabled="true">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MY_PACKAGE_REPLACED" /> <action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
@ -131,11 +119,9 @@
<receiver android:name=".receivers.DateTimeListener" /> <receiver android:name=".receivers.DateTimeListener" />
<receiver android:name=".receivers.ConnectivityReceiver" /> <receiver android:name=".receivers.ConnectivityReceiver" />
<receiver android:name=".receivers.TimeZoneListener" /> <receiver android:name=".receivers.TimeZoneListener" />
<receiver android:name=".receivers.CalendarReceiver" />
<receiver <receiver
android:name=".DeviceAdmin" android:name=".DeviceAdmin"
android:exported="true"
android:description="@string/app_name" android:description="@string/app_name"
android:label="@string/app_name" android:label="@string/app_name"
android:permission= "android.permission.BIND_DEVICE_ADMIN" > android:permission= "android.permission.BIND_DEVICE_ADMIN" >
@ -165,20 +151,8 @@
<activity android:name=".ActivityManageActionVibrate" /> <activity android:name=".ActivityManageActionVibrate" />
<activity android:name=".ActivityManageActionControlMedia" /> <activity android:name=".ActivityManageActionControlMedia" />
<activity android:name=".ActivityManageActionSendBroadcast" /> <activity android:name=".ActivityManageActionSendBroadcast" />
<activity android:name=".ActivityManageActionRunExecutable" />
<activity android:name=".ActivityManageActionWifi" />
<activity android:name=".ActivityManageTriggerTethering" />
<activity android:name=".ActivityManageActionWakeLock" />
<activity android:name=".ActivityManageTriggerSubSystemState" />
<activity android:name=".ActivityManageActionSetVariable" />
<activity android:name=".ActivityManageTriggerCheckVariable" />
<activity android:name=".ActivityManageActionCopyToClipboard" />
<activity android:name=".ActivityManageActionLocationService" />
<activity android:name=".ActivityManageTriggerCharging" />
<activity <activity
android:name=".ActivityMainTabLayout" android:name=".ActivityMainTabLayout"
android:exported="true"
android:launchMode="singleTask"> android:launchMode="singleTask">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
@ -216,6 +190,7 @@
<activity android:name=".ActivityManageActionStartActivity" /> <activity android:name=".ActivityManageActionStartActivity" />
<activity android:name=".ActivityManageTriggerNfc" /> <activity android:name=".ActivityManageTriggerNfc" />
<activity android:name=".ActivityManageActionSpeakText" /> <activity android:name=".ActivityManageActionSpeakText" />
<activity android:name=".ActivityManageActionPlaySound" />
<activity android:name=".ActivityManageTriggerBluetooth" /> <activity android:name=".ActivityManageTriggerBluetooth" />
<activity android:name=".ActivityMainProfiles" /> <activity android:name=".ActivityMainProfiles" />
<activity android:name=".ActivityManageProfile" /> <activity android:name=".ActivityManageProfile" />
@ -223,11 +198,9 @@
<activity android:name=".ActivityVolumeTest" /> <activity android:name=".ActivityVolumeTest" />
<activity android:name=".ActivityPermissions"></activity> <activity android:name=".ActivityPermissions"></activity>
<activity android:name=".ActivityManageTriggerNotification" /> <activity android:name=".ActivityManageTriggerNotification" />
<activity android:name=".ActivityManageTriggerCalendar" />
<service <service
android:name=".receivers.NotificationListener" android:name=".receivers.NotificationListener"
android:exported="true"
android:label="@string/app_name" android:label="@string/app_name"
android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE" > android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE" >
<intent-filter> <intent-filter>
@ -236,6 +209,8 @@
</service> </service>
<activity android:name=".ActivityPermissions" />
<!-- https://developer.android.com/about/versions/pie/android-9.0-changes-28#apache-p--> <!-- 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"/> <uses-library android:name="org.apache.http.legacy" android:required="false"/>

View File

@ -10,12 +10,9 @@ import android.os.Looper;
import android.util.Log; import android.util.Log;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.Nullable;
import com.google.android.gms.location.DetectedActivity; import com.google.android.gms.location.DetectedActivity;
import com.jens.automation2.receivers.ActivityDetectionReceiver; import com.jens.automation2.receivers.ActivityDetectionReceiver;
import com.jens.automation2.receivers.BroadcastListener; import com.jens.automation2.receivers.BroadcastListener;
import com.jens.automation2.receivers.CalendarReceiver;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
@ -110,7 +107,7 @@ public class Rule implements Comparable<Rule>
} }
public void setName(String name) public void setName(String name)
{ {
this.name = name.trim(); this.name = name;
} }
public static void readFromFile() public static void readFromFile()
@ -350,17 +347,8 @@ public class Rule implements Comparable<Rule>
if(oneTrigger.getTriggerType().equals(Trigger.Trigger_Enum.timeFrame)) if(oneTrigger.getTriggerType().equals(Trigger.Trigger_Enum.timeFrame))
{ {
if(oneTrigger.getTimeFrame().repetition > 0) if(oneTrigger.getTimeFrame().repetition > 0)
{
if(this.getLastExecution() != null)
{
Calendar now = Calendar.getInstance();
if (this.getLastExecution().getTimeInMillis() + oneTrigger.getTimeFrame().getRepetition() * 1000 <= now.getTimeInMillis())
return true; return true;
} }
else
return true;
}
}
else if(oneTrigger.getTriggerType().equals(Trigger.Trigger_Enum.broadcastReceived)) else if(oneTrigger.getTriggerType().equals(Trigger.Trigger_Enum.broadcastReceived))
{ {
return oneTrigger.getTriggerParameter() == BroadcastListener.getInstance().hasBroadcastOccurredSince(oneTrigger.getTriggerParameter2(), getLastExecution()); return oneTrigger.getTriggerParameter() == BroadcastListener.getInstance().hasBroadcastOccurredSince(oneTrigger.getTriggerParameter2(), getLastExecution());
@ -376,19 +364,14 @@ public class Rule implements Comparable<Rule>
{ {
if(hasNotAppliedSinceLastExecution()) if(hasNotAppliedSinceLastExecution())
{ {
Miscellaneous.logEvent("i", "getsGreenLight()", "Rule \"" + getName() + "\" applies and has flipped since its last execution.", 4); Miscellaneous.logEvent("i", "getsGreenLight()", "Rule " + getName() + " applies and has flipped since its last execution.", 4);
return true;
}
else if(hasTriggerOfType(Trigger.Trigger_Enum.calendarEvent) && CalendarReceiver.mayRuleStillBeActivatedForPendingCalendarEvents(this))
{
Miscellaneous.logEvent("i", "getsGreenLight()", "Rule \"" + getName() + "\" applies, has not flipped since its last execution, but may still be executed for other calendar events.", 4);
return true; return true;
} }
else else
Miscellaneous.logEvent("i", "getsGreenLight()", "Rule \"" + getName() + "\" has not flipped since its last execution.", 4); Miscellaneous.logEvent("i", "getsGreenLight()", "Rule " + getName() + " has not flipped since its last execution.", 4);
} }
else else
Miscellaneous.logEvent("i", "getsGreenLight()", "Rule \"" + getName() + "\" does not apply.", 4); Miscellaneous.logEvent("i", "getsGreenLight()", "Rule " + getName() + " does not apply.", 4);
return false; return false;
} }
@ -397,7 +380,7 @@ public class Rule implements Comparable<Rule>
{ {
if(AutomationService.getInstance() == null) if(AutomationService.getInstance() == null)
{ {
Miscellaneous.logEvent("i", "RuleCheck", "Automation service not running. Rule \"" + getName() + "\" cannot apply.", 3); Miscellaneous.logEvent("i", "RuleCheck", "Automation service not running. Rule " + getName() + " cannot apply.", 3);
return false; return false;
} }
@ -409,11 +392,11 @@ public class Rule implements Comparable<Rule>
return false; return false;
} }
Miscellaneous.logEvent("i", String.format(context.getResources().getString(R.string.ruleCheckOf), this.getName()), String.format("Rule \"%1$s\" generally applies currently. Checking if it's really due, yet will be done separately.", this.getName()), 3); Miscellaneous.logEvent("i", String.format(context.getResources().getString(R.string.ruleCheckOf), this.getName()), String.format("Rule %1$s generally applies currently. Checking if it's really due, yet will be done separately.", this.getName()), 3);
return true; return true;
} }
Miscellaneous.logEvent("i", String.format(context.getResources().getString(R.string.ruleCheckOf), this.getName()), String.format(context.getResources().getString(R.string.ruleIsDeactivatedCantApply), this.getName()), 4); Miscellaneous.logEvent("i", String.format(context.getResources().getString(R.string.ruleCheckOf), this.getName()), String.format(context.getResources().getString(R.string.ruleIsDeactivatedCantApply), this.getName()), 3);
return false; return false;
} }
@ -484,8 +467,6 @@ public class Rule implements Comparable<Rule>
{ {
AutomationService service = AutomationService.getInstance(); AutomationService service = AutomationService.getInstance();
service.speak(messages[0], false); service.speak(messages[0], false);
if(Settings.showToasts)
Toast.makeText(service, messages[0], Toast.LENGTH_LONG).show(); Toast.makeText(service, messages[0], Toast.LENGTH_LONG).show();
super.onProgressUpdate(messages); super.onProgressUpdate(messages);
@ -515,7 +496,7 @@ public class Rule implements Comparable<Rule>
{ {
boolean isActuallyToggleable = isActuallyToggable(); boolean isActuallyToggleable = isActuallyToggable();
// boolean notLastActive = getLastActivatedRule() == null || !getLastActivatedRule().equals(Rule.this); boolean notLastActive = getLastActivatedRule() == null || !getLastActivatedRule().equals(Rule.this);
boolean doToggle = ruleToggle && isActuallyToggleable; boolean doToggle = ruleToggle && isActuallyToggleable;
String message; String message;
@ -529,29 +510,6 @@ public class Rule implements Comparable<Rule>
if(Settings.startNewThreadForRuleActivation) if(Settings.startNewThreadForRuleActivation)
publishProgress(message); publishProgress(message);
/*
Make a note of Rule/CalendarEvent executed combinations
*/
if(Rule.this.hasTriggerOfType(Trigger.Trigger_Enum.calendarEvent))
{
for(CalendarReceiver.CalendarEvent event : CalendarReceiver.getApplyingCalendarEvents(Rule.this))
{
if(!CalendarReceiver.hasEventBeenUsedInRule(Rule.this, event))
{
/*
Record only the first calendar event that matched because the rule may
be executed once for every matching event.
*/
Miscellaneous.logEvent("i", "Rule", "Executing this rule run for calender event: " + event, 5);
CalendarReceiver.addUsedPair(new CalendarReceiver.RuleEventPair(Rule.this, event));
break;
}
}
}
/*
Run actions one after another
*/
for(int i = 0; i< Rule.this.getActionSet().size(); i++) for(int i = 0; i< Rule.this.getActionSet().size(); i++)
{ {
try try
@ -811,71 +769,4 @@ public class Rule implements Comparable<Rule>
return null; return null;
} }
@Override
public boolean equals(@Nullable Object obj)
{
return this.getName().equals(((Rule)obj).getName());
}
public boolean hasTriggerOfType(Trigger.Trigger_Enum queryType)
{
for(Trigger t : getTriggerSet())
{
if(t.getTriggerType().equals(queryType))
return true;
}
return false;
}
public boolean hasActionOfType(Action.Action_Enum queryType)
{
for(Action a : getActionSet())
{
if(a.getAction().equals(queryType))
return true;
}
return false;
}
public int getAmountOfTriggersForType(Trigger.Trigger_Enum type)
{
int amount = 0;
for(Trigger t : getTriggerSet())
{
if(t.getTriggerType().equals(type))
amount++;
}
return amount;
}
public int getAmountOfActionsForType(Action.Action_Enum type)
{
int amount = 0;
for(Action a : getActionSet())
{
if(a.getAction().equals(type))
amount++;
}
return amount;
}
public static int getAmountOfActivatedRules()
{
int amount = 0;
for(Rule r : Rule.getRuleCollection())
{
if(r.isRuleActive())
amount++;
}
return amount;
}
} }

View File

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

View File

@ -6,12 +6,13 @@ import android.os.Build;
import android.util.Log; import android.util.Log;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.RequiresApi;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.http.client.methods.HttpGet;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.Locale; import java.util.Locale;
import java.util.Map;
public class Action public class Action
@ -20,10 +21,7 @@ public class Action
public static final String actionParameter2Split = "ap2split"; public static final String actionParameter2Split = "ap2split";
public static final String intentPairSeparator = "intPairSplit"; public static final String intentPairSeparator = "intPairSplit";
public static final String actionParameters2SeparatorInner = "a2splitInner";
public static final String actionParameters2SeparatorOuter = "a2splitOuter";
public static final String vibrateSeparator = ","; public static final String vibrateSeparator = ",";
public static final String httpErrorDefaultText = "HTTP_ERROR";
public enum Action_Enum public enum Action_Enum
{ {
@ -54,14 +52,6 @@ public class Action
createNotification, createNotification,
closeNotification, closeNotification,
sendBroadcast, sendBroadcast,
runExecutable,
wakelock,
setVariable,
startPhoneCall,
stopPhoneCall,
copyToClipboard,
takeScreenshot,
setLocationService,
sendTextMessage; sendTextMessage;
public String getFullName(Context context) public String getFullName(Context context)
@ -134,22 +124,6 @@ public class Action
return context.getResources().getString(R.string.closeNotifications); return context.getResources().getString(R.string.closeNotifications);
case sendBroadcast: case sendBroadcast:
return context.getResources().getString(R.string.sendBroadcast); return context.getResources().getString(R.string.sendBroadcast);
case runExecutable:
return context.getResources().getString(R.string.runExecutable);
case wakelock:
return context.getResources().getString(R.string.keepDeviceAwake);
case setVariable:
return context.getResources().getString(R.string.setVariable);
case startPhoneCall:
return context.getResources().getString(R.string.startPhoneCall);
case stopPhoneCall:
return context.getResources().getString(R.string.endPhoneCall);
case copyToClipboard:
return context.getResources().getString(R.string.copyTextToClipboard);
case takeScreenshot:
return context.getResources().getString(R.string.takeScreenshot);
case setLocationService:
return context.getResources().getString(R.string.setLocationServiceCapital);
default: default:
return "Unknown"; return "Unknown";
} }
@ -293,86 +267,23 @@ public class Action
case sendBroadcast: case sendBroadcast:
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.sendBroadcast)); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.sendBroadcast));
break; break;
case runExecutable:
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.runExecutable));
break;
case wakelock:
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.keepDeviceAwake) + " (" + String.valueOf(getParameter1()) + ")");
break;
case setVariable:
String[] variableParams = getParameter2().split(actionParameter2Split);
String addition;
if (variableParams.length >= 2)
addition = " (key: " + variableParams[0] + ", value: " + variableParams[1] + ")";
else
addition = " (delete key: " + variableParams[0] + ")";
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.setVariable) + addition);
break;
case startPhoneCall:
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.startPhoneCall));
break;
case stopPhoneCall:
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.endPhoneCall));
break;
case copyToClipboard:
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.copyTextToClipboard));
break;
case takeScreenshot:
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.takeScreenshot));
break;
case setLocationService:
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.setLocationService) + ": " );
switch(Integer.parseInt(getParameter2()))
{
case android.provider.Settings.Secure.LOCATION_MODE_OFF:
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.off));
break;
case android.provider.Settings.Secure.LOCATION_MODE_SENSORS_ONLY:
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.LOCATION_MODE_SENSOR_ONLY));
break;
case android.provider.Settings.Secure.LOCATION_MODE_BATTERY_SAVING:
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.LOCATION_MODE_BATTERY_SAVING));
break;
case android.provider.Settings.Secure.LOCATION_MODE_HIGH_ACCURACY:
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.LOCATION_MODE_HIGH_ACCURACY));
break;
}
break;
default: default:
returnString.append(action.toString()); returnString.append(action.toString());
} }
if (this.getAction().equals(Action_Enum.triggerUrl)) if (this.getAction().equals(Action_Enum.triggerUrl))
{ {
String[] components; String[] components = parameter2.split(";");
if(parameter2.contains(Action.actionParameter2Split))
components = parameter2.split(Action.actionParameter2Split);
else
components = parameter2.split(";");
if (components.length >= 3) if (components.length >= 3)
{ {
returnString.append(" (");
if(components.length >= 4)
returnString.append(components[3]);
else
returnString.append(ActivityManageActionTriggerUrl.methodGet);
returnString.append(")");
returnString.append(": " + components[2]); returnString.append(": " + components[2]);
if (parameter1) if (parameter1)
returnString.append(" " + Miscellaneous.getAnyContext().getResources().getString(R.string.usingAuthentication) + "."); returnString.append(" " + Miscellaneous.getAnyContext().getResources().getString(R.string.usingAuthentication) + ".");
} }
else else
{
returnString.append(" (");
returnString.append(ActivityManageActionTriggerUrl.methodGet);;
returnString.append(")");
returnString.append(": " + components[0]); returnString.append(": " + components[0]);
} }
}
else if (this.getAction().equals(Action_Enum.startOtherActivity)) else if (this.getAction().equals(Action_Enum.startOtherActivity))
{ {
returnString.append(": " + parameter2.replace(Action.intentPairSeparator, "/")); returnString.append(": " + parameter2.replace(Action.intentPairSeparator, "/"));
@ -414,24 +325,8 @@ public class Action
if (parts.length > 4 && !StringUtils.isBlank(parts[4])) if (parts.length > 4 && !StringUtils.isBlank(parts[4]))
returnString.append(", " + Miscellaneous.getAnyContext().getResources().getString(R.string.ifString) + " " + Miscellaneous.getAnyContext().getResources().getString(R.string.text) + " " + Trigger.getMatchString(parts[3]) + " " + parts[4]); returnString.append(", " + Miscellaneous.getAnyContext().getResources().getString(R.string.ifString) + " " + Miscellaneous.getAnyContext().getResources().getString(R.string.text) + " " + Trigger.getMatchString(parts[3]) + " " + parts[4]);
if (parts.length >= 6)
{
if (!parts[5].equals(ActivityManageActionCloseNotification.dismissRegularString))
{
returnString.append(" " + String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.withButton), parts[5]));
} }
} else if(this.getAction().equals(Action_Enum.controlMediaPlayback))
}
else if (this.getAction().equals(Action_Enum.setWifi))
{
if (!StringUtils.isEmpty(this.parameter2))
{
boolean useRoot = Boolean.parseBoolean(this.parameter2);
if (useRoot)
returnString.append(" " + Miscellaneous.getAnyContext().getResources().getString(R.string.usingRoot));
}
}
else if (this.getAction().equals(Action_Enum.controlMediaPlayback))
{ {
returnString.append(": "); returnString.append(": ");
@ -459,12 +354,6 @@ public class Action
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.unknown)); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.unknown));
} }
} }
else if (this.getAction().equals(Action_Enum.sendBroadcast))
{
returnString.append(": " + parameter2.replace(Action.actionParameter2Split, "; ").replace(Action.intentPairSeparator, "/"));
}
else if(this.getAction().equals(Action_Enum.setVariable) || this.getAction().equals(Action_Enum.copyToClipboard) || this.getAction().equals(Action_Enum.setLocationService))
; // it's completed further above already
else if (parameter2 != null && parameter2.length() > 0) else if (parameter2 != null && parameter2.length() > 0)
returnString.append(": " + parameter2.replace(Action.actionParameter2Split, "; ")); returnString.append(": " + parameter2.replace(Action.actionParameter2Split, "; "));
} }
@ -578,7 +467,7 @@ public class Action
Actions.setUsbTethering(context, getParameter1(), toggleActionIfPossible); Actions.setUsbTethering(context, getParameter1(), toggleActionIfPossible);
break; break;
case setWifi: case setWifi:
Actions.WifiStuff.setWifi(context, getParameter1(), getParameter2(), toggleActionIfPossible); Actions.WifiStuff.setWifi(context, getParameter1(), toggleActionIfPossible);
break; break;
case setWifiTethering: case setWifiTethering:
Actions.setWifiTethering(context, getParameter1(), toggleActionIfPossible); Actions.setWifiTethering(context, getParameter1(), toggleActionIfPossible);
@ -656,37 +545,6 @@ public class Action
case sendBroadcast: case sendBroadcast:
Actions.sendBroadcast(context, this.getParameter2()); Actions.sendBroadcast(context, this.getParameter2());
break; break;
case runExecutable:
String[] execParts = this.getParameter2().split(Action.actionParameter2Split);
if(execParts.length == 1)
Actions.runExecutable(context, this.getParameter1(), execParts[0], null);
else if(execParts.length == 2)
Actions.runExecutable(context, this.getParameter1(), execParts[0], execParts[1]);
break;
case wakelock:
if(this.getParameter1())
Actions.wakeLockStart(context, Long.parseLong(this.getParameter2()));
else
Actions.wakeLockStop();
break;
case setVariable:
Actions.setVariable(this.getParameter2());
break;
case startPhoneCall:
Actions.startPhoneCall(context, this.getParameter2());
break;
case stopPhoneCall:
Actions.endPhoneCall(context);
break;
case copyToClipboard:
Actions.copyToClipboard(context, Miscellaneous.replaceVariablesInText(this.getParameter2(), context));
break;
case takeScreenshot:
Actions.takeScreenshot();
break;
case setLocationService:
Actions.setLocationService(Integer.parseInt(this.getParameter2()), AutomationService.getInstance());
break;
default: default:
Miscellaneous.logEvent("w", "Action", context.getResources().getString(R.string.unknownActionSpecified), 3); Miscellaneous.logEvent("w", "Action", context.getResources().getString(R.string.unknownActionSpecified), 3);
break; break;
@ -701,54 +559,33 @@ public class Action
private void triggerUrl(Context context) private void triggerUrl(Context context)
{ {
//TODO: Check if data needs to be escaped
String username = null; String username = null;
String password = null; String password = null;
String method = ActivityManageActionTriggerUrl.methodGet;
String url; String url;
String params = null;
String[] components; String[] components = getParameter2().split(";");
if(getParameter2().contains(Action.actionParameter2Split))
components = getParameter2().split(Action.actionParameter2Split, -1);
else
components = getParameter2().split(";", -1);
if(components.length >= 3) if(components.length >= 3)
{ {
username = components[0]; username = components[0];
password = components[1]; password = components[1];
url = components[2]; url = components[2];
if(components.length >= 4)
method = components[3];
if(components.length >= 5)
{
params = components[4];
} }
} else
else // compatibility for very old versions which haven't upgraded, yet.
url = components[0]; url = components[0];
try try
{ {
url = Miscellaneous.replaceVariablesInText(url, context); url = Miscellaneous.replaceVariablesInText(url, context);
if(!StringUtils.isEmpty(params))
params = Miscellaneous.replaceVariablesInText(params, context);
Actions myAction = new Actions(); Actions myAction = new Actions();
Miscellaneous.logEvent("i", "HTTP", "Attempting download of " + url, 4); //getResources().getString("attemptingDownloadOf"); Miscellaneous.logEvent("i", "HTTP", "Attempting download of " + url, 4); //getResources().getString("attemptingDownloadOf");
/*
Theoretically credentials could be saved, but authentication has been turned off afterwards.
The following if clause is there to force username and password to be null.
*/
if(this.getParameter1()) // use authentication if(this.getParameter1()) // use authentication
new DownloadTask().execute(url, username, password, method, params); new DownloadTask().execute(url, username, password);
else else
new DownloadTask().execute(url, null, null, method, params); new DownloadTask().execute(url, null, null);
} }
catch(Exception e) catch(Exception e)
{ {
@ -763,49 +600,32 @@ public class Action
{ {
Thread.setDefaultUncaughtExceptionHandler(Miscellaneous.uncaughtExceptionHandler); Thread.setDefaultUncaughtExceptionHandler(Miscellaneous.uncaughtExceptionHandler);
int attempts = 1; int attempts=1;
String urlString=parameters[0]; String urlString=parameters[0];
String urlUsername = null; String urlUsername = null;
String urlPassword = null; String urlPassword = null;
String method = ActivityManageActionTriggerUrl.methodGet;
Map<String,String> httpParams = new HashMap<>();
if(parameters.length >= 3) if(parameters.length >= 3)
{ {
urlUsername = parameters[1]; urlUsername=parameters[1];
urlPassword = parameters[2]; urlPassword=parameters[2];
if(parameters.length >= 4)
method = parameters[3];
if(parameters.length >= 5 && parameters[4] != null)
{
// has params
String[] paramPairs = parameters[4].split(Action.actionParameters2SeparatorOuter);
for(String pair : paramPairs)
{
String[] pieces = pair.split(Action.actionParameters2SeparatorInner);
httpParams.put(pieces[0], pieces[1]);
}
} }
} String response = "httpError";
HttpGet post;
String response = httpErrorDefaultText;
if(Settings.httpAttempts < 1) if(Settings.httpAttempts < 1)
Miscellaneous.logEvent("w", "HTTP Request", Miscellaneous.getAnyContext().getResources().getString(R.string.cantDownloadTooFewRequestsInSettings), 3); Miscellaneous.logEvent("w", "HTTP Request", Miscellaneous.getAnyContext().getResources().getString(R.string.cantDownloadTooFewRequestsInSettings), 3);
while(attempts <= Settings.httpAttempts && response.equals(httpErrorDefaultText)) while(attempts <= Settings.httpAttempts && response.equals("httpError"))
{ {
Miscellaneous.logEvent("i", "HTTP Request", "Attempt " + String.valueOf(attempts++) + " of " + String.valueOf(Settings.httpAttempts), 3); Miscellaneous.logEvent("i", "HTTP Request", "Attempt " + String.valueOf(attempts++) + " of " + String.valueOf(Settings.httpAttempts), 3);
// Either thorough checking or no encryption // 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); response = Miscellaneous.downloadURL(urlString, urlUsername, urlPassword);
else else
response = Miscellaneous.downloadUrlWithoutCertificateChecking(urlString, urlUsername, urlPassword, method, httpParams); response = Miscellaneous.downloadURLwithoutCertificateChecking(urlString, urlUsername, urlPassword);
try try
{ {

View File

@ -1,7 +1,6 @@
package com.jens.automation2; package com.jens.automation2;
import android.Manifest; import android.Manifest;
import android.accessibilityservice.AccessibilityService;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.annotation.TargetApi; import android.annotation.TargetApi;
import android.app.NotificationManager; import android.app.NotificationManager;
@ -16,6 +15,8 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.media.AudioManager; import android.media.AudioManager;
import android.media.MediaPlayer; import android.media.MediaPlayer;
import android.media.session.MediaController;
import android.media.session.MediaSessionManager;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.Uri; import android.net.Uri;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
@ -25,8 +26,8 @@ import android.os.PowerManager.WakeLock;
import android.os.VibrationEffect; import android.os.VibrationEffect;
import android.os.Vibrator; import android.os.Vibrator;
import android.provider.MediaStore; import android.provider.MediaStore;
import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification; import android.service.notification.StatusBarNotification;
import android.telecom.TelecomManager;
import android.telephony.SmsManager; import android.telephony.SmsManager;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
@ -51,12 +52,7 @@ import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.conn.util.InetAddressUtils; import org.apache.http.conn.util.InetAddressUtils;
import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.client.DefaultHttpClient;
import java.io.BufferedReader;
import java.io.File; import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
@ -66,12 +62,8 @@ import java.net.NetworkInterface;
import java.security.KeyStore; import java.security.KeyStore;
import java.util.Calendar; import java.util.Calendar;
import java.util.Collections; import java.util.Collections;
import java.util.Enumeration;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set; import java.util.Set;
import java.util.concurrent.TimeUnit;
import javax.net.ssl.SSLContext; import javax.net.ssl.SSLContext;
@ -82,6 +74,10 @@ public class Actions
public static AutomationService automationServerRef; public static AutomationService automationServerRef;
public static Context context; public static Context context;
private static Intent playMusicIntent; private static Intent playMusicIntent;
private static boolean suAvailable = false;
private static String suVersion = null;
private static String suVersionInternal = null;
private static List<String> suResult = null;
public final static String smsSeparator = "&sms&"; public final static String smsSeparator = "&sms&";
public final static String dummyPackageString = "dummyPkg239asd"; public final static String dummyPackageString = "dummyPkg239asd";
@ -95,7 +91,6 @@ public class Actions
Miscellaneous.logEvent("w", "createNotification", "Creating notification with title " + elements[0] + " and text " + elements[1], 3); Miscellaneous.logEvent("w", "createNotification", "Creating notification with title " + elements[0] + " and text " + elements[1], 3);
// Create a new notification ID each time
int notificationId = Math.round(Calendar.getInstance().getTimeInMillis()/1000); int notificationId = Math.round(Calendar.getInstance().getTimeInMillis()/1000);
try try
@ -114,8 +109,8 @@ public class Actions
public static void closeNotification(Action action) public static void closeNotification(Action action)
{ {
NotificationManager nm = (NotificationManager) Miscellaneous.getAnyContext().getSystemService(Context.NOTIFICATION_SERVICE); NotificationManager nm = (NotificationManager) Miscellaneous.getAnyContext().getSystemService(Context.NOTIFICATION_SERVICE);
// for(StatusBarNotification n : nm.getActiveNotifications()) for(StatusBarNotification n : nm.getActiveNotifications())
// { {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
{ {
String[] params = action.getParameter2().split(Action.actionParameter2Split); String[] params = action.getParameter2().split(Action.actionParameter2Split);
@ -124,14 +119,11 @@ public class Actions
String myTitleDir = params[1]; String myTitleDir = params[1];
String requiredTitle = params[2]; String requiredTitle = params[2];
String myTextDir = params[3]; String myTextDir = params[3];
String requiredText = ""; String requiredText;
String method = ActivityManageActionCloseNotification.dismissRegularString; if (params.length >= 5)
if(params.length >= 5)
requiredText = params[4]; requiredText = params[4];
else
if(params.length >= 6 && !params[5].equals(ActivityManageActionCloseNotification.dismissRegularString)) requiredText = "";
method = params[5];
for (StatusBarNotification sbn : NotificationListener.getInstance().getActiveNotifications()) for (StatusBarNotification sbn : NotificationListener.getInstance().getActiveNotifications())
{ {
@ -185,91 +177,27 @@ public class Actions
Miscellaneous.logEvent("i", "NotificationCloseCheck", "All criteria matches. Closing notification: " + sbn.getNotification().toString(), 3); Miscellaneous.logEvent("i", "NotificationCloseCheck", "All criteria matches. Closing notification: " + sbn.getNotification().toString(), 3);
if(NotificationListener.getInstance() != null) if(NotificationListener.getInstance() != null)
{
if(method == ActivityManageActionCloseNotification.dismissRegularString)
NotificationListener.getInstance().dismissNotification(sbn); NotificationListener.getInstance().dismissNotification(sbn);
else
NotificationListener.getInstance().clickNotificationButton(sbn, method);
}
else else
Miscellaneous.logEvent("i", "NotificationCloseCheck", "NotificationListener instance is null. Can\'t close notification.", 3); Miscellaneous.logEvent("i", "NotificationCloseCheck", "NotificationListener instance is null. Can\'t close notification.", 3);
} }
} }
// } }
} }
public static void sendBroadcast(Context context, String action) public static void sendBroadcast(Context context, String action)
{ {
Miscellaneous.logEvent("i", "sendBroadcast", "Sending broadcast with action " + action, 5); Miscellaneous.logEvent("i", "sendBroadcast", "Sending broadcast with action " + action, 5);
Intent broadcastIntent = new Intent(); Intent broadcastIntent = new Intent();
if(action.contains(Action.actionParameter2Split))
{
String[] parts = action.split(Action.actionParameter2Split);
broadcastIntent.setAction(parts[0]);
String[] intentparts = parts[1].split(";");
broadcastIntent = packParametersIntoIntent(broadcastIntent, intentparts, 0);
}
else
broadcastIntent.setAction(action); broadcastIntent.setAction(action);
context.sendBroadcast(broadcastIntent); context.sendBroadcast(broadcastIntent);
} }
public static void setVariable(String parameter2)
{
String[] parts = parameter2.split(Action.actionParameter2Split);
if(AutomationService.isMyServiceRunning(Miscellaneous.getAnyContext()))
{
Map<String,String> map = AutomationService.getInstance().getVariableMap();
if(parts.length > 1)
{
try
{
map.put(parts[0], Miscellaneous.replaceVariablesInText(parts[1], Miscellaneous.getAnyContext()));
}
catch (Exception e)
{
map.put(parts[0], parts[1]);
}
}
else
map.remove(parts[0]);
}
Miscellaneous.logEvent("i", "Variable", "Checking for applicable rules after variable has been set or deleted.", 2);
List<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger.Trigger_Enum.checkVariable);
for(int i=0; i<ruleCandidates.size(); i++)
{
if(ruleCandidates.get(i).haveEnoughPermissions() && ruleCandidates.get(i).getsGreenLight(AutomationService.getInstance()))
{
Miscellaneous.logEvent("i", "Variable", "Rule " + ruleCandidates.get(i).getName() + " applies after variable has been set or deleted.", 2);
ruleCandidates.get(i).activate(AutomationService.getInstance(), false);
}
}
Miscellaneous.logEvent("i", "Variable", "Done checking for applicable rules after variable has been set or deleted.", 2);
}
public static class WifiStuff public static class WifiStuff
{ {
public static Boolean setWifi(Context context, Boolean desiredState, String parameter2, boolean toggleActionIfPossible) public static Boolean setWifi(Context context, Boolean desiredState, boolean toggleActionIfPossible)
{ {
boolean forceUseRoot = false; if(context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.Q)
try
{
forceUseRoot = Boolean.parseBoolean(parameter2);
}
catch(Exception e)
{
}
if(context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.Q || forceUseRoot)
return setWifiWithRoot(context, desiredState, toggleActionIfPossible); return setWifiWithRoot(context, desiredState, toggleActionIfPossible);
else else
return setWifiOldFashioned(context, desiredState, toggleActionIfPossible); return setWifiOldFashioned(context, desiredState, toggleActionIfPossible);
@ -305,15 +233,8 @@ public class Actions
{ {
Miscellaneous.logEvent("i", "Wifi", "Changing wifi to " + String.valueOf(desiredState), 4); Miscellaneous.logEvent("i", "Wifi", "Changing wifi to " + String.valueOf(desiredState), 4);
try
{
if (desiredState && Settings.useWifiForPositioning) if (desiredState && Settings.useWifiForPositioning)
WifiBroadcastReceiver.startWifiReceiver(automationServerRef.getLocationProvider()); WifiBroadcastReceiver.startWifiReceiver(automationServerRef.getLocationProvider());
}
catch(Exception e)
{
Miscellaneous.logEvent("w", "setWifiOldFashioned()", Log.getStackTraceString(e), 4);
}
WifiManager myWifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); WifiManager myWifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
@ -735,6 +656,7 @@ public class Actions
if (method == null) if (method == null)
throw new NoSuchMethodException(); throw new NoSuchMethodException();
/* /*
* For some reason this doesn't work, throws NoSuchMethodExpection even if the method is present. * For some reason this doesn't work, throws NoSuchMethodExpection even if the method is present.
*/ */
@ -840,21 +762,29 @@ public class Actions
return false; return false;
} }
public static void setDoNotDisturb(Context context, int desiredDndMode) @RequiresApi(api = Build.VERSION_CODES.M)
public static void setDoNotDisturb(Context context, int desiredSetting)
{ {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
{
/*
if (!notificationManager.isNotificationPolicyAccessGranted())
--> done externally
*/
Miscellaneous.logEvent("i", context.getResources().getString(R.string.soundSettings), "Changing DND to " + String.valueOf(desiredDndMode), 4); // Check if the notification policy access has been granted for the app.
NotificationManager mNotificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE); /* if (!notificationManager.isNotificationPolicyAccessGranted())
mNotificationManager.setInterruptionFilter(desiredDndMode); {
Intent intent = new Intent(android.provider.Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
startActivity(intent);
return;
}*/
notificationManager.setInterruptionFilter(desiredSetting);
/*if (notificationManager.getCurrentInterruptionFilter() == NotificationManager.INTERRUPTION_FILTER_ALL)
{
notificationManager.setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_NONE);
} }
else else
Miscellaneous.logEvent("w", context.getResources().getString(R.string.soundSettings), "Cannot change DND to " + String.valueOf(desiredDndMode) + ". This Android version is too and doesn\'t have that feature, yet.", 4); {
notificationManager.setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_ALL);
}*/
} }
@RequiresApi(api = Build.VERSION_CODES.M) @RequiresApi(api = Build.VERSION_CODES.M)
@ -991,10 +921,21 @@ public class Actions
} }
} }
public static void setDND(Context context, int desiredDndMode)
{
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
{
Miscellaneous.logEvent("i", context.getResources().getString(R.string.soundSettings), "Changing DND to " + String.valueOf(desiredDndMode), 4);
NotificationManager mNotificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.setInterruptionFilter(desiredDndMode);
}
else
Miscellaneous.logEvent("w", context.getResources().getString(R.string.soundSettings), "Cannot change DND to " + String.valueOf(desiredDndMode) + ". This Android version is too and doesn\'t have that feature, yet.", 4);
}
public void useDownloadedWebpage(String result) public void useDownloadedWebpage(String result)
{ {
// Toast.makeText(context, "Result: " + result, Toast.LENGTH_LONG).show(); // Toast.makeText(context, "Result: " + result, Toast.LENGTH_LONG).show();
Actions.setVariable("last_triggerurl_result" + Action.actionParameter2Split + result);
} }
public static HttpClient getInsecureSslClient(HttpClient client) public static HttpClient getInsecureSslClient(HttpClient client)
@ -1053,16 +994,13 @@ public class Actions
{ {
Miscellaneous.logEvent("i", "StartOtherActivity", "Starting other Activity...", 4); Miscellaneous.logEvent("i", "StartOtherActivity", "Starting other Activity...", 4);
String params[]; String params[] = param.split(";");
if(param.contains(Action.actionParameter2Split))
params = param.split(Action.actionParameter2Split);
else
params = param.split(";");
try try
{ {
Intent externalApplicationIntent; Intent externalActivityIntent;
int paramsStartIndex;
if (!startByAction) if (!startByAction)
{ {
@ -1075,15 +1013,17 @@ public class Actions
Miscellaneous.logEvent("i", "StartOtherApp", "Starting app by activity: " + packageName + " " + className, 3); Miscellaneous.logEvent("i", "StartOtherApp", "Starting app by activity: " + packageName + " " + className, 3);
externalApplicationIntent = new Intent(Intent.ACTION_MAIN); paramsStartIndex = 2;
externalApplicationIntent.addCategory(Intent.CATEGORY_LAUNCHER);
if(packageName.equals("dummyPkg")) externalActivityIntent = new Intent(Intent.ACTION_MAIN);
externalApplicationIntent.setAction(className); externalActivityIntent.addCategory(Intent.CATEGORY_LAUNCHER);
externalApplicationIntent.setClassName(packageName, className); // if(packageName.equals("dummyPkg"))
// externalActivityIntent.setAction(className);
// else
externalActivityIntent.setClassName(packageName, className);
if (!Miscellaneous.doesActivityExist(externalApplicationIntent, Miscellaneous.getAnyContext())) if (!Miscellaneous.doesActivityExist(externalActivityIntent, Miscellaneous.getAnyContext()))
Miscellaneous.logEvent("w", "StartOtherApp", "Activity not found: " + className, 2); Miscellaneous.logEvent("w", "StartOtherApp", "Activity not found: " + className, 2);
} }
else else
@ -1091,49 +1031,18 @@ public class Actions
// selected by action // selected by action
Miscellaneous.logEvent("i", "StartOtherApp", "Starting app by action: " + param, 3); Miscellaneous.logEvent("i", "StartOtherApp", "Starting app by action: " + param, 3);
externalApplicationIntent = new Intent(); externalActivityIntent = new Intent();
if (!params[0].equals(dummyPackageString)) if (!params[0].equals(dummyPackageString))
externalApplicationIntent.setPackage(params[0]); externalActivityIntent.setPackage(params[0]);
externalApplicationIntent.setAction(params[1]); externalActivityIntent.setAction(params[1]);
if (params[2].equals(ActivityManageActionStartActivity.startByServiceString) || params[2].equals(ActivityManageActionStartActivity.startByForegroundServiceString))
{
externalApplicationIntent.setComponent(new ComponentName(params[0], params[2]));
}
} }
externalApplicationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); externalActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// Pack intents // Pack intents
if(params.length >= 4) for (int i = 3; i < params.length; i++)
{
if(Miscellaneous.isNumeric(params[3]))
externalApplicationIntent = packParametersIntoIntent(externalApplicationIntent, params, 4);
else
externalApplicationIntent = packParametersIntoIntent(externalApplicationIntent, params, 3);
}
if (params[2].equals(ActivityManageActionStartActivity.startByActivityString))
automationServerRef.startActivity(externalApplicationIntent);
else if (params[2].equals(ActivityManageActionStartActivity.startByServiceString))
automationServerRef.startService(externalApplicationIntent);
else if (params[2].equals(ActivityManageActionStartActivity.startByForegroundServiceString) && Build.VERSION.SDK_INT >= 26)
automationServerRef.startForegroundService(externalApplicationIntent);
else
automationServerRef.sendBroadcast(externalApplicationIntent);
}
catch (Exception e)
{
Miscellaneous.logEvent("e", "StartOtherApp", automationServerRef.getResources().getString(R.string.errorStartingOtherActivity) + ": " + Log.getStackTraceString(e), 2);
Toast.makeText(automationServerRef, automationServerRef.getResources().getString(R.string.errorStartingOtherActivity) + ": " + e.getMessage(), Toast.LENGTH_LONG).show();
}
}
public static Intent packParametersIntoIntent(Intent intent, String[] params, int startIndex)
{
for (int i = startIndex; i < params.length; i++)
{ {
String[] singleParam = params[i].split(Action.intentPairSeparator); String[] singleParam = params[i].split(Action.intentPairSeparator);
@ -1150,86 +1059,80 @@ public class Actions
if (singleParam[0].equals("boolean")) if (singleParam[0].equals("boolean"))
{ {
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3); Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3);
intent.putExtra(singleParam[1], Boolean.parseBoolean(singleParam[2])); externalActivityIntent.putExtra(singleParam[1], Boolean.parseBoolean(singleParam[2]));
} }
else if (singleParam[0].equals("byte")) else if (singleParam[0].equals("byte"))
{ {
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3); Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3);
intent.putExtra(singleParam[1], Byte.parseByte(singleParam[2])); externalActivityIntent.putExtra(singleParam[1], Byte.parseByte(singleParam[2]));
} }
else if (singleParam[0].equals("char")) else if (singleParam[0].equals("char"))
{ {
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3); Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3);
intent.putExtra(singleParam[1], singleParam[2].charAt(0)); externalActivityIntent.putExtra(singleParam[1], singleParam[2].charAt(0));
} }
else if (singleParam[0].equals("CharSequence")) else if (singleParam[0].equals("CharSequence"))
{ {
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3); Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3);
intent.putExtra(singleParam[1], (CharSequence) singleParam[2]); externalActivityIntent.putExtra(singleParam[1], (CharSequence) singleParam[2]);
} }
else if (singleParam[0].equals("double")) else if (singleParam[0].equals("double"))
{ {
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3); Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3);
intent.putExtra(singleParam[1], Double.parseDouble(singleParam[2])); externalActivityIntent.putExtra(singleParam[1], Double.parseDouble(singleParam[2]));
} }
else if (singleParam[0].equals("float")) else if (singleParam[0].equals("float"))
{ {
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3); Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3);
intent.putExtra(singleParam[1], Float.parseFloat(singleParam[2])); externalActivityIntent.putExtra(singleParam[1], Float.parseFloat(singleParam[2]));
} }
else if (singleParam[0].equals("int")) else if (singleParam[0].equals("int"))
{ {
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3); Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3);
intent.putExtra(singleParam[1], Integer.parseInt(singleParam[2])); externalActivityIntent.putExtra(singleParam[1], Integer.parseInt(singleParam[2]));
} }
else if (singleParam[0].equals("long")) else if (singleParam[0].equals("long"))
{ {
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3); Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3);
intent.putExtra(singleParam[1], Long.parseLong(singleParam[2])); externalActivityIntent.putExtra(singleParam[1], Long.parseLong(singleParam[2]));
} }
else if (singleParam[0].equals("short")) else if (singleParam[0].equals("short"))
{ {
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3); Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3);
intent.putExtra(singleParam[1], Short.parseShort(singleParam[2])); externalActivityIntent.putExtra(singleParam[1], Short.parseShort(singleParam[2]));
} }
else if (singleParam[0].equals("Uri")) else if (singleParam[0].equals("Uri"))
{
try
{ {
if (singleParam[1].equalsIgnoreCase("IntentData")) if (singleParam[1].equalsIgnoreCase("IntentData"))
{ {
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with value " + singleParam[2] + " as standard data parameter.", 3); 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))); externalActivityIntent.setData(Uri.parse(singleParam[2]));
} }
else else
{ {
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3); Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3);
intent.putExtra(singleParam[1], Uri.parse(Miscellaneous.replaceVariablesInText(singleParam[2], context))); externalActivityIntent.putExtra(singleParam[1], Uri.parse(singleParam[2]));
}
}
catch (Exception e)
{
throw new RuntimeException(e);
} }
} }
else if (singleParam[0].equals("String")) else if (singleParam[0].equals("String"))
{ {
Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3); Miscellaneous.logEvent("i", "StartOtherApp", "Adding parameter of type " + singleParam[0] + " with name " + singleParam[1] + " and value " + singleParam[2], 3);
try externalActivityIntent.putExtra(singleParam[1], singleParam[2]);
{
intent.putExtra(singleParam[1], Miscellaneous.replaceVariablesInText(singleParam[2], context));
}
catch (Exception e)
{
intent.putExtra(singleParam[1], singleParam[2]);
}
} }
else else
Miscellaneous.logEvent("w", "StartOtherApp", "Unknown type of parameter " + singleParam[0] + " found. Name " + singleParam[1] + " and value " + singleParam[2], 3); Miscellaneous.logEvent("w", "StartOtherApp", "Unknown type of parameter " + singleParam[0] + " found. Name " + singleParam[1] + " and value " + singleParam[2], 3);
} }
return intent; if (params[2].equals(ActivityManageActionStartActivity.startByActivityString))
automationServerRef.startActivity(externalActivityIntent);
else
automationServerRef.sendBroadcast(externalActivityIntent);
}
catch (Exception e)
{
Miscellaneous.logEvent("e", "StartOtherApp", automationServerRef.getResources().getString(R.string.errorStartingOtherActivity) + ": " + Log.getStackTraceString(e), 2);
Toast.makeText(automationServerRef, automationServerRef.getResources().getString(R.string.errorStartingOtherActivity) + ": " + e.getMessage(), Toast.LENGTH_LONG).show();
}
} }
public static void waitBeforeNextAction(Long waitTime) public static void waitBeforeNextAction(Long waitTime)
@ -1268,37 +1171,21 @@ public class Actions
public static void sendTextMessage(Context context, String[] parametersArray) public static void sendTextMessage(Context context, String[] parametersArray)
{ {
String phoneNumber, message, messageType = ActivityManageActionSendTextMessage.messageTypeSms, filePath = null; String phoneNumber, message;
phoneNumber = parametersArray[0]; phoneNumber = parametersArray[0];
message = parametersArray[1]; message = parametersArray[1];
if(parametersArray.length > 2)
{
messageType = parametersArray[2];
if(parametersArray.length > 3)
filePath = parametersArray[3];
}
try try
{ {
String textToSend = Miscellaneous.replaceVariablesInText(message, context); String textToSend = Miscellaneous.replaceVariablesInText(message, context);
if(messageType.equals("sms"))
sendSmsMessage(phoneNumber, textToSend);
else
sendMmsMessage(phoneNumber, textToSend, filePath);
}
catch (Exception e)
{
Miscellaneous.logEvent("e", Miscellaneous.getAnyContext().getString(R.string.sendTextMessage), "Error in sendTextMessage: " + Log.getStackTraceString(e), 3);
}
}
private static void sendSmsMessage(String phoneNumber, String textToSend) /*
{ Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("sms:" + phoneNumber));
try intent.putExtra("sms_body", message);
{ AutomationService.getInstance().startActivity(intent);
*/
PendingIntent pi = PendingIntent.getActivity(context, 0, new Intent(context, Actions.class), 0); PendingIntent pi = PendingIntent.getActivity(context, 0, new Intent(context, Actions.class), 0);
SmsManager sms = SmsManager.getDefault(); SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNumber, null, textToSend, pi, null); sms.sendTextMessage(phoneNumber, null, textToSend, pi, null);
@ -1309,26 +1196,6 @@ public class Actions
} }
} }
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private static void sendMmsMessage(String phoneNumber, String textToSend, String fileToBeAttached)
{
try
{
Miscellaneous.logEvent("i", "sendMmsMessage()", "Sending MMS message...", 2);
// Uri contentUri = Uri.fromFile(new File(fileToBeAttached));
String str2 = "send." + String.valueOf(Math.abs(new Random().nextLong())) + ".dat";
Uri contentUri = new Uri.Builder().authority(context.getPackageName() + ".MmsFileProvider").path(str2).scheme("content").build();
// Bundle a3 = C3326a.m16196a(new C8792q("enableGroupMms", true), new C8792q("maxMessageSize", Integer.valueOf(C3664a.m17428d())));
SmsManager.getDefault().sendMultimediaMessage(context, contentUri, phoneNumber, null, null);
}
catch (Exception e)
{
Miscellaneous.logEvent("e", "sendMmsMessage()", "Error in sendMmsMessage(): " + Log.getStackTraceString(e), 3);
}
}
private static class WakeUpDeviceClass implements Runnable private static class WakeUpDeviceClass implements Runnable
{ {
private long awakeTime; private long awakeTime;
@ -1995,11 +1862,6 @@ public class Actions
protected static boolean executeCommandViaSu(String[] commands) protected static boolean executeCommandViaSu(String[] commands)
{ {
boolean suAvailable = false;
String suVersion = null;
String suVersionInternal = null;
int suResult;
boolean success = false; boolean success = false;
try try
@ -2009,33 +1871,17 @@ public class Actions
{ {
suVersion = Shell.SU.version(false); suVersion = Shell.SU.version(false);
suVersionInternal = Shell.SU.version(true); suVersionInternal = Shell.SU.version(true);
suResult = Shell.SU.run(commands);
Miscellaneous.logEvent("i", "executeCommandViaSu()", "suVersion: " + suVersion + ", suVersionInternal: " + suVersionInternal, 5); if (suResult != null)
Miscellaneous.logEvent("i", "executeCommandViaSu()", "calling method: " + Miscellaneous.getCallingMethodName(), 5);
suResult = Shell.Pool.SU.run(commands);
if(Miscellaneous.getCallingMethodName().equals("runExecutable"))
{
Actions.setVariable("last_run_executable_exit_code" + Action.actionParameter2Split + String.valueOf(suResult));
// Actions.setVariable("last_run_executable_output" + Action.actionParameter2Split + (String) result[1]);
}
Miscellaneous.logEvent("i", "executeCommandViaSu()", "RC=" + String.valueOf(suResult), 3);
if(suResult == 0)
success = true; success = true;
} }
else
Miscellaneous.logEvent("w", "executeCommandViaSu()", "su not available.", 4);
} }
catch (Exception e) catch (Exception e)
{ {
success = false; success = false;
} }
Miscellaneous.logEvent("i", "executeCommandViaSu()", "Returning " + String.valueOf(success), 4);
return success; return success;
} }
@ -2061,320 +1907,4 @@ public class Actions
return android.provider.Settings.Global.getInt(context.getContentResolver(), android.provider.Settings.Global.AIRPLANE_MODE_ON, 0) != 0; return android.provider.Settings.Global.getInt(context.getContentResolver(), android.provider.Settings.Global.AIRPLANE_MODE_ON, 0) != 0;
} }
} }
public static boolean runExecutable(Context context, boolean runAsRoot, String path, String parameters)
{
if(runAsRoot)
{
if(!StringUtils.isEmpty(parameters))
return executeCommandViaSu(new String[] { path + " " + parameters });
else
return executeCommandViaSu(new String[] { path });
}
else
{
Object[] result;
File executable = new File(path);
File workingDir = new File(executable.getParent());
if(!StringUtils.isEmpty(parameters))
result = runExternalApplication(path, 0, workingDir, parameters);
else
result = runExternalApplication(path, 0, workingDir, null);
boolean execResult = ((int) result[0] == 0);
Actions.setVariable("last_run_executable_exit_code" + Action.actionParameter2Split + String.valueOf((int) result[0]));
Actions.setVariable("last_run_executable_output" + Action.actionParameter2Split + (String) result[1]);
return execResult;
}
}
/**
*
* @param commandToExecute
* @param timeout
* @param params
* @return Returns an array: 0=exit code, 1=cmdline output
*/
public static Object[] runExternalApplication(String commandToExecute, long timeout, File workingDirectory, String params)
{
/*
* Classes stolen from https://github.com/stleary/JSON-java
*/
String fullCommand;
if(!StringUtils.isEmpty(params))
fullCommand = commandToExecute + " " + params;
else
fullCommand = commandToExecute;
Miscellaneous.logEvent("i", "Running executable", "Running external application " + fullCommand, 4);
Object[] returnObject = new Object[2];
StringBuilder output = new StringBuilder();
String line = null;
OutputStream stdin = null;
InputStream stderr = null;
InputStream stdout = null;
try
{
Process process = null;
if(workingDirectory != null)
process = Runtime.getRuntime().exec(fullCommand, null, workingDirectory);
else
process = Runtime.getRuntime().exec(fullCommand);
stdin = process.getOutputStream ();
stderr = process.getErrorStream ();
stdout = process.getInputStream ();
stdin.close();
// clean up if any output in stdout
BufferedReader brCleanUp = new BufferedReader (new InputStreamReader (stdout));
while ((line = brCleanUp.readLine ()) != null)
{
Miscellaneous.logEvent ("i", "Running executable", "[Stdout] " + line, 4);
output.append(line);
}
brCleanUp.close();
// clean up if any output in stderr
brCleanUp = new BufferedReader (new InputStreamReader(stderr));
while ((line = brCleanUp.readLine ()) != null)
{
Miscellaneous.logEvent ("i", "Running executable", "[Stderr] " + line, 4);
output.append(line);
}
brCleanUp.close();
try
{
// Wait for the process to exit, we want the return code
if(timeout > 0 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
{
try
{
if(!process.waitFor(timeout, TimeUnit.MILLISECONDS))
{
Miscellaneous.logEvent("i", "Running executable", "Timeout of " + String.valueOf(timeout) + " ms reached. Killing check attempt.", 3);
process.destroyForcibly();
}
}
catch(NoSuchMethodError e)
{
process.waitFor();
}
}
else
process.waitFor();
}
catch (InterruptedException e)
{
Miscellaneous.logEvent("i", "Running executable", "Waiting for process failed: " + Log.getStackTraceString(e), 4);
Miscellaneous.logEvent("i", "Running executable", Log.getStackTraceString(e), 1);
}
if(process.exitValue() == 0)
Miscellaneous.logEvent("i", "Running executable", "ReturnCode: " + String.valueOf(process.exitValue()), 4);
else
Miscellaneous.logEvent("i", "Running executable", "External execution (RC=" + String.valueOf(process.exitValue()) + ") returned error: " + output.toString(), 3);
returnObject[0] = process.exitValue();
returnObject[1] = output.toString();
return returnObject;
}
catch (IOException e)
{
Miscellaneous.logEvent("e", "Running executable", Log.getStackTraceString(e), 1);
}
Miscellaneous.logEvent("i", "Running executable", "Error running external application.", 1);
return null;
}
public static boolean isTetheringActive1(Context context)
{
try
{
for(Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();)
{
NetworkInterface intf = en.nextElement();
for(Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();)
{
InetAddress inetAddress = enumIpAddr.nextElement();
if(!intf.isLoopback())
{
if(intf.getName().contains("rndis"))
{
return true;
}
}
}
}
}
catch(Exception e)
{
Miscellaneous.logEvent("e", "isTetheringActive()", Log.getStackTraceString(e), 3);
}
return false;
}
public final static int wakeLockTimeoutDisabled = -1;
static boolean wakeLockStopRequested = false;
public static void wakeLockStart(Context context, long duration)
{
Thread lockThread = new Thread(new Runnable()
{
@Override
public void run()
{
wakeLockStopRequested = false;
long waited = 0;
int step = 2000;
try
{
PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock fullWakeLock = powerManager.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "Loneworker - FULL WAKE LOCK");
fullWakeLock.acquire(); // turn on
do
{
try
{
Thread.sleep(step); // turn on duration
}
catch (InterruptedException e)
{
e.printStackTrace();
}
if(duration > 0)
waited += step;
if(wakeLockStopRequested) //stop requested
Miscellaneous.logEvent("i", "WakeLockStart", "Stop requested.", 4);
}
while(!wakeLockStopRequested && (duration < 0 || waited <= duration));
fullWakeLock.release();
}
catch (Exception e)
{
}
}
});
lockThread.start();
}
public static void wakeLockStop()
{
Miscellaneous.logEvent("i", "WakeLockStart", "Requesting stop.", 4);
wakeLockStopRequested = true;
}
public static void startPhoneCall(Context context, String phoneNumber)
{
Intent intent;
/*
Bug in Android 14 makes it necessary to add double quotes around MMI code.
More precisely it's required for codes containing the # character.
*/
if(Build.VERSION.SDK_INT >= 34)
intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + Uri.encode("\"" + phoneNumber + "\"")));
else
intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + Uri.encode(phoneNumber)));
// intent.setClassName("com.android.phone","com.android.phone.OutgoingCallBroadcaster");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_FROM_BACKGROUND);
context.startActivity(intent);
}
public static void endPhoneCall(Context context)
{
if(Build.VERSION.SDK_INT < 21)
{
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
try
{
Class c = Class.forName(tm.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
m.setAccessible(true);
Object telephonyService = m.invoke(tm);
c = Class.forName(telephonyService.getClass().getName());
m = c.getDeclaredMethod("endCall");
m.setAccessible(true);
m.invoke(telephonyService);
}
catch (Exception e)
{
e.printStackTrace();
}
}
else
{
TelecomManager mgr = (TelecomManager) context.getSystemService(context.TELECOM_SERVICE);
mgr.endCall();
}
}
public static void copyToClipboard(Context context, String text)
{
Miscellaneous.logEvent("i", "Clipboard", "Copying data to clipboard: " + text, 4);
if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB)
{
android.text.ClipboardManager clipboard = (android.text.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
clipboard.setText(text);
}
else
{
android.content.ClipboardManager clipboard = (android.content.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
android.content.ClipData clip = android.content.ClipData.newPlainText("Data-from-Automation", text);
clipboard.setPrimaryClip(clip);
}
}
public static void takeScreenshot()
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
{
if(!BuildConfig.FLAVOR.equals(AutomationService.flavor_name_googleplay))
MyAccessibilityService.getInstance().performGlobalAction(AccessibilityService.GLOBAL_ACTION_TAKE_SCREENSHOT);
}
}
public static void setLocationService(int desiredState, Context context)
{
// if(desiredState)
// {
// android.provider.Settings.Secure.putString(context.getContentResolver(), android.provider.Settings.Secure.LOCATION_MODE, new Integer(android.provider.Settings.Secure.LOCATION_MODE_HIGH_ACCURACY).toString());
// }
// else
// {
// android.provider.Settings.Secure.putString(context.getContentResolver(), android.provider.Settings.Secure.LOCATION_MODE, new Integer(android.provider.Settings.Secure.LOCATION_MODE_OFF).toString());
// }
android.provider.Settings.Secure.putString(context.getContentResolver(), android.provider.Settings.Secure.LOCATION_MODE, String.valueOf(desiredState));
}
} }

View File

@ -39,10 +39,8 @@ public class ActivityControlCenter extends Activity
protected void onCreate(@Nullable Bundle savedInstanceState) protected void onCreate(@Nullable Bundle savedInstanceState)
{ {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_control_center); setContentView(R.layout.activity_control_center);
bVolumeTest = (Button) findViewById(R.id.bVolumeTest); bVolumeTest = (Button) findViewById(R.id.bVolumeTest);
bVolumeTest.setOnClickListener(new View.OnClickListener() bVolumeTest.setOnClickListener(new View.OnClickListener()
{ {
@ -359,7 +357,7 @@ public class ActivityControlCenter extends Activity
systemInfoText.append("Device: " + android.os.Build.DEVICE + Miscellaneous.lineSeparator); systemInfoText.append("Device: " + android.os.Build.DEVICE + Miscellaneous.lineSeparator);
systemInfoText.append("Model: " + android.os.Build.MODEL + Miscellaneous.lineSeparator); systemInfoText.append("Model: " + android.os.Build.MODEL + Miscellaneous.lineSeparator);
systemInfoText.append("Product: " + android.os.Build.PRODUCT + Miscellaneous.lineSeparator); systemInfoText.append("Product: " + android.os.Build.PRODUCT + Miscellaneous.lineSeparator);
systemInfoText.append("Rooted: " + String.valueOf(Miscellaneous.isPhoneRooted()) + Miscellaneous.lineSeparator); systemInfoText.append("Rooted: " + String.valueOf(Miscellaneous.isPhoneRooted()));
systemInfoText.append("Country: " + Miscellaneous.getUserCountry(Miscellaneous.getAnyContext()) + Miscellaneous.lineSeparator); systemInfoText.append("Country: " + Miscellaneous.getUserCountry(Miscellaneous.getAnyContext()) + Miscellaneous.lineSeparator);
systemInfoText.append("OS language: " + Locale.getDefault().getDisplayName() + Miscellaneous.lineSeparator); systemInfoText.append("OS language: " + Locale.getDefault().getDisplayName() + Miscellaneous.lineSeparator);
systemInfoText.append("Logfile written: " + String.valueOf(Settings.writeLogFile) + Miscellaneous.lineSeparator); systemInfoText.append("Logfile written: " + String.valueOf(Settings.writeLogFile) + Miscellaneous.lineSeparator);
@ -386,7 +384,6 @@ public class ActivityControlCenter extends Activity
protected void onResume() protected void onResume()
{ {
super.onResume(); super.onResume();
Miscellaneous.setDisplayLanguage(this);
String folder = Miscellaneous.getWriteableFolder(); String folder = Miscellaneous.getWriteableFolder();
if (folder != null && folder.length() > 0) if (folder != null && folder.length() > 0)

View File

@ -21,7 +21,6 @@ public class ActivityDisplayLongMessage extends Activity
protected void onCreate(@Nullable Bundle savedInstanceState) protected void onCreate(@Nullable Bundle savedInstanceState)
{ {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_display_long_message); setContentView(R.layout.activity_display_long_message);
tvMessageTitle = (TextView)findViewById(R.id.tvMessageTitle); tvMessageTitle = (TextView)findViewById(R.id.tvMessageTitle);

View File

@ -13,8 +13,7 @@ public class ActivityHelp extends Activity
protected void onCreate(Bundle savedInstanceState) protected void onCreate(Bundle savedInstanceState)
{ {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this); setContentView(layout.help_text);
setContentView(layout.activity_help_text);
TextView tvHelpTextEnergySaving = (TextView) findViewById(R.id.tvHelpTextEnergySaving); TextView tvHelpTextEnergySaving = (TextView) findViewById(R.id.tvHelpTextEnergySaving);
tvHelpTextEnergySaving.setMovementMethod(LinkMovementMethod.getInstance()); tvHelpTextEnergySaving.setMovementMethod(LinkMovementMethod.getInstance());

View File

@ -44,7 +44,6 @@ public class ActivityMainPoi extends ActivityGeneric
protected void onCreate(Bundle savedInstanceState) protected void onCreate(Bundle savedInstanceState)
{ {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.main_poi_layout); setContentView(R.layout.main_poi_layout);
instance = this; instance = this;
@ -108,13 +107,6 @@ public class ActivityMainPoi extends ActivityGeneric
this.storeServiceReferenceInVariable(); this.storeServiceReferenceInVariable();
} }
@Override
protected void onResume()
{
super.onResume();
Miscellaneous.setDisplayLanguage(this);
}
private void buttonAddPoi() private void buttonAddPoi()
{ {
poiToEdit = null; poiToEdit = null;
@ -198,27 +190,8 @@ public class ActivityMainPoi extends ActivityGeneric
startActivityForResult(manageSpecificPoiIntent, 2000); startActivityForResult(manageSpecificPoiIntent, 2000);
break; break;
case 1: case 1:
AlertDialog.Builder deleteDialog = new AlertDialog.Builder(ActivityMainPoi.this);
deleteDialog.setMessage(getResources().getString(R.string.areYouSure));
deleteDialog.setPositiveButton(getResources().getString(R.string.yes), new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialogInterface, int i)
{
if(pointOfInterest.delete(Miscellaneous.getAnyContext())) if(pointOfInterest.delete(Miscellaneous.getAnyContext()))
updateListView(); updateListView();
}
});
deleteDialog.setNegativeButton(getResources().getString(R.string.no), new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialogInterface, int i)
{
}
});
deleteDialog.show();
break; break;
} }
} }

View File

@ -40,7 +40,6 @@ public class ActivityMainProfiles extends ActivityGeneric
protected void onCreate(Bundle savedInstanceState) protected void onCreate(Bundle savedInstanceState)
{ {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.main_profile_layout); setContentView(R.layout.main_profile_layout);
instance = this; instance = this;
@ -155,13 +154,6 @@ public class ActivityMainProfiles extends ActivityGeneric
} }
} }
@Override
protected void onResume()
{
super.onResume();
Miscellaneous.setDisplayLanguage(this);
}
private AlertDialog getProfileDialog(final Profile profile) private AlertDialog getProfileDialog(final Profile profile)
{ {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
@ -194,31 +186,12 @@ public class ActivityMainProfiles extends ActivityGeneric
case 2: case 2:
Rule user = profile.isInUseByRules(); Rule user = profile.isInUseByRules();
if(user == null) if(user == null)
{
AlertDialog.Builder deleteDialog = new AlertDialog.Builder(ActivityMainProfiles.this);
deleteDialog.setMessage(getResources().getString(R.string.areYouSure));
deleteDialog.setPositiveButton(getResources().getString(R.string.yes), new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialogInterface, int i)
{ {
if (profile.delete(ActivityMainProfiles.this)) if (profile.delete(ActivityMainProfiles.this))
updateListView(); updateListView();
else else
Toast.makeText(ActivityMainProfiles.this, getResources().getString(R.string.profileCouldNotBeDeleted), Toast.LENGTH_LONG).show(); Toast.makeText(ActivityMainProfiles.this, getResources().getString(R.string.profileCouldNotBeDeleted), Toast.LENGTH_LONG).show();
} }
});
deleteDialog.setNegativeButton(getResources().getString(R.string.no), new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialogInterface, int i)
{
}
});
deleteDialog.show();
}
else else
Toast.makeText(ActivityMainProfiles.this, String.format(getResources().getString(R.string.ruleXIsUsingProfileY), user.getName(), profile.getName()), Toast.LENGTH_LONG).show(); Toast.makeText(ActivityMainProfiles.this, String.format(getResources().getString(R.string.ruleXIsUsingProfileY), user.getName(), profile.getName()), Toast.LENGTH_LONG).show();
break; break;

View File

@ -18,7 +18,6 @@ import android.widget.ListView;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.jens.automation2.AutomationService.serviceCommands; import com.jens.automation2.AutomationService.serviceCommands;
import com.jens.automation2.receivers.DateTimeListener; import com.jens.automation2.receivers.DateTimeListener;
@ -48,7 +47,6 @@ public class ActivityMainRules extends ActivityGeneric
protected void onCreate(Bundle savedInstanceState) protected void onCreate(Bundle savedInstanceState)
{ {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.main_rule_layout); setContentView(R.layout.main_rule_layout);
instance = this; instance = this;
@ -155,13 +153,6 @@ public class ActivityMainRules extends ActivityGeneric
} }
} }
@Override
protected void onResume()
{
super.onResume();
Miscellaneous.setDisplayLanguage(this);
}
@Override @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) protected void onActivityResult(int requestCode, int resultCode, Intent data)
{ {
@ -222,30 +213,11 @@ public class ActivityMainRules extends ActivityGeneric
startActivityForResult(manageSpecificRuleIntent, requestCodeChangeRule); startActivityForResult(manageSpecificRuleIntent, requestCodeChangeRule);
break; break;
case 2: case 2:
AlertDialog.Builder deleteDialog = new AlertDialog.Builder(ActivityMainRules.this);
deleteDialog.setMessage(getResources().getString(R.string.areYouSure));
deleteDialog.setPositiveButton(getResources().getString(R.string.yes), new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialogInterface, int i)
{
if(ruleThisIsAbout.delete()) if(ruleThisIsAbout.delete())
{ {
ruleToEdit = null; //clear cache ruleToEdit = null; //clear cache
updateListView(); updateListView();
} }
}
});
deleteDialog.setNegativeButton(getResources().getString(R.string.no), new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialogInterface, int i)
{
}
});
deleteDialog.show();
break; break;
case 3: case 3:
ruleToEdit = ruleThisIsAbout; ruleToEdit = ruleThisIsAbout;

View File

@ -6,12 +6,9 @@ import android.app.AlertDialog;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log; import android.util.Log;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.View; import android.view.View;
@ -34,7 +31,6 @@ import com.jens.automation2.location.LocationProvider;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.Locale;
@SuppressLint("NewApi") @SuppressLint("NewApi")
public class ActivityMainScreen extends ActivityGeneric public class ActivityMainScreen extends ActivityGeneric
@ -55,7 +51,6 @@ public class ActivityMainScreen extends ActivityGeneric
public void onCreate(Bundle savedInstanceState) public void onCreate(Bundle savedInstanceState)
{ {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.main_overview_layout); setContentView(R.layout.main_overview_layout);
activityMainScreenInstance = this; activityMainScreenInstance = this;
@ -82,9 +77,10 @@ public class ActivityMainScreen extends ActivityGeneric
tvLockSoundDuration = (TextView)findViewById(R.id.tvlockSoundDuration); tvLockSoundDuration = (TextView)findViewById(R.id.tvlockSoundDuration);
tbLockSound = (ToggleButton) findViewById(R.id.tbLockSound); tbLockSound = (ToggleButton) findViewById(R.id.tbLockSound);
toggleService = (ToggleButton) findViewById(R.id.tbArmMastListener); toggleService = (ToggleButton) findViewById(R.id.tbArmMastListener);
bDonate = (Button)findViewById(R.id.bDonate); bDonate = (Button)findViewById(R.id.bDonate);
if(!BuildConfig.FLAVOR.equalsIgnoreCase(AutomationService.flavor_name_googleplay)) if(!BuildConfig.FLAVOR.equalsIgnoreCase("googlePlayFlavor"))
bDonate.setVisibility(View.VISIBLE); bDonate.setVisibility(View.VISIBLE);
toggleService.setChecked(AutomationService.isMyServiceRunning(this)); toggleService.setChecked(AutomationService.isMyServiceRunning(this));
@ -275,14 +271,9 @@ public class ActivityMainScreen extends ActivityGeneric
activityMainScreenInstance.tvMainScreenNotePermissions.setVisibility(View.GONE); activityMainScreenInstance.tvMainScreenNotePermissions.setVisibility(View.GONE);
} }
if(BuildConfig.FLAVOR.equals(AutomationService.flavor_name_fdroid) && Miscellaneous.restrictedFeaturesConfiguredFdroid()) if(Miscellaneous.restrictedFeaturesConfigured())
{ {
activityMainScreenInstance.tvMainScreenNoteFeaturesFromOtherFlavor.setText(R.string.settingsReferringToRestrictedFeaturesInFdroid); activityMainScreenInstance.tvMainScreenNoteFeaturesFromOtherFlavor.setText(R.string.settingsReferringToRestrictedFeatures);
activityMainScreenInstance.tvMainScreenNoteFeaturesFromOtherFlavor.setVisibility(View.VISIBLE);
}
else if(BuildConfig.FLAVOR.equals(AutomationService.flavor_name_googleplay) && Miscellaneous.restrictedFeaturesConfiguredGoogle())
{
activityMainScreenInstance.tvMainScreenNoteFeaturesFromOtherFlavor.setText(R.string.settingsReferringToRestrictedFeaturesInGoogle);
activityMainScreenInstance.tvMainScreenNoteFeaturesFromOtherFlavor.setVisibility(View.VISIBLE); activityMainScreenInstance.tvMainScreenNoteFeaturesFromOtherFlavor.setVisibility(View.VISIBLE);
} }
else else
@ -293,6 +284,14 @@ public class ActivityMainScreen extends ActivityGeneric
if(Miscellaneous.googleToBlameForLocation(true)) if(Miscellaneous.googleToBlameForLocation(true))
{ {
// Intent intent = new Intent(AutomationService.this, ActivityDisplayLongMessage.class);
// intent.putExtra("longMessage", getResources().getString(R.string.locationEngineDisabledLong));
// PendingIntent pi = PendingIntent.getActivity(AutomationService.this, 0, intent, 0);
// if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1)
// Miscellaneous.createDismissableNotificationWithDelay(2200, getResources().getString(R.string.featuresDisabled), notificationIdLocationRestriction, pi);
// else
// Miscellaneous.createDismissableNotification(getResources().getString(R.string.featuresDisabled), notificationIdLocationRestriction, pi);
activityMainScreenInstance.tvMainScreenNoteLocationImpossibleBlameGoogle.setText(R.string.locationEngineDisabledShort); activityMainScreenInstance.tvMainScreenNoteLocationImpossibleBlameGoogle.setText(R.string.locationEngineDisabledShort);
activityMainScreenInstance.tvMainScreenNoteLocationImpossibleBlameGoogle.setVisibility(View.VISIBLE); activityMainScreenInstance.tvMainScreenNoteLocationImpossibleBlameGoogle.setVisibility(View.VISIBLE);
activityMainScreenInstance.tvMainScreenNoteLocationImpossibleBlameGoogle.setOnClickListener(new OnClickListener() activityMainScreenInstance.tvMainScreenNoteLocationImpossibleBlameGoogle.setOnClickListener(new OnClickListener()
@ -317,7 +316,8 @@ public class ActivityMainScreen extends ActivityGeneric
uiUpdateRunning = true; uiUpdateRunning = true;
activityMainScreenInstance.toggleService.setChecked(true); activityMainScreenInstance.toggleService.setChecked(true);
uiUpdateRunning = false; uiUpdateRunning = false;
// if(activityMainScreenInstance.hasWindowFocus())
// {
try try
{ {
PointOfInterest activePoi = PointOfInterest.getActivePoi(); PointOfInterest activePoi = PointOfInterest.getActivePoi();
@ -434,7 +434,7 @@ public class ActivityMainScreen extends ActivityGeneric
else else
activityMainScreenInstance.checkForNews(); activityMainScreenInstance.checkForNews();
if(BuildConfig.FLAVOR.equals(AutomationService.flavor_name_apk) && Settings.automaticUpdateCheck) if(BuildConfig.FLAVOR.equals("apkFlavor") && Settings.automaticUpdateCheck)
{ {
Calendar now = Calendar.getInstance(); Calendar now = Calendar.getInstance();
if (Settings.lastUpdateCheck == Settings.default_lastUpdateCheck || now.getTimeInMillis() >= Settings.lastUpdateCheck + (long)(Settings.updateCheckFrequencyDays * 24 * 60 * 60 * 1000)) if (Settings.lastUpdateCheck == Settings.default_lastUpdateCheck || now.getTimeInMillis() >= Settings.lastUpdateCheck + (long)(Settings.updateCheckFrequencyDays * 24 * 60 * 60 * 1000))
@ -526,23 +526,15 @@ public class ActivityMainScreen extends ActivityGeneric
{ {
if (Rule.getRuleCollection().size() > 0) if (Rule.getRuleCollection().size() > 0)
{ {
if(Rule.getAmountOfActivatedRules() == 0)
{
Toast.makeText(context, context.getResources().getString(R.string.serviceWontStartNoActivatedRules), Toast.LENGTH_LONG).show();
activityMainScreenInstance.toggleService.setChecked(false);
return;
}
if (!AutomationService.isMyServiceRunning(context)) if (!AutomationService.isMyServiceRunning(context))
{ {
// if(myServiceIntent == null) //do we need that line?????
myServiceIntent = new Intent(context, AutomationService.class); myServiceIntent = new Intent(context, AutomationService.class);
myServiceIntent.putExtra("startAtBoot", startAtBoot); myServiceIntent.putExtra("startAtBoot", startAtBoot);
context.startService(myServiceIntent); context.startService(myServiceIntent);
} } else
else
Miscellaneous.logEvent("w", "Service", context.getResources().getString(R.string.logServiceAlreadyRunning), 3); Miscellaneous.logEvent("w", "Service", context.getResources().getString(R.string.logServiceAlreadyRunning), 3);
} } else
else
{ {
Toast.makeText(context, context.getResources().getString(R.string.serviceWontStart), Toast.LENGTH_LONG).show(); Toast.makeText(context, context.getResources().getString(R.string.serviceWontStart), Toast.LENGTH_LONG).show();
activityMainScreenInstance.toggleService.setChecked(false); activityMainScreenInstance.toggleService.setChecked(false);
@ -579,7 +571,6 @@ public class ActivityMainScreen extends ActivityGeneric
protected void onResume() protected void onResume()
{ {
super.onResume(); super.onResume();
Miscellaneous.setDisplayLanguage(this);
toggleService.setChecked(AutomationService.isMyServiceRunning(this)); toggleService.setChecked(AutomationService.isMyServiceRunning(this));
ActivityMainScreen.updateMainScreen(); ActivityMainScreen.updateMainScreen();

View File

@ -3,17 +3,12 @@ package com.jens.automation2;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.TabActivity; import android.app.TabActivity;
import android.content.Intent; import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Bundle; import android.os.Bundle;
import android.util.DisplayMetrics;
import android.widget.TabHost; import android.widget.TabHost;
import android.widget.TabHost.TabSpec; import android.widget.TabHost.TabSpec;
import com.jens.automation2.receivers.NfcReceiver; import com.jens.automation2.receivers.NfcReceiver;
import java.util.Locale;
@SuppressLint("NewApi") @SuppressLint("NewApi")
public class ActivityMainTabLayout extends TabActivity public class ActivityMainTabLayout extends TabActivity
@ -22,8 +17,8 @@ public class ActivityMainTabLayout extends TabActivity
protected void onCreate(Bundle savedInstanceState) protected void onCreate(Bundle savedInstanceState)
{ {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Settings.readFromPersistentStorage(ActivityMainTabLayout.this); Settings.readFromPersistentStorage(ActivityMainTabLayout.this);
Miscellaneous.setDisplayLanguage(this);
if(Settings.tabsPlacement == 1) if(Settings.tabsPlacement == 1)
setContentView(R.layout.main_tab_layout_tabs_at_bottom); setContentView(R.layout.main_tab_layout_tabs_at_bottom);
@ -65,7 +60,6 @@ public class ActivityMainTabLayout extends TabActivity
protected void onResume() protected void onResume()
{ {
super.onResume(); super.onResume();
Miscellaneous.setDisplayLanguage(this);
// Miscellaneous.logEvent("i", "NFC", "ActivityMainTabLayout.onResume().", 5); // Miscellaneous.logEvent("i", "NFC", "ActivityMainTabLayout.onResume().", 5);
NfcReceiver.checkIntentForNFC(this, getIntent()); NfcReceiver.checkIntentForNFC(this, getIntent());
// NfcReceiver.checkIntentForNFC(this, new Intent(this.getApplicationContext(), this.getClass())); // NfcReceiver.checkIntentForNFC(this, new Intent(this.getApplicationContext(), this.getClass()));

View File

@ -26,7 +26,6 @@ public class ActivityManageActionBrightnessSetting extends Activity
protected void onCreate(@Nullable Bundle savedInstanceState) protected void onCreate(@Nullable Bundle savedInstanceState)
{ {
setContentView(R.layout.activity_manage_action_brightness_settings); setContentView(R.layout.activity_manage_action_brightness_settings);
Miscellaneous.setDisplayLanguage(this);
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
chkAutoBrightness = (CheckBox)findViewById(R.id.chkAutoBrightness); chkAutoBrightness = (CheckBox)findViewById(R.id.chkAutoBrightness);

View File

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

View File

@ -19,7 +19,6 @@ public class ActivityManageActionControlMedia extends Activity
protected void onCreate(@Nullable Bundle savedInstanceState) protected void onCreate(@Nullable Bundle savedInstanceState)
{ {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_action_control_media); setContentView(R.layout.activity_manage_action_control_media);
rbMediaPlayPause = (RadioButton)findViewById(R.id.rbMediaPlayPause); rbMediaPlayPause = (RadioButton)findViewById(R.id.rbMediaPlayPause);

View File

@ -1,53 +0,0 @@
package com.jens.automation2;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import org.apache.commons.lang3.StringUtils;
public class ActivityManageActionCopyToClipboard extends Activity
{
private Button bSaveCopyToClipboard;
private EditText etCopyToClipboard;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
this.setContentView(R.layout.activity_manage_action_copy_to_clipboard);
bSaveCopyToClipboard = (Button) findViewById(R.id.bSaveCopyToClipboard);
etCopyToClipboard = (EditText)findViewById(R.id.etCopyToClipboard);
bSaveCopyToClipboard.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
if(StringUtils.isEmpty(etCopyToClipboard.getText().toString()))
{
Toast.makeText(ActivityManageActionCopyToClipboard.this, getResources().getString(R.string.enterText), Toast.LENGTH_SHORT).show();
}
else
{
Intent response = new Intent();
response.putExtra(ActivityManageRule.intentNameActionParameter2, etCopyToClipboard.getText().toString());
setResult(RESULT_OK, response);
finish();
}
}
});
if(getIntent().hasExtra(ActivityManageRule.intentNameActionParameter2))
{
String text = getIntent().getStringExtra(ActivityManageRule.intentNameActionParameter2);
etCopyToClipboard.setText(text);
}
}
}

View File

@ -24,7 +24,6 @@ public class ActivityManageActionCreateNotification extends Activity
protected void onCreate(@Nullable Bundle savedInstanceState) protected void onCreate(@Nullable Bundle savedInstanceState)
{ {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_action_create_notification); setContentView(R.layout.activity_manage_action_create_notification);
etNotificationTitle = (EditText) findViewById(R.id.etNotificationTitle); etNotificationTitle = (EditText) findViewById(R.id.etNotificationTitle);

View File

@ -1,75 +0,0 @@
package com.jens.automation2;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.provider.Settings;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import androidx.annotation.Nullable;
public class ActivityManageActionLocationService extends Activity
{
RadioButton rbActionLocationServiceOff, rbActionLocationServiceSensorsOnly, rbActionLocationServiceBatterySaving, rbActionLocationServiceHighAccuracy;
Button bActionSetLocationServiceSave;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_action_location_service);
rbActionLocationServiceOff = (RadioButton) findViewById(R.id.rbActionLocationServiceOff);
rbActionLocationServiceSensorsOnly = (RadioButton)findViewById(R.id.rbActionLocationServiceSensorsOnly);
rbActionLocationServiceBatterySaving = (RadioButton)findViewById(R.id.rbActionLocationServiceBatterySaving);
rbActionLocationServiceHighAccuracy = (RadioButton)findViewById(R.id.rbActionLocationServiceHighAccuracy);
bActionSetLocationServiceSave = (Button) findViewById(R.id.bActionSetLocationServiceSave);
Intent input = getIntent();
if(input.hasExtra(ActivityManageRule.intentNameActionParameter2))
{
String[] params = input.getStringExtra(ActivityManageRule.intentNameActionParameter2).split(Action.actionParameter2Split);
int desiredState = Integer.parseInt(params[0]);
switch(desiredState)
{
case Settings.Secure.LOCATION_MODE_OFF:
rbActionLocationServiceOff.setChecked(true);
break;
case Settings.Secure.LOCATION_MODE_SENSORS_ONLY:
rbActionLocationServiceSensorsOnly.setChecked(true);
break;
case Settings.Secure.LOCATION_MODE_BATTERY_SAVING:
rbActionLocationServiceBatterySaving.setChecked(true);
break;
case Settings.Secure.LOCATION_MODE_HIGH_ACCURACY:
rbActionLocationServiceHighAccuracy.setChecked(true);
break;
}
}
bActionSetLocationServiceSave.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
Intent response = new Intent();
if(rbActionLocationServiceOff.isChecked())
response.putExtra(ActivityManageRule.intentNameActionParameter2, String.valueOf(Settings.Secure.LOCATION_MODE_OFF));
else if(rbActionLocationServiceSensorsOnly.isChecked())
response.putExtra(ActivityManageRule.intentNameActionParameter2, String.valueOf(Settings.Secure.LOCATION_MODE_SENSORS_ONLY));
else if(rbActionLocationServiceBatterySaving.isChecked())
response.putExtra(ActivityManageRule.intentNameActionParameter2, String.valueOf(Settings.Secure.LOCATION_MODE_BATTERY_SAVING));
else
response.putExtra(ActivityManageRule.intentNameActionParameter2, String.valueOf(Settings.Secure.LOCATION_MODE_HIGH_ACCURACY));
setResult(RESULT_OK, response);
finish();
}
});
}
}

View File

@ -1,55 +0,0 @@
package com.jens.automation2;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.annotation.Nullable;
import org.apache.commons.lang3.StringUtils;
public class ActivityManageActionMakePhoneCall extends Activity
{
EditText etTargetPhoneNumber;
Button bActionMakePhoneCallSave;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_action_make_phone_call);
etTargetPhoneNumber = (EditText)findViewById(R.id.etTargetPhoneNumber);
bActionMakePhoneCallSave = (Button) findViewById(R.id.bActionMakePhoneCallSave);
Intent input = getIntent();
/*if(input.hasExtra(ActivityManageRule.intentNameActionParameter1))
rbActionWifiOn.setChecked(input.getBooleanExtra(ActivityManageRule.intentNameActionParameter1, true));
*/
if(input.hasExtra(ActivityManageRule.intentNameActionParameter2))
etTargetPhoneNumber.setText(input.getStringExtra(ActivityManageRule.intentNameActionParameter2));
bActionMakePhoneCallSave.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
if(!StringUtils.isEmpty(etTargetPhoneNumber.getText()))
{
Intent response = new Intent();
response.putExtra(ActivityManageRule.intentNameActionParameter1, false);
response.putExtra(ActivityManageRule.intentNameActionParameter2, etTargetPhoneNumber.getText().toString());
setResult(RESULT_OK, response);
finish();
}
else
Toast.makeText(ActivityManageActionMakePhoneCall.this, getResources().getText(R.string.enterPhoneNumber), Toast.LENGTH_SHORT).show();
}
});
}
}

View File

@ -26,7 +26,6 @@ public class ActivityManageActionPlaySound extends Activity
protected void onCreate(@Nullable Bundle savedInstanceState) protected void onCreate(@Nullable Bundle savedInstanceState)
{ {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_action_play_sound); setContentView(R.layout.activity_manage_action_play_sound);
chkPlaySoundAlwaysPlay = (CheckBox)findViewById(R.id.chkPlaySoundAlwaysPlay); chkPlaySoundAlwaysPlay = (CheckBox)findViewById(R.id.chkPlaySoundAlwaysPlay);

View File

@ -1,124 +0,0 @@
package com.jens.automation2;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;
import androidx.annotation.Nullable;
import org.apache.commons.lang3.StringUtils;
import java.io.File;
public class ActivityManageActionRunExecutable extends Activity
{
final static int PICKFILE_RESULT_CODE = 4711;
CheckBox chkRunExecAsRoot;
EditText etRunExecutablePath, etRunExecutableParameters;
Button bChooseExecutable, bSaveActionRunExec;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_action_run_executable);
chkRunExecAsRoot = (CheckBox)findViewById(R.id.chkRunExecAsRoot);
etRunExecutablePath = (EditText) findViewById(R.id.etRunExecutablePath);
etRunExecutableParameters = (EditText) findViewById(R.id.etRunExecutableParameters);
bChooseExecutable = (Button) findViewById(R.id.bChooseExecutable);
bSaveActionRunExec = (Button) findViewById(R.id.bSaveActionRunExec);
bChooseExecutable.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
//Need to check for storage permissions
Intent chooseFile = new Intent(Intent.ACTION_GET_CONTENT);
chooseFile.setType("*/*");
chooseFile = Intent.createChooser(chooseFile, getResources().getString(R.string.selectSoundFile));
startActivityForResult(chooseFile, PICKFILE_RESULT_CODE);
}
});
bSaveActionRunExec.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
saveExecSettings();
}
});
if(getIntent().hasExtra(ActivityManageRule.intentNameActionParameter2))
{
String[] parts = getIntent().getStringExtra(ActivityManageRule.intentNameActionParameter2).split(Action.actionParameter2Split);
etRunExecutablePath.setText(parts[0]);
if(parts.length > 1)
etRunExecutableParameters.setText(parts[1]);
}
}
void saveExecSettings()
{
if(etRunExecutablePath.getText().toString() == null || etRunExecutablePath.getText().toString().length() == 0)
{
Toast.makeText(ActivityManageActionRunExecutable.this, getResources().getString(R.string.selectValidExecutable), Toast.LENGTH_LONG).show();
return;
}
else
{
File executableFile = new File(etRunExecutablePath.getText().toString());
if(!executableFile.exists())
{
Toast.makeText(ActivityManageActionRunExecutable.this, getResources().getString(R.string.fileDoesNotExist), Toast.LENGTH_LONG).show();
return;
}
else
{
if(!chkRunExecAsRoot.isChecked() && !executableFile.canExecute())
{
Toast.makeText(ActivityManageActionRunExecutable.this, getResources().getString(R.string.fileNotExecutable), Toast.LENGTH_LONG).show();
return;
}
}
}
Intent returnData = new Intent();
returnData.putExtra(ActivityManageRule.intentNameActionParameter1, chkRunExecAsRoot.isChecked());
if(etRunExecutableParameters.getText() != null && !StringUtils.isEmpty(etRunExecutableParameters.getText().toString()))
returnData.putExtra(ActivityManageRule.intentNameActionParameter2, etRunExecutablePath.getText().toString() + Action.actionParameter2Split + etRunExecutableParameters.getText().toString());
else
returnData.putExtra(ActivityManageRule.intentNameActionParameter2, etRunExecutablePath.getText().toString());
setResult(RESULT_OK, returnData);
finish();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_OK)
{
if(requestCode == PICKFILE_RESULT_CODE)
{
Uri fileUri = data.getData();
String filePath = CompensateCrappyAndroidPaths.getPath(ActivityManageActionRunExecutable.this, fileUri);
etRunExecutablePath.setText(filePath);
}
}
}
}

View File

@ -5,54 +5,29 @@ import android.app.AlertDialog;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.text.InputType;
import android.view.View; import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button; import android.widget.Button;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.List;
public class ActivityManageActionSendBroadcast extends Activity public class ActivityManageActionSendBroadcast extends Activity
{ {
EditText etBroadcastToSend; EditText etBroadcastToSend;
Button bBroadcastSendShowSuggestions, bSaveSendBroadcast, bAddIntentPair; Button bBroadcastSendShowSuggestions, bSaveSendBroadcast;
ListView lvIntentPairs;
EditText etParameterName, etParameterValue;
Spinner spinnerParameterType;
ArrayAdapter<String> intentTypeSpinnerAdapter, intentPairAdapter;
private static final String[] supportedIntentTypes = { "boolean", "byte", "char", "double", "float", "int", "long", "short", "String", "Uri" };
private ArrayList<String> intentPairList = new ArrayList<>();
@Override @Override
protected void onCreate(@Nullable Bundle savedInstanceState) protected void onCreate(@Nullable Bundle savedInstanceState)
{ {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_action_send_broadcast); setContentView(R.layout.activity_manage_action_send_broadcast);
etBroadcastToSend = (EditText)findViewById(R.id.etBroadcastToSend); etBroadcastToSend = (EditText)findViewById(R.id.etBroadcastToSend);
bBroadcastSendShowSuggestions = (Button)findViewById(R.id.bBroadcastSendShowSuggestions); bBroadcastSendShowSuggestions = (Button)findViewById(R.id.bBroadcastSendShowSuggestions);
bSaveSendBroadcast = (Button)findViewById(R.id.bSaveSendBroadcast); bSaveSendBroadcast = (Button)findViewById(R.id.bSaveSendBroadcast);
bAddIntentPair = (Button)findViewById(R.id.bAddIntentPair);
lvIntentPairs = (ListView) findViewById(R.id.lvIntentPairs);
etParameterName = (EditText) findViewById(R.id.etParameterName);
etParameterValue = (EditText) findViewById(R.id.etParameterValue);
spinnerParameterType = (Spinner) findViewById(R.id.spinnerParameterType);
intentTypeSpinnerAdapter = new ArrayAdapter<String>(this, R.layout.text_view_for_poi_listview_mediumtextsize, ActivityManageActionSendBroadcast.supportedIntentTypes);
spinnerParameterType.setAdapter(intentTypeSpinnerAdapter);
intentTypeSpinnerAdapter.notifyDataSetChanged();
intentPairAdapter = new ArrayAdapter<String>(this, R.layout.text_view_for_poi_listview_mediumtextsize, intentPairList);
bSaveSendBroadcast.setOnClickListener(new View.OnClickListener() bSaveSendBroadcast.setOnClickListener(new View.OnClickListener()
{ {
@ -62,20 +37,7 @@ public class ActivityManageActionSendBroadcast extends Activity
if(checkInput()) if(checkInput())
{ {
Intent answer = new Intent(); Intent answer = new Intent();
answer.putExtra(ActivityManageRule.intentNameActionParameter2, etBroadcastToSend.getText().toString());
String param2 = etBroadcastToSend.getText().toString();
if(intentPairList.size() > 0)
{
param2 += Action.actionParameter2Split;
for (String s : intentPairList)
param2 += s + ";";
param2 = param2.substring(0, param2.length() - 1);
}
answer.putExtra(ActivityManageRule.intentNameActionParameter2, param2);
setResult(RESULT_OK, answer); setResult(RESULT_OK, answer);
finish(); finish();
} }
@ -104,140 +66,7 @@ public class ActivityManageActionSendBroadcast extends Activity
Intent input = getIntent(); Intent input = getIntent();
if(input.hasExtra(ActivityManageRule.intentNameActionParameter2)) if(input.hasExtra(ActivityManageRule.intentNameActionParameter2))
{
String param2 = input.getStringExtra(ActivityManageRule.intentNameActionParameter2);
if(!param2.contains(Action.actionParameter2Split))
etBroadcastToSend.setText(input.getStringExtra(ActivityManageRule.intentNameActionParameter2)); etBroadcastToSend.setText(input.getStringExtra(ActivityManageRule.intentNameActionParameter2));
else
{
String[] param2Parts = param2.split(Action.actionParameter2Split);
etBroadcastToSend.setText(param2Parts[0]);
String[] params = param2Parts[1].split(";");
intentPairList.clear();
for(int i = 0; i < params.length; i++)
{
if(lvIntentPairs.getVisibility() != View.VISIBLE)
lvIntentPairs.setVisibility(View.VISIBLE);
intentPairList.add(params[i]);
}
updateIntentPairList();
}
}
bAddIntentPair.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
// type;name;value
if(spinnerParameterType.getSelectedItem().toString().length() == 0)
{
Toast.makeText(ActivityManageActionSendBroadcast.this, getResources().getString(R.string.selectTypeOfIntentPair), Toast.LENGTH_LONG).show();
return;
}
if(etParameterName.getText().toString().length() == 0)
{
Toast.makeText(ActivityManageActionSendBroadcast.this, getResources().getString(R.string.enterNameForIntentPair), Toast.LENGTH_LONG).show();
return;
}
else if(etParameterName.getText().toString().contains(Action.intentPairSeparator))
{
Toast.makeText(ActivityManageActionSendBroadcast.this, String.format(getResources().getString(R.string.stringNotAllowed), Action.intentPairSeparator), Toast.LENGTH_LONG).show();
return;
}
else if(etParameterName.getText().toString().contains(";"))
{
Toast.makeText(ActivityManageActionSendBroadcast.this, String.format(getResources().getString(R.string.stringNotAllowed), ";"), Toast.LENGTH_LONG).show();
return;
}
if(etParameterValue.getText().toString().length() == 0)
{
Toast.makeText(ActivityManageActionSendBroadcast.this, getResources().getString(R.string.enterValueForIntentPair), Toast.LENGTH_LONG).show();
return;
}
else if(etParameterValue.getText().toString().contains(Action.intentPairSeparator))
{
Toast.makeText(ActivityManageActionSendBroadcast.this, String.format(getResources().getString(R.string.stringNotAllowed), Action.intentPairSeparator), Toast.LENGTH_LONG).show();
return;
}
else if(etParameterValue.getText().toString().contains(";"))
{
Toast.makeText(ActivityManageActionSendBroadcast.this, String.format(getResources().getString(R.string.stringNotAllowed), ";"), Toast.LENGTH_LONG).show();
return;
}
switch(supportedIntentTypes[spinnerParameterType.getSelectedItemPosition()])
{
case "int":
case "long":
case "short":
if(!Miscellaneous.isNumeric(etParameterValue.getText().toString()))
{
Toast.makeText(ActivityManageActionSendBroadcast.this, getResources().getString(R.string.enter_a_number), Toast.LENGTH_LONG).show();
return;
}
break;
case "double":
case "float":
if(!Miscellaneous.isNumericDecimal(etParameterValue.getText().toString()))
{
Toast.makeText(ActivityManageActionSendBroadcast.this, getResources().getString(R.string.enter_a_number), Toast.LENGTH_LONG).show();
return;
}
break;
default:
ActivityManageActionSendBroadcast.this.etParameterValue.setInputType(InputType.TYPE_CLASS_TEXT);
}
String param = supportedIntentTypes[spinnerParameterType.getSelectedItemPosition()] + Action.intentPairSeparator + etParameterName.getText().toString() + Action.intentPairSeparator + etParameterValue.getText().toString();
intentPairList.add(param);
spinnerParameterType.setSelection(0);
etParameterName.setText("");
etParameterValue.setText("");
updateIntentPairList();
if(lvIntentPairs.getVisibility() != View.VISIBLE)
lvIntentPairs.setVisibility(View.VISIBLE);
}
});
lvIntentPairs.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener()
{
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3)
{
getIntentPairDialog(arg2).show();
return false;
}
});
spinnerParameterType.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
{
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3)
{
if(supportedIntentTypes[arg2].equals("int") || supportedIntentTypes[arg2].equals("long") || supportedIntentTypes[arg2].equals("short"))
ActivityManageActionSendBroadcast.this.etParameterValue.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED);
else if(supportedIntentTypes[arg2].equals("double") || supportedIntentTypes[arg2].equals("float"))
ActivityManageActionSendBroadcast.this.etParameterValue.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL);
else
ActivityManageActionSendBroadcast.this.etParameterValue.setInputType(InputType.TYPE_CLASS_TEXT);
}
@Override
public void onNothingSelected(AdapterView<?> arg0)
{
}
});
} }
boolean checkInput() boolean checkInput()
@ -251,30 +80,4 @@ public class ActivityManageActionSendBroadcast extends Activity
return true; return true;
} }
private void updateIntentPairList()
{
if(lvIntentPairs.getAdapter() == null)
lvIntentPairs.setAdapter(intentPairAdapter);
intentPairAdapter.notifyDataSetChanged();
}
private AlertDialog getIntentPairDialog(final int itemPosition)
{
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(ActivityManageActionSendBroadcast.this);
alertDialogBuilder.setTitle(getResources().getString(R.string.whatToDoWithIntentPair));
alertDialogBuilder.setItems(new String[]{getResources().getString(R.string.delete)}, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
// Only 1 choice at the moment, no need to check
ActivityManageActionSendBroadcast.this.intentPairList.remove(itemPosition);
updateIntentPairList();
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
return alertDialog;
}
} }

View File

@ -9,37 +9,26 @@ import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.provider.ContactsContract; import android.provider.ContactsContract;
import android.provider.MediaStore;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.widget.Button; import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.EditText; import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.jens.automation2.Action.Action_Enum; import com.jens.automation2.Action.Action_Enum;
import org.apache.commons.lang3.StringUtils;
public class ActivityManageActionSendTextMessage extends Activity public class ActivityManageActionSendTextMessage extends Activity
{ {
Button bSaveSendTextMessage, bImportNumberFromContacts, bMmsAttachment; Button bSaveSendTextMessage, bImportNumberFromContacts;
EditText etPhoneNumber, etSendTextMessage; EditText etPhoneNumber, etSendTextMessage;
RadioButton rbMessageTypeSms, rbMessageTypeMms;
TextView tvSendMmsFileAttachment;
protected final static int requestCodeForContactsPermissions = 9876; protected final static int requestCodeForContactsPermissions = 9876;
protected final static int requestCodeGetContact = 3235; protected final static int requestCodeGetContact = 3235;
protected final static int requestCodeGetMMSattachment = 3236;
public static final String messageTypeSms = "sms"; // private String existingUrl = "";
public static final String messageTypeMms = "mms";
public static boolean edit = false; public static boolean edit = false;
public static Action resultingAction = null; public static Action resultingAction = null;
@ -48,17 +37,12 @@ public class ActivityManageActionSendTextMessage extends Activity
protected void onCreate(Bundle savedInstanceState) protected void onCreate(Bundle savedInstanceState)
{ {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
this.setContentView(R.layout.activity_manage_action_send_textmessage); this.setContentView(R.layout.activity_manage_action_send_textmessage);
etSendTextMessage = (EditText)findViewById(R.id.etSendTextMessage); etSendTextMessage = (EditText)findViewById(R.id.etSendTextMessage);
etPhoneNumber = (EditText)findViewById(R.id.etPhoneNumber); etPhoneNumber = (EditText)findViewById(R.id.etPhoneNumber);
bSaveSendTextMessage = (Button)findViewById(R.id.bSaveSendTextMessage); bSaveSendTextMessage = (Button)findViewById(R.id.bSaveSendTextMessage);
bImportNumberFromContacts = (Button)findViewById(R.id.bImportNumberFromContacts); bImportNumberFromContacts = (Button)findViewById(R.id.bImportNumberFromContacts);
rbMessageTypeSms = (RadioButton)findViewById(R.id.rbMessageTypeSms);
rbMessageTypeMms = (RadioButton) findViewById(R.id.rbMessageTypeMms);
bMmsAttachment = (Button)findViewById(R.id.bMmsAttachment);
tvSendMmsFileAttachment = (TextView)findViewById(R.id.tvSendMmsFileAttachment);
bSaveSendTextMessage.setOnClickListener(new OnClickListener() bSaveSendTextMessage.setOnClickListener(new OnClickListener()
{ {
@ -67,30 +51,14 @@ public class ActivityManageActionSendTextMessage extends Activity
{ {
if(etSendTextMessage.getText().toString().length() > 0 && etPhoneNumber.getText().toString().length() > 0) if(etSendTextMessage.getText().toString().length() > 0 && etPhoneNumber.getText().toString().length() > 0)
{ {
if(rbMessageTypeMms.isChecked() && StringUtils.isEmpty(tvSendMmsFileAttachment.getText().toString())) if(resultingAction == null)
Toast.makeText(getBaseContext(), getResources().getString(R.string.chooseFile), Toast.LENGTH_LONG).show();
else
{
if (resultingAction == null)
{ {
resultingAction = new Action(); resultingAction = new Action();
resultingAction.setAction(Action_Enum.sendTextMessage); resultingAction.setAction(Action_Enum.sendTextMessage);
String messageType = null; resultingAction.setParameter2(etPhoneNumber.getText().toString() + Actions.smsSeparator + etSendTextMessage.getText().toString());
String path = "";
if(rbMessageTypeSms.isChecked())
messageType = messageTypeSms;
else
{
messageType = messageTypeMms;
path = Actions.smsSeparator + tvSendMmsFileAttachment.getText().toString();
}
resultingAction.setParameter2(etPhoneNumber.getText().toString() + Actions.smsSeparator + etSendTextMessage.getText().toString() + Actions.smsSeparator + messageType + path);
} }
backToRuleManager(); backToRuleManager();
} }
}
else else
Toast.makeText(getBaseContext(), getResources().getString(R.string.enterPhoneNumberAndText), Toast.LENGTH_LONG).show(); Toast.makeText(getBaseContext(), getResources().getString(R.string.enterPhoneNumberAndText), Toast.LENGTH_LONG).show();
} }
@ -110,28 +78,6 @@ public class ActivityManageActionSendTextMessage extends Activity
} }
}); });
RadioButton.OnCheckedChangeListener checkedChangedListener = new RadioButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b)
{
bMmsAttachment.setEnabled(rbMessageTypeMms.isChecked());
}
};
rbMessageTypeSms.setOnCheckedChangeListener(checkedChangedListener);
rbMessageTypeMms.setOnCheckedChangeListener(checkedChangedListener);
bMmsAttachment.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View view)
{
Intent chooseFileIntent = new Intent(Intent.ACTION_GET_CONTENT);
chooseFileIntent.setType("*/*");
chooseFileIntent = Intent.createChooser(chooseFileIntent, getResources().getString(R.string.chooseFile));
startActivityForResult(chooseFileIntent, requestCodeGetMMSattachment);
}
});
ActivityManageActionSendTextMessage.edit = getIntent().getBooleanExtra("edit", false); ActivityManageActionSendTextMessage.edit = getIntent().getBooleanExtra("edit", false);
if(edit) if(edit)
{ {
@ -197,10 +143,10 @@ public class ActivityManageActionSendTextMessage extends Activity
@Override @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if(resultCode == Activity.RESULT_OK)
{ {
if(requestCode == requestCodeGetContact) if(requestCode == requestCodeGetContact)
{
if(resultCode == Activity.RESULT_OK)
{ {
String phoneNo = null; String phoneNo = null;
String name = null; String name = null;
@ -219,12 +165,6 @@ public class ActivityManageActionSendTextMessage extends Activity
etPhoneNumber.setText(phoneNo); etPhoneNumber.setText(phoneNo);
} }
} }
else if (requestCode == requestCodeGetMMSattachment)
{
Uri fileUri = data.getData();
String filePath = fileUri.getPath();
tvSendMmsFileAttachment.setText(filePath);
}
} }
//super.onActivityResult(requestCode, resultCode, data); //super.onActivityResult(requestCode, resultCode, data);
} }

View File

@ -1,65 +0,0 @@
package com.jens.automation2;
//import static com.jens.automation2.ActivityManageActionTriggerUrl.edit;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.jens.automation2.Action.Action_Enum;
import org.apache.commons.lang3.StringUtils;
public class ActivityManageActionSetVariable extends Activity
{
private Button bSaveVariable;
private EditText etVariableSetKey, etVariableSetValue;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
this.setContentView(R.layout.activity_manage_action_set_variable);
etVariableSetKey = (EditText)findViewById(R.id.etVariableSetKey);
etVariableSetValue = (EditText)findViewById(R.id.etVariableSetValue);
bSaveVariable = (Button)findViewById(R.id.bSaveVariable);
bSaveVariable.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
if(StringUtils.isEmpty(etVariableSetKey.getText().toString()))
{
Toast.makeText(ActivityManageActionSetVariable.this, getResources().getString(R.string.enterVariableKey), Toast.LENGTH_SHORT).show();
}
else
{
Intent response = new Intent();
if(StringUtils.isEmpty(etVariableSetValue.getText().toString()))
response.putExtra(ActivityManageRule.intentNameActionParameter2, etVariableSetKey.getText().toString());
else
response.putExtra(ActivityManageRule.intentNameActionParameter2, etVariableSetKey.getText().toString() + Action.actionParameter2Split + etVariableSetValue.getText().toString());
setResult(RESULT_OK, response);
finish();
}
}
});
if(getIntent().hasExtra(ActivityManageRule.intentNameActionParameter2))
{
String[] input = getIntent().getStringExtra(ActivityManageRule.intentNameActionParameter2).split(Action.actionParameter2Split);
etVariableSetKey.setText(input[0]);
if(input.length > 1)
etVariableSetValue.setText(input[1]);
}
}
}

View File

@ -15,6 +15,8 @@ public class ActivityManageActionSpeakText extends Activity
private Button bSaveSpeakText; private Button bSaveSpeakText;
private EditText etSpeakText; private EditText etSpeakText;
// private String existingUrl = "";
public static boolean edit = false; public static boolean edit = false;
public static Action resultingAction = null; public static Action resultingAction = null;
@ -22,11 +24,10 @@ public class ActivityManageActionSpeakText extends Activity
protected void onCreate(Bundle savedInstanceState) protected void onCreate(Bundle savedInstanceState)
{ {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
this.setContentView(R.layout.activity_manage_action_speak_text); this.setContentView(R.layout.activity_manage_action_speak_text);
etSpeakText = (EditText)findViewById(R.id.etTextToSpeak); etSpeakText = (EditText)findViewById(R.id.etTextToSpeak);
bSaveSpeakText = (Button)findViewById(R.id.bSaveSpeakText); bSaveSpeakText = (Button)findViewById(R.id.bSaveTriggerUrl);
bSaveSpeakText.setOnClickListener(new OnClickListener() bSaveSpeakText.setOnClickListener(new OnClickListener()
{ {
@Override @Override

View File

@ -29,7 +29,6 @@ import android.widget.CompoundButton;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ListView; import android.widget.ListView;
import android.widget.RadioButton; import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Spinner; import android.widget.Spinner;
import android.widget.Toast; import android.widget.Toast;
@ -49,295 +48,19 @@ public class ActivityManageActionStartActivity extends Activity
*/ */
ListView lvIntentPairs; ListView lvIntentPairs;
EditText etParameterName, etParameterValue, etPackageName, etActivityOrActionPath, etClassName; EditText etParameterName, etParameterValue, etPackageName, etActivityOrActionPath;
Button bSelectApp, bAddIntentPair, bSaveActionStartOtherActivity, showStartProgramExamples; Button bSelectApp, bAddIntentPair, bSaveActionStartOtherActivity, showStartProgramExamples;
Spinner spinnerParameterType; Spinner spinnerParameterType;
RadioGroup rgAppStartupType;
boolean edit = false; boolean edit = false;
ProgressDialog progressDialog = null; ProgressDialog progressDialog = null;
RadioButton rbStartAppSelectByActivity, rbStartAppSelectByAction, rbStartAppByActivity, rbStartAppByBroadcast, rbStartAppByService, rbStartAppByForegroundService; RadioButton rbStartAppSelectByActivity, rbStartAppSelectByAction, rbStartAppByActivity, rbStartAppByBroadcast;
final String urlShowExamples = "https://server47.de/automation/examples_startProgram.html"; final String urlShowExamples = "https://server47.de/automation/examples_startProgram.html";
public final static String startByActivityString = "0"; final static String startByActivityString = "0";
public final static String startByBroadcastString = "1"; final static String startByBroadcastString = "1";
public final static String startByServiceString = "2";
public final static String startByForegroundServiceString = "3";
final static int requestCodeForRequestQueryAllPackagesPermission = 4711; final static int requestCodeForRequestQueryAllPackagesPermission = 4711;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_action_start_activity);
lvIntentPairs = (ListView)findViewById(R.id.lvIntentPairs);
etParameterName = (EditText)findViewById(R.id.etParameterName);
etParameterValue = (EditText)findViewById(R.id.etParameterValue);
etClassName = (EditText)findViewById(R.id.etClassName);
bSelectApp = (Button)findViewById(R.id.bSelectApp);
bAddIntentPair = (Button)findViewById(R.id.bAddIntentPair);
bSaveActionStartOtherActivity = (Button)findViewById(R.id.bSaveActionStartOtherActivity);
spinnerParameterType = (Spinner)findViewById(R.id.spinnerParameterType);
etPackageName = (EditText) findViewById(R.id.etPackageName);
etActivityOrActionPath = (EditText) findViewById(R.id.etActivityOrActionPath);
rbStartAppSelectByActivity = (RadioButton)findViewById(R.id.rbStartAppSelectByActivity);
rbStartAppSelectByAction = (RadioButton)findViewById(R.id.rbStartAppSelectByAction);
showStartProgramExamples = (Button)findViewById(R.id.showStartProgramExamples);
rbStartAppByActivity = (RadioButton)findViewById(R.id.rbStartAppByActivity);
rbStartAppByBroadcast = (RadioButton)findViewById(R.id.rbStartAppByBroadcast);
rbStartAppByService = (RadioButton)findViewById(R.id.rbStartAppByService);
rbStartAppByForegroundService = (RadioButton)findViewById(R.id.rbStartAppByForegroundService);
rgAppStartupType = (RadioGroup)findViewById(R.id.rgAppStartupType);
intentTypeSpinnerAdapter = new ArrayAdapter<String>(this, R.layout.text_view_for_poi_listview_mediumtextsize, ActivityManageActionStartActivity.supportedIntentTypes);
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()
{
@Override
public void onClick(View v)
{
int targetSdkVersion = getApplicationContext().getApplicationInfo().targetSdkVersion;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && targetSdkVersion >= 30 && !ActivityPermissions.havePermission(Manifest.permission.QUERY_ALL_PACKAGES, ActivityManageActionStartActivity.this))// && shouldShowRequestPermissionRationale(Manifest.permission.QUERY_ALL_PACKAGES))
{
if(BuildConfig.FLAVOR.equals(AutomationService.flavor_name_googleplay))
{
// This ain't possible anymore.
Miscellaneous.messageBox(getResources().getString(R.string.info), getResources().getString(R.string.featureNotInGooglePlayVersion) + Miscellaneous.lineSeparator + Miscellaneous.lineSeparator + getResources().getString(R.string.startActivityInsertManually), ActivityManageActionStartActivity.this).show();
}
else
requestPermissions(new String[] {Manifest.permission.QUERY_ALL_PACKAGES}, requestCodeForRequestQueryAllPackagesPermission);
}
else
getAppList();
}
});
bAddIntentPair.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
// type;name;value
if(spinnerParameterType.getSelectedItem().toString().length() == 0)
{
Toast.makeText(ActivityManageActionStartActivity.this, getResources().getString(R.string.selectTypeOfIntentPair), Toast.LENGTH_LONG).show();
return;
}
if(etParameterName.getText().toString().length() == 0)
{
Toast.makeText(ActivityManageActionStartActivity.this, getResources().getString(R.string.enterNameForIntentPair), Toast.LENGTH_LONG).show();
return;
}
else if(etParameterName.getText().toString().contains(Action.intentPairSeparator))
{
Toast.makeText(ActivityManageActionStartActivity.this, String.format(getResources().getString(R.string.stringNotAllowed), Action.intentPairSeparator), Toast.LENGTH_LONG).show();
return;
}
else if(etParameterName.getText().toString().contains(";"))
{
Toast.makeText(ActivityManageActionStartActivity.this, String.format(getResources().getString(R.string.stringNotAllowed), ";"), Toast.LENGTH_LONG).show();
return;
}
if(etParameterValue.getText().toString().length() == 0)
{
Toast.makeText(ActivityManageActionStartActivity.this, getResources().getString(R.string.enterValueForIntentPair), Toast.LENGTH_LONG).show();
return;
}
else if(etParameterValue.getText().toString().contains(Action.intentPairSeparator))
{
Toast.makeText(ActivityManageActionStartActivity.this, String.format(getResources().getString(R.string.stringNotAllowed), Action.intentPairSeparator), Toast.LENGTH_LONG).show();
return;
}
else if(etParameterValue.getText().toString().contains(";"))
{
Toast.makeText(ActivityManageActionStartActivity.this, String.format(getResources().getString(R.string.stringNotAllowed), ";"), Toast.LENGTH_LONG).show();
return;
}
switch(supportedIntentTypes[spinnerParameterType.getSelectedItemPosition()])
{
case "int":
case "long":
case "short":
if(!Miscellaneous.isNumeric(etParameterValue.getText().toString()))
{
Toast.makeText(ActivityManageActionStartActivity.this, getResources().getString(R.string.enter_a_number), Toast.LENGTH_LONG).show();
return;
}
break;
case "double":
case "float":
if(!Miscellaneous.isNumericDecimal(etParameterValue.getText().toString()))
{
Toast.makeText(ActivityManageActionStartActivity.this, getResources().getString(R.string.enter_a_number), Toast.LENGTH_LONG).show();
return;
}
break;
default:
ActivityManageActionStartActivity.this.etParameterValue.setInputType(InputType.TYPE_CLASS_TEXT);
}
String param = supportedIntentTypes[spinnerParameterType.getSelectedItemPosition()] + Action.intentPairSeparator + etParameterName.getText().toString() + Action.intentPairSeparator + etParameterValue.getText().toString();
intentPairList.add(param);
spinnerParameterType.setSelection(0);
etParameterName.setText("");
etParameterValue.setText("");
updateIntentPairList();
if(lvIntentPairs.getVisibility() != View.VISIBLE)
lvIntentPairs.setVisibility(View.VISIBLE);
}
});
showStartProgramExamples.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(urlShowExamples));
startActivity(browserIntent);
}
});
lvIntentPairs.setOnItemLongClickListener(new OnItemLongClickListener()
{
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3)
{
getIntentPairDialog(arg2).show();
return false;
}
});
bSaveActionStartOtherActivity.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
if(checkInput())
{
Intent returnData = new Intent();
returnData.putExtra(ActivityManageRule.intentNameActionParameter1, rbStartAppSelectByAction.isChecked());
String parameter2 = "";
if (rbStartAppSelectByActivity.isChecked())
parameter2 += etPackageName.getText().toString() + Action.actionParameter2Split + etActivityOrActionPath.getText().toString();
else
{
if (etPackageName.getText().toString() != null && etPackageName.getText().toString().length() > 0)
parameter2 += etPackageName.getText().toString() + Action.actionParameter2Split + etActivityOrActionPath.getText().toString();
else
parameter2 += Actions.dummyPackageString + Action.actionParameter2Split + etActivityOrActionPath.getText().toString();
parameter2 += Action.actionParameter2Split + etClassName.getText().toString();
}
if (rbStartAppByActivity.isChecked())
parameter2 += Action.actionParameter2Split + startByActivityString;
else if(rbStartAppByService.isChecked())
parameter2 += Action.actionParameter2Split + startByServiceString;
else if(rbStartAppByForegroundService.isChecked())
parameter2 += Action.actionParameter2Split + startByForegroundServiceString;
else
parameter2 += Action.actionParameter2Split + startByBroadcastString;
for (String s : intentPairList)
parameter2 += Action.actionParameter2Split + s;
returnData.putExtra(ActivityManageRule.intentNameActionParameter2, parameter2);
setResult(RESULT_OK, returnData);
finish();
}
}
});
lvIntentPairs.setOnTouchListener(new OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
v.getParent().requestDisallowInterceptTouchEvent(true);
return false;
}
});
spinnerParameterType.setOnItemSelectedListener(new OnItemSelectedListener()
{
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3)
{
if(supportedIntentTypes[arg2].equals("int") || supportedIntentTypes[arg2].equals("long") || supportedIntentTypes[arg2].equals("short"))
ActivityManageActionStartActivity.this.etParameterValue.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED);
else if(supportedIntentTypes[arg2].equals("double") || supportedIntentTypes[arg2].equals("float"))
ActivityManageActionStartActivity.this.etParameterValue.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL);
else
ActivityManageActionStartActivity.this.etParameterValue.setInputType(InputType.TYPE_CLASS_TEXT);
}
@Override
public void onNothingSelected(AdapterView<?> arg0)
{
}
});
rbStartAppSelectByActivity.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
if(isChecked)
{
bSelectApp.setEnabled(isChecked);
}
}
});
rbStartAppSelectByAction.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
if(isChecked)
bSelectApp.setEnabled(!isChecked);
}
});
rgAppStartupType.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i)
{
if(rbStartAppByActivity.isChecked())
etClassName.setEnabled(false);
else if (rbStartAppByBroadcast.isChecked())
etClassName.setEnabled(false);
else if(rbStartAppByService.isChecked())
etClassName.setEnabled(true);
else if(rbStartAppByForegroundService.isChecked())
etClassName.setEnabled(true);
}
});
Intent i = getIntent();
if(i.hasExtra(ActivityManageRule.intentNameActionParameter1))
loadValuesIntoGui(i);
}
private class CustomPackageInfo extends PackageInfo implements Comparable<CustomPackageInfo> private class CustomPackageInfo extends PackageInfo implements Comparable<CustomPackageInfo>
{ {
@Override @Override
@ -359,9 +82,11 @@ public class ActivityManageActionStartActivity extends Activity
return name1.compareTo(name2); return name1.compareTo(name2);
} }
} }
private static List<PackageInfo> pInfos = null; private static List<PackageInfo> pInfos = null;
public static Action resultingAction;
private static final String[] supportedIntentTypes = { "boolean", "byte", "char", "double", "float", "int", "long", "short", "String", "Uri" }; private static final String[] supportedIntentTypes = { "boolean", "byte", "char", "double", "float", "int", "long", "short", "String", "Uri" };
private ArrayList<String> intentPairList = new ArrayList<String>(); private ArrayList<String> intentPairList = new ArrayList<String>();
@ -619,33 +344,213 @@ public class ActivityManageActionStartActivity extends Activity
progressDialog = ProgressDialog.show(ActivityManageActionStartActivity.this, "", ActivityManageActionStartActivity.this.getResources().getString(R.string.gettingListOfInstalledApplications)); progressDialog = ProgressDialog.show(ActivityManageActionStartActivity.this, "", ActivityManageActionStartActivity.this.getResources().getString(R.string.gettingListOfInstalledApplications));
} }
private void loadValuesIntoGui(Intent input) @Override
protected void onCreate(Bundle savedInstanceState)
{ {
boolean selectionByAction = input.getBooleanExtra(ActivityManageRule.intentNameActionParameter1, true); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_manage_action_start_activity);
lvIntentPairs = (ListView)findViewById(R.id.lvIntentPairs);
etParameterName = (EditText)findViewById(R.id.etParameterName);
etParameterValue = (EditText)findViewById(R.id.etParameterValue);
bSelectApp = (Button)findViewById(R.id.bSelectApp);
bAddIntentPair = (Button)findViewById(R.id.bAddIntentPair);
bSaveActionStartOtherActivity = (Button)findViewById(R.id.bSaveActionStartOtherActivity);
spinnerParameterType = (Spinner)findViewById(R.id.spinnerParameterType);
etPackageName = (EditText) findViewById(R.id.etPackageName);
etActivityOrActionPath = (EditText) findViewById(R.id.etActivityOrActionPath);
rbStartAppSelectByActivity = (RadioButton)findViewById(R.id.rbStartAppSelectByActivity);
rbStartAppSelectByAction = (RadioButton)findViewById(R.id.rbStartAppSelectByAction);
showStartProgramExamples = (Button)findViewById(R.id.showStartProgramExamples);
rbStartAppByActivity = (RadioButton)findViewById(R.id.rbStartAppByActivity);
rbStartAppByBroadcast = (RadioButton)findViewById(R.id.rbStartAppByBroadcast);
intentTypeSpinnerAdapter = new ArrayAdapter<String>(this, R.layout.text_view_for_poi_listview_mediumtextsize, ActivityManageActionStartActivity.supportedIntentTypes);
spinnerParameterType.setAdapter(intentTypeSpinnerAdapter);
intentTypeSpinnerAdapter.notifyDataSetChanged();
intentPairAdapter = new ArrayAdapter<String>(this, R.layout.text_view_for_poi_listview_mediumtextsize, intentPairList);
bSelectApp.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
int targetSdkVersion = getApplicationContext().getApplicationInfo().targetSdkVersion;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && targetSdkVersion >= 30 && !ActivityPermissions.havePermission(Manifest.permission.QUERY_ALL_PACKAGES, ActivityManageActionStartActivity.this))// && shouldShowRequestPermissionRationale(Manifest.permission.QUERY_ALL_PACKAGES))
{
if(BuildConfig.FLAVOR.equals("googlePlayFlavor"))
{
// This ain't possible anymore.
Miscellaneous.messageBox(getResources().getString(R.string.info), getResources().getString(R.string.featureNotInGooglePlayVersion) + Miscellaneous.lineSeparator + Miscellaneous.lineSeparator + getResources().getString(R.string.startActivityInsertManually), ActivityManageActionStartActivity.this).show();
}
else
requestPermissions(new String[] {Manifest.permission.QUERY_ALL_PACKAGES}, requestCodeForRequestQueryAllPackagesPermission);
}
else
getAppList();
}
});
bAddIntentPair.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
// type;name;value
if(spinnerParameterType.getSelectedItem().toString().length() == 0)
{
Toast.makeText(ActivityManageActionStartActivity.this, getResources().getString(R.string.selectTypeOfIntentPair), Toast.LENGTH_LONG).show();
return;
}
if(etParameterName.getText().toString().length() == 0)
{
Toast.makeText(ActivityManageActionStartActivity.this, getResources().getString(R.string.enterNameForIntentPair), Toast.LENGTH_LONG).show();
return;
}
else if(etParameterName.getText().toString().contains(Action.intentPairSeparator))
{
Toast.makeText(ActivityManageActionStartActivity.this, String.format(getResources().getString(R.string.stringNotAllowed), Action.intentPairSeparator), Toast.LENGTH_LONG).show();
return;
}
else if(etParameterName.getText().toString().contains(";"))
{
Toast.makeText(ActivityManageActionStartActivity.this, String.format(getResources().getString(R.string.stringNotAllowed), ";"), Toast.LENGTH_LONG).show();
return;
}
if(etParameterValue.getText().toString().length() == 0)
{
Toast.makeText(ActivityManageActionStartActivity.this, getResources().getString(R.string.enterValueForIntentPair), Toast.LENGTH_LONG).show();
return;
}
else if(etParameterValue.getText().toString().contains(Action.intentPairSeparator))
{
Toast.makeText(ActivityManageActionStartActivity.this, String.format(getResources().getString(R.string.stringNotAllowed), Action.intentPairSeparator), Toast.LENGTH_LONG).show();
return;
}
else if(etParameterValue.getText().toString().contains(";"))
{
Toast.makeText(ActivityManageActionStartActivity.this, String.format(getResources().getString(R.string.stringNotAllowed), ";"), Toast.LENGTH_LONG).show();
return;
}
String param = supportedIntentTypes[spinnerParameterType.getSelectedItemPosition()] + Action.intentPairSeparator + etParameterName.getText().toString() + Action.intentPairSeparator + etParameterValue.getText().toString();
intentPairList.add(param);
spinnerParameterType.setSelection(0);
etParameterName.setText("");
etParameterValue.setText("");
updateIntentPairList();
if(lvIntentPairs.getVisibility() != View.VISIBLE)
lvIntentPairs.setVisibility(View.VISIBLE);
}
});
showStartProgramExamples.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(urlShowExamples));
startActivity(browserIntent);
}
});
lvIntentPairs.setOnItemLongClickListener(new OnItemLongClickListener()
{
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3)
{
getIntentPairDialog(arg2).show();
return false;
}
});
bSaveActionStartOtherActivity.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
if(saveAction())
{
ActivityManageActionStartActivity.this.setResult(RESULT_OK);
finish();
}
}
});
lvIntentPairs.setOnTouchListener(new OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
v.getParent().requestDisallowInterceptTouchEvent(true);
return false;
}
});
spinnerParameterType.setOnItemSelectedListener(new OnItemSelectedListener()
{
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3)
{
if(supportedIntentTypes[arg2].equals("double") | supportedIntentTypes[arg2].equals("float") | supportedIntentTypes[arg2].equals("int") | supportedIntentTypes[arg2].equals("long") | supportedIntentTypes[arg2].equals("short"))
ActivityManageActionStartActivity.this.etParameterValue.setInputType(InputType.TYPE_CLASS_NUMBER);
else
ActivityManageActionStartActivity.this.etParameterValue.setInputType(InputType.TYPE_CLASS_TEXT);
}
@Override
public void onNothingSelected(AdapterView<?> arg0)
{
// TODO Auto-generated method stub
}
});
rbStartAppSelectByActivity.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
if(isChecked)
bSelectApp.setEnabled(isChecked);
}
});
rbStartAppSelectByAction.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
if(isChecked)
bSelectApp.setEnabled(!isChecked);
}
});
Intent i = getIntent();
if(i.getBooleanExtra("edit", false) == true)
{
edit = true;
loadValuesIntoGui();
}
}
private void loadValuesIntoGui()
{
boolean selectionByAction = resultingAction.getParameter1();
rbStartAppSelectByActivity.setChecked(!selectionByAction); rbStartAppSelectByActivity.setChecked(!selectionByAction);
rbStartAppSelectByAction.setChecked(selectionByAction); rbStartAppSelectByAction.setChecked(selectionByAction);
String[] params; String[] params = resultingAction.getParameter2().split(";");
String partsString = input.getStringExtra(ActivityManageRule.intentNameActionParameter2);
if(partsString.contains(Action.actionParameter2Split))
params = partsString.split(Action.actionParameter2Split);
else
params = partsString.split(";");
if(Miscellaneous.isNumeric(params[2])) // old configuration file
{
rbStartAppByActivity.setChecked(params[2].equals(startByActivityString)); rbStartAppByActivity.setChecked(params[2].equals(startByActivityString));
rbStartAppByBroadcast.setChecked(params[2].equals(startByBroadcastString)); rbStartAppByBroadcast.setChecked(params[2].equals(startByBroadcastString));
rbStartAppByService.setChecked(params[2].equals(startByServiceString));
}
else
{
rbStartAppByActivity.setChecked(params[3].equals(startByActivityString));
rbStartAppByBroadcast.setChecked(params[3].equals(startByBroadcastString));
rbStartAppByService.setChecked(params[3].equals(startByServiceString));
rbStartAppByForegroundService.setChecked(params[3].equals(startByForegroundServiceString));
}
int startIndex = -1; int startIndex = -1;
@ -660,11 +565,10 @@ public class ActivityManageActionStartActivity extends Activity
etPackageName.setText(params[0]); etPackageName.setText(params[0]);
etActivityOrActionPath.setText(params[1]); etActivityOrActionPath.setText(params[1]);
etClassName.setText(params[2]);
} }
if (params.length >= 4) if (params.length >= 3)
startIndex = 4; startIndex = 3;
if(startIndex > -1 && params.length > startIndex) if(startIndex > -1 && params.length > startIndex)
{ {
@ -690,7 +594,7 @@ public class ActivityManageActionStartActivity extends Activity
intentPairAdapter.notifyDataSetChanged(); intentPairAdapter.notifyDataSetChanged();
} }
boolean checkInput() private boolean saveAction()
{ {
if(rbStartAppSelectByActivity.isChecked()) if(rbStartAppSelectByActivity.isChecked())
{ {
@ -714,6 +618,35 @@ public class ActivityManageActionStartActivity extends Activity
} }
} }
if(resultingAction == null)
resultingAction = new Action();
resultingAction.setParameter1(rbStartAppSelectByAction.isChecked());
resultingAction.setAction(Action_Enum.startOtherActivity);
String parameter2 = "";
if(rbStartAppSelectByActivity.isChecked())
parameter2 += etPackageName.getText().toString() + ";" + etActivityOrActionPath.getText().toString();
else
{
if(etPackageName.getText().toString() != null && etPackageName.getText().toString().length() > 0)
parameter2 += etPackageName.getText().toString() + ";" + etActivityOrActionPath.getText().toString();
else
parameter2 += Actions.dummyPackageString + ";" + etActivityOrActionPath.getText().toString();
}
if(rbStartAppByActivity.isChecked())
parameter2 += ";" + startByActivityString;
else
parameter2 += ";" + startByBroadcastString;
for(String s : intentPairList)
parameter2 += ";" + s;
resultingAction.setParameter2(parameter2);
return true; return true;
} }

View File

@ -1,10 +1,6 @@
package com.jens.automation2; package com.jens.automation2;
import android.app.Activity; import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
@ -17,43 +13,32 @@ import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ListView; import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.TableLayout; import android.widget.TableLayout;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.NonNull;
import com.jens.automation2.Action.Action_Enum; import com.jens.automation2.Action.Action_Enum;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.Map; import java.util.Map;
public class ActivityManageActionTriggerUrl extends Activity public class ActivityManageActionTriggerUrl extends Activity
{ {
Button bSaveTriggerUrl, bAddHttpParam; Button bSaveTriggerUrl;
EditText etTriggerUrl, etTriggerUrlUsername, etTriggerUrlPassword, etParameterName, etParameterValue; EditText etTriggerUrl, etTriggerUrlUsername, etTriggerUrlPassword;
ListView lvTriggerUrlPostParameters; ListView lvTriggerUrlPostParameters;
CheckBox chkTriggerUrlUseAuthentication; CheckBox chkTriggerUrlUseAuthentication;
RadioButton rbTriggerUrlMethodGet, rbTriggerUrlMethodPost;
TableLayout tlTriggerUrlAuthentication; TableLayout tlTriggerUrlAuthentication;
ArrayAdapter<String> httpParametersAdapter;
private ArrayList<String> httpParamsList = new ArrayList<>();
ArrayAdapter<Map<String,String>> lvTriggerUrlPostParametersAdapter; ArrayAdapter<Map<String,String>> lvTriggerUrlPostParametersAdapter;
public static final String methodGet = "GET"; // private String existingUrl = "";
public static final String methodPost = "POST";
// public static boolean edit = false; public static boolean edit = false;
// public static Action resultingAction = null; public static Action resultingAction = null;
@Override @Override
protected void onCreate(Bundle savedInstanceState) protected void onCreate(Bundle savedInstanceState)
{ {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
this.setContentView(R.layout.activity_manage_action_trigger_url); this.setContentView(R.layout.activity_manage_action_trigger_url);
etTriggerUrl = (EditText)findViewById(R.id.etTriggerUrl); etTriggerUrl = (EditText)findViewById(R.id.etTriggerUrl);
@ -62,33 +47,7 @@ public class ActivityManageActionTriggerUrl extends Activity
chkTriggerUrlUseAuthentication = (CheckBox)findViewById(R.id.chkTriggerUrlUseAuthentication); chkTriggerUrlUseAuthentication = (CheckBox)findViewById(R.id.chkTriggerUrlUseAuthentication);
lvTriggerUrlPostParameters = (ListView)findViewById(R.id.lvTriggerUrlPostParameters); lvTriggerUrlPostParameters = (ListView)findViewById(R.id.lvTriggerUrlPostParameters);
tlTriggerUrlAuthentication = (TableLayout)findViewById(R.id.tlTriggerUrlAuthentication); tlTriggerUrlAuthentication = (TableLayout)findViewById(R.id.tlTriggerUrlAuthentication);
bSaveTriggerUrl = (Button)findViewById(R.id.bSaveSpeakText); bSaveTriggerUrl = (Button)findViewById(R.id.bSaveTriggerUrl);
rbTriggerUrlMethodGet = (RadioButton) findViewById(R.id.rbTriggerUrlMethodGet);
rbTriggerUrlMethodPost = (RadioButton) findViewById(R.id.rbTriggerUrlMethodPost);
etTriggerUrl = (EditText) findViewById(R.id.etTriggerUrl);
etParameterName = (EditText) findViewById(R.id.etParameterName);
etParameterValue = (EditText)findViewById(R.id.etParameterValue);
bAddHttpParam = (Button)findViewById(R.id.bAddHttpParam);
etParameterName.setEnabled(false);
etParameterValue.setEnabled(false);
bAddHttpParam.setEnabled(false);
rbTriggerUrlMethodPost.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean checked)
{
etParameterName.setEnabled(checked);
etParameterValue.setEnabled(checked);
bAddHttpParam.setEnabled(checked);
if(checked)
lvTriggerUrlPostParameters.setVisibility(View.VISIBLE);
}
});
httpParametersAdapter = new ArrayAdapter<String>(this, R.layout.text_view_for_poi_listview_mediumtextsize, httpParamsList);
bSaveTriggerUrl.setOnClickListener(new OnClickListener() bSaveTriggerUrl.setOnClickListener(new OnClickListener()
{ {
@Override @Override
@ -96,9 +55,11 @@ public class ActivityManageActionTriggerUrl extends Activity
{ {
if(etTriggerUrl.getText().toString().length() > 0) if(etTriggerUrl.getText().toString().length() > 0)
{ {
Intent returnIntent = new Intent(); if(resultingAction == null)
{
returnIntent.putExtra(ActivityManageRule.intentNameActionParameter1, chkTriggerUrlUseAuthentication.isChecked()); resultingAction = new Action();
resultingAction.setAction(Action_Enum.triggerUrl);
resultingAction.setParameter1(chkTriggerUrlUseAuthentication.isChecked());
String username = etTriggerUrlUsername.getText().toString(); String username = etTriggerUrlUsername.getText().toString();
String password = etTriggerUrlPassword.getText().toString(); String password = etTriggerUrlPassword.getText().toString();
@ -109,51 +70,29 @@ public class ActivityManageActionTriggerUrl extends Activity
if(password == null) if(password == null)
password = ""; password = "";
String method = methodGet; ActivityManageActionTriggerUrl.resultingAction.setParameter2(
if(rbTriggerUrlMethodPost.isChecked()) username + ";" +
method = methodPost; password + ";" +
etTriggerUrl.getText().toString().trim()
String httpParams = "";
for (String s : httpParamsList)
httpParams += Action.actionParameters2SeparatorOuter + s;
if(httpParams.length() > 0)
httpParams = httpParams.substring(Action.actionParameters2SeparatorOuter.length());
returnIntent.putExtra(ActivityManageRule.intentNameActionParameter2,
username + Action.actionParameter2Split +
password + Action.actionParameter2Split +
etTriggerUrl.getText().toString().trim() + Action.actionParameter2Split +
method + Action.actionParameter2Split +
httpParams
); );
}
setResult(RESULT_OK, returnIntent); backToRuleManager();
finish();
} }
else else
Toast.makeText(getBaseContext(), getResources().getString(R.string.urlTooShort), Toast.LENGTH_LONG).show(); Toast.makeText(getBaseContext(), getResources().getString(R.string.urlTooShort), Toast.LENGTH_LONG).show();
} }
}); });
chkTriggerUrlUseAuthentication.setOnCheckedChangeListener(new OnCheckedChangeListener() chkTriggerUrlUseAuthentication.setOnCheckedChangeListener(new OnCheckedChangeListener()
{ {
@Override @Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{ {
if(isChecked) if(isChecked)
{
tlTriggerUrlAuthentication.setVisibility(View.VISIBLE); tlTriggerUrlAuthentication.setVisibility(View.VISIBLE);
rbTriggerUrlMethodGet.setChecked(false);
rbTriggerUrlMethodPost.setChecked(true);
rbTriggerUrlMethodGet.setEnabled(false);
rbTriggerUrlMethodPost.setEnabled(false);
}
else else
{
tlTriggerUrlAuthentication.setVisibility(View.GONE); tlTriggerUrlAuthentication.setVisibility(View.GONE);
rbTriggerUrlMethodGet.setEnabled(true);
rbTriggerUrlMethodPost.setEnabled(true);
}
etTriggerUrlUsername.setEnabled(isChecked); etTriggerUrlUsername.setEnabled(isChecked);
etTriggerUrlPassword.setEnabled(isChecked); etTriggerUrlPassword.setEnabled(isChecked);
@ -170,84 +109,50 @@ public class ActivityManageActionTriggerUrl extends Activity
}); });
updateListView(); updateListView();
if(getIntent().hasExtra(ActivityManageRule.intentNameActionParameter2))
{
// username,password,URL,etc.
String[] components;
if(getIntent().getStringExtra(ActivityManageRule.intentNameActionParameter2).contains(Action.actionParameter2Split)) ActivityManageActionTriggerUrl.edit = getIntent().getBooleanExtra("edit", false);
components = getIntent().getStringExtra(ActivityManageRule.intentNameActionParameter2).split(Action.actionParameter2Split, -1); if(edit)
else {
components = getIntent().getStringExtra(ActivityManageRule.intentNameActionParameter2).split(";", -1); // username,password,URL
String[] components = ActivityManageActionTriggerUrl.resultingAction.getParameter2().split(";");
if(components.length >= 3) if(components.length >= 3)
{ {
etTriggerUrl.setText(components[2]); etTriggerUrl.setText(components[2]);
chkTriggerUrlUseAuthentication.setChecked(getIntent().getBooleanExtra(ActivityManageRule.intentNameActionParameter1, false)); chkTriggerUrlUseAuthentication.setChecked(ActivityManageActionTriggerUrl.resultingAction.getParameter1());
etTriggerUrlUsername.setText(components[0]); etTriggerUrlUsername.setText(components[0]);
etTriggerUrlPassword.setText(components[1]); etTriggerUrlPassword.setText(components[1]);
if(components.length >= 4)
{
switch(components[3])
{
case methodPost:
rbTriggerUrlMethodPost.setChecked(true);
break;
case methodGet:
default:
rbTriggerUrlMethodGet.setChecked(true);
break;
}
}
if(components.length >= 5)
{
if(!StringUtils.isEmpty(components[4]) && components[4].contains(Action.actionParameters2SeparatorInner))
{
String httpParams[] = components[4].split(Action.actionParameters2SeparatorOuter);
for (String paramPair : httpParams)
httpParamsList.add(paramPair);
updateHttpParamsList();
}
}
} }
else else
etTriggerUrl.setText(components[0]); etTriggerUrl.setText(components[0]);
} }
bAddHttpParam.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View view)
{
if(StringUtils.isEmpty(etParameterName.getText()) || StringUtils.isEmpty(etParameterValue.getText()))
{
Toast.makeText(ActivityManageActionTriggerUrl.this, getResources().getString(R.string.enterValidDataIntoParametersFields), Toast.LENGTH_SHORT).show();
return;
} }
httpParamsList.add(etParameterName.getText() + Action.actionParameters2SeparatorInner + etParameterValue.getText()); private void backToRuleManager()
updateHttpParamsList();
etParameterName.setText("");
etParameterValue.setText("");
if(lvTriggerUrlPostParameters.getVisibility() != View.VISIBLE)
lvTriggerUrlPostParameters.setVisibility(View.VISIBLE);
}
});
lvTriggerUrlPostParameters.setOnItemLongClickListener(new OnItemLongClickListener()
{ {
@Override if(edit && resultingAction != null)
public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3)
{ {
getHttpParamsDialog(arg2).show(); String username = etTriggerUrlUsername.getText().toString();
return false; String password = etTriggerUrlPassword.getText().toString();
if(username == null)
username = "";
if(password == null)
password = "";
ActivityManageActionTriggerUrl.resultingAction.setParameter1(chkTriggerUrlUseAuthentication.isChecked());
ActivityManageActionTriggerUrl.resultingAction.setParameter2(
username + ";" +
password + ";" +
etTriggerUrl.getText().toString()
);
} }
});
setResult(RESULT_OK);
this.finish();
} }
private void updateListView() private void updateListView()
@ -263,30 +168,4 @@ public class ActivityManageActionTriggerUrl extends Activity
catch(NullPointerException e) catch(NullPointerException e)
{} {}
} }
private void updateHttpParamsList()
{
if(lvTriggerUrlPostParameters.getAdapter() == null)
lvTriggerUrlPostParameters.setAdapter(httpParametersAdapter);
httpParametersAdapter.notifyDataSetChanged();
}
private AlertDialog getHttpParamsDialog(final int itemPosition)
{
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(ActivityManageActionTriggerUrl.this);
alertDialogBuilder.setTitle(getResources().getString(R.string.whatToDoWithIntentPair));
alertDialogBuilder.setItems(new String[]{getResources().getString(R.string.delete)}, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
// Only 1 choice at the moment, no need to check
ActivityManageActionTriggerUrl.this.httpParamsList.remove(itemPosition);
updateHttpParamsList();
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
return alertDialog;
}
} }

View File

@ -27,7 +27,6 @@ public class ActivityManageActionVibrate extends Activity
protected void onCreate(@Nullable Bundle savedInstanceState) protected void onCreate(@Nullable Bundle savedInstanceState)
{ {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_action_vibrate); setContentView(R.layout.activity_manage_action_vibrate);
etVibratePattern = (EditText)findViewById(R.id.etVibratePattern); etVibratePattern = (EditText)findViewById(R.id.etVibratePattern);

View File

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

View File

@ -1,64 +0,0 @@
package com.jens.automation2;
import android.app.Activity;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.RadioButton;
import android.widget.TextView;
import androidx.annotation.Nullable;
public class ActivityManageActionWifi extends Activity
{
CheckBox chkWifiRunAsRoot;
RadioButton rbActionWifiOn, rbActionWifiOff;
Button bActionWifiSave;
TextView tvWifiExplanation1, tvWifiExplanation2;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_action_wifi);
chkWifiRunAsRoot = (CheckBox)findViewById(R.id.chkWifiRunAsRoot);
rbActionWifiOn = (RadioButton) findViewById(R.id.rbActionWifiOn);
rbActionWifiOff = (RadioButton)findViewById(R.id.rbActionWifiOff);
bActionWifiSave = (Button) findViewById(R.id.bActionWifiSave);
tvWifiExplanation1 = (TextView)findViewById(R.id.tvWifiExplanation1);
tvWifiExplanation2 = (TextView)findViewById(R.id.tvWifiExplanation2);
Intent input = getIntent();
if(input.hasExtra(ActivityManageRule.intentNameActionParameter1))
rbActionWifiOn.setChecked(input.getBooleanExtra(ActivityManageRule.intentNameActionParameter1, true));
if(input.hasExtra(ActivityManageRule.intentNameActionParameter2))
chkWifiRunAsRoot.setChecked(Boolean.parseBoolean(input.getStringExtra(ActivityManageRule.intentNameActionParameter2)));
// if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
// Miscellaneous.messageBox(getResources().getString(R.string.app_name), getResources().getString(R.string.android10WifiToggleNotice), ActivityManageActionWifi.this).show();
if(getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.Q)
tvWifiExplanation1.setVisibility(View.VISIBLE);
else
tvWifiExplanation1.setVisibility(View.GONE);
bActionWifiSave.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
Intent response = new Intent();
response.putExtra(ActivityManageRule.intentNameActionParameter1, rbActionWifiOn.isChecked());
response.putExtra(ActivityManageRule.intentNameActionParameter2, String.valueOf(chkWifiRunAsRoot.isChecked()));
setResult(RESULT_OK, response);
finish();
}
});
}
}

View File

@ -59,7 +59,6 @@ public class ActivityManagePoi extends Activity
protected void onCreate(Bundle savedInstanceState) protected void onCreate(Bundle savedInstanceState)
{ {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
this.setContentView(R.layout.activity_manage_specific_poi); this.setContentView(R.layout.activity_manage_specific_poi);
myLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); myLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
@ -411,16 +410,22 @@ public class ActivityManagePoi extends Activity
@Override @Override
public void onProviderDisabled(String provider) public void onProviderDisabled(String provider)
{ {
// TODO Auto-generated method stub
} }
@Override @Override
public void onProviderEnabled(String provider) public void onProviderEnabled(String provider)
{ {
// TODO Auto-generated method stub
} }
@Override @Override
public void onStatusChanged(String provider, int status, Bundle extras) public void onStatusChanged(String provider, int status, Bundle extras)
{ {
// TODO Auto-generated method stub
} }
} }
@ -448,16 +453,22 @@ public class ActivityManagePoi extends Activity
@Override @Override
public void onProviderDisabled(String provider) public void onProviderDisabled(String provider)
{ {
// TODO Auto-generated method stub
} }
@Override @Override
public void onProviderEnabled(String provider) public void onProviderEnabled(String provider)
{ {
// TODO Auto-generated method stub
} }
@Override @Override
public void onStatusChanged(String provider, int status, Bundle extras) public void onStatusChanged(String provider, int status, Bundle extras)
{ {
// TODO Auto-generated method stub
} }
} }

View File

@ -47,37 +47,37 @@ public class ActivityManageProfile extends Activity
boolean guiUpdate = false; boolean guiUpdate = false;
String incomingCallsRingtone = null, notificationsRingtone = null; File incomingCallsRingtone = null, notificationsRingtone = null;
ArrayAdapter<String> soundModeAdapter; ArrayAdapter<String> soundModeAdapter;
ArrayAdapter<String> dndModeAdapter; ArrayAdapter<String> dndModeAdapter;
public void setIncomingCallsRingtone(String incomingCallsRingtone) public void setIncomingCallsRingtone(File incomingCallsRingtone)
{ {
this.incomingCallsRingtone = incomingCallsRingtone; this.incomingCallsRingtone = incomingCallsRingtone;
if(incomingCallsRingtone != null) if(incomingCallsRingtone != null)
tvIncomingCallsRingtone.setText(this.incomingCallsRingtone); tvIncomingCallsRingtone.setText(this.incomingCallsRingtone.getAbsolutePath());
else else
tvIncomingCallsRingtone.setText(getResources().getString(R.string.none)); tvIncomingCallsRingtone.setText(getResources().getString(R.string.none));
} }
public String getIncomingCallsRingtone() public File getIncomingCallsRingtone()
{ {
return incomingCallsRingtone; return incomingCallsRingtone;
} }
public void setNotificationsRingtone(String notificationsRingtone) public void setNotificationsRingtone(File notificationsRingtone)
{ {
this.notificationsRingtone = notificationsRingtone; this.notificationsRingtone = notificationsRingtone;
if(this.notificationsRingtone != null) if(this.notificationsRingtone != null)
tvNotificationsRingtone.setText(this.notificationsRingtone); tvNotificationsRingtone.setText(this.notificationsRingtone.getAbsolutePath());
else else
tvNotificationsRingtone.setText(getResources().getString(R.string.none)); tvNotificationsRingtone.setText(getResources().getString(R.string.none));
} }
public String getNotificationsRingtone() public File getNotificationsRingtone()
{ {
return notificationsRingtone; return notificationsRingtone;
} }
@ -86,7 +86,6 @@ public class ActivityManageProfile extends Activity
protected void onCreate(Bundle savedInstanceState) protected void onCreate(Bundle savedInstanceState)
{ {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
this.setContentView(R.layout.activity_manage_specific_profile); this.setContentView(R.layout.activity_manage_specific_profile);
checkBoxChangeSoundMode = (CheckBox)findViewById(R.id.checkBoxChangeSoundMode); checkBoxChangeSoundMode = (CheckBox)findViewById(R.id.checkBoxChangeSoundMode);
@ -285,26 +284,26 @@ public class ActivityManageProfile extends Activity
@Override @Override
public void onClick(View v) public void onClick(View v)
{ {
// try try
// { {
// Intent fileIntent = new Intent(Intent.ACTION_GET_CONTENT); Intent fileIntent = new Intent(Intent.ACTION_GET_CONTENT);
// fileIntent.setType("audio/*"); fileIntent.setType("audio/*");
// startActivityForResult(Intent.createChooser(fileIntent, "Select a ringtone"), intentCodeRingtonePickerCallsFile); startActivityForResult(Intent.createChooser(fileIntent, "Select a ringtone"), intentCodeRingtonePickerCallsFile);
// } }
// catch(ActivityNotFoundException e) catch(ActivityNotFoundException e)
// { {
// Use media browser instead // Use media browser instead
Intent fileSelectionIntent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); Intent fileSelectionIntent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
if(ActivityMainProfiles.profileToEdit != null) if(ActivityMainProfiles.profileToEdit != null)
{ {
Uri currenturi = Uri.parse(ActivityMainProfiles.profileToEdit.incomingCallsRingtone); Uri currenturi = Uri.parse(ActivityMainProfiles.profileToEdit.incomingCallsRingtone.getAbsolutePath());
if(ActivityMainProfiles.profileToEdit.changeIncomingCallsRingtone) if(ActivityMainProfiles.profileToEdit.changeIncomingCallsRingtone)
fileSelectionIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, currenturi); fileSelectionIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, currenturi);
} }
startActivityForResult(fileSelectionIntent, intentCodeRingtonePickerCallsRingtone); startActivityForResult(fileSelectionIntent, intentCodeRingtonePickerCallsRingtone);
// } }
} }
}); });
bChangeSoundNotifications.setOnClickListener(new OnClickListener() bChangeSoundNotifications.setOnClickListener(new OnClickListener()
@ -325,7 +324,7 @@ public class ActivityManageProfile extends Activity
if(ActivityMainProfiles.profileToEdit != null) if(ActivityMainProfiles.profileToEdit != null)
{ {
Uri currenturi = Uri.parse(ActivityMainProfiles.profileToEdit.notificationRingtone); Uri currenturi = Uri.parse(ActivityMainProfiles.profileToEdit.notificationRingtone.getAbsolutePath());
if(ActivityMainProfiles.profileToEdit.changeNotificationRingtone) if(ActivityMainProfiles.profileToEdit.changeNotificationRingtone)
fileSelectionIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, currenturi); fileSelectionIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, currenturi);
} }
@ -496,20 +495,15 @@ public class ActivityManageProfile extends Activity
Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
if (uri != null) if (uri != null)
{ {
// if(Build.VERSION.SDK_INT < 26) String ringTonePath = CompensateCrappyAndroidPaths.getPath(ActivityManageProfile.this, uri);
// { setIncomingCallsRingtone(new File(ringTonePath));
// String ringTonePath = CompensateCrappyAndroidPaths.getPath(ActivityManageProfile.this, uri);
// setIncomingCallsRingtone(ringTonePath);
// }
// else
setIncomingCallsRingtone(uri.toString());
} }
break; break;
} }
case intentCodeRingtonePickerCallsFile: case intentCodeRingtonePickerCallsFile:
{ {
String ringTonePath = CompensateCrappyAndroidPaths.getPath(ActivityManageProfile.this, data.getData()); String ringTonePath = CompensateCrappyAndroidPaths.getPath(ActivityManageProfile.this, data.getData());
setIncomingCallsRingtone(ringTonePath); setIncomingCallsRingtone(new File(ringTonePath));
break; break;
} }
case intentCodeRingtonePickerNotificationsRingtone: // notifications case intentCodeRingtonePickerNotificationsRingtone: // notifications
@ -517,20 +511,15 @@ public class ActivityManageProfile extends Activity
Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
if (uri != null) if (uri != null)
{ {
// if(Build.VERSION.SDK_INT < 26) String ringTonePath = CompensateCrappyAndroidPaths.getPath(ActivityManageProfile.this, data.getData());
// { setNotificationsRingtone(new File(ringTonePath));
// String ringTonePath = CompensateCrappyAndroidPaths.getPath(ActivityManageProfile.this, uri);
// setNotificationsRingtone(ringTonePath);
// }
// else
setNotificationsRingtone(uri.toString());
} }
break; break;
} }
case intentCodeRingtonePickerNotificationsFile: case intentCodeRingtonePickerNotificationsFile:
{ {
String ringTonePath = CompensateCrappyAndroidPaths.getPath(ActivityManageProfile.this, data.getData()); String ringTonePath = CompensateCrappyAndroidPaths.getPath(ActivityManageProfile.this, data.getData());
setNotificationsRingtone(ringTonePath); setNotificationsRingtone(new File(ringTonePath));
break; break;
} }
default: default:

View File

@ -123,30 +123,6 @@ public class ActivityManageRule extends Activity
final static int requestCodeTriggerBroadcastReceivedEdit = 810; final static int requestCodeTriggerBroadcastReceivedEdit = 810;
final static int requestCodeActionSendBroadcastAdd = 811; final static int requestCodeActionSendBroadcastAdd = 811;
final static int requestCodeActionSendBroadcastEdit = 812; final static int requestCodeActionSendBroadcastEdit = 812;
final static int requestCodeActionRunExecutableAdd = 813;
final static int requestCodeActionRunExecutableEdit = 814;
final static int requestCodeActionSetWifiAdd = 815;
final static int requestCodeActionSetWifiEdit = 816;
final static int requestCodeTriggerTetheringAdd = 817;
final static int requestCodeTriggerTetheringEdit = 818;
final static int requestCodeActionWakeLockAdd = 819;
final static int requestCodeActionWakeLockEdit = 820;
final static int requestCodeTriggerSubSystemStateAdd = 821;
final static int requestCodeTriggerSubSystemStateEdit = 822;
final static int requestCodeActionMakePhoneCallAdd = 823;
final static int requestCodeActionMakePhoneCallEdit = 824;
final static int requestCodeActionSetVariableAdd = 825;
final static int requestCodeActionSetVariableEdit = 826;
final static int requestCodeTriggerCheckVariableAdd = 827;
final static int requestCodeTriggerCheckVariableEdit = 828;
final static int requestCodeActionCopyTextToClipboardAdd = 829;
final static int requestCodeActionCopyTextToClipboardEdit = 830;
final static int requestCodeActionSetLocationServiceAdd = 831;
final static int requestCodeActionSetLocationServiceEdit = 832;
final static int requestCodeTriggerCalendarEventAdd = 833;
final static int requestCodeTriggerCalendarEventEdit = 834;
final static int requestCodeTriggerChargingAdd = 835;
final static int requestCodeTriggerChargingEdit = 836;
public static ActivityManageRule getInstance() public static ActivityManageRule getInstance()
{ {
@ -160,7 +136,6 @@ public class ActivityManageRule extends Activity
protected void onCreate(Bundle savedInstanceState) protected void onCreate(Bundle savedInstanceState)
{ {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_specific_rule); setContentView(R.layout.activity_manage_specific_rule);
context = this; context = this;
@ -333,36 +308,6 @@ public class ActivityManageRule extends Activity
broadcastEditor.putExtra(intentNameTriggerParameter2, selectedTrigger.getTriggerParameter2()); broadcastEditor.putExtra(intentNameTriggerParameter2, selectedTrigger.getTriggerParameter2());
startActivityForResult(broadcastEditor, requestCodeTriggerBroadcastReceivedEdit); startActivityForResult(broadcastEditor, requestCodeTriggerBroadcastReceivedEdit);
break; break;
case tethering:
Intent tetheringEditor = new Intent(ActivityManageRule.this, ActivityManageTriggerTethering.class);
tetheringEditor.putExtra(intentNameTriggerParameter1, selectedTrigger.getTriggerParameter());
tetheringEditor.putExtra(intentNameTriggerParameter2, selectedTrigger.getTriggerParameter2());
startActivityForResult(tetheringEditor, requestCodeTriggerTetheringEdit);
break;
case subSystemState:
Intent subSystemStateEditor = new Intent(ActivityManageRule.this, ActivityManageTriggerSubSystemState.class);
subSystemStateEditor.putExtra(intentNameTriggerParameter1, selectedTrigger.getTriggerParameter());
subSystemStateEditor.putExtra(intentNameTriggerParameter2, selectedTrigger.getTriggerParameter2());
startActivityForResult(subSystemStateEditor, requestCodeTriggerSubSystemStateEdit);
break;
case checkVariable:
Intent variableStateEditor = new Intent(ActivityManageRule.this, ActivityManageTriggerCheckVariable.class);
variableStateEditor.putExtra(intentNameTriggerParameter1, selectedTrigger.getTriggerParameter());
variableStateEditor.putExtra(intentNameTriggerParameter2, selectedTrigger.getTriggerParameter2());
startActivityForResult(variableStateEditor, requestCodeTriggerCheckVariableEdit);
break;
case calendarEvent:
Intent calendarStateEditor = new Intent(ActivityManageRule.this, ActivityManageTriggerCalendar.class);
calendarStateEditor.putExtra(intentNameTriggerParameter1, selectedTrigger.getTriggerParameter());
calendarStateEditor.putExtra(intentNameTriggerParameter2, selectedTrigger.getTriggerParameter2());
startActivityForResult(calendarStateEditor, requestCodeTriggerCalendarEventEdit);
break;
case charging:
Intent chargingStateEditor = new Intent(ActivityManageRule.this, ActivityManageTriggerCharging.class);
chargingStateEditor.putExtra(intentNameTriggerParameter1, selectedTrigger.getTriggerParameter());
chargingStateEditor.putExtra(intentNameTriggerParameter2, selectedTrigger.getTriggerParameter2());
startActivityForResult(chargingStateEditor, requestCodeTriggerChargingEdit);
break;
default: default:
break; break;
} }
@ -398,14 +343,15 @@ public class ActivityManageRule extends Activity
{ {
case startOtherActivity: case startOtherActivity:
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionStartActivity.class); Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionStartActivity.class);
intent.putExtra(intentNameActionParameter1, a.getParameter1()); ActivityManageActionStartActivity.resultingAction = a;
intent.putExtra(intentNameActionParameter2, a.getParameter2()); intent.putExtra("edit", true);
startActivityForResult(intent, requestCodeActionStartActivityEdit); startActivityForResult(intent, requestCodeActionStartActivityEdit);
break; break;
case triggerUrl: case triggerUrl:
Intent activityEditTriggerUrlIntent = new Intent(ActivityManageRule.this, ActivityManageActionTriggerUrl.class); Intent activityEditTriggerUrlIntent = new Intent(ActivityManageRule.this, ActivityManageActionTriggerUrl.class);
activityEditTriggerUrlIntent.putExtra(intentNameActionParameter1, a.getParameter1()); ActivityManageActionTriggerUrl.resultingAction = a;
activityEditTriggerUrlIntent.putExtra(intentNameActionParameter2, a.getParameter2()); ActivityManageActionTriggerUrl.resultingAction.setParentRule(ruleToEdit);
activityEditTriggerUrlIntent.putExtra("edit", true);
startActivityForResult(activityEditTriggerUrlIntent, requestCodeActionTriggerUrlEdit); startActivityForResult(activityEditTriggerUrlIntent, requestCodeActionTriggerUrlEdit);
break; break;
case speakText: case speakText:
@ -436,35 +382,6 @@ public class ActivityManageRule extends Activity
activityEditSendBroadcastIntent.putExtra(intentNameActionParameter2, a.getParameter2()); activityEditSendBroadcastIntent.putExtra(intentNameActionParameter2, a.getParameter2());
startActivityForResult(activityEditSendBroadcastIntent, requestCodeActionSendBroadcastEdit); startActivityForResult(activityEditSendBroadcastIntent, requestCodeActionSendBroadcastEdit);
break; break;
case wakelock:
Intent activityEditWakeLockIntent = new Intent(ActivityManageRule.this, ActivityManageActionWakeLock.class);
activityEditWakeLockIntent.putExtra(intentNameActionParameter1, a.getParameter1());
activityEditWakeLockIntent.putExtra(intentNameActionParameter2, a.getParameter2());
startActivityForResult(activityEditWakeLockIntent, requestCodeActionWakeLockEdit);
break;
case runExecutable:
Intent activityEditRunExecutableIntent = new Intent(ActivityManageRule.this, ActivityManageActionRunExecutable.class);
activityEditRunExecutableIntent.putExtra(intentNameActionParameter1, a.getParameter1());
activityEditRunExecutableIntent.putExtra(intentNameActionParameter2, a.getParameter2());
startActivityForResult(activityEditRunExecutableIntent, requestCodeActionRunExecutableEdit);
break;
case startPhoneCall:
Intent activityEditMakePhoneCallIntent = new Intent(ActivityManageRule.this, ActivityManageActionMakePhoneCall.class);
activityEditMakePhoneCallIntent.putExtra(intentNameActionParameter1, a.getParameter1());
activityEditMakePhoneCallIntent.putExtra(intentNameActionParameter2, a.getParameter2());
startActivityForResult(activityEditMakePhoneCallIntent, requestCodeActionMakePhoneCallEdit);
break;
case setVariable:
Intent activityEditSetVariableIntent = new Intent(ActivityManageRule.this, ActivityManageActionSetVariable.class);
activityEditSetVariableIntent.putExtra(intentNameActionParameter2, a.getParameter2());
startActivityForResult(activityEditSetVariableIntent, requestCodeActionSetVariableEdit);
break;
case setWifi:
Intent activityEditSetWifiIntent = new Intent(ActivityManageRule.this, ActivityManageActionWifi.class);
activityEditSetWifiIntent.putExtra(intentNameActionParameter1, a.getParameter1());
activityEditSetWifiIntent.putExtra(intentNameActionParameter2, a.getParameter2());
startActivityForResult(activityEditSetWifiIntent, requestCodeActionSetWifiEdit);
break;
case controlMediaPlayback: case controlMediaPlayback:
Intent activityEditControlMediaIntent = new Intent(ActivityManageRule.this, ActivityManageActionControlMedia.class); Intent activityEditControlMediaIntent = new Intent(ActivityManageRule.this, ActivityManageActionControlMedia.class);
activityEditControlMediaIntent.putExtra(ActivityManageRule.intentNameActionParameter2, a.getParameter2()); activityEditControlMediaIntent.putExtra(ActivityManageRule.intentNameActionParameter2, a.getParameter2());
@ -489,18 +406,6 @@ public class ActivityManageRule extends Activity
actionPlaySoundIntent.putExtra(intentNameActionParameter2, a.getParameter2()); actionPlaySoundIntent.putExtra(intentNameActionParameter2, a.getParameter2());
startActivityForResult(actionPlaySoundIntent, requestCodeActionPlaySoundEdit); startActivityForResult(actionPlaySoundIntent, requestCodeActionPlaySoundEdit);
break; break;
case copyToClipboard:
Intent actionCopyToClipboardIntent = new Intent(context, ActivityManageActionCopyToClipboard.class);
actionCopyToClipboardIntent.putExtra(intentNameActionParameter1, a.getParameter1());
actionCopyToClipboardIntent.putExtra(intentNameActionParameter2, a.getParameter2());
startActivityForResult(actionCopyToClipboardIntent, requestCodeActionCopyTextToClipboardEdit);
break;
case setLocationService:
Intent actionSetLocationServiceIntent = new Intent(context, ActivityManageActionLocationService.class);
// actionSetLocationServiceIntent.putExtra(intentNameActionParameter1, a.getParameter1());
actionSetLocationServiceIntent.putExtra(intentNameActionParameter2, a.getParameter2());
startActivityForResult(actionSetLocationServiceIntent, requestCodeActionSetLocationServiceEdit);
break;
default: default:
Miscellaneous.logEvent("w", "Edit action", "Editing of action type " + a.getAction().toString() + " not implemented, yet.", 4); Miscellaneous.logEvent("w", "Edit action", "Editing of action type " + a.getAction().toString() + " not implemented, yet.", 4);
break; break;
@ -619,10 +524,10 @@ public class ActivityManageRule extends Activity
else if(types[i].toString().equals(Trigger_Enum.roaming.toString())) else if(types[i].toString().equals(Trigger_Enum.roaming.toString()))
items.add(new Item(typesLong[i].toString(), R.drawable.roaming)); items.add(new Item(typesLong[i].toString(), R.drawable.roaming));
else if(types[i].toString().equals(Trigger_Enum.broadcastReceived.toString())) else if(types[i].toString().equals(Trigger_Enum.broadcastReceived.toString()))
items.add(new Item(typesLong[i].toString(), R.drawable.megaphone)); items.add(new Item(typesLong[i].toString(), R.drawable.satellite));
else if(types[i].toString().equals(Trigger_Enum.phoneCall.toString())) else if(types[i].toString().equals(Trigger_Enum.phoneCall.toString()))
{ {
if(ActivityPermissions.isPermissionDeclaratedInManifest(ActivityManageRule.this, Manifest.permission.SEND_SMS)) if(ActivityPermissions.isPermissionDeclaratedInManifest(ActivityManageRule.this, "android.permission.SEND_SMS"))
items.add(new Item(typesLong[i].toString(), R.drawable.phone)); items.add(new Item(typesLong[i].toString(), R.drawable.phone));
} }
else if(types[i].toString().equals(Trigger_Enum.nfcTag.toString())) else if(types[i].toString().equals(Trigger_Enum.nfcTag.toString()))
@ -647,17 +552,6 @@ public class ActivityManageRule extends Activity
items.add(new Item(typesLong[i].toString(), R.drawable.alarm)); items.add(new Item(typesLong[i].toString(), R.drawable.alarm));
else if(types[i].toString().equals(Trigger_Enum.serviceStarts.toString())) else if(types[i].toString().equals(Trigger_Enum.serviceStarts.toString()))
items.add(new Item(typesLong[i].toString(), R.drawable.alarm)); items.add(new Item(typesLong[i].toString(), R.drawable.alarm));
else if(types[i].toString().equals(Trigger_Enum.tethering.toString()))
items.add(new Item(typesLong[i].toString(), R.drawable.router));
else if(types[i].toString().equals(Trigger_Enum.subSystemState.toString()))
items.add(new Item(typesLong[i].toString(), R.drawable.subsystemstate));
else if(types[i].toString().equals(Trigger_Enum.checkVariable.toString()))
items.add(new Item(typesLong[i].toString(), R.drawable.variable));
else if(types[i].toString().equals(Trigger_Enum.calendarEvent.toString()))
{
if(ActivityPermissions.isPermissionDeclaratedInManifest(ActivityManageRule.this, Manifest.permission.READ_CALENDAR))
items.add(new Item(typesLong[i].toString(), R.drawable.calendar));
}
else else
items.add(new Item(typesLong[i].toString(), R.drawable.placeholder)); items.add(new Item(typesLong[i].toString(), R.drawable.placeholder));
} }
@ -666,15 +560,15 @@ public class ActivityManageRule extends Activity
{ {
public View getView(int position, View convertView, ViewGroup parent) public View getView(int position, View convertView, ViewGroup parent)
{ {
// User super class to create the View //User super class to create the View
View v = super.getView(position, convertView, parent); View v = super.getView(position, convertView, parent);
TextView tv = (TextView)v.findViewById(android.R.id.text1); TextView tv = (TextView)v.findViewById(android.R.id.text1);
// Put the image on the TextView //Put the image on the TextView
tv.setCompoundDrawablesWithIntrinsicBounds(items.get(position).icon, 0, 0, 0); tv.setCompoundDrawablesWithIntrinsicBounds(items.get(position).icon, 0, 0, 0);
// Add margin between image and text (support various screen densities) //Add margin between image and text (support various screen densities)
int dp5 = (int) (5 * getResources().getDisplayMetrics().density + 0.5f); int dp5 = (int) (5 * getResources().getDisplayMetrics().density + 0.5f);
tv.setCompoundDrawablePadding(dp5); tv.setCompoundDrawablePadding(dp5);
@ -718,14 +612,7 @@ public class ActivityManageRule extends Activity
startActivityForResult(timeFrameEditor, requestCodeTriggerTimeframeAdd); startActivityForResult(timeFrameEditor, requestCodeTriggerTimeframeAdd);
return; return;
} }
else if(triggerType == Trigger_Enum.charging) else if(triggerType == Trigger_Enum.charging || triggerType == Trigger_Enum.musicPlaying)
{
newTrigger.setTriggerType(Trigger_Enum.charging);
Intent triggerChargingIntent = new Intent(myContext, ActivityManageTriggerCharging.class);
startActivityForResult(triggerChargingIntent, requestCodeTriggerChargingAdd);
return;
}
else if(triggerType == Trigger_Enum.musicPlaying)
booleanChoices = new String[]{getResources().getString(R.string.started), getResources().getString(R.string.stopped)}; booleanChoices = new String[]{getResources().getString(R.string.started), getResources().getString(R.string.stopped)};
else if(triggerType == Trigger_Enum.usb_host_connection) else if(triggerType == Trigger_Enum.usb_host_connection)
booleanChoices = new String[]{getResources().getString(R.string.connected), getResources().getString(R.string.disconnected)}; booleanChoices = new String[]{getResources().getString(R.string.connected), getResources().getString(R.string.disconnected)};
@ -819,15 +706,13 @@ public class ActivityManageRule extends Activity
} }
else if(triggerType == Trigger_Enum.bluetoothConnection) else if(triggerType == Trigger_Enum.bluetoothConnection)
{ {
// if(!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)) if(!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH))
// //Miscellaneous.messageBox("Bluetooth", getResources().getString(R.string.deviceDoesNotHaveBluetooth), ActivityManageRule.this).show(); Miscellaneous.messageBox("Bluetooth", getResources().getString(R.string.deviceDoesNotHaveBluetooth), ActivityManageRule.this).show();;
// Toast.makeText(ActivityManageRule.this, getResources().getString(R.string.deviceDoesNotHaveBluetooth), Toast.LENGTH_LONG).show();
newTrigger.setTriggerType(Trigger_Enum.bluetoothConnection); newTrigger.setTriggerType(Trigger_Enum.bluetoothConnection);
ActivityManageTriggerBluetooth.editedBluetoothTrigger = newTrigger; ActivityManageTriggerBluetooth.editedBluetoothTrigger = newTrigger;
Intent bluetoothEditor = new Intent(myContext, ActivityManageTriggerBluetooth.class); Intent bluetoothEditor = new Intent(myContext, ActivityManageTriggerBluetooth.class);
startActivityForResult(bluetoothEditor, requestCodeTriggerBluetoothAdd); startActivityForResult(bluetoothEditor, requestCodeTriggerBluetoothAdd);
return; return;
} }
else if(triggerType == Trigger_Enum.screenState) else if(triggerType == Trigger_Enum.screenState)
@ -837,22 +722,19 @@ public class ActivityManageRule extends Activity
Miscellaneous.messageBox(getResources().getString(R.string.info), getResources().getString(R.string.lockedCommentScreenMustBeOff), ActivityManageRule.this).show(); Miscellaneous.messageBox(getResources().getString(R.string.info), getResources().getString(R.string.lockedCommentScreenMustBeOff), ActivityManageRule.this).show();
return; return;
} }
/*else if(triggerType == Trigger_Enum.deviceStarts) else if(triggerType == Trigger_Enum.deviceStarts)
{ {
newTrigger.setTriggerType(Trigger_Enum.deviceStarts); newTrigger.setTriggerType(Trigger_Enum.deviceStarts);
ruleToEdit.getTriggerSet().add(newTrigger); ruleToEdit.getTriggerSet().add(newTrigger);
refreshTriggerList(); refreshTriggerList();
return; return;
}*/ }
else if(triggerType == Trigger_Enum.deviceStarts || triggerType == Trigger_Enum.serviceStarts) else if(triggerType == Trigger_Enum.serviceStarts)
{ {
// newTrigger.setTriggerType(Trigger_Enum.serviceStarts); newTrigger.setTriggerType(Trigger_Enum.serviceStarts);
// ruleToEdit.getTriggerSet().add(newTrigger); ruleToEdit.getTriggerSet().add(newTrigger);
refreshTriggerList();
booleanChoices = new String[]{getResources().getString(R.string.yes), getResources().getString(R.string.no)}; return;
// refreshTriggerList();
// return;
} }
else if(triggerType == Trigger_Enum.headsetPlugged) else if(triggerType == Trigger_Enum.headsetPlugged)
booleanChoices = new String[]{getResources().getString(R.string.connected), getResources().getString(R.string.disconnected)}; booleanChoices = new String[]{getResources().getString(R.string.connected), getResources().getString(R.string.disconnected)};
@ -869,34 +751,6 @@ public class ActivityManageRule extends Activity
startActivityForResult(broadcastTriggerEditor, requestCodeTriggerBroadcastReceivedAdd); startActivityForResult(broadcastTriggerEditor, requestCodeTriggerBroadcastReceivedAdd);
return; return;
} }
else if(triggerType == Trigger_Enum.tethering)
{
newTrigger.setTriggerType(Trigger_Enum.tethering);
Intent tetheringTriggerEditor = new Intent(myContext, ActivityManageTriggerTethering.class);
startActivityForResult(tetheringTriggerEditor, requestCodeTriggerTetheringAdd);
return;
}
else if(triggerType == Trigger_Enum.subSystemState)
{
newTrigger.setTriggerType(Trigger_Enum.subSystemState);
Intent subSystemStateTriggerEditor = new Intent(myContext, ActivityManageTriggerSubSystemState.class);
startActivityForResult(subSystemStateTriggerEditor, requestCodeTriggerSubSystemStateAdd);
return;
}
else if(triggerType == Trigger_Enum.checkVariable)
{
newTrigger.setTriggerType(Trigger_Enum.checkVariable);
Intent variableTriggerEditor = new Intent(myContext, ActivityManageTriggerCheckVariable.class);
startActivityForResult(variableTriggerEditor, requestCodeTriggerCheckVariableAdd);
return;
}
else if(triggerType == Trigger_Enum.calendarEvent)
{
newTrigger.setTriggerType(Trigger_Enum.calendarEvent);
Intent calendarTriggerEditor = new Intent(myContext, ActivityManageTriggerCalendar.class);
startActivityForResult(calendarTriggerEditor, requestCodeTriggerCalendarEventAdd);
return;
}
else else
getTriggerParameterDialog(context, booleanChoices).show(); getTriggerParameterDialog(context, booleanChoices).show();
@ -988,7 +842,6 @@ public class ActivityManageRule extends Activity
return alertDialog; return alertDialog;
} }
private AlertDialog getTriggerBatteryDialog(final Context myContext, final String[] choices) private AlertDialog getTriggerBatteryDialog(final Context myContext, final String[] choices)
{ {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context); AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
@ -1003,7 +856,6 @@ public class ActivityManageRule extends Activity
triggerBattery = (which+1); triggerBattery = (which+1);
newTrigger.setTriggerType(Trigger_Enum.batteryLevel); newTrigger.setTriggerType(Trigger_Enum.batteryLevel);
newTrigger.setBatteryLevel(triggerBattery); newTrigger.setBatteryLevel(triggerBattery);
newTrigger.setTriggerParameter2(String.valueOf(triggerBattery));
// Log.i("test", newTrigger.toString()); // Log.i("test", newTrigger.toString());
// Log.i("test", String.valueOf(newTrigger.getBatteryLevel())); // Log.i("test", String.valueOf(newTrigger.getBatteryLevel()));
ruleToEdit.getTriggerSet().add(newTrigger); ruleToEdit.getTriggerSet().add(newTrigger);
@ -1138,7 +990,7 @@ public class ActivityManageRule extends Activity
AlertDialog.Builder alertDialog = new AlertDialog.Builder(this); AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
alertDialog.setTitle(myContext.getResources().getString(R.string.phoneNumber)); alertDialog.setTitle(myContext.getResources().getString(R.string.phoneNumber));
alertDialog.setMessage(myContext.getResources().getString(R.string.enterPhoneNumberBlankForAny)); alertDialog.setMessage(myContext.getResources().getString(R.string.enterPhoneNumber));
// Set an EditText view to get user input // Set an EditText view to get user input
final EditText input = new EditText(this); final EditText input = new EditText(this);
@ -1399,11 +1251,9 @@ public class ActivityManageRule extends Activity
{ {
if(resultCode == RESULT_OK) if(resultCode == RESULT_OK)
{ {
newAction.setParentRule(ruleToEdit); //add TriggerUrl
newAction.setAction(Action_Enum.triggerUrl); ActivityManageActionTriggerUrl.resultingAction.setParentRule(ruleToEdit);
newAction.setParameter1(data.getBooleanExtra(intentNameActionParameter1, true)); ruleToEdit.getActionSet().add(ActivityManageActionTriggerUrl.resultingAction);
newAction.setParameter2(data.getStringExtra(intentNameActionParameter2));
ruleToEdit.getActionSet().add(newAction);
this.refreshActionList(); this.refreshActionList();
} }
} }
@ -1411,14 +1261,7 @@ public class ActivityManageRule extends Activity
{ {
if(resultCode == RESULT_OK) if(resultCode == RESULT_OK)
{ {
ruleToEdit.getActionSet().get(editIndex).setParentRule(ruleToEdit); //edit TriggerUrl
if(data.hasExtra(intentNameActionParameter1))
ruleToEdit.getActionSet().get(editIndex).setParameter1(data.getBooleanExtra(intentNameActionParameter1, true));
if(data.hasExtra(intentNameActionParameter2))
ruleToEdit.getActionSet().get(editIndex).setParameter2(data.getStringExtra(intentNameActionParameter2));
this.refreshActionList(); this.refreshActionList();
} }
} }
@ -1475,39 +1318,13 @@ public class ActivityManageRule extends Activity
this.refreshTriggerList(); this.refreshTriggerList();
} }
} }
else if(requestCode == requestCodeTriggerChargingAdd)
{
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);
this.refreshTriggerList();
}
}
else if(requestCode == requestCodeActionStartActivityAdd) else if(requestCode == requestCodeActionStartActivityAdd)
{ {
// manage start of other activity // manage start of other activity
if(resultCode == RESULT_OK) if(resultCode == RESULT_OK)
{ {
newAction = ActivityManageActionStartActivity.resultingAction;
newAction.setParentRule(ruleToEdit); newAction.setParentRule(ruleToEdit);
newAction.setAction(Action_Enum.startOtherActivity);
newAction.setParameter1(data.getBooleanExtra(intentNameActionParameter1, true));
newAction.setParameter2(data.getStringExtra(intentNameActionParameter2));
ruleToEdit.getActionSet().add(newAction); ruleToEdit.getActionSet().add(newAction);
this.refreshActionList(); this.refreshActionList();
} }
@ -1517,14 +1334,9 @@ public class ActivityManageRule extends Activity
// manage start of other activity // manage start of other activity
if(resultCode == RESULT_OK) if(resultCode == RESULT_OK)
{ {
ruleToEdit.getActionSet().get(editIndex).setParentRule(ruleToEdit); newAction = ActivityManageActionStartActivity.resultingAction;
newAction.setParentRule(ruleToEdit);
if(data.hasExtra(intentNameActionParameter1)) // ruleToEdit.getActionSet().add(newAction);
ruleToEdit.getActionSet().get(editIndex).setParameter1(data.getBooleanExtra(intentNameActionParameter1, true));
if(data.hasExtra(intentNameActionParameter2))
ruleToEdit.getActionSet().get(editIndex).setParameter2(data.getStringExtra(intentNameActionParameter2));
this.refreshActionList(); this.refreshActionList();
} }
} }
@ -1656,11 +1468,11 @@ public class ActivityManageRule extends Activity
{ {
if(resultCode == RESULT_OK) if(resultCode == RESULT_OK)
{ {
if(data.hasExtra(ActivityManageActionBrightnessSetting.intentNameAutoBrightness)) if(data.hasExtra("autoBrightness"))
ruleToEdit.getActionSet().get(editIndex).setParameter1(data.getBooleanExtra(ActivityManageActionBrightnessSetting.intentNameAutoBrightness, false)); ruleToEdit.getActionSet().get(editIndex).setParameter1(data.getBooleanExtra("autoBrightness", false));
if(data.hasExtra(ActivityManageActionBrightnessSetting.intentNameBrightnessValue)) if(data.hasExtra("brightnessValue"))
ruleToEdit.getActionSet().get(editIndex).setParameter2(String.valueOf(data.getIntExtra(ActivityManageActionBrightnessSetting.intentNameBrightnessValue, 0))); ruleToEdit.getActionSet().get(editIndex).setParameter2(String.valueOf(data.getIntExtra("brightnessValue", 0)));
ruleToEdit.getActionSet().get(editIndex).setParentRule(ruleToEdit); ruleToEdit.getActionSet().get(editIndex).setParentRule(ruleToEdit);
@ -1687,49 +1499,6 @@ public class ActivityManageRule extends Activity
this.refreshActionList(); this.refreshActionList();
} }
} }
else if(requestCode == requestCodeActionRunExecutableAdd)
{
if(resultCode == RESULT_OK)
{
newAction.setParentRule(ruleToEdit);
newAction.setParameter1(data.getBooleanExtra(intentNameActionParameter1, false));
newAction.setParameter2(data.getStringExtra(intentNameActionParameter2));
ruleToEdit.getActionSet().add(newAction);
this.refreshActionList();
}
}
else if(requestCode == requestCodeActionMakePhoneCallAdd)
{
if(resultCode == RESULT_OK)
{
newAction.setParentRule(ruleToEdit);
newAction.setParameter1(data.getBooleanExtra(intentNameActionParameter1, false));
newAction.setParameter2(data.getStringExtra(intentNameActionParameter2));
ruleToEdit.getActionSet().add(newAction);
this.refreshActionList();
}
}
else if(requestCode == requestCodeActionSetVariableAdd)
{
if(resultCode == RESULT_OK)
{
newAction.setParentRule(ruleToEdit);
newAction.setParameter2(data.getStringExtra(intentNameActionParameter2));
ruleToEdit.getActionSet().add(newAction);
this.refreshActionList();
}
}
else if(requestCode == requestCodeActionWakeLockAdd)
{
if(resultCode == RESULT_OK)
{
newAction.setParentRule(ruleToEdit);
newAction.setParameter1(data.getBooleanExtra(intentNameActionParameter1, false));
newAction.setParameter2(data.getStringExtra(intentNameActionParameter2));
ruleToEdit.getActionSet().add(newAction);
this.refreshActionList();
}
}
else if(requestCode == requestCodeActionControlMediaAdd) else if(requestCode == requestCodeActionControlMediaAdd)
{ {
if(resultCode == RESULT_OK) if(resultCode == RESULT_OK)
@ -1740,17 +1509,6 @@ public class ActivityManageRule extends Activity
this.refreshActionList(); this.refreshActionList();
} }
} }
else if(requestCode == requestCodeActionSetWifiAdd)
{
if(resultCode == RESULT_OK)
{
newAction.setParentRule(ruleToEdit);
newAction.setParameter1(data.getBooleanExtra(ActivityManageRule.intentNameActionParameter1, true));
newAction.setParameter2(data.getStringExtra(ActivityManageRule.intentNameActionParameter2));
ruleToEdit.getActionSet().add(newAction);
this.refreshActionList();
}
}
else if(requestCode == requestCodeActionCreateNotificationAdd) else if(requestCode == requestCodeActionCreateNotificationAdd)
{ {
if(resultCode == RESULT_OK) if(resultCode == RESULT_OK)
@ -1799,80 +1557,6 @@ public class ActivityManageRule extends Activity
this.refreshActionList(); this.refreshActionList();
} }
} }
else if(requestCode == requestCodeActionWakeLockEdit)
{
if(resultCode == RESULT_OK)
{
ruleToEdit.getActionSet().get(editIndex).setParentRule(ruleToEdit);
if(data.hasExtra(intentNameActionParameter1))
ruleToEdit.getActionSet().get(editIndex).setParameter1(data.getBooleanExtra(intentNameActionParameter1, true));
if(data.hasExtra(intentNameActionParameter2))
ruleToEdit.getActionSet().get(editIndex).setParameter2(data.getStringExtra(intentNameActionParameter2));
this.refreshActionList();
}
}
else if(requestCode == requestCodeActionRunExecutableEdit)
{
if(resultCode == RESULT_OK)
{
ruleToEdit.getActionSet().get(editIndex).setParentRule(ruleToEdit);
if(data.hasExtra(intentNameActionParameter1) && data.hasExtra(intentNameActionParameter2))
{
ruleToEdit.getActionSet().get(editIndex).setParameter1(data.getBooleanExtra(intentNameActionParameter1, false));
ruleToEdit.getActionSet().get(editIndex).setParameter2(data.getStringExtra(intentNameActionParameter2));
}
this.refreshActionList();
}
}
else if(requestCode == requestCodeActionMakePhoneCallEdit)
{
if(resultCode == RESULT_OK)
{
ruleToEdit.getActionSet().get(editIndex).setParentRule(ruleToEdit);
if(data.hasExtra(intentNameActionParameter1) && data.hasExtra(intentNameActionParameter2))
{
ruleToEdit.getActionSet().get(editIndex).setParameter1(data.getBooleanExtra(intentNameActionParameter1, false));
ruleToEdit.getActionSet().get(editIndex).setParameter2(data.getStringExtra(intentNameActionParameter2));
}
this.refreshActionList();
}
}
else if(requestCode == requestCodeActionSetVariableEdit)
{
if(resultCode == RESULT_OK)
{
ruleToEdit.getActionSet().get(editIndex).setParentRule(ruleToEdit);
if(data.hasExtra(intentNameActionParameter2))
{
ruleToEdit.getActionSet().get(editIndex).setParameter2(data.getStringExtra(intentNameActionParameter2));
}
this.refreshActionList();
}
}
else if(requestCode == requestCodeActionSetWifiEdit)
{
if(resultCode == RESULT_OK)
{
ruleToEdit.getActionSet().get(editIndex).setParentRule(ruleToEdit);
if(data.hasExtra(intentNameActionParameter1) && data.hasExtra(intentNameActionParameter2))
{
ruleToEdit.getActionSet().get(editIndex).setParameter1(data.getBooleanExtra(intentNameActionParameter1, false));
ruleToEdit.getActionSet().get(editIndex).setParameter2(data.getStringExtra(intentNameActionParameter2));
}
this.refreshActionList();
}
}
else if(requestCode == requestCodeActionControlMediaEdit) else if(requestCode == requestCodeActionControlMediaEdit)
{ {
if(resultCode == RESULT_OK) if(resultCode == RESULT_OK)
@ -2030,153 +1714,6 @@ public class ActivityManageRule extends Activity
this.refreshTriggerList(); this.refreshTriggerList();
} }
} }
else if(requestCode == requestCodeTriggerTetheringAdd)
{
if(resultCode == RESULT_OK)
{
newTrigger.setTriggerParameter(data.getBooleanExtra(intentNameTriggerParameter1, true));
newTrigger.setTriggerParameter2(data.getStringExtra(intentNameTriggerParameter2));
newTrigger.setParentRule(ruleToEdit);
ruleToEdit.getTriggerSet().add(newTrigger);
this.refreshTriggerList();
}
}
else if(requestCode == requestCodeTriggerSubSystemStateAdd)
{
if(resultCode == RESULT_OK)
{
newTrigger.setTriggerParameter(data.getBooleanExtra(intentNameTriggerParameter1, true));
newTrigger.setTriggerParameter2(data.getStringExtra(intentNameTriggerParameter2));
newTrigger.setParentRule(ruleToEdit);
ruleToEdit.getTriggerSet().add(newTrigger);
this.refreshTriggerList();
}
}
else if(requestCode == requestCodeTriggerCheckVariableAdd)
{
if(resultCode == RESULT_OK)
{
newTrigger.setTriggerParameter(data.getBooleanExtra(intentNameTriggerParameter1, true));
newTrigger.setTriggerParameter2(data.getStringExtra(intentNameTriggerParameter2));
newTrigger.setParentRule(ruleToEdit);
ruleToEdit.getTriggerSet().add(newTrigger);
this.refreshTriggerList();
}
}
else if(requestCode == requestCodeTriggerCalendarEventAdd)
{
if(resultCode == RESULT_OK)
{
newTrigger.setTriggerParameter(data.getBooleanExtra(intentNameTriggerParameter1, true));
newTrigger.setTriggerParameter2(data.getStringExtra(intentNameTriggerParameter2));
newTrigger.setParentRule(ruleToEdit);
ruleToEdit.getTriggerSet().add(newTrigger);
this.refreshTriggerList();
}
}
else if(requestCode == requestCodeTriggerTetheringEdit)
{
if(resultCode == RESULT_OK)
{
Trigger editedTrigger = new Trigger();
editedTrigger.setTriggerType(Trigger_Enum.tethering);
editedTrigger.setTriggerParameter(data.getBooleanExtra(intentNameTriggerParameter1, true));
editedTrigger.setTriggerParameter2(data.getStringExtra(intentNameTriggerParameter2));
editedTrigger.setParentRule(ruleToEdit);
ruleToEdit.getTriggerSet().set(editIndex, editedTrigger);
this.refreshTriggerList();
}
}
else if(requestCode == requestCodeTriggerSubSystemStateEdit)
{
if(resultCode == RESULT_OK)
{
Trigger editedTrigger = new Trigger();
editedTrigger.setTriggerType(Trigger_Enum.subSystemState);
editedTrigger.setTriggerParameter(data.getBooleanExtra(intentNameTriggerParameter1, true));
editedTrigger.setTriggerParameter2(data.getStringExtra(intentNameTriggerParameter2));
editedTrigger.setParentRule(ruleToEdit);
ruleToEdit.getTriggerSet().set(editIndex, editedTrigger);
this.refreshTriggerList();
}
}
else if(requestCode == requestCodeTriggerCheckVariableEdit)
{
if(resultCode == RESULT_OK)
{
Trigger editedTrigger = new Trigger();
editedTrigger.setTriggerType(Trigger_Enum.checkVariable);
editedTrigger.setTriggerParameter(data.getBooleanExtra(intentNameTriggerParameter1, true));
editedTrigger.setTriggerParameter2(data.getStringExtra(intentNameTriggerParameter2));
editedTrigger.setParentRule(ruleToEdit);
ruleToEdit.getTriggerSet().set(editIndex, editedTrigger);
this.refreshTriggerList();
}
}
else if(requestCode == requestCodeTriggerCalendarEventEdit)
{
if(resultCode == RESULT_OK)
{
Trigger editedTrigger = new Trigger();
editedTrigger.setTriggerType(Trigger_Enum.calendarEvent);
editedTrigger.setTriggerParameter(data.getBooleanExtra(intentNameTriggerParameter1, true));
editedTrigger.setTriggerParameter2(data.getStringExtra(intentNameTriggerParameter2));
editedTrigger.setParentRule(ruleToEdit);
ruleToEdit.getTriggerSet().set(editIndex, editedTrigger);
this.refreshTriggerList();
}
}
else if(requestCode == requestCodeActionCopyTextToClipboardAdd)
{
if(resultCode == RESULT_OK)
{
newAction.setParentRule(ruleToEdit);
newAction.setParameter1(data.getBooleanExtra(intentNameActionParameter1, false));
newAction.setParameter2(data.getStringExtra(intentNameActionParameter2));
ruleToEdit.getActionSet().add(newAction);
this.refreshActionList();
}
}
else if(requestCode == requestCodeActionCopyTextToClipboardEdit)
{
if(resultCode == RESULT_OK)
{
ruleToEdit.getActionSet().get(editIndex).setParentRule(ruleToEdit);
if(data.hasExtra(intentNameActionParameter2))
{
ruleToEdit.getActionSet().get(editIndex).setParameter2(data.getStringExtra(intentNameActionParameter2));
}
this.refreshActionList();
}
}
else if(requestCode == requestCodeActionSetLocationServiceAdd)
{
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 == requestCodeActionSetLocationServiceEdit)
{
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() protected AlertDialog getActionTypeDialog()
@ -2231,37 +1768,13 @@ public class ActivityManageRule extends Activity
else if(types[i].toString().equals(Action_Enum.closeNotification.toString())) else if(types[i].toString().equals(Action_Enum.closeNotification.toString()))
items.add(new Item(typesLong[i].toString(), R.drawable.notification)); items.add(new Item(typesLong[i].toString(), R.drawable.notification));
else if(types[i].toString().equals(Action_Enum.sendBroadcast.toString())) else if(types[i].toString().equals(Action_Enum.sendBroadcast.toString()))
items.add(new Item(typesLong[i].toString(), R.drawable.megaphone)); items.add(new Item(typesLong[i].toString(), R.drawable.satellite));
else if(types[i].toString().equals(Action_Enum.wakelock.toString()))
items.add(new Item(typesLong[i].toString(), R.drawable.coffee));
else if(types[i].toString().equals(Action_Enum.runExecutable.toString()))
items.add(new Item(typesLong[i].toString(), R.drawable.script));
else if(types[i].toString().equals(Action_Enum.startPhoneCall.toString()))
{
if(ActivityPermissions.isPermissionDeclaratedInManifest(ActivityManageRule.this, Manifest.permission.CALL_PHONE))
items.add(new Item(typesLong[i].toString(), R.drawable.phone));
}
else if(types[i].toString().equals(Action_Enum.stopPhoneCall.toString()))
{
if(ActivityPermissions.isPermissionDeclaratedInManifest(ActivityManageRule.this, Manifest.permission.ANSWER_PHONE_CALLS))
items.add(new Item(typesLong[i].toString(), R.drawable.phone));
}
else if(types[i].toString().equals(Action_Enum.sendTextMessage.toString())) else if(types[i].toString().equals(Action_Enum.sendTextMessage.toString()))
{ {
// if(ActivityPermissions.isPermissionDeclaratedInManifest(ActivityManageSpecificRule.this, "android.permission.SEND_SMS") && !Miscellaneous.isGooglePlayInstalled(ActivityManageSpecificRule.this))
if(ActivityPermissions.isPermissionDeclaratedInManifest(ActivityManageRule.this, Manifest.permission.SEND_SMS)) if(ActivityPermissions.isPermissionDeclaratedInManifest(ActivityManageRule.this, Manifest.permission.SEND_SMS))
items.add(new Item(typesLong[i].toString(), R.drawable.message)); items.add(new Item(typesLong[i].toString(), R.drawable.message));
} }
else if(types[i].toString().equals(Action_Enum.copyToClipboard.toString()))
items.add(new Item(typesLong[i].toString(), R.drawable.clipboard));
else if(types[i].toString().equals(Action_Enum.setVariable.toString()))
items.add(new Item(typesLong[i].toString(), R.drawable.variable));
else if(types[i].toString().equals(Action_Enum.setLocationService.toString()))
items.add(new Item(typesLong[i].toString(), R.drawable.compass_small));
else if(types[i].toString().equals(Action_Enum.takeScreenshot.toString()))
{
if(ActivityPermissions.isPermissionDeclaratedInManifest(ActivityManageRule.this, Manifest.permission.BIND_ACCESSIBILITY_SERVICE))
items.add(new Item(typesLong[i].toString(), R.drawable.copier));
}
else else
items.add(new Item(typesLong[i].toString(), R.drawable.placeholder)); items.add(new Item(typesLong[i].toString(), R.drawable.placeholder));
} }
@ -2298,15 +1811,17 @@ public class ActivityManageRule extends Activity
{ {
//launch other activity to enter a url and parameters; //launch other activity to enter a url and parameters;
newAction.setAction(Action_Enum.triggerUrl); newAction.setAction(Action_Enum.triggerUrl);
// ActivityManageActionTriggerUrl.resultingAction = null; ActivityManageActionTriggerUrl.resultingAction = null;
Intent editTriggerIntent = new Intent(context, ActivityManageActionTriggerUrl.class); Intent editTriggerIntent = new Intent(context, ActivityManageActionTriggerUrl.class);
startActivityForResult(editTriggerIntent, requestCodeActionTriggerUrlAdd); startActivityForResult(editTriggerIntent, requestCodeActionTriggerUrlAdd);
} }
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.setWifi.toString())) else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.setWifi.toString()))
{ {
newAction.setAction(Action_Enum.setWifi); newAction.setAction(Action_Enum.setWifi);
Intent editSetWifiIntent = new Intent(context, ActivityManageActionWifi.class); getActionParameter1Dialog(ActivityManageRule.this).show();
startActivityForResult(editSetWifiIntent, requestCodeActionSetWifiAdd);
if(context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.Q)
Miscellaneous.messageBox(context.getResources().getString(R.string.app_name), context.getResources().getString(R.string.android10WifiToggleNotice), context).show();
} }
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.setBluetooth.toString())) else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.setBluetooth.toString()))
{ {
@ -2422,36 +1937,6 @@ public class ActivityManageRule extends Activity
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionSendBroadcast.class); Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionSendBroadcast.class);
startActivityForResult(intent, requestCodeActionSendBroadcastAdd); startActivityForResult(intent, requestCodeActionSendBroadcastAdd);
} }
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.runExecutable.toString()))
{
newAction.setAction(Action_Enum.runExecutable);
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionRunExecutable.class);
startActivityForResult(intent, requestCodeActionRunExecutableAdd);
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.startPhoneCall.toString()))
{
newAction.setAction(Action_Enum.startPhoneCall);
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionMakePhoneCall.class);
startActivityForResult(intent, requestCodeActionMakePhoneCallAdd);
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.setVariable.toString()))
{
newAction.setAction(Action_Enum.setVariable);
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionSetVariable.class);
startActivityForResult(intent, requestCodeActionSetVariableAdd);
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.stopPhoneCall.toString()))
{
newAction.setAction(Action_Enum.stopPhoneCall);
ruleToEdit.getActionSet().add(newAction);
refreshActionList();
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.wakelock.toString()))
{
newAction.setAction(Action_Enum.wakelock);
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionWakeLock.class);
startActivityForResult(intent, requestCodeActionWakeLockAdd);
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.controlMediaPlayback.toString())) else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.controlMediaPlayback.toString()))
{ {
newAction.setAction(Action_Enum.controlMediaPlayback); newAction.setAction(Action_Enum.controlMediaPlayback);
@ -2482,24 +1967,6 @@ public class ActivityManageRule extends Activity
Intent actionPlaySoundIntent = new Intent(context, ActivityManageActionPlaySound.class); Intent actionPlaySoundIntent = new Intent(context, ActivityManageActionPlaySound.class);
startActivityForResult(actionPlaySoundIntent, requestCodeActionPlaySoundAdd); startActivityForResult(actionPlaySoundIntent, requestCodeActionPlaySoundAdd);
} }
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.copyToClipboard.toString()))
{
newAction.setAction(Action_Enum.copyToClipboard);
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionCopyToClipboard.class);
startActivityForResult(intent, requestCodeActionCopyTextToClipboardAdd);
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.takeScreenshot.toString()))
{
newAction.setAction(Action_Enum.takeScreenshot);
ruleToEdit.getActionSet().add(newAction);
refreshActionList();
}
else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.setLocationService.toString()))
{
newAction.setAction(Action_Enum.setLocationService);
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionLocationService.class);
startActivityForResult(intent, requestCodeActionSetLocationServiceAdd);
}
} }
}); });

View File

@ -2,7 +2,6 @@ package com.jens.automation2;
import android.app.Activity; import android.app.Activity;
import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothDevice;
import android.content.pm.PackageManager;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
@ -13,7 +12,6 @@ import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.RadioButton; import android.widget.RadioButton;
import android.widget.Spinner; import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import com.jens.automation2.receivers.BluetoothReceiver; import com.jens.automation2.receivers.BluetoothReceiver;
@ -24,7 +22,6 @@ public class ActivityManageTriggerBluetooth extends Activity
RadioButton radioAnyBluetoothDevice, radioNoDevice, radioDeviceFromList, radioBluetoothConnected, radioBluetoothDisconnected, radioBluetoothInRange, radioBluetoothOutRange; RadioButton radioAnyBluetoothDevice, radioNoDevice, radioDeviceFromList, radioBluetoothConnected, radioBluetoothDisconnected, radioBluetoothInRange, radioBluetoothOutRange;
Button bSaveBluetoothTrigger; Button bSaveBluetoothTrigger;
Spinner spinnerBluetoothDevices; Spinner spinnerBluetoothDevices;
TextView tvBluetoothNotPresentNotice;
ArrayAdapter<String> bluetoothDevicesSpinnerAdapter; ArrayAdapter<String> bluetoothDevicesSpinnerAdapter;
@ -32,7 +29,6 @@ public class ActivityManageTriggerBluetooth extends Activity
protected void onCreate(Bundle savedInstanceState) protected void onCreate(Bundle savedInstanceState)
{ {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_trigger_bluetooth); setContentView(R.layout.activity_manage_trigger_bluetooth);
radioAnyBluetoothDevice = (RadioButton)findViewById(R.id.radioAnyBluetoothDevice); radioAnyBluetoothDevice = (RadioButton)findViewById(R.id.radioAnyBluetoothDevice);
@ -44,15 +40,9 @@ public class ActivityManageTriggerBluetooth extends Activity
radioBluetoothOutRange = (RadioButton)findViewById(R.id.radioBluetoothOutRange); radioBluetoothOutRange = (RadioButton)findViewById(R.id.radioBluetoothOutRange);
bSaveBluetoothTrigger = (Button)findViewById(R.id.bSaveBluetoothTrigger); bSaveBluetoothTrigger = (Button)findViewById(R.id.bSaveBluetoothTrigger);
spinnerBluetoothDevices = (Spinner)findViewById(R.id.spinnerBluetoothDevices); 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()); bluetoothDevicesSpinnerAdapter = new ArrayAdapter<String>(this, R.layout.text_view_for_poi_listview_mediumtextsize, BluetoothReceiver.getAllPairedBluetoothDevicesStrings());
if(!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH))
tvBluetoothNotPresentNotice.setVisibility(View.VISIBLE);
else
tvBluetoothNotPresentNotice.setVisibility(View.GONE);
radioDeviceFromList.setOnCheckedChangeListener(new OnCheckedChangeListener() radioDeviceFromList.setOnCheckedChangeListener(new OnCheckedChangeListener()
{ {
@Override @Override

View File

@ -28,7 +28,6 @@ public class ActivityManageTriggerBroadcast extends Activity
protected void onCreate(@Nullable Bundle savedInstanceState) protected void onCreate(@Nullable Bundle savedInstanceState)
{ {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_trigger_broadcasts); setContentView(R.layout.activity_manage_trigger_broadcasts);
bBroadcastShowSuggestions = findViewById(R.id.bBroadcastShowSuggestions); bBroadcastShowSuggestions = findViewById(R.id.bBroadcastShowSuggestions);

View File

@ -1,404 +0,0 @@
package com.jens.automation2;
import android.Manifest;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.provider.CalendarContract;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.jens.automation2.receivers.CalendarReceiver;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.List;
public class ActivityManageTriggerCalendar extends Activity
{
CheckBox chkCalendarEventActive, chkCalendarAvailabilityBusy, chkCalendarAvailabilityFree, chkCalendarAvailabilityTentative, chkCalendarAvailabilityOutOfOffice, chkCalendarAvailabilityWorkingElsewhere, chkCalendarAllDayEvent, chkCalendarEvaluateAllDayEvent, chkCalendarEvaluateReoccurring, chkCalendarReoccurring;
Spinner spinnerCalendarTitleDirection, spinnerCalendarLocationDirection, spinnerCalendarDescriptionDirection;
EditText etCalendarTitle, etCalendarLocation, etCalendarDescription;
LinearLayout llCalendarSelection;
Button bSaveTriggerCalendar;
List<CheckBox> checkboxesCalendars = new ArrayList<>();
final static String separator = ",";
TextView tvMissingCalendarHint;
private static String[] directions;
ArrayAdapter<String> directionSpinnerAdapter;
public static int requestCodePermissionReadCalendar = 815;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_trigger_calendar);
chkCalendarEventActive = (CheckBox) findViewById(R.id.chkCalendarEventActive);
spinnerCalendarTitleDirection = (Spinner)findViewById(R.id.spinnerCalendarTitleDirection);
spinnerCalendarLocationDirection = (Spinner)findViewById(R.id.spinnerCalendarLocationDirection);
spinnerCalendarDescriptionDirection = (Spinner)findViewById(R.id.spinnerCalendarDescriptionDirection);
chkCalendarAllDayEvent = (CheckBox)findViewById(R.id.chkCalendarAllDayEvent);
chkCalendarAvailabilityBusy = (CheckBox)findViewById(R.id.chkCalendarAvailabilityBusy);
chkCalendarAvailabilityFree = (CheckBox)findViewById(R.id.chkCalendarAvailabilityFree);
chkCalendarAvailabilityTentative = (CheckBox)findViewById(R.id.chkCalendarAvailabilityTentative);
chkCalendarAvailabilityOutOfOffice = (CheckBox)findViewById(R.id.chkCalendarAvailabilityOutOfOffice);
chkCalendarAvailabilityWorkingElsewhere = (CheckBox)findViewById(R.id.chkCalendarAvailabilityWorkingElsewhere);
chkCalendarEvaluateAllDayEvent = (CheckBox)findViewById(R.id.chkCalendarEvaluateAllDayEvent);
chkCalendarEvaluateReoccurring = (CheckBox)findViewById(R.id.chkCalendarEvaluateReoccurring);
chkCalendarReoccurring = (CheckBox)findViewById(R.id.chkCalendarReoccurring);
tvMissingCalendarHint = (TextView) findViewById(R.id.tvMissingCalendarHint);
llCalendarSelection = (LinearLayout)findViewById(R.id.llCalendarSelection);
etCalendarTitle = (EditText)findViewById(R.id.etCalendarTitle);
etCalendarLocation = (EditText)findViewById(R.id.etCalendarLocation);
etCalendarDescription = (EditText)findViewById(R.id.etCalendarDescription);
bSaveTriggerCalendar = (Button)findViewById(R.id.bSaveTriggerCalendar);
directions = new String[] {
getResources().getString(R.string.directionStringEquals),
getResources().getString(R.string.directionStringContains),
getResources().getString(R.string.directionStringDoesNotContain),
getResources().getString(R.string.directionStringStartsWith),
getResources().getString(R.string.directionStringEndsWith),
getResources().getString(R.string.directionStringNotEquals)
};
directionSpinnerAdapter = new ArrayAdapter<>(this, R.layout.text_view_for_poi_listview_mediumtextsize, ActivityManageTriggerCalendar.directions);
spinnerCalendarTitleDirection.setAdapter(directionSpinnerAdapter);
spinnerCalendarLocationDirection.setAdapter(directionSpinnerAdapter);
spinnerCalendarDescriptionDirection.setAdapter(directionSpinnerAdapter);
directionSpinnerAdapter.notifyDataSetChanged();
chkCalendarEvaluateAllDayEvent.setChecked(false);
chkCalendarAllDayEvent.setEnabled(false);
chkCalendarEvaluateAllDayEvent.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean checked)
{
chkCalendarAllDayEvent.setEnabled(checked);
}
});
chkCalendarEvaluateReoccurring.setChecked(false);
chkCalendarReoccurring.setEnabled(false);
chkCalendarEvaluateReoccurring.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean checked)
{
chkCalendarReoccurring.setEnabled(checked);
}
});
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
{
if(ActivityPermissions.havePermission(Manifest.permission.READ_CALENDAR, ActivityManageTriggerCalendar.this) || ActivityPermissions.havePermission(Manifest.permission.WRITE_CALENDAR, ActivityManageTriggerCalendar.this))
populateCalenderCheckboxes();
else
{
AlertDialog.Builder builder = new AlertDialog.Builder(ActivityManageTriggerCalendar.this);
builder.setTitle(getResources().getString(R.string.info));
builder.setMessage(getResources().getString(R.string.permissionCalendarRequired));
builder.setNegativeButton(getResources().getString(R.string.cancel), new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialogInterface, int i)
{
ActivityManageTriggerCalendar.this.finish();
}
});
builder.setPositiveButton(getResources().getString(R.string.ok), new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialogInterface, int i)
{
requestPermissions(new String[]{ Manifest.permission.READ_CALENDAR } , requestCodePermissionReadCalendar);
}
});
builder.show();
}
}
else
populateCalenderCheckboxes();
chkCalendarEventActive.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean checked)
{
if(checked)
chkCalendarEventActive.setText(R.string.eventIsCurrentlyHappening);
else
chkCalendarEventActive.setText(R.string.eventIsCurrentlyNotHappening);
}
});
chkCalendarAllDayEvent.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean checked)
{
if(checked)
chkCalendarAllDayEvent.setText(getResources().getString(R.string.allDayEventTrue));
else
chkCalendarAllDayEvent.setText(getResources().getString(R.string.allDayEventFalse));
}
});
chkCalendarReoccurring.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean checked)
{
if(checked)
chkCalendarReoccurring.setText(R.string.reoccurringTrue);
else
chkCalendarReoccurring.setText(R.string.reoccurringFalse);
}
});
bSaveTriggerCalendar.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
String titleDir = Trigger.getMatchCode(spinnerCalendarTitleDirection.getSelectedItem().toString());
String title = etCalendarTitle.getText().toString();
String descriptionDir = Trigger.getMatchCode(spinnerCalendarDescriptionDirection.getSelectedItem().toString());
String description = etCalendarDescription.getText().toString();
String locationDir = Trigger.getMatchCode(spinnerCalendarLocationDirection.getSelectedItem().toString());
String location = etCalendarLocation.getText().toString();
List<String> availabilityList = new ArrayList<>();
if(chkCalendarAvailabilityBusy.isChecked())
availabilityList.add(String.valueOf(CalendarContract.Events.AVAILABILITY_BUSY));
if(chkCalendarAvailabilityFree.isChecked())
availabilityList.add(String.valueOf(CalendarContract.Events.AVAILABILITY_FREE));
if(chkCalendarAvailabilityTentative.isChecked())
availabilityList.add(String.valueOf(CalendarContract.Events.AVAILABILITY_TENTATIVE));
if(chkCalendarAvailabilityOutOfOffice.isChecked())
availabilityList.add(String.valueOf(CalendarReceiver.AVAILABILITY_OUT_OF_OFFICE));
if(chkCalendarAvailabilityWorkingElsewhere.isChecked())
availabilityList.add(String.valueOf(CalendarReceiver.AVAILABILITY_WORKING_ELSEWHERE));
List<CalendarReceiver.AndroidCalendar> selectedCalendarsList = new ArrayList<>();
for(CheckBox calCheckbox : checkboxesCalendars)
{
if(calCheckbox.isChecked())
selectedCalendarsList.add((CalendarReceiver.AndroidCalendar) calCheckbox.getTag());
}
List<String> selectedCalendarsIdArray = new ArrayList<>();
for(CalendarReceiver.AndroidCalendar cal : selectedCalendarsList)
selectedCalendarsIdArray.add(String.valueOf(cal.calendarId));
String returnString =
titleDir + Trigger.triggerParameter2Split + title + Trigger.triggerParameter2Split +
descriptionDir + Trigger.triggerParameter2Split + description + Trigger.triggerParameter2Split +
locationDir + Trigger.triggerParameter2Split + location + Trigger.triggerParameter2Split +
String.valueOf(chkCalendarEvaluateAllDayEvent.isChecked()) + Trigger.triggerParameter2Split +
String.valueOf(chkCalendarAllDayEvent.isChecked()) + Trigger.triggerParameter2Split +
String.valueOf(chkCalendarEvaluateReoccurring.isChecked()) + Trigger.triggerParameter2Split +
String.valueOf(chkCalendarReoccurring.isChecked()) + Trigger.triggerParameter2Split +
Miscellaneous.explode(separator, availabilityList.toArray(new String[availabilityList.size()])) + Trigger.triggerParameter2Split +
Miscellaneous.explode(separator, selectedCalendarsIdArray.toArray(new String[selectedCalendarsIdArray.size()]));
Intent data = new Intent();
data.putExtra(ActivityManageRule.intentNameTriggerParameter1, chkCalendarEventActive.isChecked());
data.putExtra(ActivityManageRule.intentNameTriggerParameter2, returnString);
ActivityManageTriggerCalendar.this.setResult(RESULT_OK, data);
finish();
}
});
Intent inputIntent = getIntent();
if(inputIntent.hasExtra(ActivityManageRule.intentNameTriggerParameter1))
loadValuesIntoGui(inputIntent);
}
private void populateCalenderCheckboxes()
{
List<CalendarReceiver.AndroidCalendar> calList = CalendarReceiver.readCalendars(ActivityManageTriggerCalendar.this);
if(calList != null)
{
if(calList.size() > 0)
{
for (CalendarReceiver.AndroidCalendar cal : calList)
{
CheckBox oneCalCheckbox = new CheckBox(ActivityManageTriggerCalendar.this);
oneCalCheckbox.setText(cal.toString());
oneCalCheckbox.setTag(cal);
llCalendarSelection.addView(oneCalCheckbox);
checkboxesCalendars.add(oneCalCheckbox);
}
}
else
Miscellaneous.messageBox(getResources().getString(R.string.warning), getResources().getString(R.string.noCalendarsOnYourDevice), ActivityManageTriggerCalendar.this).show();
}
else
Miscellaneous.messageBox(getResources().getString(R.string.warning), getResources().getString(R.string.errorReadingCalendars), ActivityManageTriggerCalendar.this).show();
}
void loadValuesIntoGui(Intent data)
{
try
{
if (data.hasExtra(ActivityManageRule.intentNameTriggerParameter1))
chkCalendarEventActive.setChecked(data.getBooleanExtra(ActivityManageRule.intentNameTriggerParameter1, true));
if (data.hasExtra(ActivityManageRule.intentNameTriggerParameter2))
{
String input[] = data.getStringExtra(ActivityManageRule.intentNameTriggerParameter2).split(Trigger.triggerParameter2Split, -1);
/*
0 = titleDir
1 = title
2 = descriptionDir
3 = description
4 = locationDir
5 = location
6 = evaluate all day event
7 = all day event
8 = evaluate reoccurring
9 = reoccurring
10 = availability list
11 = calendars list
*/
for (int i = 0; i < directions.length; i++)
{
if (Trigger.getMatchCode(directions[i]).equalsIgnoreCase(input[0]))
spinnerCalendarTitleDirection.setSelection(i);
if (Trigger.getMatchCode(directions[i]).equalsIgnoreCase(input[2]))
spinnerCalendarDescriptionDirection.setSelection(i);
if (Trigger.getMatchCode(directions[i]).equalsIgnoreCase(input[4]))
spinnerCalendarLocationDirection.setSelection(i);
}
etCalendarTitle.setText(input[1]);
etCalendarDescription.setText(input[3]);
etCalendarLocation.setText(input[5]);
chkCalendarEvaluateAllDayEvent.setChecked(Boolean.parseBoolean(input[6]));
chkCalendarAllDayEvent.setChecked(Boolean.parseBoolean(input[7]));
chkCalendarEvaluateReoccurring.setChecked(Boolean.parseBoolean(input[8]));
chkCalendarReoccurring.setChecked(Boolean.parseBoolean(input[9]));
String[] availabilities = null;
if (!StringUtils.isEmpty(input[10]))
availabilities = input[10].split(separator);
if (availabilities != null)
{
for (String avail : availabilities)
{
if (Integer.parseInt(avail) == CalendarContract.Events.AVAILABILITY_BUSY)
chkCalendarAvailabilityBusy.setChecked(true);
else if (Integer.parseInt(avail) == CalendarContract.Events.AVAILABILITY_FREE)
chkCalendarAvailabilityFree.setChecked(true);
else if (Integer.parseInt(avail) == CalendarContract.Events.AVAILABILITY_TENTATIVE)
chkCalendarAvailabilityTentative.setChecked(true);
else if (Integer.parseInt(avail) == CalendarReceiver.AVAILABILITY_OUT_OF_OFFICE)
chkCalendarAvailabilityOutOfOffice.setChecked(true);
else if (Integer.parseInt(avail) == CalendarReceiver.AVAILABILITY_WORKING_ELSEWHERE)
chkCalendarAvailabilityWorkingElsewhere.setChecked(true);
}
}
String[] calendars = null;
if (!StringUtils.isEmpty(input[11]))
calendars = input[11].split(separator);
if (calendars != null)
{
List<String> usedCalendarIDs = new ArrayList<>();
List<String> unusedCalendarIDs = new ArrayList<>();
for (CheckBox checkbox : checkboxesCalendars)
{
int id = ((CalendarReceiver.AndroidCalendar) checkbox.getTag()).calendarId;
for (String calId : calendars)
{
if (calId.equals(String.valueOf(id)))
{
usedCalendarIDs.add(String.valueOf(id));
checkbox.setChecked(true);
break;
}
}
}
for (String calId : calendars)
{
if (!Miscellaneous.arraySearch((ArrayList<String>) usedCalendarIDs, calId, false, true))
unusedCalendarIDs.add(calId);
}
if (unusedCalendarIDs.size() > 0)
{
/*
A calendar has been configured that has been deleted since. We cannot resolve it.
It will be removed with the next save, but we should inform this user
of these circumstances.
*/
tvMissingCalendarHint.setText(String.format(getResources().getString(R.string.calendarsMissingHint), Miscellaneous.explode(", ", (ArrayList<String>) unusedCalendarIDs)));
}
}
}
}
catch (Exception e)
{
Miscellaneous.logEvent("e", "ActivityManagerTriggerCalender", "Error loading values into GUI: " + Log.getStackTraceString(e), 1);
Toast.makeText(ActivityManageTriggerCalendar.this, getResources().getString(R.string.errorLoadingValues), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
{
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode == requestCodePermissionReadCalendar)
{
if(
permissions[0].equals(Manifest.permission.READ_CALENDAR)
||
permissions[0].equals(Manifest.permission.WRITE_CALENDAR)
)
{
if(grantResults[0] == PackageManager.PERMISSION_GRANTED)
populateCalenderCheckboxes();
else
finish();
}
}
}
}

View File

@ -1,87 +0,0 @@
package com.jens.automation2;
import android.app.Activity;
import android.content.Intent;
import android.os.BatteryManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import androidx.annotation.Nullable;
import com.jens.automation2.ActivityManageRule;
import com.jens.automation2.Miscellaneous;
import com.jens.automation2.R;
import com.jens.automation2.Trigger;
import org.apache.commons.lang3.StringUtils;
public class ActivityManageTriggerCharging extends Activity
{
RadioButton rbChargingOn, rbChargingOff, rbChargingTypeAny, rbChargingTypeAc, rbChargingTypeUsb, rbChargingTypeWireless;
Button bTriggerChargingSave;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_trigger_charging);
rbChargingOn = (RadioButton) findViewById(R.id.rbChargingOn);
rbChargingOff = (RadioButton) findViewById(R.id.rbChargingOff);
rbChargingTypeAny = (RadioButton) findViewById(R.id.rbChargingTypeAny);
rbChargingTypeAc = (RadioButton) findViewById(R.id.rbChargingTypeAc);
rbChargingTypeUsb = (RadioButton) findViewById(R.id.rbChargingTypeUsb);
rbChargingTypeWireless = (RadioButton) findViewById(R.id.rbChargingTypeWireless);
bTriggerChargingSave = (Button) findViewById(R.id.bTriggerChargingSave);
Intent input = getIntent();
if(input.hasExtra(ActivityManageRule.intentNameTriggerParameter1))
{
rbChargingOn.setChecked(input.getBooleanExtra(ActivityManageRule.intentNameTriggerParameter1, true));
rbChargingOff.setChecked(!input.getBooleanExtra(ActivityManageRule.intentNameTriggerParameter1, false));
if(input.hasExtra(ActivityManageRule.intentNameTriggerParameter2))
{
String[] params2 = input.getStringExtra(ActivityManageRule.intentNameTriggerParameter2).split(Trigger.triggerParameter2Split);
int chargingType = Integer.parseInt(params2[0]);
rbChargingTypeAny.setChecked(chargingType == 0);
rbChargingTypeAc.setChecked(chargingType == BatteryManager.BATTERY_PLUGGED_AC);
rbChargingTypeUsb.setChecked(chargingType == BatteryManager.BATTERY_PLUGGED_USB);
rbChargingTypeWireless.setChecked(chargingType == BatteryManager.BATTERY_PLUGGED_WIRELESS);
}
}
bTriggerChargingSave.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
Intent response = new Intent();
response.putExtra(ActivityManageRule.intentNameTriggerParameter1, rbChargingOn.isChecked());
String param2 = "";
if(rbChargingTypeAny.isChecked())
param2 = "0";
else if(rbChargingTypeAc.isChecked())
param2 = String.valueOf(BatteryManager.BATTERY_PLUGGED_AC);
else if(rbChargingTypeUsb.isChecked())
param2 = String.valueOf(BatteryManager.BATTERY_PLUGGED_USB);
else if(rbChargingTypeWireless.isChecked())
param2 = String.valueOf(BatteryManager.BATTERY_PLUGGED_WIRELESS);
response.putExtra(ActivityManageRule.intentNameTriggerParameter2, param2);
setResult(RESULT_OK, response);
finish();
}
});
}
}

View File

@ -1,57 +0,0 @@
package com.jens.automation2;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import androidx.annotation.Nullable;
import org.apache.commons.lang3.StringUtils;
public class ActivityManageTriggerCheckVariable extends Activity
{
EditText etVariableKeyTrigger, etVariableValueTrigger;
Button bTriggerVariableSave;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_trigger_check_variable);
etVariableKeyTrigger = (EditText) findViewById(R.id.etVariableKeyTrigger);
etVariableValueTrigger = (EditText) findViewById(R.id.etVariableValueTrigger);
bTriggerVariableSave = (Button) findViewById(R.id.bTriggerVariableSave);
Intent input = getIntent();
if(input.hasExtra(ActivityManageRule.intentNameTriggerParameter2))
{
String[] conditions = input.getStringExtra(ActivityManageRule.intentNameTriggerParameter2).split(Trigger.triggerParameter2Split);
etVariableKeyTrigger.setText(conditions[0]);
if(conditions.length > 1)
etVariableValueTrigger.setText(conditions[1]);
}
bTriggerVariableSave.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
Intent response = new Intent();
// response.putExtra(ActivityManageRule.intentNameTriggerParameter1, rbTetheringOn.isChecked());
if(StringUtils.isEmpty(etVariableValueTrigger.getText().toString()))
response.putExtra(ActivityManageRule.intentNameTriggerParameter2, etVariableKeyTrigger.getText().toString());
else
response.putExtra(ActivityManageRule.intentNameTriggerParameter2, etVariableKeyTrigger.getText().toString() + Trigger.triggerParameter2Split + etVariableValueTrigger.getText().toString());
setResult(RESULT_OK, response);
finish();
}
});
}
}

View File

@ -104,7 +104,6 @@ public class ActivityManageTriggerDeviceOrientation extends Activity
protected void onCreate(@Nullable Bundle savedInstanceState) protected void onCreate(@Nullable Bundle savedInstanceState)
{ {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_trigger_device_orientation); setContentView(R.layout.activity_manage_trigger_device_orientation);
currentAzimuth = (TextView) findViewById(R.id.tvCurrentAzimuth); currentAzimuth = (TextView) findViewById(R.id.tvCurrentAzimuth);

View File

@ -39,7 +39,6 @@ public class ActivityManageTriggerNfc extends Activity
protected void onCreate(Bundle savedInstanceState) protected void onCreate(Bundle savedInstanceState)
{ {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_trigger_nfc); setContentView(R.layout.activity_manage_trigger_nfc);
etNewNfcIdValue = (EditText)findViewById(R.id.etNewNfcIdValue); etNewNfcIdValue = (EditText)findViewById(R.id.etNewNfcIdValue);

View File

@ -258,7 +258,6 @@ public class ActivityManageTriggerNotification extends Activity
protected void onCreate(Bundle savedInstanceState) protected void onCreate(Bundle savedInstanceState)
{ {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_trigger_notification); setContentView(R.layout.activity_manage_trigger_notification);
etNotificationTitle = (EditText)findViewById(R.id.etNotificationTitle); etNotificationTitle = (EditText)findViewById(R.id.etNotificationTitle);

View File

@ -35,7 +35,6 @@ public class ActivityManageTriggerPhoneCall extends Activity
protected void onCreate(Bundle savedInstanceState) protected void onCreate(Bundle savedInstanceState)
{ {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_trigger_phone_call); setContentView(R.layout.activity_manage_trigger_phone_call);
etTriggerPhoneCallPhoneNumber = (EditText)findViewById(R.id.etTriggerPhoneCallPhoneNumber); etTriggerPhoneCallPhoneNumber = (EditText)findViewById(R.id.etTriggerPhoneCallPhoneNumber);

View File

@ -31,7 +31,6 @@ public class ActivityManageTriggerProfile extends Activity
protected void onCreate(@Nullable Bundle savedInstanceState) protected void onCreate(@Nullable Bundle savedInstanceState)
{ {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_trigger_profile); setContentView(R.layout.activity_manage_trigger_profile);
bSaveTriggerProfile = (Button)findViewById(R.id.bSaveTriggerProfile); bSaveTriggerProfile = (Button)findViewById(R.id.bSaveTriggerProfile);

View File

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

View File

@ -1,102 +0,0 @@
package com.jens.automation2;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import androidx.annotation.Nullable;
import org.apache.commons.lang3.StringUtils;
public class ActivityManageTriggerTethering extends Activity
{
RadioButton rbTetheringOn, rbTetheringOff, rbTetheringTypeAny, rbTetheringTypeWifi, rbTetheringTypeBluetooth, rbTetheringTypeUsb, rbTetheringTypeCable;
Button bTriggerTetheringSave;
public final static String tetheringTypeAny = "tetheringTypeAny";
public final static String tetheringTypeWifi = "tetheringTypeWifi";
public final static String tetheringTypeBluetooth = "tetheringTypeBluetooth";
public final static String tetheringTypeUsb = "tetheringTypeUsb";
public final static String tetheringTypeCable = "tetheringTypeCable";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_trigger_tethering);
rbTetheringOn = (RadioButton) findViewById(R.id.rbTetheringOn);
rbTetheringOff = (RadioButton)findViewById(R.id.rbTetheringOff);
rbTetheringTypeAny = (RadioButton) findViewById(R.id.rbTetheringTypeAny);
rbTetheringTypeWifi = (RadioButton) findViewById(R.id.rbTetheringTypeWifi);
rbTetheringTypeBluetooth = (RadioButton) findViewById(R.id.rbTetheringTypeBluetooth);
rbTetheringTypeUsb = (RadioButton) findViewById(R.id.rbTetheringTypeUsb);
rbTetheringTypeCable = (RadioButton) findViewById(R.id.rbTetheringTypeCable);
bTriggerTetheringSave = (Button) findViewById(R.id.bTriggerTetheringSave);
Intent input = getIntent();
if(input.hasExtra(ActivityManageRule.intentNameTriggerParameter1))
{
rbTetheringOn.setChecked(input.getBooleanExtra(ActivityManageRule.intentNameTriggerParameter1, true));
rbTetheringOff.setChecked(!input.getBooleanExtra(ActivityManageRule.intentNameTriggerParameter1, false));
}
if(input.hasExtra(ActivityManageRule.intentNameTriggerParameter2))
{
String type = input.getStringExtra(ActivityManageRule.intentNameTriggerParameter2);
if(!StringUtils.isEmpty(type))
{
switch(type)
{
case tetheringTypeAny:
rbTetheringTypeAny.setChecked(true);
break;
case tetheringTypeWifi:
rbTetheringTypeWifi.setChecked(true);
break;
case tetheringTypeBluetooth:
rbTetheringTypeBluetooth.setChecked(true);
break;
case tetheringTypeUsb:
rbTetheringTypeUsb.setChecked(true);
break;
case tetheringTypeCable:
rbTetheringTypeCable.setChecked(true);
break;
default:
}
}
}
else
rbTetheringTypeAny.setChecked(true);
bTriggerTetheringSave.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
Intent response = new Intent();
response.putExtra(ActivityManageRule.intentNameTriggerParameter1, rbTetheringOn.isChecked());
if(rbTetheringTypeAny.isChecked())
response.putExtra(ActivityManageRule.intentNameTriggerParameter2, tetheringTypeAny);
else if(rbTetheringTypeWifi.isChecked())
response.putExtra(ActivityManageRule.intentNameTriggerParameter2, tetheringTypeWifi);
else if(rbTetheringTypeBluetooth.isChecked())
response.putExtra(ActivityManageRule.intentNameTriggerParameter2, tetheringTypeBluetooth);
else if(rbTetheringTypeUsb.isChecked())
response.putExtra(ActivityManageRule.intentNameTriggerParameter2, tetheringTypeUsb);
else if(rbTetheringTypeCable.isChecked())
response.putExtra(ActivityManageRule.intentNameTriggerParameter2, tetheringTypeCable);
setResult(RESULT_OK, response);
finish();
}
});
}
}

View File

@ -35,7 +35,6 @@ public class ActivityManageTriggerTimeFrame extends Activity
protected void onCreate(Bundle savedInstanceState) protected void onCreate(Bundle savedInstanceState)
{ {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_trigger_timeframe); setContentView(R.layout.activity_manage_trigger_timeframe);
startPicker = (TimePicker)findViewById(R.id.tpTimeFrameStart); startPicker = (TimePicker)findViewById(R.id.tpTimeFrameStart);

View File

@ -12,25 +12,23 @@ import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log; import android.util.Log;
import android.view.KeyEvent;
import android.view.View; import android.view.View;
import android.widget.AdapterView; import android.widget.AdapterView;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.Button; import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.EditText; import android.widget.EditText;
import android.widget.RadioButton; import android.widget.RadioButton;
import android.widget.Spinner; import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat; import androidx.core.app.ActivityCompat;
import com.jens.automation2.receivers.BluetoothReceiver;
import java.lang.reflect.Array;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@ -43,41 +41,28 @@ public class ActivityManageTriggerWifi extends Activity
RadioButton rbTriggerWifiConnected, rbTriggerWifiDisconnected; RadioButton rbTriggerWifiConnected, rbTriggerWifiDisconnected;
EditText etTriggerWifiName; EditText etTriggerWifiName;
Spinner spinnerWifiList; Spinner spinnerWifiList;
Button bTriggerWifiSave, bLoadWifiList; Button btriggerWifiSave, bLoadWifiList;
List<String> wifiList = new ArrayList<>(); List<String> wifiList = new ArrayList<>();
ArrayAdapter<String> wifiSpinnerAdapter; ArrayAdapter<String> wifiSpinnerAdapter;
private final static int requestCodeLocationPermission = 124; private final static int requestCodeLocationPermission = 124;
TextView tvWifiTriggerNameLocationNotice, tvWifiTriggerDisconnectionHint;
@Override @Override
protected void onCreate(@Nullable Bundle savedInstanceState) protected void onCreate(@Nullable Bundle savedInstanceState)
{ {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_manage_trigger_wifi); setContentView(R.layout.activity_manage_trigger_wifi);
rbTriggerWifiConnected = (RadioButton) findViewById(R.id.rbTriggerWifiConnected); rbTriggerWifiConnected = (RadioButton) findViewById(R.id.rbTriggerWifiConnected);
rbTriggerWifiDisconnected = (RadioButton) findViewById(R.id.rbTriggerWifiDisconnected); rbTriggerWifiDisconnected = (RadioButton) findViewById(R.id.rbTriggerWifiDisconnected);
etTriggerWifiName = (EditText) findViewById(R.id.etTriggerWifiName); etTriggerWifiName = (EditText) findViewById(R.id.etTriggerWifiName);
spinnerWifiList = (Spinner) findViewById(R.id.spinnerWifiList); spinnerWifiList = (Spinner) findViewById(R.id.spinnerWifiList);
bTriggerWifiSave = (Button) findViewById(R.id.bTriggerWifiSave); btriggerWifiSave = (Button) findViewById(R.id.btriggerWifiSave);
bLoadWifiList = (Button) findViewById(R.id.bLoadWifiList); bLoadWifiList = (Button) findViewById(R.id.bLoadWifiList);
tvWifiTriggerNameLocationNotice = (TextView)findViewById(R.id.tvWifiTriggerNameLocationNotice);
tvWifiTriggerDisconnectionHint = (TextView)findViewById(R.id.tvWifiTriggerDisconnectionHint);
tvWifiTriggerDisconnectionHint.setVisibility(View.GONE);
wifiSpinnerAdapter = new ArrayAdapter<String>(this, R.layout.text_view_for_poi_listview_mediumtextsize, wifiList); wifiSpinnerAdapter = new ArrayAdapter<String>(this, R.layout.text_view_for_poi_listview_mediumtextsize, wifiList);
spinnerWifiList.setAdapter(wifiSpinnerAdapter); spinnerWifiList.setAdapter(wifiSpinnerAdapter);
spinnerWifiList.setEnabled(false); // bug in Android; this only works when done in code, not in xml spinnerWifiList.setEnabled(false); // bug in Android; this only works when done in code, not in xml
if(
Miscellaneous.getTargetSDK(Miscellaneous.getAnyContext()) >= 29
&&
!ActivityPermissions.isPermissionDeclaratedInManifest(Miscellaneous.getAnyContext(), Manifest.permission.ACCESS_BACKGROUND_LOCATION)
)
tvWifiTriggerNameLocationNotice.setVisibility(View.VISIBLE);
if (getIntent().hasExtra("edit")) if (getIntent().hasExtra("edit"))
{ {
boolean connected = getIntent().getBooleanExtra("wifiState", false); boolean connected = getIntent().getBooleanExtra("wifiState", false);
@ -89,7 +74,7 @@ public class ActivityManageTriggerWifi extends Activity
etTriggerWifiName.setText(wifiName); etTriggerWifiName.setText(wifiName);
} }
bTriggerWifiSave.setOnClickListener(new View.OnClickListener() btriggerWifiSave.setOnClickListener(new View.OnClickListener()
{ {
@Override @Override
public void onClick(View v) public void onClick(View v)
@ -108,11 +93,6 @@ public class ActivityManageTriggerWifi extends Activity
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
{ {
etTriggerWifiName.setText(wifiList.get(position)); etTriggerWifiName.setText(wifiList.get(position));
if(etTriggerWifiName.getText().toString().length() > 0 && rbTriggerWifiDisconnected.isChecked())
tvWifiTriggerDisconnectionHint.setVisibility(View.VISIBLE);
else
tvWifiTriggerDisconnectionHint.setVisibility(View.GONE);
} }
@Override @Override
@ -130,41 +110,6 @@ public class ActivityManageTriggerWifi extends Activity
loadWifis(); loadWifis();
} }
}); });
rbTriggerWifiDisconnected.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b)
{
if(etTriggerWifiName.getText().toString().length() > 0 && b)
tvWifiTriggerDisconnectionHint.setVisibility(View.VISIBLE);
else
tvWifiTriggerDisconnectionHint.setVisibility(View.GONE);
}
});
etTriggerWifiName.addTextChangedListener(new TextWatcher()
{
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2)
{
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2)
{
if(etTriggerWifiName.getText().toString().length() > 0 && rbTriggerWifiDisconnected.isChecked())
tvWifiTriggerDisconnectionHint.setVisibility(View.VISIBLE);
else
tvWifiTriggerDisconnectionHint.setVisibility(View.GONE);
}
@Override
public void afterTextChanged(Editable editable)
{
}
});
} }
public void loadWifis() public void loadWifis()

View File

@ -18,8 +18,6 @@ import android.os.Bundle;
import android.os.PowerManager; import android.os.PowerManager;
import android.provider.Settings; import android.provider.Settings;
import android.text.Html; import android.text.Html;
import android.text.TextUtils;
import android.text.util.Linkify;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
import android.widget.Button; import android.widget.Button;
@ -27,8 +25,6 @@ import android.widget.TextView;
import com.jens.automation2.receivers.NotificationListener; import com.jens.automation2.receivers.NotificationListener;
import org.w3c.dom.DOMImplementationSource;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
@ -51,16 +47,12 @@ public class ActivityPermissions extends Activity
private static final int requestCodeForPermissionsNotifications = 12046; private static final int requestCodeForPermissionsNotifications = 12046;
private static final int requestCodeForPermissionsDeviceAdmin = 12047; private static final int requestCodeForPermissionsDeviceAdmin = 12047;
private static final int requestCodeForPermissionsBatteryOptimization = 12048; private static final int requestCodeForPermissionsBatteryOptimization = 12048;
private static final int requestCodeForPermissionNotificationAccessAndroid13 = 12049;
private static final int requestCodeForPermissionsManageOverlay = 12050;
private static final int requestCodeForPermissionsAccessibility = 12051;
private static final int requestCodeForPermissionsScheduleExactAlarms = 12052;
protected String[] specificPermissionsToRequest = null; protected String[] specificPermissionsToRequest = null;
public static String intentExtraName = "permissionsToBeRequested"; public static String intentExtraName = "permissionsToBeRequested";
Button bCancelPermissions, bRequestPermissions; Button bCancelPermissions, bRequestPermissions;
TextView tvPermissionsExplanation, tvPermissionsExplanationSystemSettings, tvPermissionsExplanationLong, tvRestrictionPermissionsNotice; TextView tvPermissionsExplanation, tvPermissionsExplanationSystemSettings, tvPermissionsExplanationLong;
static ActivityPermissions instance = null; static ActivityPermissions instance = null;
public final static String permissionNameWireguard = "com.wireguard.android.permission.CONTROL_TUNNELS"; public final static String permissionNameWireguard = "com.wireguard.android.permission.CONTROL_TUNNELS";
@ -83,7 +75,6 @@ public class ActivityPermissions extends Activity
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
{ {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.permissions_activity); setContentView(R.layout.permissions_activity);
bCancelPermissions = (Button)findViewById(R.id.bCancelPermissions); bCancelPermissions = (Button)findViewById(R.id.bCancelPermissions);
@ -91,7 +82,6 @@ public class ActivityPermissions extends Activity
tvPermissionsExplanation = (TextView)findViewById(R.id.tvPermissionsExplanation); tvPermissionsExplanation = (TextView)findViewById(R.id.tvPermissionsExplanation);
tvPermissionsExplanationSystemSettings = (TextView)findViewById(R.id.tvPermissionsExplanationSystemSettings); tvPermissionsExplanationSystemSettings = (TextView)findViewById(R.id.tvPermissionsExplanationSystemSettings);
tvPermissionsExplanationLong = (TextView)findViewById(R.id.tvPermissionsExplanationLong); tvPermissionsExplanationLong = (TextView)findViewById(R.id.tvPermissionsExplanationLong);
tvRestrictionPermissionsNotice = (TextView)findViewById(R.id.tvRestrictionPermissionsNotice);
bCancelPermissions.setOnClickListener(new View.OnClickListener() bCancelPermissions.setOnClickListener(new View.OnClickListener()
{ {
@ -166,7 +156,7 @@ public class ActivityPermissions extends Activity
/* /*
Filter location permission and only name it once Filter location permission and only name it once
*/ */
if(s.equals(Manifest.permission.ACCESS_COARSE_LOCATION) || s.equals(Manifest.permission.ACCESS_FINE_LOCATION)) if(s.equals(Manifest.permission.ACCESS_COARSE_LOCATION) | s.equals(Manifest.permission.ACCESS_FINE_LOCATION))
{ {
if(!locationPermissionExplained) if(!locationPermissionExplained)
{ {
@ -258,17 +248,14 @@ public class ActivityPermissions extends Activity
if (!havePermission(s, context)) if (!havePermission(s, context))
return true; return true;
} }
else if((s.equalsIgnoreCase(Manifest.permission.CALL_PHONE) || s.equalsIgnoreCase(Manifest.permission.ANSWER_PHONE_CALLS)) && BuildConfig.FLAVOR.equalsIgnoreCase(AutomationService.flavor_name_googleplay))
{
return false;
}
else if(s.equalsIgnoreCase(Manifest.permission.ACTIVITY_RECOGNITION) || s.equalsIgnoreCase(permissionNameGoogleActivityDetection)) else if(s.equalsIgnoreCase(Manifest.permission.ACTIVITY_RECOGNITION) || s.equalsIgnoreCase(permissionNameGoogleActivityDetection))
{ {
if(!BuildConfig.FLAVOR.equalsIgnoreCase(AutomationService.flavor_name_fdroid)) if(!BuildConfig.FLAVOR.equalsIgnoreCase("fdroidFlavor"))
if (!havePermission(s, context)) if (!havePermission(s, context))
return true; return true;
} }
else if (!havePermission(s, context)) else
if (!havePermission(s, context))
return true; return true;
} }
} }
@ -306,14 +293,6 @@ public class ActivityPermissions extends Activity
String packageName = context.getApplicationContext().getPackageName(); String packageName = context.getApplicationContext().getPackageName();
return pm.isIgnoringBatteryOptimizations(packageName); return pm.isIgnoringBatteryOptimizations(packageName);
} }
else if (s.equals(Manifest.permission.SYSTEM_ALERT_WINDOW))
{
return android.provider.Settings.canDrawOverlays(Miscellaneous.getAnyContext());
}
else if(s.equals(Manifest.permission.BIND_ACCESSIBILITY_SERVICE))
{
return haveAccessibilityAccess(Miscellaneous.getAnyContext());
}
else else
{ {
int res = context.checkCallingOrSelfPermission(s); int res = context.checkCallingOrSelfPermission(s);
@ -332,59 +311,6 @@ public class ActivityPermissions extends Activity
return active; return active;
} }
public static boolean haveAccessibilityAccess(Context mContext)
{
int accessibilityEnabled = 0;
final String service = mContext.getPackageName() + "/" + BuildConfig.APPLICATION_ID + ".MyAccessibilityService";
boolean accessibilityFound = false;
try
{
accessibilityEnabled = Settings.Secure.getInt(mContext.getApplicationContext().getContentResolver(), Settings.Secure.ACCESSIBILITY_ENABLED);
// Log.v(TAG, "accessibilityEnabled = " + accessibilityEnabled);
}
catch (Settings.SettingNotFoundException e)
{
// Log.e(TAG, "Error finding setting, default accessibility to not found: " + e.getMessage());
}
TextUtils.SimpleStringSplitter mStringColonSplitter = new TextUtils.SimpleStringSplitter(':');
if (accessibilityEnabled == 1)
{
String settingValue = Settings.Secure.getString(mContext.getApplicationContext().getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
if (settingValue != null)
{
TextUtils.SimpleStringSplitter splitter = mStringColonSplitter;
splitter.setString(settingValue);
while (splitter.hasNext())
{
String accessibilityService = splitter.next();
if (accessibilityService.equalsIgnoreCase(service))
{
return true;
}
}
}
}
return accessibilityFound;
}
public static void requestOverlay()
{
Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
ActivityPermissions.getInstance().startActivityForResult(intent, requestCodeForPermissionsManageOverlay);
}
public static void requestBindAccessibilityService()
{
Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
ActivityPermissions.getInstance().startActivityForResult(intent, requestCodeForPermissionsAccessibility);
}
public static void requestDeviceAdmin() public static void requestDeviceAdmin()
{ {
if(!haveDeviceAdmin()) if(!haveDeviceAdmin())
@ -427,20 +353,11 @@ public class ActivityPermissions extends Activity
if(!havePermission(Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS, workingContext)) if(!havePermission(Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS, workingContext))
addToArrayListUnique(Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS, requiredPermissions); addToArrayListUnique(Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS, requiredPermissions);
if(Build.VERSION.SDK_INT >= 33 && BuildConfig.FLAVOR.equals(AutomationService.flavor_name_googleplay)) for(Profile p : Profile.getProfileCollection())
{ {
if (!havePermission(android.Manifest.permission.POST_NOTIFICATIONS, workingContext)) if(p.changeIncomingCallsRingtone || p.changeNotificationRingtone)
addToArrayListUnique(android.Manifest.permission.POST_NOTIFICATIONS, requiredPermissions);
}
if(!havePermission(Manifest.permission.READ_EXTERNAL_STORAGE, workingContext))
{
for (Profile p : Profile.getProfileCollection())
{
if (p.changeIncomingCallsRingtone || p.changeNotificationRingtone)
addToArrayListUnique(Manifest.permission.READ_EXTERNAL_STORAGE, requiredPermissions); addToArrayListUnique(Manifest.permission.READ_EXTERNAL_STORAGE, requiredPermissions);
} }
}
if (!onlyGeneral) if (!onlyGeneral)
{ {
@ -464,7 +381,7 @@ public class ActivityPermissions extends Activity
} }
else if (singlePermission.equalsIgnoreCase(Manifest.permission.ACTIVITY_RECOGNITION) || singlePermission.equalsIgnoreCase(permissionNameGoogleActivityDetection)) else if (singlePermission.equalsIgnoreCase(Manifest.permission.ACTIVITY_RECOGNITION) || singlePermission.equalsIgnoreCase(permissionNameGoogleActivityDetection))
{ {
if (!BuildConfig.FLAVOR.equalsIgnoreCase(AutomationService.flavor_name_fdroid)) if (!BuildConfig.FLAVOR.equalsIgnoreCase("fdroidFlavor"))
addToArrayListUnique(singlePermission, requiredPermissions); addToArrayListUnique(singlePermission, requiredPermissions);
} }
else else
@ -473,6 +390,27 @@ public class ActivityPermissions extends Activity
} }
} }
} }
/*
Not all permissions need to be asked for.
*/
/*if(shouldShowRequestPermissionRationale("android.permission.RECORD_AUDIO"))
Toast.makeText(ActivityMainScreen.this, "shouldShowRequestPermissionRationale", Toast.LENGTH_LONG).show();
else
Toast.makeText(ActivityMainScreen.this, "not shouldShowRequestPermissionRationale", Toast.LENGTH_LONG).show();*/
// addToArrayListUnique("Manifest.permission.RECORD_AUDIO", requiredPermissions);
/*int hasPermission = checkSelfPermission(Manifest.permission.RECORD_AUDIO);
if (hasPermission == PackageManager.PERMISSION_DENIED)
{
Toast.makeText(ActivityMainScreen.this, "Don't have record_audio. Requesting...", Toast.LENGTH_LONG).show();
// requestPermissions(new String[]{"Manifest.permission.CAMERA"}, requestCodeForPermissions);
ActivityCompat.requestPermissions(ActivityMainScreen.this, new String[]{"Manifest.permission.CAMERA"}, requestCodeForPermissions);
}
else
Toast.makeText(ActivityMainScreen.this, "Have record_audio.", Toast.LENGTH_LONG).show();*/
} }
return requiredPermissions.toArray(new String[requiredPermissions.size()]); return requiredPermissions.toArray(new String[requiredPermissions.size()]);
@ -501,7 +439,6 @@ public class ActivityPermissions extends Activity
{ {
case activityDetection: case activityDetection:
addToArrayListUnique(permissionNameGoogleActivityDetection, requiredPermissions); addToArrayListUnique(permissionNameGoogleActivityDetection, requiredPermissions);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
addToArrayListUnique(Manifest.permission.ACTIVITY_RECOGNITION, requiredPermissions); addToArrayListUnique(Manifest.permission.ACTIVITY_RECOGNITION, requiredPermissions);
break; break;
case airplaneMode: case airplaneMode:
@ -532,7 +469,6 @@ public class ActivityPermissions extends Activity
case phoneCall: case phoneCall:
addToArrayListUnique(Manifest.permission.READ_PHONE_STATE, requiredPermissions); addToArrayListUnique(Manifest.permission.READ_PHONE_STATE, requiredPermissions);
addToArrayListUnique(Manifest.permission.PROCESS_OUTGOING_CALLS, requiredPermissions); addToArrayListUnique(Manifest.permission.PROCESS_OUTGOING_CALLS, requiredPermissions);
addToArrayListUnique(Manifest.permission.READ_CALL_LOG, requiredPermissions);
break; break;
case pointOfInterest: case pointOfInterest:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
@ -565,8 +501,6 @@ public class ActivityPermissions extends Activity
addToArrayListUnique(Manifest.permission.INTERNET, requiredPermissions); addToArrayListUnique(Manifest.permission.INTERNET, requiredPermissions);
break; break;
case timeFrame: case timeFrame:
if(Build.VERSION.SDK_INT >= 31 && Miscellaneous.getTargetSDK(Miscellaneous.getAnyContext()) >= 31)
addToArrayListUnique(Manifest.permission.SCHEDULE_EXACT_ALARM, requiredPermissions);
break; break;
case usb_host_connection: case usb_host_connection:
addToArrayListUnique(Manifest.permission.READ_PHONE_STATE, requiredPermissions); addToArrayListUnique(Manifest.permission.READ_PHONE_STATE, requiredPermissions);
@ -575,25 +509,10 @@ public class ActivityPermissions extends Activity
case wifiConnection: case wifiConnection:
addToArrayListUnique(Manifest.permission.ACCESS_NETWORK_STATE, requiredPermissions); addToArrayListUnique(Manifest.permission.ACCESS_NETWORK_STATE, requiredPermissions);
addToArrayListUnique(Manifest.permission.ACCESS_WIFI_STATE, requiredPermissions); addToArrayListUnique(Manifest.permission.ACCESS_WIFI_STATE, requiredPermissions);
if(
(
Miscellaneous.getTargetSDK(Miscellaneous.getAnyContext()) >= 29
&&
isPermissionDeclaratedInManifest(Miscellaneous.getAnyContext(), Manifest.permission.ACCESS_BACKGROUND_LOCATION)
)
||
Build.VERSION.SDK_INT >= 33
)
addToArrayListUnique(Manifest.permission.ACCESS_BACKGROUND_LOCATION, requiredPermissions);
break; break;
case notification: case notification:
addToArrayListUnique(Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE, requiredPermissions); addToArrayListUnique(Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE, requiredPermissions);
break; break;
case calendarEvent:
addToArrayListUnique(Manifest.permission.READ_CALENDAR, requiredPermissions);
if(Build.VERSION.SDK_INT >= 31 && Miscellaneous.getTargetSDK(Miscellaneous.getAnyContext()) >= 31)
addToArrayListUnique(Manifest.permission.SCHEDULE_EXACT_ALARM, requiredPermissions);
break;
default: default:
break; break;
} }
@ -701,19 +620,6 @@ public class ActivityPermissions extends Activity
// action.getParameter2().contains("eu.faircode.netguard.STOP_PORT_FORWARD") // action.getParameter2().contains("eu.faircode.netguard.STOP_PORT_FORWARD")
// ) // )
// addToArrayListUnique("net.kollnig.missioncontrol.permission.ADMIN", requiredPermissions); // addToArrayListUnique("net.kollnig.missioncontrol.permission.ADMIN", requiredPermissions);
if(Build.VERSION.SDK_INT >= 29)
{
String parts[];
if(action.getParameter2().contains(Action.actionParameter2Split))
parts = action.getParameter2().split(Action.actionParameter2Split);
else
parts = action.getParameter2().split(";");
// Permission only required for starts of activity, not broadcasts or services
if(parts[2].equals(ActivityManageActionStartActivity.startByActivityString))
addToArrayListUnique(Manifest.permission.SYSTEM_ALERT_WINDOW, requiredPermissions);
}
break; break;
case triggerUrl: case triggerUrl:
addToArrayListUnique(Manifest.permission.INTERNET, requiredPermissions); addToArrayListUnique(Manifest.permission.INTERNET, requiredPermissions);
@ -767,19 +673,6 @@ public class ActivityPermissions extends Activity
else else
addToArrayListUnique(Manifest.permission.BIND_DEVICE_ADMIN, requiredPermissions); addToArrayListUnique(Manifest.permission.BIND_DEVICE_ADMIN, requiredPermissions);
break; break;
case startPhoneCall:
addToArrayListUnique(Manifest.permission.CALL_PHONE, requiredPermissions);
addToArrayListUnique(Manifest.permission.SYSTEM_ALERT_WINDOW, requiredPermissions);
break;
case stopPhoneCall:
addToArrayListUnique(Manifest.permission.ANSWER_PHONE_CALLS, requiredPermissions);
break;
case takeScreenshot:
addToArrayListUnique(Manifest.permission.BIND_ACCESSIBILITY_SERVICE, requiredPermissions);
break;
case setLocationService:
addToArrayListUnique(Manifest.permission.WRITE_SECURE_SETTINGS, requiredPermissions);
break;
default: default:
break; break;
} }
@ -842,19 +735,14 @@ public class ActivityPermissions extends Activity
case Manifest.permission.WRITE_EXTERNAL_STORAGE: case Manifest.permission.WRITE_EXTERNAL_STORAGE:
usingElements.add(getResources().getString(R.string.storeSettings)); usingElements.add(getResources().getString(R.string.storeSettings));
break; break;
case Manifest.permission.SCHEDULE_EXACT_ALARM:
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.timeFrame))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.calendarEvent))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break;
case Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE: case Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE:
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.notification)) for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.notification))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName)); usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesUsing(Action.Action_Enum.closeNotification))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break; break;
case permissionNameGoogleActivityDetection: case permissionNameGoogleActivityDetection:
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.activityDetection))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break;
case Manifest.permission.ACTIVITY_RECOGNITION: case Manifest.permission.ACTIVITY_RECOGNITION:
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.activityDetection)) for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.activityDetection))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName)); usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
@ -869,7 +757,6 @@ public class ActivityPermissions extends Activity
break; break;
case Manifest.permission.ACCESS_BACKGROUND_LOCATION: case Manifest.permission.ACCESS_BACKGROUND_LOCATION:
usingElements.add(getResources().getString(R.string.googleLocationChicanery)); usingElements.add(getResources().getString(R.string.googleLocationChicanery));
usingElements.add(getResources().getString(R.string.wifiMonitoringAlsoRequiresThis));
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.pointOfInterest)) for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.pointOfInterest))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName)); usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.speed)) for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.speed))
@ -954,7 +841,6 @@ public class ActivityPermissions extends Activity
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName)); usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break; break;
case Manifest.permission.PROCESS_OUTGOING_CALLS: case Manifest.permission.PROCESS_OUTGOING_CALLS:
case Manifest.permission.READ_CALL_LOG:
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.phoneCall)) for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.phoneCall))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName)); usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break; break;
@ -978,20 +864,6 @@ public class ActivityPermissions extends Activity
for(String ruleName : getRulesUsing(Action.Action_Enum.sendTextMessage)) for(String ruleName : getRulesUsing(Action.Action_Enum.sendTextMessage))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName)); usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break; break;
case Manifest.permission.CALL_PHONE:
for(String ruleName : getRulesUsing(Action.Action_Enum.startPhoneCall))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break;
case Manifest.permission.SYSTEM_ALERT_WINDOW:
for(String ruleName : getRulesUsing(Action.Action_Enum.startOtherActivity))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesUsing(Action.Action_Enum.startPhoneCall))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break;
case Manifest.permission.ANSWER_PHONE_CALLS:
for(String ruleName : getRulesUsing(Action.Action_Enum.stopPhoneCall))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break;
case Manifest.permission.FOREGROUND_SERVICE: case Manifest.permission.FOREGROUND_SERVICE:
usingElements.add(getResources().getString(R.string.startAutomationAsService)); usingElements.add(getResources().getString(R.string.startAutomationAsService));
break; break;
@ -1035,18 +907,6 @@ public class ActivityPermissions extends Activity
case Manifest.permission.QUERY_ALL_PACKAGES: case Manifest.permission.QUERY_ALL_PACKAGES:
usingElements.add(getResources().getString(R.string.queryAllPackages)); usingElements.add(getResources().getString(R.string.queryAllPackages));
break; break;
case Manifest.permission.BIND_ACCESSIBILITY_SERVICE:
for(String ruleName : getRulesUsing(Action.Action_Enum.takeScreenshot))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break;
case Manifest.permission.WRITE_SECURE_SETTINGS:
for(String ruleName : getRulesUsing(Action.Action_Enum.setLocationService))
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;
} }
return usingElements; return usingElements;
@ -1055,15 +915,6 @@ public class ActivityPermissions extends Activity
@Override @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) protected void onActivityResult(int requestCode, int resultCode, Intent data)
{ {
/*
All of the following permissions need to be "manually" activated by the user in some
buried system menu.
In my opinion by mistake the function will be called when the user has just landed
on one of those screens, not when he exits it again. To compensate for that onResume()
is overridden. This enables the permission screen to automatically close after all
required permissions have been granted.
*/
super.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
@ -1107,18 +958,6 @@ public class ActivityPermissions extends Activity
if (requestCode == requestCodeForPermissionsBatteryOptimization) if (requestCode == requestCodeForPermissionsBatteryOptimization)
if(havePermission(Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS, ActivityPermissions.this)) if(havePermission(Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS, ActivityPermissions.this))
requestPermissions(cachedPermissionsToRequest, true); requestPermissions(cachedPermissionsToRequest, true);
if (requestCode == requestCodeForPermissionsManageOverlay)
if(havePermission(Manifest.permission.SYSTEM_ALERT_WINDOW, ActivityPermissions.this))
requestPermissions(cachedPermissionsToRequest, true);
if (requestCode == requestCodeForPermissionsAccessibility)
if(havePermission(Manifest.permission.BIND_ACCESSIBILITY_SERVICE, ActivityPermissions.this))
requestPermissions(cachedPermissionsToRequest, true);
if (requestCode == requestCodeForPermissionsScheduleExactAlarms)
if(havePermission(Manifest.permission.SCHEDULE_EXACT_ALARM, ActivityPermissions.this))
requestPermissions(cachedPermissionsToRequest, true);
} }
} }
@ -1169,7 +1008,7 @@ public class ActivityPermissions extends Activity
startActivityForResult(intent, requestCodeForPermissionsWriteSettings); startActivityForResult(intent, requestCodeForPermissionsWriteSettings);
return; return;
} }
else if (s.equalsIgnoreCase(Manifest.permission.BIND_DEVICE_ADMIN)) if (s.equalsIgnoreCase(Manifest.permission.BIND_DEVICE_ADMIN))
{ {
requiredPermissions.remove(s); requiredPermissions.remove(s);
cachedPermissionsToRequest = requiredPermissions; cachedPermissionsToRequest = requiredPermissions;
@ -1178,88 +1017,18 @@ public class ActivityPermissions extends Activity
} }
else if (s.equalsIgnoreCase(Manifest.permission.ACCESS_NOTIFICATION_POLICY)) else if (s.equalsIgnoreCase(Manifest.permission.ACCESS_NOTIFICATION_POLICY))
{ {
if(BuildConfig.FLAVOR.equals(AutomationService.flavor_name_apk))
Miscellaneous.messageBox(getResources().getString(R.string.info), getResources().getString(R.string.noticeRestrictedPermissions), ActivityPermissions.this).show();
requiredPermissions.remove(s); requiredPermissions.remove(s);
cachedPermissionsToRequest = requiredPermissions; cachedPermissionsToRequest = requiredPermissions;
Intent intent = new Intent(android.provider.Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS); Intent intent = new Intent(android.provider.Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
startActivityForResult(intent, requestCodeForPermissionsNotificationPolicy); startActivityForResult(intent, requestCodeForPermissionsNotificationPolicy);
return;
}
else if (s.equalsIgnoreCase(Manifest.permission.SYSTEM_ALERT_WINDOW))
{
AlertDialog diag = Miscellaneous.messageBox(getResources().getString(R.string.info), getResources().getString(R.string.overlayPermissionHint), ActivityPermissions.this);
diag.setOnDismissListener(new DialogInterface.OnDismissListener()
{
@Override
public void onDismiss(DialogInterface dialogInterface)
{
requiredPermissions.remove(s);
cachedPermissionsToRequest = requiredPermissions;
requestOverlay();
}
});
diag.show();
return;
}
else if (s.equalsIgnoreCase(Manifest.permission.BIND_ACCESSIBILITY_SERVICE))
{
AlertDialog diag = Miscellaneous.messageBox(getResources().getString(R.string.info), getResources().getString(R.string.accessibilityApiPermissionHint), ActivityPermissions.this);
diag.setOnDismissListener(new DialogInterface.OnDismissListener()
{
@Override
public void onDismiss(DialogInterface dialogInterface)
{
requiredPermissions.remove(s);
cachedPermissionsToRequest = requiredPermissions;
requestBindAccessibilityService();
}
});
diag.show();
return; return;
} }
else if (s.equalsIgnoreCase(Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE)) else if (s.equalsIgnoreCase(Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE))
{
if(Build.VERSION.SDK_INT >= 33)
{
AlertDialog dialog = Miscellaneous.messageBox(getResources().getString(R.string.info), getResources().getString(R.string.notificationAccessAndroid13), ActivityPermissions.this);
dialog.setOnDismissListener(new DialogInterface.OnDismissListener()
{
@Override
public void onDismiss(DialogInterface dialogInterface)
{ {
requiredPermissions.remove(s); requiredPermissions.remove(s);
cachedPermissionsToRequest = requiredPermissions; cachedPermissionsToRequest = requiredPermissions;
requestNotificationAccess(); Intent intent = new Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS);
} startActivityForResult(intent, requestCodeForPermissionsNotifications);
});
dialog.show();
}
else
{
requiredPermissions.remove(s);
cachedPermissionsToRequest = requiredPermissions;
requestNotificationAccess();
}
return;
}
else if (s.equalsIgnoreCase(Manifest.permission.SCHEDULE_EXACT_ALARM))
{
AlertDialog diag = Miscellaneous.messageBox(getResources().getString(R.string.info), getResources().getString(R.string.alarmsPermissionHint), ActivityPermissions.this);
diag.setOnDismissListener(new DialogInterface.OnDismissListener()
{
@Override
public void onDismiss(DialogInterface dialogInterface)
{
requiredPermissions.remove(s);
cachedPermissionsToRequest = requiredPermissions;
requestScheduleExactAlarms();
}
});
diag.show();
return; return;
} }
else if(s.equals(Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)) else if(s.equals(Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS))
@ -1291,13 +1060,6 @@ public class ActivityPermissions extends Activity
return; return;
} }
else if(s.equalsIgnoreCase(Manifest.permission.WRITE_SECURE_SETTINGS))
{
AlertDialog diaglog = Miscellaneous.messageBox(getResources().getString(R.string.info), getResources().getString(R.string.writeSecureSettingsNotice), ActivityPermissions.this);
diaglog.show();
Linkify.addLinks((TextView) diaglog.findViewById(android.R.id.message), Linkify.ALL);
// return;
}
} }
} }
@ -1341,20 +1103,6 @@ public class ActivityPermissions extends Activity
} }
} }
void requestNotificationAccess()
{
Intent intent = new Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS);
startActivityForResult(intent, requestCodeForPermissionsNotifications);
}
void requestScheduleExactAlarms()
{
Intent intent = new Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM);
startActivityForResult(intent, requestCodeForPermissionsScheduleExactAlarms);
}
protected void applyChanges() protected void applyChanges()
{ {
AutomationService service = AutomationService.getInstance(); AutomationService service = AutomationService.getInstance();
@ -1733,47 +1481,4 @@ public class ActivityPermissions extends Activity
return false; return false;
} }
} }
@Override
protected void onResume()
{
super.onResume();
if(Build.VERSION.SDK_INT >= 33 && BuildConfig.FLAVOR.equals(AutomationService.flavor_name_apk))
{
for (String p : getRequiredPermissions(false))
{
if (p.equals(Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE) || p.equals(Manifest.permission.BIND_ACCESSIBILITY_SERVICE))
{
tvRestrictionPermissionsNotice.setText(getResources().getString(R.string.noticeRestrictedPermissions));
/*
Opening the app's settings directly does not work because the
mentioned 3 dots are only displayed when you went there the hard way.
*/
/*
tvRestrictionPermissionsNotice.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivity(intent);
}
})*/;
break;
}
}
}
for(String p : getRequiredPermissions(false))
{
if(!havePermission(p, this))
return;
}
// have all
setHaveAllPermissions();
}
} }

View File

@ -16,20 +16,12 @@ public class ActivitySettings extends PreferenceActivity
protected void onCreate(Bundle savedInstanceState) protected void onCreate(Bundle savedInstanceState)
{ {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
addPreferencesFromResource(layout.activity_settings); addPreferencesFromResource(layout.activity_settings);
if(BuildConfig.FLAVOR.equals(AutomationService.flavor_name_apk)) if(BuildConfig.FLAVOR.equals("apkFlavor"))
{ {
chkPrefUpdateCheck = (CheckBoxPreference) findPreference("automaticUpdateCheck"); chkPrefUpdateCheck = (CheckBoxPreference) findPreference("automaticUpdateCheck");
chkPrefUpdateCheck.setEnabled(true); chkPrefUpdateCheck.setEnabled(true);
} }
} }
@Override
protected void onResume()
{
super.onResume();
Miscellaneous.setDisplayLanguage(this);
}
} }

View File

@ -30,7 +30,6 @@ public class ActivityVolumeTest extends Activity
instance = this; instance = this;
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Miscellaneous.setDisplayLanguage(this);
setContentView(R.layout.activity_volume_calibration); setContentView(R.layout.activity_volume_calibration);
tvCurrentVolume = (TextView)findViewById(R.id.tvCurrentVolume); tvCurrentVolume = (TextView)findViewById(R.id.tvCurrentVolume);
@ -49,15 +48,20 @@ public class ActivityVolumeTest extends Activity
@Override @Override
public void onStopTrackingTouch(SeekBar seekBar) public void onStopTrackingTouch(SeekBar seekBar)
{ {
// TODO Auto-generated method stub
} }
@Override @Override
public void onStartTrackingTouch(SeekBar seekBar) public void onStartTrackingTouch(SeekBar seekBar)
{ {
// TODO Auto-generated method stub
} }
@Override @Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser)
{ {
etReferenceValue.setText(String.valueOf(sbReferenceValue.getProgress())); etReferenceValue.setText(String.valueOf(sbReferenceValue.getProgress()));
} }

View File

@ -4,6 +4,7 @@ import android.content.Context;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.util.Log; import android.util.Log;
import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
public class AsyncTasks public class AsyncTasks
@ -22,7 +23,7 @@ public class AsyncTasks
try try
{ {
String result = Miscellaneous.downloadURL("https://server47.de/automation/?action=getLatestVersionCode", null, null, ActivityManageActionTriggerUrl.methodGet, null).trim(); String result = Miscellaneous.downloadURL("https://server47.de/automation/?action=getLatestVersionCode", null, null).trim();
int latestVersion = Integer.parseInt(result); int latestVersion = Integer.parseInt(result);
// At this point the update check itself has already been successful. // At this point the update check itself has already been successful.

View File

@ -28,29 +28,21 @@ import androidx.core.app.NotificationManagerCompat;
import com.jens.automation2.Trigger.Trigger_Enum; import com.jens.automation2.Trigger.Trigger_Enum;
import com.jens.automation2.location.LocationProvider; import com.jens.automation2.location.LocationProvider;
import com.jens.automation2.receivers.CalendarReceiver;
import com.jens.automation2.receivers.DateTimeListener; import com.jens.automation2.receivers.DateTimeListener;
import com.jens.automation2.receivers.PackageReplacedReceiver; import com.jens.automation2.receivers.PackageReplacedReceiver;
import com.jens.automation2.receivers.PhoneStatusListener; import com.jens.automation2.receivers.PhoneStatusListener;
import java.util.Calendar; import java.util.Calendar;
import java.util.HashMap; import java.util.Set;
import java.util.Locale;
import java.util.Map;
@SuppressLint("NewApi") @SuppressLint("NewApi")
public class AutomationService extends Service implements OnInitListener public class AutomationService extends Service implements OnInitListener
{ {
protected TextToSpeech ttsEngine = null; protected TextToSpeech ttsEngine = null;
protected int ttsStatus = -1;
protected final static int notificationId = 1000; protected final static int notificationId = 1000;
protected final static int notificationIdRestrictions = 1005; protected final static int notificationIdRestrictions = 1005;
protected final static int notificationIdLocationRestriction = 1006; protected final static int notificationIdLocationRestriction = 1006;
public static final String flavor_name_apk = "apkFlavor";
public static final String flavor_name_fdroid = "fdroidFlavor";
public static final String flavor_name_googleplay = "googlePlayFlavor";
final static String NOTIFICATION_CHANNEL_ID_SERVICE = "com.jens.automation2_service"; final static String NOTIFICATION_CHANNEL_ID_SERVICE = "com.jens.automation2_service";
final static String NOTIFICATION_CHANNEL_NAME_SERVICE = "Service notification"; final static String NOTIFICATION_CHANNEL_NAME_SERVICE = "Service notification";
@ -67,8 +59,6 @@ public class AutomationService extends Service implements OnInitListener
protected Calendar lockSoundChangesEnd = null; protected Calendar lockSoundChangesEnd = null;
protected boolean isRunning; protected boolean isRunning;
Map<String,String> variableMap = new HashMap();
protected static AutomationService centralInstance = null; protected static AutomationService centralInstance = null;
public void nullLockSoundChangesEnd() public void nullLockSoundChangesEnd()
@ -99,11 +89,6 @@ public class AutomationService extends Service implements OnInitListener
this.lockSoundChangesEnd = lockSoundChangesEnd; this.lockSoundChangesEnd = lockSoundChangesEnd;
} }
public int getTtsStatus()
{
return ttsStatus;
}
protected final IBinder myBinder = new LocalBinder(); protected final IBinder myBinder = new LocalBinder();
protected LocationProvider myLocationProvider; protected LocationProvider myLocationProvider;
@ -127,19 +112,6 @@ public class AutomationService extends Service implements OnInitListener
// Store a reference to myself. Other classes often need a context or something, this can provide that. // Store a reference to myself. Other classes often need a context or something, this can provide that.
centralInstance = this; centralInstance = this;
/*
This has been reported to throw a NullPointerException under
rare circumstances. The root cause remains unknown.
*/
try
{
Miscellaneous.setDisplayLanguage(AutomationService.this);
}
catch(NullPointerException e)
{
Miscellaneous.logEvent("e", "setDisplayLanguage()", Log.getStackTraceString(e), 3);
}
} }
public boolean checkStartupRequirements(Context context, boolean startAtBoot) public boolean checkStartupRequirements(Context context, boolean startAtBoot)
@ -235,9 +207,6 @@ public class AutomationService extends Service implements OnInitListener
startUpRoutine(); startUpRoutine();
Intent myIntent = new Intent(this, ActivityMainTabLayout.class); Intent myIntent = new Intent(this, ActivityMainTabLayout.class);
if(getApplicationContext().getApplicationInfo().targetSdkVersion >= 31)
myPendingIntent = PendingIntent.getActivity(this, 0, myIntent, PendingIntent.FLAG_MUTABLE);
else
myPendingIntent = PendingIntent.getActivity(this, 0, myIntent, 0); myPendingIntent = PendingIntent.getActivity(this, 0, myIntent, 0);
notificationBuilder = createServiceNotificationBuilder(); notificationBuilder = createServiceNotificationBuilder();
@ -249,7 +218,6 @@ public class AutomationService extends Service implements OnInitListener
this.isRunning = true; this.isRunning = true;
Miscellaneous.logEvent("i", "Service", this.getResources().getString(R.string.serviceStarted) + " VERSION_CODE: " + BuildConfig.VERSION_CODE + ", VERSION_NAME: " + BuildConfig.VERSION_NAME + ", flavor: " + BuildConfig.FLAVOR, 1); Miscellaneous.logEvent("i", "Service", this.getResources().getString(R.string.serviceStarted) + " VERSION_CODE: " + BuildConfig.VERSION_CODE + ", VERSION_NAME: " + BuildConfig.VERSION_NAME + ", flavor: " + BuildConfig.FLAVOR, 1);
if(Settings.showToasts)
Toast.makeText(this, this.getResources().getString(R.string.serviceStarted), Toast.LENGTH_LONG).show(); Toast.makeText(this, this.getResources().getString(R.string.serviceStarted), Toast.LENGTH_LONG).show();
/* /*
@ -320,10 +288,7 @@ public class AutomationService extends Service implements OnInitListener
ReceiverCoordinator.applySettingsAndRules(); ReceiverCoordinator.applySettingsAndRules();
DateTimeListener.setOrResetAlarms(); DateTimeListener.reloadAlarms();
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.calendarEvent) && ActivityPermissions.isPermissionDeclaratedInManifest(AutomationService.getInstance(), Manifest.permission.READ_CALENDAR) && ActivityPermissions.havePermission(Manifest.permission.READ_CALENDAR, AutomationService.getInstance()))
CalendarReceiver.armOrRearmTimer();
} }
@Override @Override
@ -333,7 +298,6 @@ public class AutomationService extends Service implements OnInitListener
stopRoutine(); stopRoutine();
this.isRunning = false; this.isRunning = false;
if(Settings.showToasts)
Toast.makeText(this, getResources().getString(R.string.serviceStopped), Toast.LENGTH_LONG).show(); Toast.makeText(this, getResources().getString(R.string.serviceStopped), Toast.LENGTH_LONG).show();
Miscellaneous.logEvent("i", "Service", getResources().getString(R.string.serviceStopped), 1); Miscellaneous.logEvent("i", "Service", getResources().getString(R.string.serviceStopped), 1);
} }
@ -343,26 +307,8 @@ public class AutomationService extends Service implements OnInitListener
if (Settings.useTextToSpeechOnNormal || Settings.useTextToSpeechOnSilent || Settings.useTextToSpeechOnVibrate || Rule.isAnyRuleUsing(Action.Action_Enum.speakText)) if (Settings.useTextToSpeechOnNormal || Settings.useTextToSpeechOnSilent || Settings.useTextToSpeechOnVibrate || Rule.isAnyRuleUsing(Action.Action_Enum.speakText))
{ {
if (ttsEngine == null) if (ttsEngine == null)
{ ttsEngine = new TextToSpeech(this, this);
ttsEngine = new TextToSpeech(this, new TextToSpeech.OnInitListener() } else
{
@Override
public void onInit(int status)
{
ttsStatus = status;
if (status == TextToSpeech.SUCCESS)
{
ttsEngine.setLanguage(Locale.getDefault());
Miscellaneous.logEvent("i", "TTS engine", "TTS engine available.", 3);
}
else
Miscellaneous.logEvent("i", "TTS engine", "TTS engine not available. Status: " + String.valueOf(status), 3);
}
});
}
}
else
{ {
if (ttsEngine != null) if (ttsEngine != null)
ttsEngine.shutdown(); ttsEngine.shutdown();
@ -507,10 +453,6 @@ public class AutomationService extends Service implements OnInitListener
private void stopRoutine() private void stopRoutine()
{ {
Miscellaneous.logEvent("i", "Service", "Stopping service...", 3); Miscellaneous.logEvent("i", "Service", "Stopping service...", 3);
// Clear variables for trigger/action with same name
variableMap.clear();
try try
{ {
myLocationProvider.stopLocationService(); myLocationProvider.stopLocationService();
@ -527,7 +469,6 @@ public class AutomationService extends Service implements OnInitListener
PackageReplacedReceiver.setHasServiceBeenRunning(false, this); PackageReplacedReceiver.setHasServiceBeenRunning(false, this);
centralInstance = null; centralInstance = null;
Settings.serviceStartDone = false;
} }
protected static Builder createDefaultNotificationBuilderOld() protected static Builder createDefaultNotificationBuilderOld()
@ -536,12 +477,7 @@ public class AutomationService extends Service implements OnInitListener
builder.setContentTitle("Automation"); builder.setContentTitle("Automation");
if(Settings.showIconWhenServiceIsRunning) if(Settings.showIconWhenServiceIsRunning)
{
if(BuildConfig.FLAVOR.equalsIgnoreCase(AutomationService.flavor_name_googleplay))
builder.setSmallIcon(R.drawable.crane);
else
builder.setSmallIcon(R.drawable.ic_launcher); builder.setSmallIcon(R.drawable.ic_launcher);
}
builder.setCategory(Notification.CATEGORY_SERVICE); builder.setCategory(Notification.CATEGORY_SERVICE);
builder.setWhen(System.currentTimeMillis()); builder.setWhen(System.currentTimeMillis());
@ -549,7 +485,7 @@ public class AutomationService extends Service implements OnInitListener
Notification defaultNotification = builder.build(); Notification defaultNotification = builder.build();
defaultNotification.icon = R.drawable.crane; defaultNotification.icon = R.drawable.ic_launcher;
defaultNotification.when = System.currentTimeMillis(); defaultNotification.when = System.currentTimeMillis();
// defaultNotification.defaults |= Notification.DEFAULT_VIBRATE; // defaultNotification.defaults |= Notification.DEFAULT_VIBRATE;
@ -596,12 +532,7 @@ public class AutomationService extends Service implements OnInitListener
builder.setOnlyAlertOnce(true); builder.setOnlyAlertOnce(true);
if(Settings.showIconWhenServiceIsRunning) if(Settings.showIconWhenServiceIsRunning)
{
if (BuildConfig.FLAVOR.equals(AutomationService.flavor_name_googleplay))
builder.setSmallIcon(R.drawable.crane);
else
builder.setSmallIcon(R.drawable.ic_launcher); builder.setSmallIcon(R.drawable.ic_launcher);
}
// builder.setContentText(textToDisplay); // builder.setContentText(textToDisplay);
// builder.setSmallIcon(icon); // builder.setSmallIcon(icon);
@ -694,6 +625,8 @@ public class AutomationService extends Service implements OnInitListener
@Override @Override
public void onInit(int status) public void onInit(int status)
{ {
// TODO Auto-generated method stub
} }
/** /**
@ -725,26 +658,25 @@ public class AutomationService extends Service implements OnInitListener
{ {
try try
{ {
for(int i = 0; i < 60; i++) for(int i = 0; i < 5; i++)
{ {
if(ttsEngine == null || ttsStatus != TextToSpeech.SUCCESS) if(ttsEngine != null)
{
break;
}
else
{ {
try try
{ {
Miscellaneous.logEvent("i", "TTS", "Waiting for a moment to give the TTS service time to load...", 4); Miscellaneous.logEvent("i", "TTS", "Waiting for a moment to give the TTS service time to load...", 4);
Thread.sleep(500); // give the tts engine time to load Thread.sleep(1000); // give the tts engine time to load
} }
catch(Exception e) catch(Exception e)
{} {}
} }
else }
{ Miscellaneous.logEvent("i", "TextToSpeech", "Speaking " + text + " in language " + ttsEngine.getLanguage().toLanguageTag(), 3);
Miscellaneous.logEvent("i", "TextToSpeech", "Speaking \"" + text + "\" in language " + ttsEngine.getLanguage().toLanguageTag(), 3);
this.ttsEngine.speak(text, TextToSpeech.QUEUE_ADD, null); this.ttsEngine.speak(text, TextToSpeech.QUEUE_ADD, null);
break;
}
}
Miscellaneous.logEvent("i", "TextToSpeech", "TTS engine not available after waiting 30 seconds, yet. Aborting.", 3);
} }
catch(Exception e) catch(Exception e)
{ {
@ -755,11 +687,6 @@ public class AutomationService extends Service implements OnInitListener
} }
} }
public Map<String, String> getVariableMap()
{
return variableMap;
}
public static boolean isMainActivityRunning(Context context) public static boolean isMainActivityRunning(Context context)
{ {
if(ActivityMainScreen.getActivityMainScreenInstance() == null) if(ActivityMainScreen.getActivityMainScreenInstance() == null)

View File

@ -15,7 +15,6 @@ import android.content.Intent;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.content.res.Resources;
import android.database.Cursor; import android.database.Cursor;
import android.media.AudioAttributes; import android.media.AudioAttributes;
import android.media.RingtoneManager; import android.media.RingtoneManager;
@ -32,27 +31,20 @@ import android.provider.Settings.Secure;
import android.telephony.PhoneNumberUtils; import android.telephony.PhoneNumberUtils;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.util.Base64; import android.util.Base64;
import android.util.DisplayMetrics;
import android.util.Log; import android.util.Log;
import android.widget.Toast; import android.widget.Toast;
import com.jens.automation2.location.LocationProvider; import com.jens.automation2.location.LocationProvider;
import com.jens.automation2.receivers.CalendarReceiver;
import com.jens.automation2.receivers.NotificationListener; import com.jens.automation2.receivers.NotificationListener;
import com.jens.automation2.receivers.PhoneStatusListener; import com.jens.automation2.receivers.PhoneStatusListener;
import org.apache.http.HttpEntity; import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse; import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion; import org.apache.http.HttpVersion;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient; import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.conn.ssl.SSLSocketFactory; import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.BasicHttpParams; import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpParams; import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams; import org.apache.http.params.HttpProtocolParams;
@ -75,9 +67,7 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.io.OutputStream; import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.StringReader; import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.lang.Thread.UncaughtExceptionHandler; import java.lang.Thread.UncaughtExceptionHandler;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
@ -85,8 +75,6 @@ import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.net.HttpURLConnection; import java.net.HttpURLConnection;
import java.net.URL; import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.DigestInputStream; import java.security.DigestInputStream;
import java.security.KeyManagementException; import java.security.KeyManagementException;
import java.security.KeyStore; import java.security.KeyStore;
@ -94,6 +82,7 @@ import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException; import java.security.cert.CertificateException;
import java.security.cert.X509Certificate; import java.security.cert.X509Certificate;
import java.sql.Time;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
@ -101,8 +90,8 @@ import java.util.Calendar;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map;
import java.util.Scanner; import java.util.Scanner;
import java.util.Set;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream; import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream; import java.util.zip.ZipOutputStream;
@ -121,16 +110,12 @@ import androidx.annotation.RequiresApi;
import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationCompat;
import androidx.documentfile.provider.DocumentFile; import androidx.documentfile.provider.DocumentFile;
import eu.chainfire.libsuperuser.Shell;
public class Miscellaneous extends Service public class Miscellaneous extends Service
{ {
protected static String writeableFolderStringCache = null; protected static String writeableFolderStringCache = null;
public static Context startupContext;
public static final String lineSeparator = System.getProperty("line.separator"); public static final String lineSeparator = System.getProperty("line.separator");
public static String downloadURL(String url, String username, String password, String method, Map<String, String> httpParams) public static String downloadURL(String url, String username, String password)
{ {
HttpClient httpclient = new DefaultHttpClient(); HttpClient httpclient = new DefaultHttpClient();
StringBuilder responseBody = new StringBuilder(); StringBuilder responseBody = new StringBuilder();
@ -158,26 +143,6 @@ public class Miscellaneous extends Service
connection.setDoOutput(true); connection.setDoOutput(true);
connection.setRequestProperty ("Authorization", "Basic " + encodedCredentials); connection.setRequestProperty ("Authorization", "Basic " + encodedCredentials);
} }
else if(method.equals(ActivityManageActionTriggerUrl.methodPost))
connection.setRequestMethod("POST");
if(httpParams.size() > 0)
{
connection.setRequestMethod("POST");
connection.setDoInput(true);
connection.setDoOutput(true);
List<NameValuePair> paramPairs = new ArrayList<NameValuePair>();
for(String key : httpParams.keySet())
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));
writer.flush();
writer.close();
}
InputStream content = (InputStream)connection.getInputStream(); InputStream content = (InputStream)connection.getInputStream();
BufferedReader in = new BufferedReader (new InputStreamReader (content)); BufferedReader in = new BufferedReader (new InputStreamReader (content));
@ -204,28 +169,12 @@ public class Miscellaneous extends Service
} }
} }
private static String getQuery(List<NameValuePair> params) throws UnsupportedEncodingException public static String downloadURLwithoutCertificateChecking(String url, String username, String password)
{ {
StringBuilder result = new StringBuilder(); // HttpClient httpclient = new DefaultHttpClient();
boolean first = true; // StringBuilder responseBody = new StringBuilder();
boolean errorFound = false;
for (NameValuePair pair : params)
{
if (first)
first = false;
else
result.append("&");
result.append(URLEncoder.encode(pair.getName(), "UTF-8"));
result.append("=");
result.append(URLEncoder.encode(pair.getValue(), "UTF-8"));
}
return result.toString();
}
public static String downloadUrlWithoutCertificateChecking(String url, String username, String password, String method, Map<String, String> httpParams)
{
try try
{ {
HttpParams params = new BasicHttpParams(); HttpParams params = new BasicHttpParams();
@ -234,36 +183,19 @@ public class Miscellaneous extends Service
HttpClient httpclient = new DefaultHttpClient(params); HttpClient httpclient = new DefaultHttpClient(params);
httpclient = Actions.getInsecureSslClient(httpclient); httpclient = Actions.getInsecureSslClient(httpclient);
HttpRequestBase httpRequest; HttpPost httppost = new HttpPost(url);
if(
method.equals(ActivityManageActionTriggerUrl.methodPost)
||
(username != null && password != null)
||
httpParams.size() > 0
)
httpRequest = new HttpPost(url);
else
httpRequest = new HttpGet(url);
// Add http simple authentication if specified // Add http simple authentication if specified
if(username != null && password != null) if(username != null && password != null)
{ {
String encodedCredentials = Base64.encodeToString(new String(username + ":" + password).getBytes(), Base64.DEFAULT); String encodedCredentials = Base64.encodeToString(new String(username + ":" + password).getBytes(), Base64.DEFAULT);
httpRequest.addHeader("Authorization", "Basic " + encodedCredentials); // List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
httppost.addHeader("Authorization", "Basic " + encodedCredentials);
// nameValuePairs.add(new BasicNameValuePair("Authorization", "Basic " + encodedCredentials));
// httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8"));
} }
if(httpParams.size() > 0) HttpResponse response = httpclient.execute(httppost);
{
List<NameValuePair> paramPairs = new ArrayList<NameValuePair>();
for(String key : httpParams.keySet())
paramPairs.add(new BasicNameValuePair(key, httpParams.get(key)));
((HttpPost)httpRequest).setEntity(new UrlEncodedFormEntity(paramPairs, "UTF-8"));
}
HttpResponse response = httpclient.execute(httpRequest);
HttpEntity entity = response.getEntity(); HttpEntity entity = response.getEntity();
if (entity != null) if (entity != null)
{ {
@ -274,6 +206,7 @@ public class Miscellaneous extends Service
catch(Exception e) catch(Exception e)
{ {
Miscellaneous.logEvent("e", "HTTP error", Log.getStackTraceString(e), 3); Miscellaneous.logEvent("e", "HTTP error", Log.getStackTraceString(e), 3);
errorFound = true;
return "httpError"; return "httpError";
} }
// finally // finally
@ -299,9 +232,25 @@ public class Miscellaneous extends Service
@Override @Override
public IBinder onBind(Intent arg0) public IBinder onBind(Intent arg0)
{ {
// TODO Auto-generated method stub
return null; return null;
} }
// public static void logEvent(String type, String header, String description)
// {
// if(type.equals("e"))
// Log.e(header, description);
//
// if(type.equals("w"))
// Log.w(header, description);
//
// if(type.equals("i"))
// Log.i(header, description);
//
// if(Settings.writeLogFile)
// writeToLogFile(type, header, description);
// }
public static void logEvent(String type, String header, String description, int logLevel) public static void logEvent(String type, String header, String description, int logLevel)
{ {
try try
@ -326,7 +275,7 @@ public class Miscellaneous extends Service
{ {
writeToLogFile(type, header, description); writeToLogFile(type, header, description);
if (!logCleanerRunning && Math.random() < 0.1) // tidy up with 10% probability if(!logCleanerRunning && Math.random() < 0.1) // tidy up with 10% probability
{ {
rotateLogFile(getLogFile()); rotateLogFile(getLogFile());
} }
@ -338,6 +287,7 @@ public class Miscellaneous extends Service
{ {
logCleanerRunning = true; logCleanerRunning = true;
long maxSizeInBytes = (long)Settings.logFileMaxSize * 1024 * 1024; long maxSizeInBytes = (long)Settings.logFileMaxSize * 1024 * 1024;
if(logFile.exists() && logFile.length() > (maxSizeInBytes)) if(logFile.exists() && logFile.length() > (maxSizeInBytes))
@ -526,9 +476,6 @@ public class Miscellaneous extends Service
switch(direction) switch(direction)
{ {
case Trigger.directionEquals: case Trigger.directionEquals:
if(Miscellaneous.isRegularExpression(needle))
return haystack.matches(needle);
else
return haystack.equalsIgnoreCase(needle); return haystack.equalsIgnoreCase(needle);
case Trigger.directionNotEquals: case Trigger.directionNotEquals:
return !haystack.equalsIgnoreCase(needle); return !haystack.equalsIgnoreCase(needle);
@ -585,45 +532,7 @@ public class Miscellaneous extends Service
Miscellaneous.logEvent("i", "TimeCompare", "Default return code. Shouldn't be here.", 5); Miscellaneous.logEvent("i", "TimeCompare", "Default return code. Shouldn't be here.", 5);
return 0; return 0;
}
public static int compareTimes(Calendar calOne, Calendar calTwo)
{
if(calOne.get(Calendar.HOUR_OF_DAY) == calTwo.get(Calendar.HOUR_OF_DAY) && calOne.get(Calendar.MINUTE) == calTwo.get((Calendar.MINUTE)))
{
// Miscellaneous.logEvent("i", "TimeCompare", "Times are equal.");
return 0;
}
if(calOne.get(Calendar.HOUR_OF_DAY) > calTwo.get(Calendar.HOUR_OF_DAY))
{
// Miscellaneous.logEvent("i", "TimeCompare", "Time1 is bigger/later by hours.");
return -1;
}
if(calOne.get(Calendar.HOUR_OF_DAY) < calTwo.get(Calendar.HOUR_OF_DAY))
{
// Miscellaneous.logEvent("i", "TimeCompare", "Time2 is bigger/later by hours.");
return 1;
}
if(calOne.get(Calendar.HOUR_OF_DAY) == calTwo.get(Calendar.HOUR_OF_DAY))
{
if(calOne.get(Calendar.MINUTE) < calTwo.get(Calendar.MINUTE))
{
// Miscellaneous.logEvent("i", "TimeCompare", "Hours are equal. Time2 is bigger/later by minutes.");
return 1;
}
if(calOne.get(Calendar.MINUTE) > calTwo.get(Calendar.MINUTE))
{
// Miscellaneous.logEvent("i", "TimeCompare", "Hours are equal. Time1 is bigger/later by minutes.");
return -1;
}
}
Miscellaneous.logEvent("i", "TimeCompare", "Default return code. Shouldn't be here.", 5);
return 0;
} }
public static String convertStreamToString(InputStream is) public static String convertStreamToString(InputStream is)
@ -648,9 +557,6 @@ public class Miscellaneous extends Service
if(returnContext != null) if(returnContext != null)
return returnContext; return returnContext;
if(startupContext != null)
return startupContext;
return null; return null;
} }
@ -702,90 +608,33 @@ public class Miscellaneous extends Service
} }
if(source.contains("[serialnr]")) if(source.contains("[serialnr]"))
{ if(Build.VERSION.SDK_INT > 8)
if (Build.VERSION.SDK_INT > 8)
source = source.replace("[serialnr]", Secure.getString(context.getContentResolver(), Build.SERIAL)); source = source.replace("[serialnr]", Secure.getString(context.getContentResolver(), Build.SERIAL));
else else
source = source.replace("[serialnr]", "serialUnknown"); source = source.replace("[serialnr]", "serialUnknown");
}
if( if(
source.contains("[d]") || source.contains("[d]") |
source.contains("[m]") || source.contains("[m]") |
source.contains("[Y]") || source.contains("[Y]") |
source.contains("[h]") || source.contains("[h]") |
source.contains("[H]") || source.contains("[H]") |
source.contains("[i]") || source.contains("[i]") |
source.contains("[s]") || source.contains("[s]") |
source.contains("[ms]") source.contains("[ms]")
) )
{ {
Calendar cal = Calendar.getInstance(); Calendar cal = Calendar.getInstance();
if(source.contains("[d]")) source = source.replace("[d]", String.valueOf(cal.get(Calendar.DAY_OF_MONTH)));
{ source = source.replace("[m]", String.valueOf(cal.get(Calendar.MONTH)));
String result = String.valueOf(cal.get(Calendar.DAY_OF_MONTH));
if(result.length() < 2)
result = "0" + result;
source = source.replace("[d]", result);
}
if(source.contains("[m]"))
{
String result = String.valueOf(cal.get(Calendar.MONTH) +1);
if(result.length() < 2)
result = "0" + result;
source = source.replace("[m]", result);
}
if(source.contains("[Y]"))
{
source = source.replace("[Y]", String.valueOf(cal.get(Calendar.YEAR))); source = source.replace("[Y]", String.valueOf(cal.get(Calendar.YEAR)));
} source = source.replace("[h]", String.valueOf(cal.get(Calendar.HOUR)));
source = source.replace("[H]", String.valueOf(cal.get(Calendar.HOUR_OF_DAY)));
if(source.contains("[h]")) source = source.replace("[i]", String.valueOf(cal.get(Calendar.MINUTE)));
{ source = source.replace("[s]", String.valueOf(cal.get(Calendar.SECOND)));
String result = String.valueOf(cal.get(Calendar.HOUR));
if(result.length() < 2)
result = "0" + result;
source = source.replace("[h]", result);
}
if(source.contains("[H]"))
{
String result = String.valueOf(cal.get(Calendar.HOUR_OF_DAY));
if(result.length() < 2)
result = "0" + result;
source = source.replace("[H]", result);
}
if(source.contains("[i]"))
{
String result = String.valueOf(cal.get(Calendar.MINUTE));
if(result.length() < 2)
result = "0" + result;
source = source.replace("[i]", result);
}
if(source.contains("[s]"))
{
String result = String.valueOf(cal.get(Calendar.SECOND));
if(result.length() < 2)
result = "0" + result;
source = source.replace("[s]", result);
}
if(source.contains("[ms]"))
{
source = source.replace("[ms]", String.valueOf(cal.get(Calendar.MILLISECOND))); source = source.replace("[ms]", String.valueOf(cal.get(Calendar.MILLISECOND)));
} }
}
if(source.contains("[notificationTitle]")) if(source.contains("[notificationTitle]"))
{ {
@ -794,7 +643,7 @@ public class Miscellaneous extends Service
String notificationTitle = NotificationListener.getLastNotification().getTitle(); String notificationTitle = NotificationListener.getLastNotification().getTitle();
if (notificationTitle != null && notificationTitle.length() > 0) if (notificationTitle != null && notificationTitle.length() > 0)
source = source.replace("[notificationTitle]", escapeStringForUrl(notificationTitle)); source = source.replace("[notificationTitle]", notificationTitle);
else else
{ {
source = source.replace("[notificationTitle]", "notificationTitle unknown"); source = source.replace("[notificationTitle]", "notificationTitle unknown");
@ -815,7 +664,7 @@ public class Miscellaneous extends Service
String notificationText = NotificationListener.getLastNotification().getText(); String notificationText = NotificationListener.getLastNotification().getText();
if (notificationText != null && notificationText.length() > 0) if (notificationText != null && notificationText.length() > 0)
source = source.replace("[notificationText]", escapeStringForUrl(notificationText)); source = source.replace("[notificationText]", notificationText);
else else
{ {
source = source.replace("[notificationText]", "notificationText unknown"); source = source.replace("[notificationText]", "notificationText unknown");
@ -829,98 +678,6 @@ public class Miscellaneous extends Service
} }
} }
if(source.contains("[last_trigger_url_result]"))
{
try
{
source = source.replace("[last_trigger_url_result]", AutomationService.getInstance().getVariableMap().get("last_trigger_url_result"));
}
catch (Exception e)
{
Miscellaneous.logEvent("w", "Variable replacement", "Error replacing variable last_trigger_url_result.", 3);
}
}
if(source.contains("[last_run_executable_exit_code]"))
{
try
{
source = source.replace("[last_run_executable_exit_code]", AutomationService.getInstance().getVariableMap().get("last_run_executable_exit_code"));
}
catch (Exception e)
{
Miscellaneous.logEvent("w", "Variable replacement", "Error replacing variable last_run_executable_exit_code.", 3);
}
}
if(source.contains("[last_run_executable_output]"))
{
try
{
source = source.replace("[last_run_executable_output]", AutomationService.getInstance().getVariableMap().get("last_run_executable_output"));
}
catch (Exception e)
{
Miscellaneous.logEvent("w", "Variable replacement", "Error replacing variable last_run_executable_output.", 3);
}
}
if(source.contains("[last_calendar_title]"))
{
try
{
source = source.replace("[last_calendar_title]", CalendarReceiver.getLastTriggeringEvent().title);
}
catch (Exception e)
{
Miscellaneous.logEvent("w", "Variable replacement", "Error replacing variable last_calendar_title.", 3);
}
}
if(source.contains("[last_calendar_description]"))
{
try
{
source = source.replace("[last_calendar_description]", CalendarReceiver.getLastTriggeringEvent().description);
}
catch (Exception e)
{
Miscellaneous.logEvent("w", "Variable replacement", "Error replacing variable last_calendar_description.", 3);
}
}
if(source.contains("[last_calendar_location]"))
{
try
{
source = source.replace("[last_calendar_location]", CalendarReceiver.getLastTriggeringEvent().location);
}
catch (Exception e)
{
Miscellaneous.logEvent("w", "Variable replacement", "Error replacing variable last_calendar_location.", 3);
}
}
while(source.contains("[variable-"))
{
int pos1 = source.indexOf("[variable-");
int pos2 = source.indexOf("]", pos1);
int posA = pos1 + "[variable-".length();
int posB = source.indexOf("]", posA);
String variableName = source.substring(posA, posB);
String replacement;
if(AutomationService.getInstance().variableMap.containsKey(variableName))
replacement = AutomationService.getInstance().variableMap.get(variableName);
else
replacement = "unknownVariable";
source = source.substring(0, pos1) + escapeStringForUrl(replacement) + source.substring(pos2 +1);
}
// Miscellaneous.logEvent("i", "URL after replace", source); // Miscellaneous.logEvent("i", "URL after replace", source);
return source; return source;
@ -947,7 +704,7 @@ public class Miscellaneous extends Service
alertDialog.setTitle(title); alertDialog.setTitle(title);
alertDialog.setMessage(message); alertDialog.setMessage(message);
alertDialog.setPositiveButton(context.getResources().getString(R.string.ok), new DialogInterface.OnClickListener() alertDialog.setPositiveButton("Ok", new DialogInterface.OnClickListener()
{ {
public void onClick(DialogInterface dialog, int whichButton) public void onClick(DialogInterface dialog, int whichButton)
{ {
@ -983,12 +740,9 @@ public class Miscellaneous extends Service
*/ */
public static boolean isPhoneRooted() public static boolean isPhoneRooted()
{ {
try // if(true)
{ // return true;
return Shell.SU.available();
}
catch(Exception e)
{
// get from build info // get from build info
String buildTags = Build.TAGS; String buildTags = Build.TAGS;
if (buildTags != null && buildTags.contains("test-keys")) if (buildTags != null && buildTags.contains("test-keys"))
@ -1017,7 +771,6 @@ public class Miscellaneous extends Service
|| ||
canExecuteCommand("which su"); canExecuteCommand("which su");
} }
}
// executes a command on the system // executes a command on the system
private static boolean canExecuteCommand(String command) private static boolean canExecuteCommand(String command)
@ -1035,22 +788,6 @@ public class Miscellaneous extends Service
return executedSuccesfully; return executedSuccesfully;
} }
public static boolean isNumericDecimal(String strNum)
{
if (strNum == null)
{
return false;
}
try
{
double d = Double.parseDouble(strNum);
}
catch (NumberFormatException nfe)
{
return false;
}
return true;
}
public static boolean isNumeric(String str) public static boolean isNumeric(String str)
{ {
@ -1097,11 +834,17 @@ public class Miscellaneous extends Service
} }
catch (KeyManagementException e) catch (KeyManagementException e)
{ {
Miscellaneous.logEvent("e", "SSL", Log.getStackTraceString(e), 4); // TODO Auto-generated catch block
e.printStackTrace();
} }
catch (NoSuchAlgorithmException e) catch (NoSuchAlgorithmException e)
{ {
Miscellaneous.logEvent("e", "SSL", Log.getStackTraceString(e), 4); // TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
} }
} }
@ -1320,12 +1063,7 @@ public class Miscellaneous extends Service
builder.setOnlyAlertOnce(true); builder.setOnlyAlertOnce(true);
if(Settings.showIconWhenServiceIsRunning && notificationChannelId.equals(AutomationService.NOTIFICATION_CHANNEL_ID_SERVICE)) if(Settings.showIconWhenServiceIsRunning && notificationChannelId.equals(AutomationService.NOTIFICATION_CHANNEL_ID_SERVICE))
{
if(BuildConfig.FLAVOR.equals(AutomationService.flavor_name_googleplay))
builder.setSmallIcon(R.drawable.crane);
else
builder.setSmallIcon(R.drawable.ic_launcher); builder.setSmallIcon(R.drawable.ic_launcher);
}
else if(!notificationChannelId.equals(AutomationService.NOTIFICATION_CHANNEL_ID_SERVICE)) else if(!notificationChannelId.equals(AutomationService.NOTIFICATION_CHANNEL_ID_SERVICE))
builder.setSmallIcon(R.drawable.info); builder.setSmallIcon(R.drawable.info);
@ -1635,7 +1373,7 @@ public class Miscellaneous extends Service
return result; return result;
} }
public static boolean restrictedFeaturesConfiguredFdroid() public static boolean restrictedFeaturesConfigured()
{ {
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.activityDetection)) if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.activityDetection))
{ {
@ -1652,17 +1390,6 @@ public class Miscellaneous extends Service
return false; return false;
} }
public static boolean restrictedFeaturesConfiguredGoogle()
{
if(Rule.isAnyRuleUsing(Action.Action_Enum.startPhoneCall) || Rule.isAnyRuleUsing(Action.Action_Enum.stopPhoneCall))
{
if(BuildConfig.FLAVOR.equals(AutomationService.flavor_name_googleplay))
return true;
}
return false;
}
public static Element getXmlTree(String inputString) throws SAXException, IOException, ParserConfigurationException public static Element getXmlTree(String inputString) throws SAXException, IOException, ParserConfigurationException
{ {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
@ -1893,7 +1620,7 @@ public class Miscellaneous extends Service
{ {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
{ {
if (BuildConfig.FLAVOR.equalsIgnoreCase(AutomationService.flavor_name_googleplay)) if (BuildConfig.FLAVOR.equalsIgnoreCase("googlePlayFlavor"))
{ {
if(checkExistingRules) if(checkExistingRules)
{ {
@ -2026,12 +1753,13 @@ public class Miscellaneous extends Service
public static boolean comparePhoneNumbers(String number1, String number2) public static boolean comparePhoneNumbers(String number1, String number2)
{ {
if(Build.VERSION.SDK_INT > Build.VERSION_CODES.S) /* To be activated when Android S SDK comes out
if(Build.VERSION.SDK_INT > Build.VERSION_CODES.Q)
{ {
TelephonyManager tm = (TelephonyManager)Miscellaneous.getAnyContext().getSystemService(Context.TELEPHONY_SERVICE); TelephonyManager tm = (TelephonyManager)Miscellaneous.getAnyContext().getSystemService(Context.TELEPHONY_SERVICE);
return PhoneNumberUtils.areSamePhoneNumber(number1, number2, tm.getNetworkCountryIso()); return PhoneNumberUtils.areSamePhoneNumber(number1, number2, tm.getNetworkCountryIso());
} }
else else*/
return PhoneNumberUtils.compare(number1, number2); return PhoneNumberUtils.compare(number1, number2);
} }
@ -2165,64 +1893,4 @@ public class Miscellaneous extends Service
return null; return null;
} }
public static int getTargetSDK(Context context)
{
return context.getApplicationContext().getApplicationInfo().targetSdkVersion;
}
public static void setDisplayLanguage(Context context)
{
if(!Settings.displayLanguage.equals(Settings.default_displayLanguage))
{
Locale myLocale;
if(Settings.displayLanguage.contains("_"))
{
String[] parts = Settings.displayLanguage.split("_");
myLocale = new Locale(parts[0], parts[1]);
}
else
myLocale = new Locale(Settings.displayLanguage);
Resources res = context.getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Configuration conf = res.getConfiguration();
conf.locale = myLocale;
res.updateConfiguration(conf, dm);
//Intent refresh = new Intent(this, AndroidLocalize.class);
//finish();
//startActivity(refresh);
}
}
public static String escapeStringForUrl(String input)
{
String output;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
{
try
{
output = URLEncoder.encode(input, String.valueOf(StandardCharsets.UTF_8));
}
catch (UnsupportedEncodingException e)
{
Miscellaneous.logEvent("e", "URLEncoder", "Error encoding string for URL. Leaving as it is. Error details: " + Log.getStackTraceString(e), 3);
output = input;
}
}
else
{
output = Uri.encode(input);
}
return output;
}
public static String getCallingMethodName()
{
StackTraceElement callingFrame = Thread.currentThread().getStackTrace()[4];
return callingFrame.getMethodName();
}
} }

View File

@ -1,51 +0,0 @@
package com.jens.automation2;
import android.accessibilityservice.AccessibilityService;
import android.os.Build;
import android.util.Log;
import android.view.Display;
import android.view.accessibility.AccessibilityEvent;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
public class MyAccessibilityService extends AccessibilityService
{
static MyAccessibilityService instance;
public static MyAccessibilityService getInstance()
{
if(instance == null)
{
instance = new MyAccessibilityService();
}
return instance;
}
@Override
public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent)
{
}
@Override
public void onInterrupt()
{
}
@Override
public void onCreate()
{
super.onCreate();
instance = this;
}
@Override
protected void onServiceConnected()
{
super.onServiceConnected();
Miscellaneous.logEvent("i", "Accessibility service", "Service started.", 4);
}
}

View File

@ -79,7 +79,7 @@ public class News
if (!(new File(filePath)).exists() || Settings.lastNewsPolltime == Settings.default_lastNewsPolltime || now.getTimeInMillis() >= Settings.lastNewsPolltime + (long)(Settings.newsDisplayForXDays * 24 * 60 * 60 * 1000)) if (!(new File(filePath)).exists() || Settings.lastNewsPolltime == Settings.default_lastNewsPolltime || now.getTimeInMillis() >= Settings.lastNewsPolltime + (long)(Settings.newsDisplayForXDays * 24 * 60 * 60 * 1000))
{ {
String newsUrl = "https://server47.de/automation/appNews.php"; String newsUrl = "https://server47.de/automation/appNews.php";
newsContent = Miscellaneous.downloadURL(newsUrl, null, null, ActivityManageActionTriggerUrl.methodGet, null); newsContent = Miscellaneous.downloadURL(newsUrl, null, null);
// Cache content to local storage // Cache content to local storage
if(Miscellaneous.writeStringToFile(filePath, newsContent)) if(Miscellaneous.writeStringToFile(filePath, newsContent))

View File

@ -64,7 +64,7 @@ public class PointOfInterest implements Comparable<PointOfInterest>
public void setName(String desiredName) public void setName(String desiredName)
{ {
this.oldName = this.name; this.oldName = this.name;
this.name = desiredName.trim(); this.name = desiredName;
} }
public Location getLocation() public Location getLocation()
@ -421,18 +421,14 @@ public class PointOfInterest implements Comparable<PointOfInterest>
public boolean create(Context context) public boolean create(Context context)
{ {
for(PointOfInterest poi : PointOfInterest.pointOfInterestCollection) for(PointOfInterest poi : PointOfInterest.pointOfInterestCollection)
{ if(poi.getName().equals(this.getName()))
if (poi.getName().equals(this.getName()))
{ {
Toast.makeText(context, context.getResources().getString(R.string.anotherPoiByThatName), Toast.LENGTH_LONG).show(); Toast.makeText(context, context.getResources().getString(R.string.anotherPoiByThatName), Toast.LENGTH_LONG).show();
return false; return false;
} }
}
if(plausibilityCheck()) if(plausibilityCheck())
{ {
Miscellaneous.logEvent("i", "Creating POI", this.toStringLong(), 3);
PointOfInterest.pointOfInterestCollection.add(this); PointOfInterest.pointOfInterestCollection.add(this);
PointOfInterest.writePoisToFile(); PointOfInterest.writePoisToFile();
@ -494,10 +490,8 @@ public class PointOfInterest implements Comparable<PointOfInterest>
Check for change of rule name END Check for change of rule name END
*/ */
if(plausibilityCheck()) if (plausibilityCheck())
{ {
Miscellaneous.logEvent("i", "Changing POI", "Old name: " + this.oldName + ", new data: " + this.toStringLong(), 3);
if(PointOfInterest.writePoisToFile()) if(PointOfInterest.writePoisToFile())
{ {
AutomationService service = AutomationService.getInstance(); AutomationService service = AutomationService.getInstance();
@ -694,16 +688,22 @@ public class PointOfInterest implements Comparable<PointOfInterest>
@Override @Override
public void onProviderDisabled(String provider) public void onProviderDisabled(String provider)
{ {
// TODO Auto-generated method stub
} }
@Override @Override
public void onProviderEnabled(String provider) public void onProviderEnabled(String provider)
{ {
// TODO Auto-generated method stub
} }
@Override @Override
public void onStatusChanged(String provider, int status, Bundle extras) public void onStatusChanged(String provider, int status, Bundle extras)
{ {
// TODO Auto-generated method stub
} }
} }

View File

@ -3,12 +3,13 @@ package com.jens.automation2;
import android.app.NotificationManager; import android.app.NotificationManager;
import android.content.ContentValues; import android.content.ContentValues;
import android.content.Context; import android.content.Context;
import android.database.Cursor;
import android.media.AudioManager; import android.media.AudioManager;
import android.media.Ringtone;
import android.media.RingtoneManager; import android.media.RingtoneManager;
import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.provider.MediaStore; import android.provider.MediaStore;
import android.provider.Settings;
import android.util.Log; import android.util.Log;
import android.widget.Toast; import android.widget.Toast;
@ -42,13 +43,13 @@ public class Profile implements Comparable<Profile>
protected int volumeAlarms; protected int volumeAlarms;
protected boolean changeIncomingCallsRingtone; protected boolean changeIncomingCallsRingtone;
protected String incomingCallsRingtone; protected File incomingCallsRingtone;
protected boolean changeVibrateWhenRinging; protected boolean changeVibrateWhenRinging;
protected boolean vibrateWhenRinging; protected boolean vibrateWhenRinging;
protected boolean changeNotificationRingtone; protected boolean changeNotificationRingtone;
protected String notificationRingtone; protected File notificationRingtone;
protected boolean changeAudibleSelection; protected boolean changeAudibleSelection;
protected boolean audibleSelection; protected boolean audibleSelection;
@ -63,7 +64,7 @@ public class Profile implements Comparable<Profile>
public void setName(String name) public void setName(String name)
{ {
this.oldName = this.name; this.oldName = this.name;
this.name = name.trim(); this.name = name;
} }
public String getName() public String getName()
@ -172,11 +173,11 @@ public class Profile implements Comparable<Profile>
return changeIncomingCallsRingtone; return changeIncomingCallsRingtone;
} }
public void setIncomingCallsRingtone(String incomingCallsRingtone) public void setIncomingCallsRingtone(File incomingCallsRingtone)
{ {
this.incomingCallsRingtone = incomingCallsRingtone; this.incomingCallsRingtone = incomingCallsRingtone;
} }
public String getIncomingCallsRingtone() public File getIncomingCallsRingtone()
{ {
return incomingCallsRingtone; return incomingCallsRingtone;
} }
@ -208,11 +209,11 @@ public class Profile implements Comparable<Profile>
return changeNotificationRingtone; return changeNotificationRingtone;
} }
public void setNotificationRingtone(String notificationsRingtone) public void setNotificationRingtone(File notificationsRingtone)
{ {
this.notificationRingtone = notificationsRingtone; this.notificationRingtone = notificationsRingtone;
} }
public String getNotificationRingtone() public File getNotificationRingtone()
{ {
return notificationRingtone; return notificationRingtone;
} }
@ -293,32 +294,21 @@ public class Profile implements Comparable<Profile>
return null; return null;
} }
private boolean applyRingTone(String ringtoneFile, int ringtoneType, Context context) private boolean applyRingTone(File ringtoneFile, int ringtoneType, Context context)
{ {
Miscellaneous.logEvent("i", "Profile", "Request to set ringtone to " + ringtoneFile, 3); Miscellaneous.logEvent("i", "Profile", "Request to set ringtone to " + ringtoneFile.getAbsolutePath(), 3);
// if(!ringtoneFile.exists() || !ringtoneFile.canRead()) if(!ringtoneFile.exists() || !ringtoneFile.canRead())
// { {
// String message = "Ringtone file does not exist or cannot read it: " + ringtoneFile.getAbsolutePath(); String message = "Ringtone file does not exist or cannot read it: " + ringtoneFile.getAbsolutePath();
// Miscellaneous.logEvent("i", "Profile", message, 3); Miscellaneous.logEvent("i", "Profile", message, 3);
// Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
// return false; return false;
// } }
// Set by URI
if(ringtoneFile.contains("//"))
{
Uri target = Uri.parse(ringtoneFile);
RingtoneManager.setActualDefaultRingtoneUri(context, ringtoneType, target);
Miscellaneous.logEvent("i", "Profile", "Ringtone set to: " + ringtoneFile, 1);
return true;
} // Set by filepath
else
{
ContentValues values = new ContentValues(); ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DATA, ringtoneFile); values.put(MediaStore.MediaColumns.DATA, ringtoneFile.getAbsolutePath());
values.put(MediaStore.MediaColumns.TITLE, ringtoneFile); values.put(MediaStore.MediaColumns.TITLE, ringtoneFile.getName());
//values.put(MediaStore.MediaColumns.TITLE, ringtoneFile.getName());
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3"); values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");
values.put(MediaStore.MediaColumns.SIZE, ringtoneFile.length()); values.put(MediaStore.MediaColumns.SIZE, ringtoneFile.length());
values.put(MediaStore.Audio.Media.IS_RINGTONE, ringtoneType == RingtoneManager.TYPE_RINGTONE); values.put(MediaStore.Audio.Media.IS_RINGTONE, ringtoneType == RingtoneManager.TYPE_RINGTONE);
@ -330,22 +320,18 @@ public class Profile implements Comparable<Profile>
{ {
Uri newRingTone = null; Uri newRingTone = null;
Uri existingRingTone = MediaStore.Audio.Media.getContentUriForPath(ringtoneFile); //TODO: This part needs to be made compatible with Android 11 and above.
if(Build.VERSION.SDK_INT > 30)
{
Uri existingRingTone = MediaStore.Audio.Media.getContentUriForPath(ringtoneFile.getAbsolutePath());
try
{
if (existingRingTone != null) if (existingRingTone != null)
context.getContentResolver().delete(existingRingTone, MediaStore.MediaColumns.DATA + "=\"" + ringtoneFile + "\"", null); context.getContentResolver().delete(existingRingTone, MediaStore.MediaColumns.DATA + "=\"" + ringtoneFile.getAbsolutePath() + "\"", null);
}
catch(Exception e)
{
Miscellaneous.logEvent("w","Delete file from ringtones", "Deleting ringtone from library failed: " + Log.getStackTraceString(e), 2);
}
newRingTone = context.getContentResolver().insert(existingRingTone, values); newRingTone = context.getContentResolver().insert(existingRingTone, values);
}
RingtoneManager.setActualDefaultRingtoneUri(context, ringtoneType, newRingTone); RingtoneManager.setActualDefaultRingtoneUri(context, ringtoneType, newRingTone);
Miscellaneous.logEvent("i", "Profile", "Ringtone set to: " + newRingTone.toString(), 1); Miscellaneous.logEvent("i", "Profile", "Ringtone set to: " + newRingTone.toString(), 1);
return true; return true;
} }
@ -354,7 +340,6 @@ public class Profile implements Comparable<Profile>
String message = "Error setting ringtone: " + Log.getStackTraceString(t); String message = "Error setting ringtone: " + Log.getStackTraceString(t);
Miscellaneous.logEvent("e", "Profile", message, 1); Miscellaneous.logEvent("e", "Profile", message, 1);
} }
}
return false; return false;
} }
@ -524,7 +509,7 @@ public class Profile implements Comparable<Profile>
Actions.setSound(context, soundMode); Actions.setSound(context, soundMode);
if(changeDndMode) if(changeDndMode)
Actions.setDoNotDisturb(context, dndMode); Actions.setDND(context, dndMode);
if(changeVolumeMusicVideoGameMedia) if(changeVolumeMusicVideoGameMedia)
am.setStreamVolume(AudioManager.STREAM_MUSIC, volumeMusic, AudioManager.FLAG_PLAY_SOUND); am.setStreamVolume(AudioManager.STREAM_MUSIC, volumeMusic, AudioManager.FLAG_PLAY_SOUND);
@ -585,17 +570,17 @@ public class Profile implements Comparable<Profile>
} }
finally finally
{ {
Miscellaneous.logEvent("i", "Profile", "Checking for applicable rules after profile " + this.getName() + " has been activated.", 2); Miscellaneous.logEvent("i", "POI", "Checking for applicable rule after profile " + this.getName() + " has been activated.", 2);
List<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger.Trigger_Enum.profileActive); List<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger.Trigger_Enum.profileActive);
for(int i=0; i<ruleCandidates.size(); i++) for(int i=0; i<ruleCandidates.size(); i++)
{ {
if(ruleCandidates.get(i).haveEnoughPermissions() && ruleCandidates.get(i).getsGreenLight(AutomationService.getInstance())) if(ruleCandidates.get(i).haveEnoughPermissions() && ruleCandidates.get(i).getsGreenLight(AutomationService.getInstance()))
{ {
Miscellaneous.logEvent("i", "Profile", "Rule " + ruleCandidates.get(i).getName() + " applies after " + this.getName() + " has been activated.", 2); Miscellaneous.logEvent("i", "POI", "Rule " + ruleCandidates.get(i).getName() + " applies after " + this.getName() + " has been activated.", 2);
ruleCandidates.get(i).activate(AutomationService.getInstance(), false); ruleCandidates.get(i).activate(AutomationService.getInstance(), false);
} }
} }
Miscellaneous.logEvent("i", "Profile", "Done checking for applicable rules after profile " + this.getName() + " has been activated.", 2); Miscellaneous.logEvent("i", "POI", "Done checking for applicable rule after profile " + this.getName() + " has been activated.", 2);
} }
} }
else else

View File

@ -1,13 +1,11 @@
package com.jens.automation2; package com.jens.automation2;
import android.Manifest;
import android.os.Build; import android.os.Build;
import android.util.Log; import android.util.Log;
import com.jens.automation2.location.CellLocationChangedReceiver; import com.jens.automation2.location.CellLocationChangedReceiver;
import com.jens.automation2.location.WifiBroadcastReceiver; import com.jens.automation2.location.WifiBroadcastReceiver;
import com.jens.automation2.receivers.BroadcastListener; import com.jens.automation2.receivers.BroadcastListener;
import com.jens.automation2.receivers.CalendarReceiver;
import com.jens.automation2.receivers.DateTimeListener; import com.jens.automation2.receivers.DateTimeListener;
import com.jens.automation2.receivers.AutomationListenerInterface; import com.jens.automation2.receivers.AutomationListenerInterface;
import com.jens.automation2.receivers.BatteryReceiver; import com.jens.automation2.receivers.BatteryReceiver;
@ -20,8 +18,6 @@ import com.jens.automation2.receivers.NoiseListener;
import com.jens.automation2.receivers.PhoneStatusListener; import com.jens.automation2.receivers.PhoneStatusListener;
import com.jens.automation2.receivers.ProcessListener; import com.jens.automation2.receivers.ProcessListener;
import com.jens.automation2.receivers.ScreenStateReceiver; import com.jens.automation2.receivers.ScreenStateReceiver;
import com.jens.automation2.receivers.SubSystemStateReceiver;
import com.jens.automation2.receivers.TetheringReceiver;
import com.jens.automation2.receivers.TimeZoneListener; import com.jens.automation2.receivers.TimeZoneListener;
import androidx.annotation.RequiresApi; import androidx.annotation.RequiresApi;
@ -63,8 +59,7 @@ public class ReceiverCoordinator
ProcessListener.class, ProcessListener.class,
MediaPlayerListener.class, MediaPlayerListener.class,
ScreenStateReceiver.class, ScreenStateReceiver.class,
TimeZoneListener.class, TimeZoneListener.class
TetheringReceiver.class
}; };
} }
catch (ClassNotFoundException e) catch (ClassNotFoundException e)
@ -82,8 +77,7 @@ public class ReceiverCoordinator
PhoneStatusListener.class, PhoneStatusListener.class,
ProcessListener.class, ProcessListener.class,
ScreenStateReceiver.class, ScreenStateReceiver.class,
TimeZoneListener.class, TimeZoneListener.class
TetheringReceiver.class
}; };
} }
} }
@ -147,7 +141,6 @@ public class ReceiverCoordinator
} }
// startPhoneStateListener // startPhoneStateListener
if(!BuildConfig.FLAVOR.equals(AutomationService.flavor_name_googleplay))
PhoneStatusListener.startPhoneStatusListener(AutomationService.getInstance()); // also used to mute anouncements during calls PhoneStatusListener.startPhoneStatusListener(AutomationService.getInstance()); // also used to mute anouncements during calls
// startConnectivityReceiver // startConnectivityReceiver
@ -183,12 +176,6 @@ public class ReceiverCoordinator
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.deviceOrientation)) if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.deviceOrientation))
DeviceOrientationListener.getInstance().startListener(AutomationService.getInstance()); DeviceOrientationListener.getInstance().startListener(AutomationService.getInstance());
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.tethering))
TetheringReceiver.getInstance().startListener(AutomationService.getInstance());
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.subSystemState))
SubSystemStateReceiver.getInstance().startListener(AutomationService.getInstance());
try try
{ {
Class testClass = Class.forName(ActivityManageRule.activityDetectionClassPath); Class testClass = Class.forName(ActivityManageRule.activityDetectionClassPath);
@ -212,9 +199,6 @@ public class ReceiverCoordinator
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.screenState)) if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.screenState))
ScreenStateReceiver.startScreenStateReceiver(AutomationService.getInstance()); ScreenStateReceiver.startScreenStateReceiver(AutomationService.getInstance());
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.calendarEvent) && ActivityPermissions.isPermissionDeclaratedInManifest(AutomationService.getInstance(), Manifest.permission.READ_CALENDAR) && ActivityPermissions.havePermission(Manifest.permission.READ_CALENDAR, AutomationService.getInstance()))
CalendarReceiver.startCalendarReceiver(AutomationService.getInstance());
} }
public static void stopAllReceivers() public static void stopAllReceivers()
@ -232,8 +216,6 @@ public class ReceiverCoordinator
ProcessListener.stopProcessListener(AutomationService.getInstance()); ProcessListener.stopProcessListener(AutomationService.getInstance());
MediaPlayerListener.getInstance().stopListener(AutomationService.getInstance()); MediaPlayerListener.getInstance().stopListener(AutomationService.getInstance());
DeviceOrientationListener.getInstance().stopListener(AutomationService.getInstance()); DeviceOrientationListener.getInstance().stopListener(AutomationService.getInstance());
TetheringReceiver.getInstance().stopListener(AutomationService.getInstance());
SubSystemStateReceiver.getInstance().stopListener(AutomationService.getInstance());
try try
{ {
@ -248,7 +230,6 @@ public class ReceiverCoordinator
BluetoothReceiver.stopBluetoothReceiver(); BluetoothReceiver.stopBluetoothReceiver();
HeadphoneJackListener.getInstance().stopListener(AutomationService.getInstance()); HeadphoneJackListener.getInstance().stopListener(AutomationService.getInstance());
DeviceOrientationListener.getInstance().stopListener(AutomationService.getInstance()); DeviceOrientationListener.getInstance().stopListener(AutomationService.getInstance());
CalendarReceiver.getInstance().stopListener(AutomationService.getInstance());
} }
catch(Exception e) catch(Exception e)
{ {
@ -337,7 +318,7 @@ public class ReceiverCoordinator
MediaPlayerListener.getInstance().stopListener(AutomationService.getInstance()); MediaPlayerListener.getInstance().stopListener(AutomationService.getInstance());
} }
if(!BuildConfig.FLAVOR.equalsIgnoreCase(AutomationService.flavor_name_fdroid)) if(!BuildConfig.FLAVOR.equalsIgnoreCase("fdroidFlavor"))
{ {
if (Rule.isAnyRuleUsing(Trigger.Trigger_Enum.activityDetection)) if (Rule.isAnyRuleUsing(Trigger.Trigger_Enum.activityDetection))
{ {
@ -402,7 +383,7 @@ public class ReceiverCoordinator
{ {
if(!HeadphoneJackListener.isHeadphoneJackListenerActive()) if(!HeadphoneJackListener.isHeadphoneJackListenerActive())
{ {
Miscellaneous.logEvent("i", "HeadphoneJackListener", "Starting HeadphoneJackListener because used in a new/changed rule.", 4); Miscellaneous.logEvent("i", "LocationProvider", "Starting HeadphoneJackListener because used in a new/changed rule.", 4);
if(HeadphoneJackListener.getInstance().haveAllPermission()) if(HeadphoneJackListener.getInstance().haveAllPermission())
HeadphoneJackListener.getInstance().startListener(AutomationService.getInstance()); HeadphoneJackListener.getInstance().startListener(AutomationService.getInstance());
} }
@ -411,7 +392,7 @@ public class ReceiverCoordinator
{ {
if(HeadphoneJackListener.isHeadphoneJackListenerActive()) if(HeadphoneJackListener.isHeadphoneJackListenerActive())
{ {
Miscellaneous.logEvent("i", "HeadphoneJackListener", "Shutting down HeadphoneJackListener because not used in any rule.", 4); Miscellaneous.logEvent("i", "LocationProvider", "Shutting down HeadphoneJackListener because not used in any rule.", 4);
HeadphoneJackListener.getInstance().stopListener(AutomationService.getInstance()); HeadphoneJackListener.getInstance().stopListener(AutomationService.getInstance());
} }
} }
@ -434,55 +415,6 @@ public class ReceiverCoordinator
} }
} }
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.tethering))
{
if(!TetheringReceiver.getInstance().isListenerRunning())
{
Miscellaneous.logEvent("i", "TetheringReceiver", "Starting TetheringReceiver because used in a new/changed rule.", 4);
// if(DevicePositionListener.getInstance().haveAllPermission())
TetheringReceiver.getInstance().startListener(AutomationService.getInstance());
}
}
else
{
if(TetheringReceiver.getInstance().isListenerRunning())
{
Miscellaneous.logEvent("i", "TetheringReceiver", "Shutting down TetheringReceiver because not used in any rule.", 4);
TetheringReceiver.getInstance().stopListener(AutomationService.getInstance());
}
}
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.subSystemState))
{
if(!SubSystemStateReceiver.getInstance().isListenerRunning())
{
Miscellaneous.logEvent("i", "SubSystemStateReceiver", "Starting SubSystemStateReceiver because used in a new/changed rule.", 4);
// if(DevicePositionListener.getInstance().haveAllPermission())
TetheringReceiver.getInstance().startListener(AutomationService.getInstance());
}
}
else
{
if(SubSystemStateReceiver.getInstance().isListenerRunning())
{
Miscellaneous.logEvent("i", "SubSystemStateReceiver", "Shutting down SubSystemStateReceiver because not used in any rule.", 4);
SubSystemStateReceiver.getInstance().stopListener(AutomationService.getInstance());
}
}
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.calendarEvent) && ActivityPermissions.isPermissionDeclaratedInManifest(AutomationService.getInstance(), Manifest.permission.READ_CALENDAR) && ActivityPermissions.havePermission(Manifest.permission.READ_CALENDAR, AutomationService.getInstance()))
{
if(!CalendarReceiver.getInstance().isListenerRunning())
CalendarReceiver.getInstance().startListener(AutomationService.getInstance());
else
CalendarReceiver.armOrRearmTimer();
}
else
{
if(CalendarReceiver.getInstance().isListenerRunning())
CalendarReceiver.getInstance().stopListener(AutomationService.getInstance());
}
AutomationService.updateNotification(); AutomationService.updateNotification();
} }
} }

View File

@ -65,10 +65,8 @@ public class Settings implements SharedPreferences
public static int tabsPlacement; public static int tabsPlacement;
public static boolean executeRulesAndProfilesWithSingleClick; public static boolean executeRulesAndProfilesWithSingleClick;
public static boolean displayNewsOnMainScreen; public static boolean displayNewsOnMainScreen;
public static boolean showToasts;
public static boolean automaticUpdateCheck; public static boolean automaticUpdateCheck;
public static long musicCheckFrequency; public static long musicCheckFrequency;
public static String displayLanguage;
public static boolean lockSoundChanges; public static boolean lockSoundChanges;
public static boolean noticeAndroid9MicrophoneShown; public static boolean noticeAndroid9MicrophoneShown;
@ -132,14 +130,11 @@ public class Settings implements SharedPreferences
public static final int default_tabsPlacement = 0; public static final int default_tabsPlacement = 0;
public static final boolean default_executeRulesAndProfilesWithSingleClick = false; public static final boolean default_executeRulesAndProfilesWithSingleClick = false;
public static final boolean default_displayNewsOnMainScreen = false; public static final boolean default_displayNewsOnMainScreen = false;
public static final boolean default_showToasts = true;
public static final boolean default_automaticUpdateCheck = false; public static final boolean default_automaticUpdateCheck = false;
public static final boolean default_lockSoundChanges = false; public static final boolean default_lockSoundChanges = false;
public static final long default_lastNewsPolltime = -1; public static final long default_lastNewsPolltime = -1;
public static final long default_lastUpdateCheck = -1; public static final long default_lastUpdateCheck = -1;
public static final long default_musicCheckFrequency = 2500; public static final long default_musicCheckFrequency = 2500;
public static final String default_displayLanguage = "systemDefaultLanguage";
@Override @Override
public boolean contains(String arg0) public boolean contains(String arg0)
@ -149,45 +144,56 @@ public class Settings implements SharedPreferences
@Override @Override
public Editor edit() public Editor edit()
{ {
// TODO Auto-generated method stub
return null; return null;
} }
@Override @Override
public Map<String, ?> getAll() public Map<String, ?> getAll()
{ {
// TODO Auto-generated method stub
return null; return null;
} }
@Override @Override
public boolean getBoolean(String arg0, boolean arg1) public boolean getBoolean(String arg0, boolean arg1)
{ {
// TODO Auto-generated method stub
return false; return false;
} }
@Override @Override
public float getFloat(String arg0, float arg1) public float getFloat(String arg0, float arg1)
{ {
// TODO Auto-generated method stub
return 0; return 0;
} }
@Override @Override
public int getInt(String arg0, int arg1) public int getInt(String arg0, int arg1)
{ {
// TODO Auto-generated method stub
return 0; return 0;
} }
@Override @Override
public long getLong(String arg0, long arg1) public long getLong(String arg0, long arg1)
{ {
// TODO Auto-generated method stub
return 0; return 0;
} }
@Override @Override
public String getString(String arg0, String arg1) public String getString(String arg0, String arg1)
{ {
// TODO Auto-generated method stub
return null; return null;
} }
@Override @Override
public void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener arg0) public void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener arg0)
{ {
// TODO Auto-generated method stub
} }
@Override @Override
public void unregisterOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener arg0) public void unregisterOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener arg0)
{ {
// TODO Auto-generated method stub
} }
public static void readFromPersistentStorage(Context context) public static void readFromPersistentStorage(Context context)
@ -264,7 +270,6 @@ public class Settings implements SharedPreferences
tabsPlacement = Integer.parseInt(prefs.getString("tabsPlacement", String.valueOf(default_tabsPlacement))); tabsPlacement = Integer.parseInt(prefs.getString("tabsPlacement", String.valueOf(default_tabsPlacement)));
musicCheckFrequency = Long.parseLong(prefs.getString("musicCheckFrequency", String.valueOf(default_musicCheckFrequency))); musicCheckFrequency = Long.parseLong(prefs.getString("musicCheckFrequency", String.valueOf(default_musicCheckFrequency)));
displayLanguage = prefs.getString("displayLanguage", default_displayLanguage);
if(Settings.musicCheckFrequency == 0) if(Settings.musicCheckFrequency == 0)
Settings.musicCheckFrequency = Settings.default_musicCheckFrequency; Settings.musicCheckFrequency = Settings.default_musicCheckFrequency;
@ -272,7 +277,6 @@ public class Settings implements SharedPreferences
executeRulesAndProfilesWithSingleClick = prefs.getBoolean("executeRulesAndProfilesWithSingleClick", default_executeRulesAndProfilesWithSingleClick); executeRulesAndProfilesWithSingleClick = prefs.getBoolean("executeRulesAndProfilesWithSingleClick", default_executeRulesAndProfilesWithSingleClick);
automaticUpdateCheck = prefs.getBoolean("automaticUpdateCheck", default_automaticUpdateCheck); automaticUpdateCheck = prefs.getBoolean("automaticUpdateCheck", default_automaticUpdateCheck);
displayNewsOnMainScreen = prefs.getBoolean("displayNewsOnMainScreen", default_displayNewsOnMainScreen); displayNewsOnMainScreen = prefs.getBoolean("displayNewsOnMainScreen", default_displayNewsOnMainScreen);
showToasts = prefs.getBoolean("showToasts", default_showToasts);
lockSoundChanges = prefs.getBoolean("lockSoundChanges", default_lockSoundChanges); lockSoundChanges = prefs.getBoolean("lockSoundChanges", default_lockSoundChanges);
noticeAndroid9MicrophoneShown = prefs.getBoolean("noticeAndroid9MicrophoneShown", false); noticeAndroid9MicrophoneShown = prefs.getBoolean("noticeAndroid9MicrophoneShown", false);
@ -468,15 +472,9 @@ public class Settings implements SharedPreferences
if(!prefs.contains("displayNewsOnMainScreen") || force) if(!prefs.contains("displayNewsOnMainScreen") || force)
editor.putBoolean("displayNewsOnMainScreen", default_displayNewsOnMainScreen); editor.putBoolean("displayNewsOnMainScreen", default_displayNewsOnMainScreen);
if(!prefs.contains("showToasts") || force)
editor.putBoolean("showToasts", default_showToasts);
if(!prefs.contains("musicCheckFrequency") || force) if(!prefs.contains("musicCheckFrequency") || force)
editor.putLong("musicCheckFrequency", default_musicCheckFrequency); editor.putLong("musicCheckFrequency", default_musicCheckFrequency);
if(!prefs.contains("displayLanguage") || force)
editor.putString("displayLanguage", default_displayLanguage);
if(!prefs.contains("lockSoundChanges") || force) if(!prefs.contains("lockSoundChanges") || force)
editor.putBoolean("lockSoundChanges", default_lockSoundChanges); editor.putBoolean("lockSoundChanges", default_lockSoundChanges);
@ -557,14 +555,11 @@ public class Settings implements SharedPreferences
editor.putBoolean("executeRulesAndProfilesWithSingleClick", executeRulesAndProfilesWithSingleClick); editor.putBoolean("executeRulesAndProfilesWithSingleClick", executeRulesAndProfilesWithSingleClick);
editor.putBoolean("automaticUpdateCheck", automaticUpdateCheck); editor.putBoolean("automaticUpdateCheck", automaticUpdateCheck);
editor.putBoolean("displayNewsOnMainScreen", displayNewsOnMainScreen); editor.putBoolean("displayNewsOnMainScreen", displayNewsOnMainScreen);
editor.putBoolean("showToasts", showToasts);
if(Settings.musicCheckFrequency == 0) if(Settings.musicCheckFrequency == 0)
Settings.musicCheckFrequency = Settings.default_musicCheckFrequency; Settings.musicCheckFrequency = Settings.default_musicCheckFrequency;
editor.putString("musicCheckFrequency", String.valueOf(musicCheckFrequency)); editor.putString("musicCheckFrequency", String.valueOf(musicCheckFrequency));
editor.putString("displayLanguage", displayLanguage);
editor.putBoolean("lockSoundChanges", lockSoundChanges); editor.putBoolean("lockSoundChanges", lockSoundChanges);
editor.putBoolean("noticeAndroid9MicrophoneShown", noticeAndroid9MicrophoneShown); editor.putBoolean("noticeAndroid9MicrophoneShown", noticeAndroid9MicrophoneShown);
editor.putBoolean("noticeAndroid10WifiShown", noticeAndroid10WifiShown); editor.putBoolean("noticeAndroid10WifiShown", noticeAndroid10WifiShown);
@ -608,6 +603,7 @@ public class Settings implements SharedPreferences
@Override @Override
public Set<String> getStringSet(String arg0, Set<String> arg1) public Set<String> getStringSet(String arg0, Set<String> arg1)
{ {
// TODO Auto-generated method stub
return null; return null;
} }
} }

View File

@ -2,7 +2,6 @@ package com.jens.automation2;
import java.sql.Time; import java.sql.Time;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
public class TimeFrame public class TimeFrame
{ {
@ -21,19 +20,18 @@ public class TimeFrame
public void setDayList(ArrayList<Integer> dayList) public void setDayList(ArrayList<Integer> dayList)
{ {
this.dayList = dayList; this.dayList = dayList;
Collections.sort(dayList);
} }
public void setDayListFromString(String dayListString) public void setDayListFromString(String dayListString)
{ {
// Log.i("Parsing", "Full string: " + dayListString);
char[] dayListCharArray = dayListString.toCharArray(); char[] dayListCharArray = dayListString.toCharArray();
dayList = new ArrayList<Integer>(); dayList = new ArrayList<Integer>();
for(char item : dayListCharArray) for(char item : dayListCharArray)
{ {
// Log.i("Parsing", String.valueOf(item));
dayList.add(Integer.parseInt(String.valueOf(item))); dayList.add(Integer.parseInt(String.valueOf(item)));
} }
Collections.sort(dayList);
} }
public TimeObject getTriggerTimeStart() public TimeObject getTriggerTimeStart()

View File

@ -1,7 +1,5 @@
package com.jens.automation2; package com.jens.automation2;
import androidx.annotation.NonNull;
import java.sql.Time; import java.sql.Time;
public class TimeObject public class TimeObject
@ -67,12 +65,4 @@ public class TimeObject
return ro; return ro;
} }
@NonNull
@Override
public String toString()
{
Time time = Time.valueOf(this.getHours() + ":" + this.getMinutes() + ":" + this.getSeconds());
return time.toString();
}
} }

File diff suppressed because it is too large Load Diff

View File

@ -160,9 +160,9 @@ public class XmlFileInterface
serializer.text(String.valueOf(Profile.getProfileCollection().get(i).getChangeIncomingCallsRingtone())); serializer.text(String.valueOf(Profile.getProfileCollection().get(i).getChangeIncomingCallsRingtone()));
serializer.endTag(null, "changeIncomingCallsRingtone");// serializer.endTag(null, "changeIncomingCallsRingtone");//
serializer.startTag(null, "incomingCallsRingtone"); serializer.startTag(null, "incomingCallsRingtone");
String incomingFile = Profile.getProfileCollection().get(i).getIncomingCallsRingtone(); File incomingFile = Profile.getProfileCollection().get(i).getIncomingCallsRingtone();
if(incomingFile != null) if(incomingFile != null)
serializer.text(String.valueOf(Profile.getProfileCollection().get(i).getIncomingCallsRingtone())); serializer.text(String.valueOf(Profile.getProfileCollection().get(i).getIncomingCallsRingtone().getPath()));
else else
serializer.text("null"); serializer.text("null");
serializer.endTag(null, "incomingCallsRingtone"); serializer.endTag(null, "incomingCallsRingtone");
@ -178,9 +178,9 @@ public class XmlFileInterface
serializer.text(String.valueOf(Profile.getProfileCollection().get(i).getChangeNotificationRingtone())); serializer.text(String.valueOf(Profile.getProfileCollection().get(i).getChangeNotificationRingtone()));
serializer.endTag(null, "changeNotificationRingtone");// serializer.endTag(null, "changeNotificationRingtone");//
serializer.startTag(null, "notificationRingtone"); serializer.startTag(null, "notificationRingtone");
String notificationFile = Profile.getProfileCollection().get(i).getNotificationRingtone(); File notificationFile = Profile.getProfileCollection().get(i).getNotificationRingtone();
if(notificationFile != null) if(notificationFile != null)
serializer.text(String.valueOf(Profile.getProfileCollection().get(i).getNotificationRingtone())); serializer.text(String.valueOf(Profile.getProfileCollection().get(i).getNotificationRingtone().getPath()));
else else
serializer.text("null"); serializer.text("null");
serializer.endTag(null, "notificationRingtone"); serializer.endTag(null, "notificationRingtone");
@ -631,7 +631,7 @@ public class XmlFileInterface
{ {
String path = readTag(parser, "incomingCallsRingtone"); String path = readTag(parser, "incomingCallsRingtone");
if(!path.equals("null")) if(!path.equals("null"))
newProfile.setIncomingCallsRingtone(path); newProfile.setIncomingCallsRingtone(new File(path));
else else
newProfile.setIncomingCallsRingtone(null); newProfile.setIncomingCallsRingtone(null);
} }
@ -643,7 +643,7 @@ public class XmlFileInterface
{ {
String path = readTag(parser, "notificationRingtone"); String path = readTag(parser, "notificationRingtone");
if(!path.equals("null")) if(!path.equals("null"))
newProfile.setNotificationRingtone(path); newProfile.setNotificationRingtone(new File(path));
else else
newProfile.setNotificationRingtone(null); newProfile.setNotificationRingtone(null);
} }
@ -1286,24 +1286,20 @@ public class XmlFileInterface
else else
newTag = tag.replace("/", Action.intentPairSeparator); newTag = tag.replace("/", Action.intentPairSeparator);
String[] newTagPieces = new String[0]; String[] newTagPieces = newTag.split(";");
if(newTag.contains(Action.actionParameter2Split))
newTagPieces = newTag.split(Action.actionParameter2Split);
else
newTag.split(";");
if(newTagPieces.length < 2 || (!newTagPieces[0].contains(Actions.dummyPackageString) && newTagPieces[1].contains(Action.intentPairSeparator))) if(newTagPieces.length < 2 || (!newTagPieces[0].contains(Actions.dummyPackageString) && newTagPieces[1].contains(Action.intentPairSeparator)))
{ {
newTag = Actions.dummyPackageString + Action.actionParameter2Split + newTag; newTag = Actions.dummyPackageString + ";" + newTag;
newTagPieces = newTag.split(Action.actionParameter2Split); newTagPieces = newTag.split(";");
} }
if(newTagPieces.length < 3) if(newTagPieces.length < 3)
newTag += Action.actionParameter2Split + ActivityManageActionStartActivity.startByActivityString; newTag += ";" + ActivityManageActionStartActivity.startByActivityString;
else if(newTagPieces.length >= 3) else if(newTagPieces.length >= 3)
{ {
if(newTagPieces[2].contains(Action.intentPairSeparator)) if(newTagPieces[2].contains(Action.intentPairSeparator))
newTag = newTagPieces[0] + Action.actionParameter2Split + newTagPieces[1] + Action.actionParameter2Split + ActivityManageActionStartActivity.startByActivityString + Action.actionParameter2Split + newTagPieces[2]; newTag = newTagPieces[0] + ";" + newTagPieces[1] + ";" + ActivityManageActionStartActivity.startByActivityString + ";" + newTagPieces[2];
} }
newAction.setParameter2(newTag); newAction.setParameter2(newTag);

View File

@ -272,23 +272,29 @@ public class CellLocationChangedReceiver extends PhoneStateListener
locationListenerArmed = false; locationListenerArmed = false;
Miscellaneous.logEvent("i", "LocationListener", "Disarmed location listener, accuracy reached", 4); Miscellaneous.logEvent("i", "LocationListener", "Disarmed location listener, accuracy reached", 4);
} }
// Miscellaneous.logEvent("i", "LocationListener", "Giving update to POI class");
// PointOfInterest.positionUpdate(up2DateLocation, parentLocationProvider.parentService);
} }
@Override @Override
public void onProviderDisabled(String provider) public void onProviderDisabled(String provider)
{ {
// TODO Auto-generated method stub
} }
@Override @Override
public void onProviderEnabled(String provider) public void onProviderEnabled(String provider)
{ {
// TODO Auto-generated method stub
} }
@Override @Override
public void onStatusChanged(String provider, int status, Bundle extras) public void onStatusChanged(String provider, int status, Bundle extras)
{ {
// TODO Auto-generated method stub
} }
} }

View File

@ -7,11 +7,11 @@ import android.location.LocationManager;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.Message; import android.os.Message;
import android.telephony.TelephonyManager;
import android.util.Log; import android.util.Log;
import com.jens.automation2.ActivityMainScreen; import com.jens.automation2.ActivityMainScreen;
import com.jens.automation2.AutomationService; import com.jens.automation2.AutomationService;
import com.jens.automation2.BuildConfig;
import com.jens.automation2.Miscellaneous; import com.jens.automation2.Miscellaneous;
import com.jens.automation2.PointOfInterest; import com.jens.automation2.PointOfInterest;
import com.jens.automation2.R; import com.jens.automation2.R;
@ -233,7 +233,6 @@ public class LocationProvider
public void startLocationService() public void startLocationService()
{ {
// startPhoneStateListener // startPhoneStateListener
if(!BuildConfig.FLAVOR.equals(AutomationService.flavor_name_googleplay))
PhoneStatusListener.startPhoneStatusListener(parentService); // also used to mute anouncements during calls PhoneStatusListener.startPhoneStatusListener(parentService); // also used to mute anouncements during calls
// startConnectivityReceiver // startConnectivityReceiver
@ -402,12 +401,12 @@ public class LocationProvider
Miscellaneous.logEvent("i", "LocationProvider", this.getParentService().getResources().getString(R.string.applyingSettingsAndRules), 3); Miscellaneous.logEvent("i", "LocationProvider", this.getParentService().getResources().getString(R.string.applyingSettingsAndRules), 3);
// *********** SETTING CHANGES *********** // *********** SETTING CHANGES ***********
if(Settings.useWifiForPositioning && !WifiBroadcastReceiver.isWifiListenerActive() || Rule.isAnyRuleUsing(Trigger_Enum.wifiConnection)) if(Settings.useWifiForPositioning && !WifiBroadcastReceiver.isWifiListenerActive())
{ {
Miscellaneous.logEvent("i", "LocationProvider", "Starting WifiReceiver because settings now allow to.", 4); Miscellaneous.logEvent("i", "LocationProvider", "Starting WifiReceiver because settings now allow to.", 4);
WifiBroadcastReceiver.startWifiReceiver(this); WifiBroadcastReceiver.startWifiReceiver(this);
} }
else if(!Settings.useWifiForPositioning && WifiBroadcastReceiver.isWifiListenerActive() && !Rule.isAnyRuleUsing(Trigger_Enum.wifiConnection)) else if(!Settings.useWifiForPositioning && WifiBroadcastReceiver.isWifiListenerActive())
{ {
Miscellaneous.logEvent("i", "LocationProvider", "Shutting down WifiReceiver because settings forbid to.", 4); Miscellaneous.logEvent("i", "LocationProvider", "Shutting down WifiReceiver because settings forbid to.", 4);
WifiBroadcastReceiver.stopWifiReceiver(); WifiBroadcastReceiver.stopWifiReceiver();
@ -486,6 +485,7 @@ public class LocationProvider
} }
} }
public static void resetSpeedTimer(Calendar timeOfForcedLocationCheck) public static void resetSpeedTimer(Calendar timeOfForcedLocationCheck)
{ {
if(speedTimerActive) if(speedTimerActive)

View File

@ -1,5 +1,6 @@
package com.jens.automation2.location; package com.jens.automation2.location;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@ -17,8 +18,6 @@ import com.jens.automation2.Rule;
import com.jens.automation2.Settings; import com.jens.automation2.Settings;
import com.jens.automation2.Trigger; import com.jens.automation2.Trigger;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList; import java.util.ArrayList;
public class WifiBroadcastReceiver extends BroadcastReceiver public class WifiBroadcastReceiver extends BroadcastReceiver
@ -26,19 +25,11 @@ public class WifiBroadcastReceiver extends BroadcastReceiver
public static LocationProvider parentLocationProvider; public static LocationProvider parentLocationProvider;
public static Boolean wasConnected = false; public static Boolean wasConnected = false;
protected static String lastWifiSsid = ""; protected static String lastWifiSsid = "";
protected static String lastWifiSsidReal = "";
public static boolean lastConnectedState = false; public static boolean lastConnectedState = false;
protected static boolean mayCellLocationChangedReceiverBeActivatedFromWifiPointOfView = true; protected static boolean mayCellLocationChangedReceiverBeActivatedFromWifiPointOfWifi = true;
protected static WifiBroadcastReceiver wifiBrInstance; protected static WifiBroadcastReceiver wifiBrInstance;
protected static IntentFilter wifiListenerIntentFilter; protected static IntentFilter wifiListenerIntentFilter;
protected static boolean wifiListenerActive = false; protected static boolean wifiListenerActive=false;
final static String unknownSsidName = "<unknown ssid>";
public static String getLastWifiSsidReal()
{
return lastWifiSsidReal;
}
public static String getLastWifiSsid() public static String getLastWifiSsid()
{ {
@ -47,19 +38,12 @@ public class WifiBroadcastReceiver extends BroadcastReceiver
public static void setLastWifiSsid(String newWifiSsid) public static void setLastWifiSsid(String newWifiSsid)
{ {
// Remove double quotes that sometimes come
if(newWifiSsid.startsWith("\"") && newWifiSsid.endsWith("\"")) if(newWifiSsid.startsWith("\"") && newWifiSsid.endsWith("\""))
newWifiSsid = newWifiSsid.substring(1, newWifiSsid.length()-1); newWifiSsid = newWifiSsid.substring(1, newWifiSsid.length()-1);
// If it's a real name, not an empty string, it's stored as the last ssid
if(newWifiSsid.length() > 0) if(newWifiSsid.length() > 0)
{
if(!newWifiSsid.equals(unknownSsidName))
WifiBroadcastReceiver.lastWifiSsidReal = lastWifiSsid;
WifiBroadcastReceiver.lastWifiSsid = newWifiSsid; WifiBroadcastReceiver.lastWifiSsid = newWifiSsid;
} }
}
public static boolean isWifiListenerActive() public static boolean isWifiListenerActive()
{ {
@ -68,7 +52,7 @@ public class WifiBroadcastReceiver extends BroadcastReceiver
public static boolean mayCellLocationReceiverBeActivated() public static boolean mayCellLocationReceiverBeActivated()
{ {
return mayCellLocationChangedReceiverBeActivatedFromWifiPointOfView; return mayCellLocationChangedReceiverBeActivatedFromWifiPointOfWifi;
} }
@Override @Override
@ -76,19 +60,29 @@ public class WifiBroadcastReceiver extends BroadcastReceiver
{ {
try try
{ {
if(!StringUtils.isEmpty(intent.getAction())) // int state = -1;
Miscellaneous.logEvent("i", "WifiReceiver", "Received signal with action \""+ intent.getAction() + "\".", 4);
else
Miscellaneous.logEvent("i", "WifiReceiver", "Received signal with empty action.", 4);
NetworkInfo myWifi = null; NetworkInfo myWifi = null;
if(intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) // fired upon disconnection // if(intent.getAction().equals(WifiManager.RSSI_CHANGED_ACTION)) //gefeuert bei Verbindung
// {
// Miscellaneous.logEvent("i", "WifiReceiver", "RSSI_CHANGED_ACTION: " + String.valueOf(intent.getIntExtra(WifiManager.RSSI_CHANGED_ACTION, -1)));
// }
// else
if(intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) //gefeuert bei Trennung
{ {
// state = intent.getIntExtra(WifiManager.NETWORK_STATE_CHANGED_ACTION, -1);
// Miscellaneous.logEvent("i", "WifiReceiver", "NETWORK_STATE_CHANGED_ACTION: " + String.valueOf(state));
myWifi = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); myWifi = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
} }
WifiManager myWifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE); WifiManager myWifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
// ConnectivityManager connManager = (ConnectivityManager)context.getSystemService(context.CONNECTIVITY_SERVICE);
// myWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
// myWifi = state
// WifiInfo wifiInfo = myWifiManager.getConnectionInfo();
// SupplicantState supState = wifiInfo.getSupplicantState();
if(intent.getAction().equals(WifiManager.RSSI_CHANGED_ACTION)) // fired upon connection if(intent.getAction().equals(WifiManager.RSSI_CHANGED_ACTION)) // fired upon connection
{ {
@ -101,14 +95,8 @@ public class WifiBroadcastReceiver extends BroadcastReceiver
if(Settings.useWifiForPositioning && PointOfInterest.reachedPoiWithActivateWifiRule()) // Poi has wifi if(Settings.useWifiForPositioning && PointOfInterest.reachedPoiWithActivateWifiRule()) // Poi has wifi
{ {
Miscellaneous.logEvent("i", "WifiReceiver", context.getResources().getString(R.string.poiHasWifiStoppingCellLocationListener), 2); Miscellaneous.logEvent("i", "WifiReceiver", context.getResources().getString(R.string.poiHasWifiStoppingCellLocationListener), 2);
mayCellLocationChangedReceiverBeActivatedFromWifiPointOfView = false; mayCellLocationChangedReceiverBeActivatedFromWifiPointOfWifi = false;
CellLocationChangedReceiver.stopCellLocationChangedReceiver(); CellLocationChangedReceiver.stopCellLocationChangedReceiver();
/*
TODO: Every time the screen is turned on, we receive a "wifi has been connected"-event.
This is technically wrong and not really any change to when the screen was off. It has
to be filtered.
*/
} }
else else
{ {
@ -122,7 +110,7 @@ public class WifiBroadcastReceiver extends BroadcastReceiver
{ {
wasConnected = true; wasConnected = true;
Miscellaneous.logEvent("i", "WifiReceiver", "WifiReceiver just activated. Wifi already connected. Stopping CellLocationReceiver", 3); Miscellaneous.logEvent("i", "WifiReceiver", "WifiReceiver just activated. Wifi already connected. Stopping CellLocationReceiver", 3);
mayCellLocationChangedReceiverBeActivatedFromWifiPointOfView = false; mayCellLocationChangedReceiverBeActivatedFromWifiPointOfWifi = false;
CellLocationChangedReceiver.stopCellLocationChangedReceiver(); CellLocationChangedReceiver.stopCellLocationChangedReceiver();
SensorActivity.stopAccelerometerTimer(); SensorActivity.stopAccelerometerTimer();
String ssid = myWifiManager.getConnectionInfo().getSSID(); String ssid = myWifiManager.getConnectionInfo().getSSID();
@ -132,13 +120,13 @@ public class WifiBroadcastReceiver extends BroadcastReceiver
} }
else if(!myWifi.isConnectedOrConnecting()) // really disconnected? because sometimes also fires on connect else if(!myWifi.isConnectedOrConnecting()) // really disconnected? because sometimes also fires on connect
{ {
if(wasConnected) // we could simply not be home yet if(wasConnected) // wir könnten einfach noch nicht daheim sein
{ {
try try
{ {
wasConnected = false; wasConnected = false;
Miscellaneous.logEvent("i", "WifiReceiver", "Disconnected from wifi \"" + getLastWifiSsid() + "\". Switching to CellLocationChangedReceiver.", 3); Miscellaneous.logEvent("i", "WifiReceiver", String.format(context.getResources().getString(R.string.disconnectedFromWifi), getLastWifiSsid()) + " Switching to CellLocationChangedReceiver.", 3);
mayCellLocationChangedReceiverBeActivatedFromWifiPointOfView = true; mayCellLocationChangedReceiverBeActivatedFromWifiPointOfWifi = true;
CellLocationChangedReceiver.startCellLocationChangedReceiver(); CellLocationChangedReceiver.startCellLocationChangedReceiver();
lastConnectedState = false; lastConnectedState = false;
findRules(AutomationService.getInstance()); findRules(AutomationService.getInstance());
@ -226,16 +214,17 @@ public class WifiBroadcastReceiver extends BroadcastReceiver
{ {
try try
{ {
if (wifiListenerActive) if(wifiListenerActive)
{ {
Miscellaneous.logEvent("i", "Wifi Listener", "Stopping wifiListener", 4); Miscellaneous.logEvent("i", "Wifi Listener", "Stopping wifiListener", 4);
wifiListenerActive = false; wifiListenerActive = false;
parentLocationProvider.getParentService().unregisterReceiver(wifiBrInstance); parentLocationProvider.getParentService().unregisterReceiver(wifiBrInstance);
} }
} }
catch (Exception ex) catch(Exception ex)
{ {
Miscellaneous.logEvent("e", "Wifi Listener", "Error stopping wifiListener: " + Log.getStackTraceString(ex), 3); Miscellaneous.logEvent("e", "Wifi Listener", "Error stopping wifiListener: " + Log.getStackTraceString(ex), 3);
} }
} }
} }

View File

@ -7,6 +7,7 @@ import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.os.BatteryManager; import android.os.BatteryManager;
import android.util.Log; import android.util.Log;
import android.widget.Toast;
import com.jens.automation2.ActivityPermissions; import com.jens.automation2.ActivityPermissions;
import com.jens.automation2.AutomationService; import com.jens.automation2.AutomationService;
@ -18,16 +19,14 @@ import java.util.ArrayList;
public class BatteryReceiver extends BroadcastReceiver implements AutomationListenerInterface public class BatteryReceiver extends BroadcastReceiver implements AutomationListenerInterface
{ {
private static int batteryLevel = -1; // initialize with a better value than this
public static AutomationService automationServiceRef = null; public static AutomationService automationServiceRef = null;
static int batteryLevel = -1; // initialize with a better value than this private static boolean usbHostConnected = false;
static boolean usbHostConnected = false;
static boolean batteryReceiverActive = false;
static IntentFilter batteryIntentFilter = null;
static Intent batteryStatus = null;
private static int currentChargingState = 0; //0=unknown, 1=no, 2=yes private static boolean batteryReceiverActive = false;
private static int currentChargingType = 0; //AC, wireless, USB private static IntentFilter batteryIntentFilter = null;
static BroadcastReceiver batteryInfoReceiverInstance = null; private static Intent batteryStatus = null;
private static BroadcastReceiver batteryInfoReceiverInstance = null;
public static void startBatteryReceiver(final AutomationService automationServiceRef) public static void startBatteryReceiver(final AutomationService automationServiceRef)
{ {
@ -43,6 +42,8 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList
batteryIntentFilter = new IntentFilter(); batteryIntentFilter = new IntentFilter();
batteryIntentFilter.addAction(Intent.ACTION_BATTERY_CHANGED); batteryIntentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
batteryIntentFilter.addAction(Intent.ACTION_BATTERY_LOW); batteryIntentFilter.addAction(Intent.ACTION_BATTERY_LOW);
// batteryIntentFilter.addAction(Intent.ACTION_POWER_CONNECTED);
// batteryIntentFilter.addAction(Intent.ACTION_POWER_DISCONNECTED);
} }
batteryStatus = automationServiceRef.registerReceiver(batteryInfoReceiverInstance, batteryIntentFilter); batteryStatus = automationServiceRef.registerReceiver(batteryInfoReceiverInstance, batteryIntentFilter);
@ -79,6 +80,8 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList
return batteryLevel; return batteryLevel;
} }
private static int currentChargingState = 0; //0=unknown, 1=no, 2=yes
public static int getCurrentChargingState() public static int getCurrentChargingState()
{ {
return currentChargingState; return currentChargingState;
@ -87,7 +90,7 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList
@Override @Override
public void onReceive(Context context, Intent intent) public void onReceive(Context context, Intent intent)
{ {
Miscellaneous.logEvent("i", "BatteryReceiver", "Received event " + intent.getAction(), 5); // Log.i("Battery", "Some battery event");
if (intent == null) if (intent == null)
return; return;
@ -121,12 +124,7 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList
case BatteryManager.BATTERY_PLUGGED_AC: case BatteryManager.BATTERY_PLUGGED_AC:
// Toast.makeText(context, "Regular charging", Toast.LENGTH_LONG).show(); // Toast.makeText(context, "Regular charging", Toast.LENGTH_LONG).show();
Miscellaneous.logEvent("i", "BatteryReceiver", "Regular charging.", 5); Miscellaneous.logEvent("i", "BatteryReceiver", "Regular charging.", 5);
this.actionCharging(context, statusPlugged); this.actionCharging(context);
break;
case BatteryManager.BATTERY_PLUGGED_WIRELESS:
// Toast.makeText(context, "Regular charging", Toast.LENGTH_LONG).show();
Miscellaneous.logEvent("i", "BatteryReceiver", "Wireless charging.", 5);
this.actionCharging(context, statusPlugged);
break; break;
case BatteryManager.BATTERY_PLUGGED_USB: case BatteryManager.BATTERY_PLUGGED_USB:
this.actionUsbConnected(context); this.actionUsbConnected(context);
@ -135,13 +133,11 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList
switch(status) switch(status)
{ {
case BatteryManager.BATTERY_STATUS_CHARGING:
case BatteryManager.BATTERY_STATUS_FULL: case BatteryManager.BATTERY_STATUS_FULL:
// Miscellaneous.logEvent("i", "BatteryReceiver", "Device has been fully charged.", 5); Miscellaneous.logEvent("i", "BatteryReceiver", "Device has been fully charged.", 5);
this.actionCharging(context, statusPlugged); this.actionCharging(context);
break; break;
case BatteryManager.BATTERY_STATUS_DISCHARGING: case BatteryManager.BATTERY_STATUS_DISCHARGING:
case BatteryManager.BATTERY_STATUS_NOT_CHARGING:
this.actionDischarging(context); this.actionDischarging(context);
break; break;
} }
@ -158,33 +154,28 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList
switch(currentChargingState) switch(currentChargingState)
{ {
case 0: case 0:
Miscellaneous.logEvent("w", "ChargingInfo", "Information isn't available, yet.", 4); Miscellaneous.logEvent("w", "ChargingInfo", "Status of device charging was requested. Information isn't available, yet.", 4);
break; break;
case 1: case 1:
Miscellaneous.logEvent("i", "ChargingInfo", "Device is discharging.", 3); Miscellaneous.logEvent("i", "ChargingInfo", "Status of device charging was requested. Device is discharging.", 3);
break; break;
case BatteryManager.BATTERY_STATUS_CHARGING: case BatteryManager.BATTERY_STATUS_CHARGING:
Miscellaneous.logEvent("i", "ChargingInfo", "Device is charging.", 3); Miscellaneous.logEvent("i", "ChargingInfo", "Status of device charging was requested. Device is charging.", 3);
break; break;
} }
return currentChargingState; return currentChargingState;
} }
public static int getCurrentChargingType() private void actionCharging(Context context)
{
return currentChargingType;
}
private void actionCharging(Context context, int statusPlugged)
{ {
if(currentChargingState != BatteryManager.BATTERY_STATUS_CHARGING) // Avoid flooding the log. This event will occur on a regular basis even though charging state wasn't changed. if(currentChargingState != BatteryManager.BATTERY_STATUS_CHARGING) // Avoid flooding the log. This event will occur on a regular basis even though charging state wasn't changed.
{ {
Miscellaneous.logEvent("i", "BatteryReceiver", "Battery is charging or full.", 3); Miscellaneous.logEvent("i", "BatteryReceiver", "Battery is charging or full.", 3);
currentChargingState = BatteryManager.BATTERY_STATUS_CHARGING; currentChargingState = BatteryManager.BATTERY_STATUS_CHARGING;
currentChargingType = statusPlugged; //activate rule(s)
ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.charging); ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.charging);
// ArrayList<Rule> ruleCandidates = Rule.findRuleCandidatesByCharging(true);
for(int i=0; i<ruleCandidates.size(); i++) for(int i=0; i<ruleCandidates.size(); i++)
{ {
if(ruleCandidates.get(i).getsGreenLight(context)) if(ruleCandidates.get(i).getsGreenLight(context))
@ -234,16 +225,17 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList
{ {
usbHostConnected = true; usbHostConnected = true;
Miscellaneous.logEvent("i", "BatteryReceiver", "Connected to computer.", 3); Miscellaneous.logEvent("i", "BatteryReceiver", "Connected to computer.", 3);
// Toast.makeText(context, "Connected to computer.", Toast.LENGTH_LONG).show(); Toast.makeText(context, "Connected to computer.", Toast.LENGTH_LONG).show();
ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.usb_host_connection); ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.usb_host_connection);
// ArrayList<Rule> ruleCandidates = Rule.findRuleCandidatesByUsbHost(true);
for(Rule oneRule : ruleCandidates) for(Rule oneRule : ruleCandidates)
{ {
if(oneRule.getsGreenLight(context)) if(oneRule.getsGreenLight(context))
oneRule.activate(automationServiceRef, false); oneRule.activate(automationServiceRef, false);
} }
this.actionCharging(context, BatteryManager.BATTERY_PLUGGED_USB); this.actionCharging(context);
} }
} }
@ -255,7 +247,7 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList
{ {
usbHostConnected = false; usbHostConnected = false;
Miscellaneous.logEvent("i", "BatteryReceiver", "Disconnected from computer.", 3); Miscellaneous.logEvent("i", "BatteryReceiver", "Disconnected from computer.", 3);
// Toast.makeText(context, "Disconnected from computer.", Toast.LENGTH_LONG).show(); Toast.makeText(context, "Disconnected from computer.", Toast.LENGTH_LONG).show();
ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.usb_host_connection); ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.usb_host_connection);
// ArrayList<Rule> ruleCandidates = Rule.findRuleCandidatesByUsbHost(false); // ArrayList<Rule> ruleCandidates = Rule.findRuleCandidatesByUsbHost(false);

View File

@ -94,13 +94,12 @@ public class BluetoothReceiver extends BroadcastReceiver implements AutomationLi
@Override @Override
public void onReceive(Context context, Intent intent) public void onReceive(Context context, Intent intent)
{ {
// Miscellaneous.logEvent("i", "BluetoothReceiver", "Bluetooth event.", 4);
String action = intent.getAction(); String action = intent.getAction();
Miscellaneous.logEvent("i", "BluetoothReceiver", "Bluetooth event: " + action, 5);
BluetoothDevice bluetoothDevice = null; BluetoothDevice bluetoothDevice = null;
if(action.equals(BluetoothDevice.ACTION_ACL_CONNECTED) || action.equals("android.bluetooth.device.action.ACL_CONNECTED")) if(action.equals(BluetoothDevice.ACTION_ACL_CONNECTED) | action.equals("android.bluetooth.device.action.ACL_CONNECTED"))
{ {
bluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); bluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
lastAffectedDevice = bluetoothDevice; lastAffectedDevice = bluetoothDevice;
@ -108,7 +107,7 @@ public class BluetoothReceiver extends BroadcastReceiver implements AutomationLi
connectedDevices.add(bluetoothDevice); connectedDevices.add(bluetoothDevice);
Miscellaneous.logEvent("i", "BluetoothReceiver", String.format(context.getResources().getString(R.string.bluetoothConnectionTo), bluetoothDevice.getName()), 3); Miscellaneous.logEvent("i", "BluetoothReceiver", String.format(context.getResources().getString(R.string.bluetoothConnectionTo), bluetoothDevice.getName()), 3);
} }
else if(action.equals(BluetoothDevice.ACTION_ACL_DISCONNECTED) || action.equals(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED) || action.equals("android.bluetooth.device.ACTION_ACL_DISCONNECTED") || action.equals("android.bluetooth.device.ACTION_ACL_DISCONNECT_REQUESTED")) else if(action.equals(BluetoothDevice.ACTION_ACL_DISCONNECTED) | action.equals(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED) | action.equals("android.bluetooth.device.ACTION_ACL_DISCONNECTED") | action.equals("android.bluetooth.device.ACTION_ACL_DISCONNECT_REQUESTED"))
{ {
bluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); bluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
lastAffectedDevice = bluetoothDevice; lastAffectedDevice = bluetoothDevice;
@ -116,7 +115,7 @@ public class BluetoothReceiver extends BroadcastReceiver implements AutomationLi
connectedDevices.remove(bluetoothDevice); connectedDevices.remove(bluetoothDevice);
Miscellaneous.logEvent("i", "BluetoothReceiver", String.format(context.getResources().getString(R.string.bluetoothDisconnectFrom), bluetoothDevice.getName()), 3); Miscellaneous.logEvent("i", "BluetoothReceiver", String.format(context.getResources().getString(R.string.bluetoothDisconnectFrom), bluetoothDevice.getName()), 3);
} }
else if(action.equals(BluetoothDevice.ACTION_FOUND) || action.equals("android.bluetooth.device.ACTION_FOUND")) else if(action.equals(BluetoothDevice.ACTION_FOUND) | action.equals("android.bluetooth.device.ACTION_FOUND"))
{ {
bluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); bluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
lastAffectedDevice = bluetoothDevice; lastAffectedDevice = bluetoothDevice;
@ -301,16 +300,4 @@ public class BluetoothReceiver extends BroadcastReceiver implements AutomationLi
{ {
return new Trigger_Enum[] { Trigger_Enum.bluetoothConnection }; return new Trigger_Enum[] { Trigger_Enum.bluetoothConnection };
} }
/**
* Check for Bluetooth.
*
* @return true if Bluetooth is available.
*/
public static boolean isBluetoothEnabled()
{
final BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
return bluetoothAdapter != null && bluetoothAdapter.isEnabled() && bluetoothAdapter.getState() == BluetoothAdapter.STATE_ON;
}
} }

View File

@ -3,10 +3,8 @@ package com.jens.automation2.receivers;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log; import android.util.Log;
import android.widget.Toast;
import com.jens.automation2.ActivityPermissions; import com.jens.automation2.ActivityPermissions;
import com.jens.automation2.AutomationService; import com.jens.automation2.AutomationService;
@ -52,13 +50,11 @@ public class BroadcastListener extends android.content.BroadcastReceiver impleme
{ {
broadcastsCollection.add(new EventOccurrence(Calendar.getInstance(), intent.getAction())); broadcastsCollection.add(new EventOccurrence(Calendar.getInstance(), intent.getAction()));
Miscellaneous.logEvent("i", "Broadcast received", "Broadcast " + intent.getAction() + " received.", 4); for(String key : intent.getExtras().keySet())
if(intent.getExtras() != null && intent.getExtras().size() > 0)
{
for (String key : intent.getExtras().keySet())
{ {
Miscellaneous.logEvent("i", "Broadcast extra", "Broadcast " + intent.getAction() + " has extra " + key + " and type " + intent.getExtras().get(key).getClass().getName(), 4); Miscellaneous.logEvent("i", "Broadcast extra", "Broadcast " + intent.getAction() + " has extra " + key + " and type " + intent.getExtras().get(key).getClass().getName(), 4);
} // Object ob = intent.getExtras().get(key);
// Miscellaneous.logEvent("i", "Broadcast extra", "Broadcast " + intent.getAction() + " has extra " + key + " and type " + intent.getExtras().get(key).getClass().getName(), 4);
} }
ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger.Trigger_Enum.broadcastReceived); ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger.Trigger_Enum.broadcastReceived);

View File

@ -1,659 +0,0 @@
package com.jens.automation2.receivers;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.provider.CalendarContract;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.jens.automation2.AutomationService;
import com.jens.automation2.Miscellaneous;
import com.jens.automation2.Rule;
import com.jens.automation2.Trigger;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
public class CalendarReceiver extends BroadcastReceiver implements AutomationListenerInterface
{
static CalendarReceiver calendarReceiverInstance = null;
static boolean calendarReceiverActive = false;
static IntentFilter calendarIntentFilter = null;
private static Intent calendarIntent = null;
public static final int AVAILABILITY_OUT_OF_OFFICE = 4;
public static final int AVAILABILITY_WORKING_ELSEWHERE = 5;
public static final String calendarAlarmAction = "ALARM_FOR_CALENDAR";
static List<AndroidCalendar> calendarsCache = null;
static List<CalendarEvent> calendarEventsCache = null;
static List<CalendarEvent> calendarEventsReoccurringCache = null;
// To determine for which events which rules have been executed
static List<RuleEventPair> calendarEventsUsed = new ArrayList<>();
static Timer timer = null;
static TimerTask timerTask = null;
static Calendar nextWakeup = null;
static AlarmManager alarmManager = null;
static boolean wakeupNeedsToBeScheduledOrRescheduled = false;
public static CalendarEvent getLastTriggeringEvent()
{
if(calendarEventsUsed.size() > 0)
{
return calendarEventsUsed.get(calendarEventsUsed.size() -1).event;
}
return null;
}
public static class RuleEventPair
{
Rule rule;
CalendarEvent event;
public RuleEventPair(Rule rule, CalendarEvent event)
{
this.rule = rule;
this.event = event;
}
}
public static void addUsedPair(RuleEventPair pair)
{
// Add pair only if it's not in the list already.
for(RuleEventPair usedPair : calendarEventsUsed)
{
if(usedPair.rule.equals(pair.rule) && usedPair.event.equals(pair.event))
return;
}
calendarEventsUsed.add(pair);
}
public static CalendarReceiver getInstance()
{
if(calendarReceiverInstance == null)
calendarReceiverInstance = new CalendarReceiver();
return calendarReceiverInstance;
}
@Override
public void onReceive(Context context, Intent intent)
{
Miscellaneous.logEvent("i", "CalendarReceiver", "Received " + intent.getAction(), 4);
if(intent.getAction().equalsIgnoreCase(Intent.ACTION_PROVIDER_CHANGED))
{
Miscellaneous.logEvent("i", "CalendarReceiver", "Clearing calendar caches.", 4);
clearCaches();
routineAtAlarm();
}
else if(intent.getAction().equalsIgnoreCase(calendarAlarmAction))
{
routineAtAlarm();
}
}
static void checkForRules(Context context)
{
ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger.Trigger_Enum.calendarEvent);
for (int i = 0; i < ruleCandidates.size(); i++)
{
if (ruleCandidates.get(i).getsGreenLight(context))
ruleCandidates.get(i).activate(AutomationService.getInstance(), false);
}
}
@Override
public void startListener(AutomationService automationServiceRef)
{
startCalendarReceiver(automationServiceRef);
}
static void clearCaches()
{
calendarsCache = null;
calendarEventsCache = null;
calendarEventsReoccurringCache = null;
}
@Override
public void stopListener(AutomationService automationService)
{
if(calendarReceiverActive)
{
if(calendarReceiverInstance != null)
{
AutomationService.getInstance().unregisterReceiver(calendarReceiverInstance);
calendarReceiverInstance = null;
}
clearCaches();
calendarEventsUsed.clear();
calendarReceiverActive = false;
}
}
@Override
public boolean isListenerRunning()
{
return calendarReceiverActive;
}
@Override
public Trigger.Trigger_Enum[] getMonitoredTrigger()
{
return new Trigger.Trigger_Enum[]{Trigger.Trigger_Enum.calendarEvent};
}
public static class AndroidCalendar
{
public int calendarId;
public String displayName;
public String accountString;
@NonNull
@Override
public String toString()
{
return displayName + " (" + accountString + ")";
}
}
public static class CalendarEvent
{
public AndroidCalendar calendar;
public int calendarId;
public String eventId;
public String title;
public String description;
public String location;
public String availability;
public Calendar start, end;
public boolean allDay, reoccurring;
public boolean isCurrentlyActive()
{
Calendar now = Calendar.getInstance();
return now.getTimeInMillis() >= start.getTimeInMillis() && now.getTimeInMillis() < end.getTimeInMillis();
}
@NonNull
@Override
public String toString()
{
return "Title: " + title + ", location: " + location + ", description: " + description + ", start: " + Miscellaneous.formatDate(start.getTime()) + ", end: " + Miscellaneous.formatDate(end.getTime()) + ", is currently active: " + String.valueOf(isCurrentlyActive()) + ", all day: " + String.valueOf(allDay) + ", availability: " + availability;
}
@Override
public boolean equals(@Nullable Object obj)
{
try
{
CalendarEvent compareEvent = (CalendarEvent) obj;
return calendarId == compareEvent.calendarId
&&
eventId.equals(compareEvent.eventId)
&&
title.equals(compareEvent.title)
&&
description.equals(compareEvent.description)
&&
location.equals(compareEvent.location)
&&
availability.equals(compareEvent.availability)
&&
start.getTimeInMillis() == compareEvent.start.getTimeInMillis()
&&
end.getTimeInMillis() == compareEvent.end.getTimeInMillis()
&&
allDay == compareEvent.allDay;
}
catch (Exception e)
{
Miscellaneous.logEvent("e", "CalendarReceiver compare()", Log.getStackTraceString(e), 5);
return false;
}
}
}
public static List<AndroidCalendar> readCalendars(Context context)
{
if(calendarsCache == null)
{
calendarsCache = new ArrayList<>();
Cursor cursor;
cursor = context.getContentResolver().query(
Uri.parse("content://com.android.calendar/calendars"),
new String[]{ CalendarContract.Calendars._ID, CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, CalendarContract.Calendars.OWNER_ACCOUNT, },
null, null, null);
cursor.moveToFirst();
// fetching calendars name
String CNames[] = new String[cursor.getCount()];
for (int i = 0; i < CNames.length; i++)
{
try
{
AndroidCalendar calendar = new AndroidCalendar();
calendar.calendarId = Integer.parseInt(cursor.getString(0));
calendar.displayName = cursor.getString(1);
calendar.accountString = cursor.getString(2);
calendarsCache.add(calendar);
}
catch (Exception e)
{
}
cursor.moveToNext();
}
if (cursor != null)
cursor.close();
}
return calendarsCache;
}
public static List<CalendarEvent> readCalendarEvents(Context context, boolean includeReoccurring, boolean includePastEvents)
{
if(calendarEventsCache == null)
{
calendarEventsCache = new ArrayList<>();
Cursor cursor;
cursor = context.getContentResolver().query(
Uri.parse("content://com.android.calendar/events"),
new String[] {
CalendarContract.Events.CALENDAR_ID,
CalendarContract.Events._ID,
CalendarContract.Events.TITLE,
CalendarContract.Events.DESCRIPTION,
CalendarContract.Events.ALL_DAY,
CalendarContract.Events.DTSTART,
CalendarContract.Events.DTEND,
CalendarContract.Events.EVENT_LOCATION,
CalendarContract.Events.AVAILABILITY
},
null, null, null);
cursor.moveToFirst();
// fetching calendars name
String CNames[] = new String[cursor.getCount()];
Calendar now = Calendar.getInstance();
for (int i = 0; i < CNames.length; i++)
{
try
{
CalendarEvent event = new CalendarEvent();
event.calendarId = Integer.parseInt(cursor.getString(0));
for(AndroidCalendar cal : readCalendars(context))
{
if(cal.calendarId == event.calendarId)
{
event.calendar = cal;
break;
}
}
event.eventId = cursor.getString(1);
event.title = cursor.getString(2);
event.description = cursor.getString(3);
event.allDay = cursor.getString(4).equals("1");
event.start = Miscellaneous.calendarFromLong(Long.parseLong(cursor.getString(5)));
event.end = Miscellaneous.calendarFromLong(Long.parseLong(cursor.getString(6)));
event.location = cursor.getString(7);
event.availability = cursor.getString(8);
event.reoccurring = false;
if(includePastEvents || event.end.getTimeInMillis() > now.getTimeInMillis())
calendarEventsCache.add(event);
}
catch (Exception e)
{}
cursor.moveToNext();
}
if(cursor != null)
cursor.close();
}
if(includeReoccurring && calendarEventsReoccurringCache == null)
{
calendarEventsReoccurringCache = new ArrayList<>();
Cursor cursor;
Calendar queryStart, queryEnd;
if(includePastEvents)
queryStart = Miscellaneous.calendarFromLong(0);
else
queryStart = Calendar.getInstance();
queryEnd = Calendar.getInstance();
queryEnd.add(Calendar.YEAR, 1);
cursor = context.getContentResolver().query(
Uri.parse("content://com.android.calendar/instances/when/" + queryStart.getTimeInMillis() + "/" + queryEnd.getTimeInMillis()),
new String[] {
CalendarContract.Instances.CALENDAR_ID,
CalendarContract.Instances._ID,
CalendarContract.Instances.TITLE,
CalendarContract.Instances.DESCRIPTION,
CalendarContract.Instances.ALL_DAY,
CalendarContract.Instances.BEGIN,
CalendarContract.Instances.END,
CalendarContract.Instances.EVENT_LOCATION,
CalendarContract.Instances.AVAILABILITY
},
null, null, null);
cursor.moveToFirst();
String CNames[] = new String[cursor.getCount()];
Calendar now = Calendar.getInstance();
for (int i = 0; i < CNames.length; i++)
{
try
{
CalendarEvent event = new CalendarEvent();
event.calendarId = Integer.parseInt(cursor.getString(0));
for(AndroidCalendar cal : readCalendars(context))
{
if(cal.calendarId == event.calendarId)
{
event.calendar = cal;
break;
}
}
event.eventId = cursor.getString(1);
event.title = cursor.getString(2);
event.description = cursor.getString(3);
event.allDay = cursor.getString(4).equals("1");
event.start = Miscellaneous.calendarFromLong(Long.parseLong(cursor.getString(5)));
event.end = Miscellaneous.calendarFromLong(Long.parseLong(cursor.getString(6)));
event.location = cursor.getString(7);
event.availability = cursor.getString(8);
event.reoccurring = true;
if(includePastEvents || event.end.getTimeInMillis() > now.getTimeInMillis())
{
// For the moment keeping separate records to some extent
calendarEventsReoccurringCache.add(event);
calendarEventsCache.add(event);
}
}
catch (Exception e)
{}
cursor.moveToNext();
}
if(cursor != null)
cursor.close();
}
return calendarEventsCache;
}
protected static void routineAtAlarm()
{
checkForRules(Miscellaneous.getAnyContext());
// Set next timer
calculateNextWakeup();
armOrRearmTimer();
}
public static void armOrRearmTimer()
{
PendingIntent pi = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
{
if (alarmManager == null)
{
alarmManager = (AlarmManager) Miscellaneous.getAnyContext().getSystemService(Context.ALARM_SERVICE);
}
if(pi == null)
{
Intent intent = new Intent(Miscellaneous.getAnyContext(), CalendarReceiver.class);
intent.setAction(calendarAlarmAction);
pi = PendingIntent.getBroadcast(AutomationService.getInstance(), 0, intent, 0);
}
}
else
{
timerTask = new TimerTask()
{
@Override
public void run()
{
routineAtAlarm();
}
};
if(timer != null)
{
timer.cancel();
timer.purge();
}
timer = new Timer();
}
if(nextWakeup == null)
{
readCalendarEvents(Miscellaneous.getAnyContext(), true,false);
calculateNextWakeup();
}
// If it's now filled, go on
if(nextWakeup != null && wakeupNeedsToBeScheduledOrRescheduled)
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
{
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && alarmManager.canScheduleExactAlarms()))
{
try
{
alarmManager.cancel(pi);
}
catch (Exception e)
{
}
Miscellaneous.logEvent("i", "armOrRearmTimer()", "Scheduling wakeup for calendar at " + Miscellaneous.formatDate(nextWakeup.getTime()), 4);
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, nextWakeup.getTimeInMillis(), pi);
wakeupNeedsToBeScheduledOrRescheduled = false;
}
}
else
timer.schedule(timerTask, nextWakeup.getTimeInMillis());
}
}
private static void calculateNextWakeup()
{
Calendar now = Calendar.getInstance();
List<CalendarEvent> events = readCalendarEvents(Miscellaneous.getAnyContext(), true, false);
if (events.size() == 0)
{
Miscellaneous.logEvent("i", "calculateNextWakeup()", "No future events, nothing to schedule.", 4);
}
else
{
List<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger.Trigger_Enum.calendarEvent);
List<Long> wakeUpCandidatesList = new ArrayList<>();
for (CalendarEvent event : events)
{
for (Rule r : ruleCandidates)
{
for (Trigger t : r.getTriggerSet())
{
if (t.getTriggerType().equals(Trigger.Trigger_Enum.calendarEvent) && t.checkCalendarEvent(event, true))
{
/*
Device needs to wakeup at start AND end of events, no matter what is specified in triggers.
This is because we also need to know when a trigger doesn't apply anymore to make it
count for hasStateNotAppliedSinceLastRuleExecution().
Otherwise the same rule would not get executed again even after calendar events have come and gone.
*/
if(event.start.getTimeInMillis() > now.getTimeInMillis())
wakeUpCandidatesList.add(event.start.getTimeInMillis());
if(event.end.getTimeInMillis() > now.getTimeInMillis())
wakeUpCandidatesList.add(event.end.getTimeInMillis());
}
}
}
}
Collections.sort(wakeUpCandidatesList);
if(wakeUpCandidatesList.size() == 0)
Miscellaneous.logEvent("i", "calculateNextWakeupForCalendar()", "Not scheduling any calendar related wakeup as there are no future events that might match a configured trigger.", 4);
else
{
if (nextWakeup == null || nextWakeup.getTimeInMillis() != wakeUpCandidatesList.get(0))
{
Calendar newAlarm = Miscellaneous.calendarFromLong(wakeUpCandidatesList.get(0));
if (nextWakeup == null)
Miscellaneous.logEvent("i", "calculateNextWakeupForCalendar()", "Chose " + Miscellaneous.formatDate(newAlarm.getTime()) + " as next wakeup for calendar triggers. Old was null.", 4);
else
Miscellaneous.logEvent("i", "calculateNextWakeupForCalendar()", "Chose " + Miscellaneous.formatDate(newAlarm.getTime()) + " as next wakeup for calendar triggers. Old was " + Miscellaneous.formatDate(nextWakeup.getTime()), 4);
nextWakeup = newAlarm;
if (!wakeupNeedsToBeScheduledOrRescheduled)
wakeupNeedsToBeScheduledOrRescheduled = true;
}
else
Miscellaneous.logEvent("i", "calculateNextWakeupForCalendar()", "Alarm " + Miscellaneous.formatDate(nextWakeup.getTime()) + " has been selected as next wakeup, but not rescheduling since this was not a change.", 4);
}
}
}
public static void startCalendarReceiver(final AutomationService automationServiceRef)
{
if (!calendarReceiverActive)
{
if (calendarReceiverInstance == null)
calendarReceiverInstance = new CalendarReceiver();
if (calendarIntentFilter == null)
{
calendarIntentFilter = new IntentFilter();
calendarIntentFilter.addAction(Intent.ACTION_PROVIDER_CHANGED);
calendarIntentFilter.addDataScheme("content");
calendarIntentFilter.addDataAuthority("com.android.calendar", null);
}
calendarIntent = automationServiceRef.registerReceiver(calendarReceiverInstance, calendarIntentFilter);
calendarReceiverActive = true;
armOrRearmTimer();
}
}
public static boolean mayRuleStillBeActivatedForPendingCalendarEvents(Rule rule)
{
for(RuleEventPair pair : calendarEventsUsed)
Miscellaneous.logEvent("i", "mayRuleStillBeActivatedForPendingCalendarEvents()", "Existing pair of " + pair.rule.getName() + " and " + pair.event, 5);
for(CalendarEvent event : readCalendarEvents(Miscellaneous.getAnyContext(), true,false))
{
for(Trigger t : rule.getTriggerSet())
{
if(t.getTriggerType().equals(Trigger.Trigger_Enum.calendarEvent) && t.checkCalendarEvent(event, false))
{
if (!hasEventBeenUsedInRule(rule, event))
{
/*
If there are multiple parallel calendar events and a rule has multiple
triggers of type calendar event, we don't want the rule to fire only once.
*/
if(rule.getAmountOfTriggersForType(Trigger.Trigger_Enum.calendarEvent) == 1)
{
Miscellaneous.logEvent("i", "mayRuleStillBeActivatedForPendingCalendarEvents()", "Rule " + rule.getName() + " has not been used in conjunction with event " + event, 4);
return true;
}
}
}
}
}
return false;
}
public static boolean hasEventBeenUsedInRule(Rule rule, CalendarEvent event)
{
for (RuleEventPair executedPair : calendarEventsUsed)
{
if (executedPair.rule.equals(rule) && executedPair.event.equals(event))
return true;
}
return false;
}
public static List<CalendarReceiver.CalendarEvent> getApplyingCalendarEvents(Rule rule)
{
List<CalendarReceiver.CalendarEvent> returnList = new ArrayList<>();
try
{
List<CalendarReceiver.CalendarEvent> calendarEvents = CalendarReceiver.readCalendarEvents(AutomationService.getInstance(), true,false);
for(Trigger t : rule.getTriggerSet())
{
if(t.getTriggerType().equals(Trigger.Trigger_Enum.calendarEvent))
{
for (CalendarReceiver.CalendarEvent event : calendarEvents)
{
if (t.checkCalendarEvent(event, false))
returnList.add(event);
}
}
}
}
catch(Exception e)
{
Miscellaneous.logEvent("e", "getApplyingCalendarEvents()", Log.getStackTraceString(e), 1);
}
return returnList;
}
}

View File

@ -8,7 +8,6 @@ import android.content.Intent;
import android.os.Build; import android.os.Build;
import android.util.Log; import android.util.Log;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi; import androidx.annotation.RequiresApi;
import com.jens.automation2.AutomationService; import com.jens.automation2.AutomationService;
@ -19,10 +18,10 @@ import com.jens.automation2.TimeObject;
import com.jens.automation2.Trigger; import com.jens.automation2.Trigger;
import com.jens.automation2.Trigger.Trigger_Enum; import com.jens.automation2.Trigger.Trigger_Enum;
import java.sql.Time;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.Collections;
import java.util.Date; import java.util.Date;
public class DateTimeListener extends BroadcastReceiver implements AutomationListenerInterface public class DateTimeListener extends BroadcastReceiver implements AutomationListenerInterface
@ -53,18 +52,18 @@ public class DateTimeListener extends BroadcastReceiver implements AutomationLis
{ {
Miscellaneous.logEvent("i", "AlarmListener", "Alarm received", 2); Miscellaneous.logEvent("i", "AlarmListener", "Alarm received", 2);
ArrayList<Rule> allRulesWithTimeFrame = Rule.findRuleCandidates(Trigger_Enum.timeFrame); ArrayList<Rule> allRulesWithNowInTimeFrame = Rule.findRuleCandidates(Trigger_Enum.timeFrame);
for(int i=0; i < allRulesWithTimeFrame.size(); i++) for(int i=0; i < allRulesWithNowInTimeFrame.size(); i++)
{ {
if(allRulesWithTimeFrame.get(i).getsGreenLight(context)) if(allRulesWithNowInTimeFrame.get(i).getsGreenLight(context))
allRulesWithTimeFrame.get(i).activate(automationServiceRef, false); allRulesWithNowInTimeFrame.get(i).activate(automationServiceRef, false);
} }
setOrResetAlarms(); setAlarms();
} }
@RequiresApi(api = Build.VERSION_CODES.KITKAT) @RequiresApi(api = Build.VERSION_CODES.KITKAT)
public static void setOrResetAlarms() public static void setAlarms()
{ {
alarmCandidates.clear(); alarmCandidates.clear();
@ -77,7 +76,7 @@ public class DateTimeListener extends BroadcastReceiver implements AutomationLis
ArrayList<Rule> allRulesWithTimeFrames = new ArrayList<Rule>(); ArrayList<Rule> allRulesWithTimeFrames = new ArrayList<Rule>();
allRulesWithTimeFrames = Rule.findRuleCandidates(Trigger_Enum.timeFrame); allRulesWithTimeFrames = Rule.findRuleCandidates(Trigger_Enum.timeFrame);
// allRulesWithTimeFrames = Rule.findRuleCandidatesByTimeFrame();
/* /*
* Take care of regular executions, no repetitions in between. * Take care of regular executions, no repetitions in between.
*/ */
@ -191,17 +190,18 @@ public class DateTimeListener extends BroadcastReceiver implements AutomationLis
* 4. Take div result +1 and add this on top of starting time * 4. Take div result +1 and add this on top of starting time
* 5. Is this next possible execution still inside timeframe? Also consider timeframes spanning over midnight * 5. Is this next possible execution still inside timeframe? Also consider timeframes spanning over midnight
*/ */
Calendar calSet;
Time setTime;
TimeFrame tf = new TimeFrame(oneTrigger.getTriggerParameter2()); TimeFrame tf = new TimeFrame(oneTrigger.getTriggerParameter2());
if(tf.getRepetition() > 0) if(tf.getRepetition() > 0)
{ {
// if(oneTrigger.applies(calNow, Miscellaneous.getAnyContext())) if(oneTrigger.applies(calNow, Miscellaneous.getAnyContext()))
// { {
Calendar calSchedule = getNextRepeatedExecution(oneTrigger); Calendar calSchedule = getNextRepeatedExecutionAfter(oneTrigger, calNow);
alarmCandidates.add(new ScheduleElement(calSchedule, "Rule " + oneRule.getName() + ", trigger " + oneTrigger.toString())); alarmCandidates.add(new ScheduleElement(calSchedule, "Rule " + oneRule.getName() + ", trigger " + oneTrigger.toString()));
// } }
} }
} }
} }
@ -243,15 +243,7 @@ public class DateTimeListener extends BroadcastReceiver implements AutomationLis
} }
Intent alarmIntent = new Intent(automationServiceRef, DateTimeListener.class); Intent alarmIntent = new Intent(automationServiceRef, DateTimeListener.class);
if(Miscellaneous.getAnyContext().getApplicationContext().getApplicationInfo().targetSdkVersion >= 31)
alarmPendingIntent = PendingIntent.getBroadcast(automationServiceRef, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
else
alarmPendingIntent = PendingIntent.getBroadcast(automationServiceRef, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT); alarmPendingIntent = PendingIntent.getBroadcast(automationServiceRef, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
centralAlarmManagerInstance.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, scheduleCandidate.time.getTimeInMillis(), alarmPendingIntent);
else
centralAlarmManagerInstance.set(AlarmManager.RTC_WAKEUP, scheduleCandidate.time.getTimeInMillis(), alarmPendingIntent); centralAlarmManagerInstance.set(AlarmManager.RTC_WAKEUP, scheduleCandidate.time.getTimeInMillis(), alarmPendingIntent);
SimpleDateFormat sdf = new SimpleDateFormat("E dd.MM.yyyy HH:mm:ss"); SimpleDateFormat sdf = new SimpleDateFormat("E dd.MM.yyyy HH:mm:ss");
@ -263,16 +255,14 @@ public class DateTimeListener extends BroadcastReceiver implements AutomationLis
public static void clearAlarms() public static void clearAlarms()
{ {
Miscellaneous.logEvent("i", "AlarmManager", "Clearing possibly standing alarms.", 4); Miscellaneous.logEvent("i", "AlarmManager", "Clearing possibly standing alarms.", 4);
for(int requestCode : requestCodeList) for(int requestCode : requestCodeList)
{ {
Intent alarmIntent = new Intent(automationServiceRef, DateTimeListener.class); Intent alarmIntent = new Intent(automationServiceRef, DateTimeListener.class);
if(alarmPendingIntent == null) if(alarmPendingIntent == null)
alarmPendingIntent = PendingIntent.getBroadcast(automationServiceRef, requestCode, alarmIntent, 0); alarmPendingIntent = PendingIntent.getBroadcast(automationServiceRef, requestCode, alarmIntent, 0);
// Miscellaneous.logEvent("i", "AlarmManager", "Clearing alarm with request code: " + String.valueOf(requestCode));
centralAlarmManagerInstance.cancel(alarmPendingIntent); centralAlarmManagerInstance.cancel(alarmPendingIntent);
} }
requestCodeList.clear(); requestCodeList.clear();
} }
@ -283,10 +273,11 @@ public class DateTimeListener extends BroadcastReceiver implements AutomationLis
Miscellaneous.logEvent("i", "AlarmListener", "Starting alarm listener.", 4); Miscellaneous.logEvent("i", "AlarmListener", "Starting alarm listener.", 4);
DateTimeListener.automationServiceRef = givenAutomationServiceRef; DateTimeListener.automationServiceRef = givenAutomationServiceRef;
centralAlarmManagerInstance = (AlarmManager)automationServiceRef.getSystemService(automationServiceRef.ALARM_SERVICE); centralAlarmManagerInstance = (AlarmManager)automationServiceRef.getSystemService(automationServiceRef.ALARM_SERVICE);
// alarmIntent = new Intent(automationServiceRef, AlarmListener.class);
// alarmPendingIntent = PendingIntent.getBroadcast(automationServiceRef, 0, alarmIntent, 0);
alarmListenerActive = true; alarmListenerActive = true;
Miscellaneous.logEvent("i", "AlarmListener", "Alarm listener started.", 4); Miscellaneous.logEvent("i", "AlarmListener", "Alarm listener started.", 4);
DateTimeListener.setOrResetAlarms(); DateTimeListener.setAlarms();
// // get a Calendar object with current time // // get a Calendar object with current time
// Calendar cal = Calendar.getInstance(); // Calendar cal = Calendar.getInstance();
@ -310,7 +301,10 @@ public class DateTimeListener extends BroadcastReceiver implements AutomationLis
else else
Miscellaneous.logEvent("i", "AlarmListener", "Request to stop AlarmListener. But it's not running.", 5); Miscellaneous.logEvent("i", "AlarmListener", "Request to stop AlarmListener. But it's not running.", 5);
} }
public static void reloadAlarms()
{
DateTimeListener.setAlarms();
}
@Override @Override
public void startListener(AutomationService automationService) public void startListener(AutomationService automationService)
{ {
@ -368,217 +362,46 @@ public class DateTimeListener extends BroadcastReceiver implements AutomationLis
} }
} }
static int getNextDayIntForExecution(Trigger trigger)
{
TimeFrame tf = new TimeFrame(trigger.getTriggerParameter2());
Calendar now = Calendar.getInstance();
if(tf.getDayList().contains(now.get(Calendar.DAY_OF_WEEK)))
return now.get(Calendar.DAY_OF_WEEK);
else
{
int dayNumberOfNextExecution = now.get(Calendar.DAY_OF_WEEK);
while(!tf.getDayList().contains(dayNumberOfNextExecution))
{
dayNumberOfNextExecution++;
if(dayNumberOfNextExecution > 6)
dayNumberOfNextExecution = 1;
}
return dayNumberOfNextExecution;
}
}
static int getDayDelta(Calendar now, int dayNumberOfNextExecution)
{
int result = dayNumberOfNextExecution - now.get(Calendar.DAY_OF_WEEK);
if(result >= 0)
return result;
else
return 6 + result;
}
@Nullable
@RequiresApi(api = Build.VERSION_CODES.N) @RequiresApi(api = Build.VERSION_CODES.N)
public static Calendar getNextRepeatedExecution(Trigger trigger) public static Calendar getNextRepeatedExecutionAfter(Trigger trigger, Calendar now)
{ {
Calendar now = Calendar.getInstance(); Calendar calSet;
Miscellaneous.logEvent("i", "DateTimeListener", "Checking for next repetition execution after " + Miscellaneous.formatDate(now.getTime()), 5); TimeObject setTime;
Calendar calculationStart, calSchedule = null;
TimeFrame tf = new TimeFrame(trigger.getTriggerParameter2()); TimeFrame tf = new TimeFrame(trigger.getTriggerParameter2());
if(tf.getRepetition() > 0) if(tf.getRepetition() > 0)
{
/*
Are we inside of the timeframe or outside?
Inside -> is this demanded?
Yes:
If last execution known, calculate from it
If not known, calculate from start of timeframe
No:
Use end-time and add repetition
Outside? -> is this demanded?
Yes:
If last execution known, calculate from it
If not known, calculate from end of timeframe
No:
Use start-time and add repetition
*/
if(areWeInTimeFrame(trigger, new Date()))
{ {
if(trigger.getTriggerParameter()) if(trigger.getTriggerParameter())
{ setTime = tf.getTriggerTimeStart();
if(trigger.getParentRule().getLastExecution() != null)
{
calculationStart = (Calendar) trigger.getParentRule().getLastExecution().clone();
}
else else
{ setTime = tf.getTriggerTimeStop();
calculationStart = (Calendar) now.clone();
calculationStart.set(Calendar.HOUR_OF_DAY, tf.getTriggerTimeStart().getHours()); calSet = (Calendar) now.clone();
calculationStart.set(Calendar.MINUTE, tf.getTriggerTimeStart().getMinutes()); calSet.set(Calendar.HOUR_OF_DAY, setTime.getHours());
calculationStart.set(Calendar.SECOND, tf.getTriggerTimeStart().getSeconds()); calSet.set(Calendar.MINUTE, setTime.getMinutes());
calculationStart.set(Calendar.MILLISECOND, 0); calSet.set(Calendar.SECOND, 0);
} calSet.set(Calendar.MILLISECOND, 0);
long differenceInSeconds = Math.abs(now.getTimeInMillis() - calculationStart.getTimeInMillis()) / 1000;
// If the starting time is a day ahead remove 1 day.
if(calSet.getTimeInMillis() > now.getTimeInMillis())
calSet.add(Calendar.DAY_OF_MONTH, -1);
long differenceInSeconds = Math.abs(now.getTimeInMillis() - calSet.getTimeInMillis()) / 1000;
long nextExecutionMultiplier = Math.floorDiv(differenceInSeconds, tf.getRepetition()) + 1; long nextExecutionMultiplier = Math.floorDiv(differenceInSeconds, tf.getRepetition()) + 1;
calSchedule = (Calendar) calculationStart.clone(); long nextScheduleTimestamp = (calSet.getTimeInMillis() / 1000) + (nextExecutionMultiplier * tf.getRepetition());
calSchedule.add(Calendar.SECOND, (int) (nextExecutionMultiplier * tf.getRepetition())); Calendar calSchedule = Calendar.getInstance();
} calSchedule.setTimeInMillis(nextScheduleTimestamp * 1000);
else
{
calculationStart = (Calendar) now.clone();
calculationStart.set(Calendar.HOUR_OF_DAY, tf.getTriggerTimeStop().getHours());
calculationStart.set(Calendar.MINUTE, tf.getTriggerTimeStop().getMinutes());
calculationStart.set(Calendar.SECOND, tf.getTriggerTimeStop().getSeconds());
calculationStart.set(Calendar.MILLISECOND, 0);
calSchedule = (Calendar) calculationStart.clone();
calSchedule.add(Calendar.SECOND, (int) tf.getRepetition());
}
}
else // not in timeframe
{
if (!trigger.getTriggerParameter())
{
if (trigger.getParentRule().getLastExecution() != null)
{
calculationStart = (Calendar) trigger.getParentRule().getLastExecution().clone();
long differenceInSeconds = Math.abs(now.getTimeInMillis() - calculationStart.getTimeInMillis()) / 1000;
long nextExecutionMultiplier = Math.floorDiv(differenceInSeconds, tf.getRepetition()) + 1;
calSchedule = (Calendar) calculationStart.clone();
calSchedule.add(Calendar.SECOND, (int) (nextExecutionMultiplier * tf.getRepetition()));
Miscellaneous.logEvent("i", "getNextRepeatedExecutionAfter()", "Chose " + Miscellaneous.formatDate(calSchedule.getTime()) + " as next repeated execution time.", 5);
return calSchedule;
}
else
{
calculationStart = (Calendar) now.clone();
if(tf.getDayList().contains(now.get(Calendar.DAY_OF_WEEK)))
{
calculationStart.set(Calendar.HOUR_OF_DAY, tf.getTriggerTimeStop().getHours());
calculationStart.set(Calendar.MINUTE, tf.getTriggerTimeStop().getMinutes());
calculationStart.set(Calendar.SECOND, tf.getTriggerTimeStop().getSeconds());
calculationStart.set(Calendar.MILLISECOND, 0);
calculationStart.add(Calendar.SECOND, (int) tf.getRepetition());
int dayDelta = getDayDelta(now, getNextDayIntForExecution(trigger));
calculationStart.add(Calendar.DAY_OF_WEEK, dayDelta);
}
calSchedule = (Calendar) calculationStart.clone();
Miscellaneous.logEvent("i", "getNextRepeatedExecutionAfter()", "Chose " + Miscellaneous.formatDate(calSchedule.getTime()) + " as next repeated execution time.", 5);
return calSchedule;
}
/*long differenceInSeconds = Math.abs(now.getTimeInMillis() - calculationStart.getTimeInMillis()) / 1000;
long nextExecutionMultiplier = Math.floorDiv(differenceInSeconds, tf.getRepetition()) + 1;
calSchedule = (Calendar) calculationStart.clone();
calSchedule.add(Calendar.SECOND, (int) (nextExecutionMultiplier * tf.getRepetition()));*/
}
else
{
calculationStart = (Calendar) now.clone();
calculationStart.set(Calendar.HOUR_OF_DAY, tf.getTriggerTimeStart().getHours());
calculationStart.set(Calendar.MINUTE, tf.getTriggerTimeStart().getMinutes());
calculationStart.set(Calendar.SECOND, tf.getTriggerTimeStart().getSeconds());
calculationStart.set(Calendar.MILLISECOND, 0);
calSchedule = (Calendar) calculationStart.clone();
calSchedule.add(Calendar.SECOND, (int) (tf.getRepetition()));
}
if (Miscellaneous.compareTimes(calSchedule, now) > 0)
calSchedule.add(Calendar.DAY_OF_MONTH, 1);
}
int dayDelta = getDayDelta(now, getNextDayIntForExecution(trigger));
calSchedule.add(Calendar.DAY_OF_WEEK, dayDelta);
Miscellaneous.logEvent("i", "getNextRepeatedExecutionAfter()", "Chose " + Miscellaneous.formatDate(calSchedule.getTime()) + " as next repeated execution time.", 5);
}
else
Miscellaneous.logEvent("i", "getNextRepeatedExecutionAfter()", "Trigger " + trigger.toString() + " is not configured to repeat.", 5);
return calSchedule;
}
public static boolean areWeInTimeFrame(Trigger trigger, Object triggeringObject)
{
/* /*
* Use format known from Automation * Das war mal aktiviert. Allerdings: Die ganze Funktion liefert zurück, wenn die Regel NOCH nicht
* 07:30:00/17:30:00/23456/300 <-- last parameter is optional: repetition in seconds * zutrifft, aber wir z.B. gleich den zeitlichen Bereich betreten.
* Also required: inside or outside that interval
*/ */
Date triggeringTime; return calSchedule;
// if(triggeringObject instanceof Date)
// triggeringTime = (Date)triggeringObject;
// else
triggeringTime = new Date();
String timeString = String.valueOf(triggeringTime.getHours()) + ":" + String.valueOf(triggeringTime.getMinutes()) + ":" + String.valueOf(triggeringTime.getSeconds());
TimeObject nowTime = TimeObject.valueOf(timeString);
Calendar calNow = Calendar.getInstance();
try
{
TimeFrame tf = new TimeFrame(trigger.getTriggerParameter2());
if(tf.getDayList().contains(calNow.get(Calendar.DAY_OF_WEEK)))
{
if(
// Regular case, start time is lower than end time
(
Miscellaneous.compareTimes(tf.getTriggerTimeStart(), nowTime) >= 0
&&
Miscellaneous.compareTimes(nowTime, tf.getTriggerTimeStop()) > 0
)
||
// Other case, start time higher than end time, timeframe goes over midnight
(
Miscellaneous.compareTimes(tf.getTriggerTimeStart(), tf.getTriggerTimeStop()) < 0
&&
(Miscellaneous.compareTimes(tf.getTriggerTimeStart(), nowTime) >= 0
||
Miscellaneous.compareTimes(nowTime, tf.getTriggerTimeStop()) > 0)
)
||
// further case: start and end times are identical, meaning a 24h window
(
Miscellaneous.compareTimes(tf.getTriggerTimeStart(), tf.getTriggerTimeStop()) == 0
)
)
return true;
}
}
catch(Exception e)
{
Miscellaneous.logEvent("e", "Trigger", "There was an error while checking if the time based trigger applies: " + Log.getStackTraceString(e), 1);
return false;
} }
else
Miscellaneous.logEvent("i", "DateTimeListener", "Trigger " + trigger.toString() + " is not executed repeatedly.", 5);
return false; return null;
} }
} }

View File

@ -20,7 +20,7 @@ public class HeadphoneJackListener extends BroadcastReceiver implements Automati
private static boolean headsetConnected = false; private static boolean headsetConnected = false;
private static int headphoneType = -1; private static int headphoneType = -1;
protected static boolean headphoneJackListenerActive = false; protected static boolean headphoneJackListenerActive=false;
protected static IntentFilter headphoneJackListenerIntentFilter = null; protected static IntentFilter headphoneJackListenerIntentFilter = null;
protected static HeadphoneJackListener instance; protected static HeadphoneJackListener instance;
@ -76,6 +76,7 @@ public class HeadphoneJackListener extends BroadcastReceiver implements Automati
} }
ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.headsetPlugged); ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.headsetPlugged);
// ArrayList<Rule> ruleCandidates = Rule.findRuleCandidatesByHeadphoneJack(isHeadsetConnected());
for(int i=0; i<ruleCandidates.size(); i++) for(int i=0; i<ruleCandidates.size(); i++)
{ {
if(ruleCandidates.get(i).getsGreenLight(context)) if(ruleCandidates.get(i).getsGreenLight(context))
@ -103,12 +104,13 @@ public class HeadphoneJackListener extends BroadcastReceiver implements Automati
{ {
Miscellaneous.logEvent("i", "HeadsetJackListener", "Starting HeadsetJackListener", 4); Miscellaneous.logEvent("i", "HeadsetJackListener", "Starting HeadsetJackListener", 4);
headphoneJackListenerActive = true; headphoneJackListenerActive = true;
// getInstance().startHeadphoneJackListener(AutomationService.getInstance(), headphoneJackListenerIntentFilter);
automationService.registerReceiver(this, headphoneJackListenerIntentFilter); automationService.registerReceiver(this, headphoneJackListenerIntentFilter);
} }
} }
catch(Exception ex) catch(Exception ex)
{ {
Miscellaneous.logEvent("e", "HeadsetJackListener", "Error starting HeadsetJackListener: " + Log.getStackTraceString(ex), 3); Miscellaneous.logEvent("e", "ActivityDetectionReceiver", "Error starting HeadsetJackListener: " + Log.getStackTraceString(ex), 3);
} }
} }
@ -120,6 +122,7 @@ public class HeadphoneJackListener extends BroadcastReceiver implements Automati
if(headphoneJackListenerActive) if(headphoneJackListenerActive)
{ {
Miscellaneous.logEvent("i", "HeadsetJackListener", "Stopping HeadsetJackListener", 4); Miscellaneous.logEvent("i", "HeadsetJackListener", "Stopping HeadsetJackListener", 4);
// getInstance().stopHeadphoneJackListener(AutomationService.getInstance());
automationService.unregisterReceiver(this); automationService.unregisterReceiver(this);
headphoneJackListenerActive = false; headphoneJackListenerActive = false;
} }
@ -147,4 +150,5 @@ public class HeadphoneJackListener extends BroadcastReceiver implements Automati
{ {
return new Trigger_Enum[] { Trigger_Enum.headsetPlugged }; return new Trigger_Enum[] { Trigger_Enum.headsetPlugged };
} }
} }

View File

@ -2,14 +2,15 @@ package com.jens.automation2.receivers;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.Notification; import android.app.Notification;
import android.app.PendingIntent; import android.bluetooth.BluetoothDevice;
import android.content.IntentFilter;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Parcelable;
import android.service.notification.NotificationListenerService; import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification; import android.service.notification.StatusBarNotification;
import android.util.Log; import android.util.Log;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi; import androidx.annotation.RequiresApi;
import com.jens.automation2.AutomationService; import com.jens.automation2.AutomationService;
@ -19,7 +20,6 @@ import com.jens.automation2.Trigger;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.List;
// See here for reference: http://gmariotti.blogspot.com/2013/11/notificationlistenerservice-and-kitkat.html // See here for reference: http://gmariotti.blogspot.com/2013/11/notificationlistenerservice-and-kitkat.html
@ -27,6 +27,8 @@ import java.util.List;
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
public class NotificationListener extends NotificationListenerService// implements AutomationListenerInterface public class NotificationListener extends NotificationListenerService// implements AutomationListenerInterface
{ {
static Calendar lastResponseToNotification = null;
static boolean listenerRunning = false;
static NotificationListener instance; static NotificationListener instance;
static SimpleNotification lastNotification = null; static SimpleNotification lastNotification = null;
@ -42,30 +44,13 @@ public class NotificationListener extends NotificationListenerService// implemen
// a bitmap to be used instead of the small icon when showing the notification payload // a bitmap to be used instead of the small icon when showing the notification payload
public static final String EXTRA_LARGE_ICON = "android.largeIcon"; public static final String EXTRA_LARGE_ICON = "android.largeIcon";
public static void setLastNotification(SimpleNotification notification) protected static IntentFilter notificationReceiverIntentFilter = null;
{
lastNotification = notification;
}
public static SimpleNotification getLastNotification() public static SimpleNotification getLastNotification()
{ {
return lastNotification; return lastNotification;
} }
// To determine for which notifications which rules have been executed
static List<RuleNotificationPair> notificationUsed = new ArrayList<>();
public static class RuleNotificationPair
{
Rule rule;
SimpleNotification notification;
public RuleNotificationPair(Rule rule, SimpleNotification sn)
{
this.rule = rule;
this.notification = sn;
}
}
@Override @Override
public void onCreate() public void onCreate()
{ {
@ -100,7 +85,6 @@ public class NotificationListener extends NotificationListenerService// implemen
synchronized boolean checkNotification(boolean created, StatusBarNotification sbn) synchronized boolean checkNotification(boolean created, StatusBarNotification sbn)
{ {
//TODO: Merge with functino in Trigger class
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT)
{ {
lastNotification = convertNotificationToSimpleNotification(created, sbn); lastNotification = convertNotificationToSimpleNotification(created, sbn);
@ -165,6 +149,51 @@ public class NotificationListener extends NotificationListenerService// implemen
return returnNotification; return returnNotification;
} }
/*@Override
public void startListener(AutomationService automationService)
{
if(instance == null)
instance = new NotificationListener();
if(notificationReceiverIntentFilter == null)
{
notificationReceiverIntentFilter = new IntentFilter();
notificationReceiverIntentFilter.addAction("android.service.notification.NotificationListenerService");
}
try
{
if(!listenerRunning)
{
Miscellaneous.logEvent("i", "NotificationListener", "Starting NotificationListener", 4);
listenerRunning = true;
AutomationService.getInstance().registerReceiver(instance, notificationReceiverIntentFilter);
}
}
catch(Exception ex)
{
Miscellaneous.logEvent("e", "BluetoothReceiver", "Error starting BluetoothReceiver: " + Log.getStackTraceString(ex), 3);
}
}
@Override
public void stopListener(AutomationService automationService)
{
}
@Override
public boolean isListenerRunning()
{
return false;
}
@Override
public Trigger.Trigger_Enum[] getMonitoredTrigger()
{
return new Trigger.Trigger_Enum[0];
}*/
public static class SimpleNotification public static class SimpleNotification
{ {
boolean created; boolean created;
@ -232,19 +261,6 @@ public class NotificationListener extends NotificationListenerService// implemen
", text='" + text + '\'' + ", text='" + text + '\'' +
'}'; '}';
} }
@Override
public boolean equals(@Nullable Object obj)
{
return
this.publishTime.getTimeInMillis() == ((SimpleNotification)obj).publishTime.getTimeInMillis()
&&
this.app.equals(((SimpleNotification)obj).app)
&&
this.title.equals(((SimpleNotification)obj).title)
&&
this.text.equals(((SimpleNotification)obj).text);
}
} }
@Override @Override
@ -265,36 +281,6 @@ public class NotificationListener extends NotificationListenerService// implemen
cancelNotification(sbn.getPackageName(), sbn.getTag(), sbn.getId()); cancelNotification(sbn.getPackageName(), sbn.getTag(), sbn.getId());
else else
cancelNotification(sbn.getKey()); cancelNotification(sbn.getKey());
}
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public void clickNotificationButton(StatusBarNotification sbn, String buttonText)
{
boolean buttonFound = false;
if(sbn.getNotification().actions != null)
{
for (Notification.Action a : sbn.getNotification().actions)
{
if((Miscellaneous.isRegularExpression(buttonText) && a.title.toString().matches(buttonText)) || a.title.toString().equalsIgnoreCase(buttonText))
{
if (!buttonFound)
buttonFound = true;
try
{
Miscellaneous.logEvent("w", "clickNotificationButton()", "Pressing button with text \"" + a.title.toString() + "\".", 2);
a.actionIntent.send();
}
catch (PendingIntent.CanceledException e)
{
Miscellaneous.logEvent("w", "clickNotificationButton()", Log.getStackTraceString(e), 2);
}
}
}
}
if(!buttonFound)
Miscellaneous.logEvent("w", "clickNotificationButton()", "Button with text \n" + buttonText + "\n could not found.", 2);
} }
} }

View File

@ -6,15 +6,10 @@ import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.os.Build;
import android.telephony.PhoneStateListener; import android.telephony.PhoneStateListener;
import android.telephony.TelephonyCallback;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.util.Log; import android.util.Log;
import androidx.annotation.RequiresApi;
import com.jens.automation2.ActivityPermissions; import com.jens.automation2.ActivityPermissions;
import com.jens.automation2.AutomationService; import com.jens.automation2.AutomationService;
import com.jens.automation2.Miscellaneous; import com.jens.automation2.Miscellaneous;
@ -27,7 +22,8 @@ import java.util.ArrayList;
public class PhoneStatusListener implements AutomationListenerInterface public class PhoneStatusListener implements AutomationListenerInterface
{ {
static int problematicAndroidLevel = 29; // protected static int currentStateIncoming = -1;
// protected static int currentStateOutgoing = -1;
protected static String lastPhoneNumber=""; protected static String lastPhoneNumber="";
protected static int lastPhoneDirection = -1; //0=incoming, 1=outgoing protected static int lastPhoneDirection = -1; //0=incoming, 1=outgoing
protected static int currentState = -1; protected static int currentState = -1;
@ -76,13 +72,22 @@ public class PhoneStatusListener implements AutomationListenerInterface
return currentState; return currentState;
} }
public static interface IncomingCallsReceiver public static class IncomingCallsReceiver extends PhoneStateListener
{ {
@Override
} public void onCallStateChanged(int state, String incomingNumber)
protected static void workWithIncomingCallData(int state, String incomingNumber)
{ {
// Miscellaneous.logEvent("i", "Call state", "New call state: " + String.valueOf(state), 4);
/*
Unfortunately receivers for incoming and outgoing calls behave pretty differently:
The Outgoing-Receiver is called when starting a call (ringing)
It is not called when that outgoing call ends however, only the incoming receiver.
If the last call was outgoing the state has not changed to idle this is kind of a fake alert.
*/
if(lastPhoneDirection == 2 && currentState != TelephonyManager.CALL_STATE_IDLE) if(lastPhoneDirection == 2 && currentState != TelephonyManager.CALL_STATE_IDLE)
{ {
// This status update is actually for an outgoing call // This status update is actually for an outgoing call
@ -115,6 +120,8 @@ public class PhoneStatusListener implements AutomationListenerInterface
} }
else else
{ {
// state != TelephonyManager.CALL_STATE_IDLE &&
setCurrentState(state); setCurrentState(state);
setLastPhoneDirection(1); setLastPhoneDirection(1);
@ -144,61 +151,6 @@ public class PhoneStatusListener implements AutomationListenerInterface
} }
} }
} }
public static class IncomingCallsReceiverOld extends PhoneStateListener implements IncomingCallsReceiver
{
@Override
public void onCallStateChanged(int state, String incomingNumber)
{
// Miscellaneous.logEvent("i", "Call state", "New call state: " + String.valueOf(state), 4);
/*
Unfortunately receivers for incoming and outgoing calls behave pretty differently:
The Outgoing-Receiver is called when starting a call (ringing)
It is not called when that outgoing call ends however, only the incoming receiver.
If the last call was outgoing the state has not changed to idle this is kind of a fake alert.
*/
workWithIncomingCallData(state, incomingNumber);
}
}
@RequiresApi(api = Build.VERSION_CODES.S)
public static class IncomingCallsReceiverNew extends BroadcastReceiver implements IncomingCallsReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
/*
this code detects both incoming and outgoing,
if the state changes idle => ringing you know it's an incoming call,
if the state changes idle => offhook, you know it's an outgoing call
*/
if (!intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL))
{
String stateStr = intent.getExtras().getString(TelephonyManager.EXTRA_STATE);
int state = 99;
switch(stateStr)
{
case "RINGING":
state = TelephonyManager.CALL_STATE_RINGING;
break;
case "IDLE":
state = TelephonyManager.CALL_STATE_IDLE;
break;
case "OFFHOOK":
state = TelephonyManager.CALL_STATE_OFFHOOK;
break;
}
String number = intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
Log.i("test", "test");
}
}
} }
static void setLastPhoneDirection(int i) static void setLastPhoneDirection(int i)
@ -223,7 +175,7 @@ public class PhoneStatusListener implements AutomationListenerInterface
Miscellaneous.logEvent("i", "Call state", String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.outgoingCallTo), getLastPhoneNumber()), 4); Miscellaneous.logEvent("i", "Call state", String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.outgoingCallTo), getLastPhoneNumber()), 4);
ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.phoneCall); ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.phoneCall);
for(int i = 0; i < ruleCandidates.size(); i++) for(int i=0; i<ruleCandidates.size(); i++)
{ {
AutomationService asInstance = AutomationService.getInstance(); AutomationService asInstance = AutomationService.getInstance();
if(asInstance != null) if(asInstance != null)
@ -253,12 +205,7 @@ public class PhoneStatusListener implements AutomationListenerInterface
} }
if(incomingCallsReceiverInstance == null) if(incomingCallsReceiverInstance == null)
{ incomingCallsReceiverInstance = new IncomingCallsReceiver();
// if(Build.VERSION.SDK_INT >= 31)
// incomingCallsReceiverInstance = new IncomingCallsReceiverNew();
// else
incomingCallsReceiverInstance = new IncomingCallsReceiverOld();
}
if(outgoingCallsReceiverInstance == null) if(outgoingCallsReceiverInstance == null)
outgoingCallsReceiverInstance = new OutgoingCallsReceiver(); outgoingCallsReceiverInstance = new OutgoingCallsReceiver();
@ -268,17 +215,8 @@ public class PhoneStatusListener implements AutomationListenerInterface
if(!incomingCallsReceiverActive) if(!incomingCallsReceiverActive)
{ {
Miscellaneous.logEvent("i", "PhoneStatusListener", "Starting PhoneStatusListener->incomingCallsReceiver", 4); Miscellaneous.logEvent("i", "PhoneStatusListener", "Starting PhoneStatusListener->incomingCallsReceiver", 4);
// if(Build.VERSION.SDK_INT >= problematicAndroidLevel) TelephonyManager tm = (TelephonyManager)automationService.getSystemService(Context.TELEPHONY_SERVICE);
// { tm.listen(incomingCallsReceiverInstance, PhoneStateListener.LISTEN_CALL_STATE);
// IntentFilter callsFilter = new IntentFilter();
// callsFilter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
// automationService.registerReceiver((IncomingCallsReceiverNew)incomingCallsReceiverInstance, callsFilter);
// }
// else
// {
TelephonyManager tm = (TelephonyManager) automationService.getSystemService(Context.TELEPHONY_SERVICE);
tm.listen((IncomingCallsReceiverOld)incomingCallsReceiverInstance, PhoneStateListener.LISTEN_CALL_STATE);
// }
incomingCallsReceiverActive = true; incomingCallsReceiverActive = true;
} }
@ -302,15 +240,8 @@ public class PhoneStatusListener implements AutomationListenerInterface
if(incomingCallsReceiverActive) if(incomingCallsReceiverActive)
{ {
Miscellaneous.logEvent("i", "PhoneStatusListener", "Stopping phoneStatusListener", 4); Miscellaneous.logEvent("i", "PhoneStatusListener", "Stopping phoneStatusListener", 4);
// if(Build.VERSION.SDK_INT >= 31) TelephonyManager tm = (TelephonyManager)automationService.getSystemService(Context.TELEPHONY_SERVICE);
// { tm.listen(incomingCallsReceiverInstance, PhoneStateListener.LISTEN_NONE);
// automationService.unregisterReceiver((IncomingCallsReceiverNew)incomingCallsReceiverInstance);
// }
// else
// {
TelephonyManager tm = (TelephonyManager) automationService.getSystemService(Context.TELEPHONY_SERVICE);
tm.listen((IncomingCallsReceiverOld)incomingCallsReceiverInstance, PhoneStateListener.LISTEN_NONE);
// }
incomingCallsReceiverActive = false; incomingCallsReceiverActive = false;
} }

View File

@ -11,13 +11,12 @@ import com.jens.automation2.Settings;
public class StartupIntentReceiver extends BroadcastReceiver public class StartupIntentReceiver extends BroadcastReceiver
{ {
@Override @Override
public void onReceive(Context context, Intent intent) public void onReceive(Context context, Intent intent)
{ {
Settings.readFromPersistentStorage(context); Settings.readFromPersistentStorage(context);
Miscellaneous.startupContext = context;
// Miscellaneous.logEvent("i", "Boot event", "Received event: " + intent.getAction(), 5); // Miscellaneous.logEvent("i", "Boot event", "Received event: " + intent.getAction(), 5);
if(Settings.startServiceAtSystemBoot) if(Settings.startServiceAtSystemBoot)

View File

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

View File

@ -1,205 +0,0 @@
package com.jens.automation2.receivers;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Build;
import android.util.Log;
import com.jens.automation2.ActivityManageTriggerTethering;
import com.jens.automation2.AutomationService;
import com.jens.automation2.Miscellaneous;
import com.jens.automation2.Rule;
import com.jens.automation2.Trigger;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
public class TetheringReceiver extends android.content.BroadcastReceiver implements AutomationListenerInterface
{
public static AutomationService automationServiceRef = null;
private static boolean receiverActive = false;
private static TetheringReceiver receiverInstance = null;
private static IntentFilter intentFilter = null;
private static List<String> lastTetheringTypes = null;
private static boolean tetheringActive = false;
public static List<String> getLastTetheringTypes()
{
return lastTetheringTypes;
}
public static TetheringReceiver getInstance()
{
if(receiverInstance == null)
receiverInstance = new TetheringReceiver();
return receiverInstance;
}
public static boolean isTetheringActive()
{
return tetheringActive;
}
@Override
public void onReceive(Context context, Intent intent)
{
Miscellaneous.logEvent("i", "TetheringReceiver", "Received " + intent.getAction(), 5);
/*
DETECT BY DATA DELIVERED IN INTENT
*/
// if(intent.getAction().equals("android.net.conn.TETHER_STATE_CHANGED"))
// {
String searchArray = null;
if (Build.VERSION.SDK_INT >= 26)
searchArray = "tetherArray";
else
searchArray = "activeArray";
for (String key : intent.getExtras().keySet())
{
// Miscellaneous.logEvent("i", "Broadcast extra", "Broadcast " + intent.getAction() + " has extra " + key + " and type " + intent.getExtras().get(key).getClass().getName(), 4);
Object ob = intent.getExtras().get(key);
if (key.equals(searchArray) && ob instanceof ArrayList)
{
if (((ArrayList<String>) ob).size() > 0)
{
tetheringActive = true;
if (lastTetheringTypes == null)
lastTetheringTypes = new ArrayList<>();
else
lastTetheringTypes.clear();
for (String adapterName : (ArrayList<String>) ob)
{
if (adapterName.contains("wlan"))
lastTetheringTypes.add(ActivityManageTriggerTethering.tetheringTypeWifi);
else if (adapterName.contains("bluetooth"))
lastTetheringTypes.add(ActivityManageTriggerTethering.tetheringTypeBluetooth);
else if (adapterName.contains("rndis"))
lastTetheringTypes.add(ActivityManageTriggerTethering.tetheringTypeUsb);
else if (adapterName.contains("ndis"))
lastTetheringTypes.add(ActivityManageTriggerTethering.tetheringTypeCable);
}
}
else
tetheringActive = false;
}
// Miscellaneous.logEvent("i", "Broadcast extra", "Broadcast " + intent.getAction() + " has extra " + key + " and type " + intent.getExtras().get(key).getClass().getName(), 4);
}
// }
// else if(intent.getAction().equals("android.net.conn.CONNECTIVITY_CHANGE"))
/*
DETECT BY CHECKING ALL NETWORK INTERFACES
*/
// {
/*try
{
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); )
{
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); )
{
InetAddress inetAddress = enumIpAddr.nextElement();
if (!intf.isLoopback())
{
if (intf.getName().contains("rndis"))
{
Miscellaneous.logEvent("i", "TetheringReceiver", "Tethering on interface " + intf.getName() + " seems to be active.", 4);
lastTetheringTypes.add(ActivityManageTriggerTethering.tetheringTypeUsb);
tetheringActive = true;
}
else if (intf.getName().contains("ndis"))
{
Miscellaneous.logEvent("i", "TetheringReceiver", "Tethering on interface " + intf.getName() + " seems to be active.", 4);
lastTetheringTypes.add(ActivityManageTriggerTethering.tetheringTypeCable);
tetheringActive = true;
}
}
}
}
}
catch (Exception e)
{
Miscellaneous.logEvent("e", "TetheringReceiver", Log.getStackTraceString(e), 1);
}*/
// }
ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger.Trigger_Enum.tethering);
for(int i=0; i<ruleCandidates.size(); i++)
{
if(ruleCandidates.get(i).getsGreenLight(context))
ruleCandidates.get(i).activate(automationServiceRef, false);
}
}
@Override
public void startListener(AutomationService automationService)
{
if(!receiverActive)
{
TetheringReceiver.automationServiceRef = automationService;
if(receiverInstance == null)
receiverInstance = new TetheringReceiver();
if(intentFilter == null)
{
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.TETHER_STATE_CHANGED");
// intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
}
try
{
automationServiceRef.registerReceiver(receiverInstance, intentFilter);
receiverActive = true;
}
catch(Exception e)
{
/*
We might be confronted with permission issues here.
*/
Miscellaneous.logEvent("e", "TetheringReceiver", Log.getStackTraceString(e), 1);
receiverActive = false;
}
}
}
@Override
public void stopListener(AutomationService automationService)
{
if(receiverActive)
{
if(receiverInstance != null)
{
automationServiceRef.unregisterReceiver(receiverInstance);
receiverInstance = null;
}
receiverActive = false;
}
}
@Override
public boolean isListenerRunning()
{
return receiverActive;
}
@Override
public Trigger.Trigger_Enum[] getMonitoredTrigger()
{
return new Trigger.Trigger_Enum[] { Trigger.Trigger_Enum.tethering};
}
}

View File

@ -76,12 +76,12 @@ public class TimeZoneListener extends BroadcastReceiver implements AutomationLis
if(action.equals(Intent.ACTION_TIMEZONE_CHANGED)) if(action.equals(Intent.ACTION_TIMEZONE_CHANGED))
{ {
Miscellaneous.logEvent("i", "TimeZoneListener", "Device timezone changed. Reloading alarms.", 3); Miscellaneous.logEvent("i", "TimeZoneListener", "Device timezone changed. Reloading alarms.", 3);
DateTimeListener.setOrResetAlarms(); DateTimeListener.reloadAlarms();
} }
else if(action.equals(Intent.ACTION_TIME_CHANGED)) else if(action.equals(Intent.ACTION_TIME_CHANGED))
{ {
Miscellaneous.logEvent("i", "TimeZoneListener", "Device time changed. Reloading alarms.", 3); Miscellaneous.logEvent("i", "TimeZoneListener", "Device time changed. Reloading alarms.", 3);
DateTimeListener.setOrResetAlarms(); DateTimeListener.reloadAlarms();
} }
} }
@Override @Override

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 679 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Some files were not shown because too many files have changed in this diff Show More