diff --git a/app/src/apkFlavor/java/com/jens/automation2/Rule.java b/app/src/apkFlavor/java/com/jens/automation2/Rule.java index d5d9c28..18b2389 100644 --- a/app/src/apkFlavor/java/com/jens/automation2/Rule.java +++ b/app/src/apkFlavor/java/com/jens/automation2/Rule.java @@ -556,7 +556,7 @@ public class Rule implements Comparable innerloop: for(Trigger oneTrigger : oneRule.getTriggerSet()) { - if(oneTrigger.getTriggerType() == triggerType) + if(oneTrigger.getTriggerType().equals(triggerType)) { ruleCandidates.add(oneRule); break innerloop; // we don't need to check the other triggers in the same rule @@ -566,6 +566,26 @@ public class Rule implements Comparable return ruleCandidates; } + + public static ArrayList findRuleCandidates(Action.Action_Enum actionType) + { + ArrayList ruleCandidates = new ArrayList(); + + for(Rule oneRule : ruleCollection) + { + innerloop: + for(Action oneAction : oneRule.getActionSet()) + { + if(oneAction.getAction().equals(actionType)) + { + ruleCandidates.add(oneRule); + break innerloop; // we don't need to check the other actions in the same rule + } + } + } + + return ruleCandidates; + } public static ArrayList findRuleCandidatesByPoi(PointOfInterest searchPoi, boolean triggerParameter) { @@ -608,186 +628,6 @@ public class Rule implements Comparable return ruleCandidates; } - /*public static ArrayList findRuleCandidatesByTimeFrame(TimeFrame searchTimeFrame, boolean triggerParameter) - { - ArrayList ruleCandidates = new ArrayList(); - - for(int i=0; i findRuleCandidatesByTime(Time searchTime) - { - Miscellaneous.logEvent("i", "RuleSearch", "Searching for rules with TimeFrame with time " + searchTime.toString() + ". RuleCollection-Size: " + String.valueOf(ruleCollection.size()), 3);; - ArrayList ruleCandidates = new ArrayList(); - - for(Rule oneRule : ruleCollection) - { - innerloop: - for(Trigger oneTrigger : oneRule.getTriggerSet()) - { - if(oneTrigger.getTriggerType() == Trigger.Trigger_Enum.timeFrame) - { - Miscellaneous.logEvent("i", "RuleSearch", "Searching interval: " + oneTrigger.getTimeFrame().getTriggerTimeStart().toString() + " to " + oneTrigger.getTimeFrame().getTriggerTimeStop().toString(), 5); - Miscellaneous.logEvent("i", "RuleSearch", "interval start: " + String.valueOf(oneTrigger.getTimeFrame().getTriggerTimeStart().getTime()), 5); - Miscellaneous.logEvent("i", "RuleSearch", "search time: " + String.valueOf(searchTime.getTime()), 5); - Miscellaneous.logEvent("i", "RuleSearch", "interval stop: " + String.valueOf(oneTrigger.getTimeFrame().getTriggerTimeStop().getTime()), 5); - - if(oneTrigger.getTimeFrame().getTriggerTimeStart().getTime() > oneTrigger.getTimeFrame().getTriggerTimeStop().getTime()) - { - Miscellaneous.logEvent("i", "Timeframe search", "Rule (" + oneRule.getName() + ") stretches over midnight.", 5); - if(oneTrigger.getTimeFrame().getTriggerTimeStart().getTime() <= searchTime.getTime() || searchTime.getTime() <= oneTrigger.getTimeFrame().getTriggerTimeStop().getTime()+20000) //add 20 seconds because of delay - { - ruleCandidates.add(oneRule); - break innerloop; //if the poi is found we don't need to search the other triggers in the same rule - } - } - else if(oneTrigger.getTimeFrame().getTriggerTimeStart().getTime() <= searchTime.getTime() && searchTime.getTime() <= oneTrigger.getTimeFrame().getTriggerTimeStop().getTime()+20000) //add 20 seconds because of delay - { - Miscellaneous.logEvent("i", "RuleSearch", "Rule found (" + oneRule.getName() + ") with TimeFrame with time " + searchTime.toString(), 3); - ruleCandidates.add(oneRule); - break innerloop; //if the poi is found we don't need to search the other triggers in the same rule - } - } - } - } - - Miscellaneous.logEvent("i", "RuleSearch", String.valueOf(ruleCandidates.size()) + " Rule(s) found with TimeFrame with time " + searchTime.toString(), 3); - - return ruleCandidates; - }*/ - - /*public static ArrayList findRuleCandidatesByCharging(boolean triggerParameter) - { - ArrayList ruleCandidates = new ArrayList(); - - for(Rule oneRule : ruleCollection) - { - innerloop: - for(Trigger oneTrigger : oneRule.getTriggerSet()) - { - if(oneTrigger.getTriggerType() == Trigger.Trigger_Enum.charging) - { - if(oneTrigger.getTriggerParameter() == triggerParameter) - { - ruleCandidates.add(oneRule); - break innerloop; //if the poi is found we don't need to search the other triggers in the same rule - } - } - } - } - - return ruleCandidates; - }*/ - - /*public static ArrayList findRuleCandidatesByUsbHost(boolean triggerParameter) - { - ArrayList ruleCandidates = new ArrayList(); - - for(Rule oneRule : ruleCollection) - { - innerloop: - for(Trigger oneTrigger : oneRule.getTriggerSet()) - { - if(oneTrigger.getTriggerType() == Trigger.Trigger_Enum.usb_host_connection) - { - if(oneTrigger.getTriggerParameter() == triggerParameter) - { - ruleCandidates.add(oneRule); - break innerloop; //if the poi is found we don't need to search the other triggers in the same rule - } - } - } - } - - return ruleCandidates; - }*/ - - /*public static ArrayList findRuleCandidatesByAirplaneMode(boolean triggerParameter) - { - ArrayList ruleCandidates = new ArrayList(); - - for(Rule oneRule : ruleCollection) - { - innerloop: - for(Trigger oneTrigger : oneRule.getTriggerSet()) - { - if(oneTrigger.getTriggerType() == Trigger.Trigger_Enum.airplaneMode) - { - if(oneTrigger.getTriggerParameter() == triggerParameter) - { - ruleCandidates.add(oneRule); - break innerloop; //we don't need to search the other triggers in the same rule - } - } - } - } - - return ruleCandidates; - }*/ - - /*public static ArrayList findRuleCandidatesByRoaming(boolean triggerParameter) - { - ArrayList ruleCandidates = new ArrayList(); - - for(Rule oneRule : ruleCollection) - { - innerloop: - for(Trigger oneTrigger : oneRule.getTriggerSet()) - { - if(oneTrigger.getTriggerType() == Trigger.Trigger_Enum.roaming) - { - if(oneTrigger.getTriggerParameter() == triggerParameter) - { - ruleCandidates.add(oneRule); - break innerloop; //we don't need to search the other triggers in the same rule - } - } - } - } - - return ruleCandidates; - }*/ - - /*public static ArrayList findRuleCandidatesByPhoneCall(String direction) - { - ArrayList ruleCandidates = new ArrayList(); - - for(Rule oneRule : ruleCollection) - { - innerloop: - for(Trigger oneTrigger : oneRule.getTriggerSet()) - { - if(oneTrigger.getTriggerType() == Trigger.Trigger_Enum.phoneCall) - { - String[] elements = oneTrigger.getTriggerParameter2().split(triggerParameter2Split); - if(elements[1].equals(Trigger.triggerPhoneCallDirectionAny) || elements[1].equals(direction)) - { - ruleCandidates.add(oneRule); - break innerloop; //we don't need to search the other triggers in the same rule - } - } - } - } - - return ruleCandidates; - }*/ - public static ArrayList findRuleCandidatesByPoi(PointOfInterest searchPoi) { ArrayList ruleCandidates = new ArrayList(); @@ -810,29 +650,6 @@ public class Rule implements Comparable return ruleCandidates; } - - /*public static ArrayList findRuleCandidatesByHeadphoneJack(boolean triggerParameter) - { - ArrayList ruleCandidates = new ArrayList(); - - for(Rule oneRule : ruleCollection) - { - innerloop: - for(Trigger oneTrigger : oneRule.getTriggerSet()) - { - if(oneTrigger.getTriggerType() == Trigger.Trigger_Enum.headsetPlugged) - { - if(oneTrigger.getTriggerParameter() == triggerParameter) - { - ruleCandidates.add(oneRule); - break innerloop; //we don't need to search the other triggers in the same rule - } - } - } - } - - return ruleCandidates; - }*/ public static ArrayList findRuleCandidatesByTriggerProfile(Profile profile) { @@ -931,4 +748,4 @@ public class Rule implements Comparable { return ActivityPermissions.havePermissionsForRule(this, Miscellaneous.getAnyContext()); } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/jens/automation2/ActivityManageRule.java b/app/src/main/java/com/jens/automation2/ActivityManageRule.java index 542b727..6ff1f5a 100644 --- a/app/src/main/java/com/jens/automation2/ActivityManageRule.java +++ b/app/src/main/java/com/jens/automation2/ActivityManageRule.java @@ -1137,9 +1137,6 @@ public class ActivityManageRule extends Activity }); AlertDialog alertDialog = alertDialogBuilder.create(); -// Log.i("Amount of Applications", String.valueOf(applicationArray.length)); -// Log.i("Amount of Packages", String.valueOf(ActivityManageStartActivity.getPackageListString(myContext).length)); - return alertDialog; } @@ -1176,6 +1173,7 @@ public class ActivityManageRule extends Activity triggerProcess = activityArray[which]; newTrigger.setTriggerType(Trigger_Enum.process_started_stopped); newTrigger.setProcessName(triggerProcess); + newTrigger.setTriggerParameter2(packageName + Trigger.triggerParameter2Split + triggerProcess); ruleToEdit.getTriggerSet().add(newTrigger); refreshTriggerList(); } diff --git a/app/src/main/java/com/jens/automation2/ReceiverCoordinator.java b/app/src/main/java/com/jens/automation2/ReceiverCoordinator.java index d59fd1b..5613da2 100644 --- a/app/src/main/java/com/jens/automation2/ReceiverCoordinator.java +++ b/app/src/main/java/com/jens/automation2/ReceiverCoordinator.java @@ -15,6 +15,7 @@ import com.jens.automation2.receivers.HeadphoneJackListener; import com.jens.automation2.receivers.NoiseListener; import com.jens.automation2.receivers.PhoneStatusListener; import com.jens.automation2.receivers.ProcessListener; +import com.jens.automation2.receivers.ScreenStateReceiver; import com.jens.automation2.receivers.TimeZoneListener; import androidx.annotation.RequiresApi; @@ -54,6 +55,7 @@ public class ReceiverCoordinator //NotificationListener.class, PhoneStatusListener.class, ProcessListener.class, + ScreenStateReceiver.class, TimeZoneListener.class }; } @@ -70,6 +72,7 @@ public class ReceiverCoordinator NoiseListener.class, PhoneStatusListener.class, ProcessListener.class, + ScreenStateReceiver.class, TimeZoneListener.class }; } @@ -177,13 +180,14 @@ public class ReceiverCoordinator // Nothing to do, just not starting this one. } - //startBluetoothReceiver if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.bluetoothConnection)) BluetoothReceiver.startBluetoothReceiver(); - //startHeadsetJackListener if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.headsetPlugged)) HeadphoneJackListener.getInstance().startListener(AutomationService.getInstance()); + + if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.screenState)) + ScreenStateReceiver.startScreenStateReceiver(AutomationService.getInstance()); } public static void stopAllReceivers() @@ -268,6 +272,17 @@ public class ReceiverCoordinator ProcessListener.stopProcessListener(AutomationService.getInstance()); } + if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.screenState)) + { + Miscellaneous.logEvent("i", "LocationProvider", "Starting ScreenStateListener because used in a new/changed rule.", 4); + ScreenStateReceiver.startScreenStateReceiver(AutomationService.getInstance()); + } + else + { + Miscellaneous.logEvent("i", "LocationProvider", "Shutting down ScreenStateListener because not used in any rule.", 4); + ScreenStateReceiver.stopScreenStateReceiver(); + } + if(!BuildConfig.FLAVOR.equalsIgnoreCase("fdroidFlavor")) { if (Rule.isAnyRuleUsing(Trigger.Trigger_Enum.activityDetection)) diff --git a/app/src/main/java/com/jens/automation2/Trigger.java b/app/src/main/java/com/jens/automation2/Trigger.java index 14c2eb0..bf5bf91 100644 --- a/app/src/main/java/com/jens/automation2/Trigger.java +++ b/app/src/main/java/com/jens/automation2/Trigger.java @@ -24,6 +24,7 @@ import com.jens.automation2.receivers.PhoneStatusListener; import com.jens.automation2.receivers.ProcessListener; import com.jens.automation2.receivers.ScreenStateReceiver; +import static com.jens.automation2.Trigger.triggerParameter2Split; import static com.jens.automation2.receivers.NotificationListener.EXTRA_TEXT; import static com.jens.automation2.receivers.NotificationListener.EXTRA_TITLE; @@ -555,7 +556,19 @@ public class Trigger boolean checkProcess() { - boolean running = ProcessListener.getRunningApps().contains(this.getProcessName()); + boolean running = false; + + if(getTriggerParameter2().contains(triggerParameter2Split)) + { + String parts[] = triggerParameter2.split(triggerParameter2Split); + for(String appName : ProcessListener.getRunningApps()) + { + if(appName.startsWith(parts[0])) + running = true; + } + } + else + running = ProcessListener.getRunningApps().contains(this.getProcessName()); if(running) Miscellaneous.logEvent("i", "ProcessMonitoring", "App " + this.getProcessName() + " is currently running.", 4); diff --git a/app/src/main/java/com/jens/automation2/XmlFileInterface.java b/app/src/main/java/com/jens/automation2/XmlFileInterface.java index 8adfc2e..946e223 100644 --- a/app/src/main/java/com/jens/automation2/XmlFileInterface.java +++ b/app/src/main/java/com/jens/automation2/XmlFileInterface.java @@ -263,11 +263,9 @@ public class XmlFileInterface else if(Rule.getRuleCollection().get(i).getTriggerSet().get(j).getTriggerType() == Trigger_Enum.wifiConnection) serializer.text(Rule.getRuleCollection().get(i).getTriggerSet().get(j).getTriggerParameter2()); else if(Rule.getRuleCollection().get(i).getTriggerSet().get(j).getTriggerType() == Trigger_Enum.process_started_stopped) - serializer.text(Rule.getRuleCollection().get(i).getTriggerSet().get(j).getProcessName()); + serializer.text(Rule.getRuleCollection().get(i).getTriggerSet().get(j).getTriggerParameter2()); else if(Rule.getRuleCollection().get(i).getTriggerSet().get(j).getTriggerType() == Trigger_Enum.batteryLevel) serializer.text(String.valueOf(Rule.getRuleCollection().get(i).getTriggerSet().get(j).getBatteryLevel())); -// else if(Rule.getRuleCollection().get(i).getTriggerSet().get(j).getTriggerType() == Trigger_Enum.phoneCall) -// serializer.text(String.valueOf(Rule.getRuleCollection().get(i).getTriggerSet().get(j).getPhoneDirection()) + "," + String.valueOf(Rule.getRuleCollection().get(i).getTriggerSet().get(j).getPhoneNumber())); else if(Rule.getRuleCollection().get(i).getTriggerSet().get(j).getTriggerType() == Trigger_Enum.nfcTag) serializer.text(Rule.getRuleCollection().get(i).getTriggerSet().get(j).getNfcTagId()); else if(Rule.getRuleCollection().get(i).getTriggerSet().get(j).getTriggerType() == Trigger_Enum.activityDetection) @@ -943,8 +941,16 @@ public class XmlFileInterface } else if(newTrigger.getTriggerType() == Trigger_Enum.process_started_stopped) { - newTrigger.setProcessName(triggerParameter2); newTrigger.setTriggerParameter2(triggerParameter2); + + if(triggerParameter2.contains(triggerParameter2Split)) + { + String[] parts = triggerParameter2.split(triggerParameter2Split); + newTrigger.setProcessName(parts[1]); + } + else + newTrigger.setProcessName(triggerParameter2); + } else if(newTrigger.getTriggerType() == Trigger_Enum.phoneCall) { diff --git a/app/src/main/java/com/jens/automation2/receivers/ProcessListener.java b/app/src/main/java/com/jens/automation2/receivers/ProcessListener.java index 4b12919..9f57c0a 100644 --- a/app/src/main/java/com/jens/automation2/receivers/ProcessListener.java +++ b/app/src/main/java/com/jens/automation2/receivers/ProcessListener.java @@ -1,5 +1,6 @@ package com.jens.automation2.receivers; +import android.Manifest; import android.app.ActivityManager; import android.app.ActivityManager.RunningAppProcessInfo; import android.app.ActivityManager.RunningServiceInfo; @@ -8,6 +9,7 @@ import android.content.Context; import android.os.Handler; import android.os.Message; +import com.jens.automation2.Action; import com.jens.automation2.ActivityPermissions; import com.jens.automation2.AutomationService; import com.jens.automation2.Miscellaneous; @@ -208,12 +210,12 @@ public class ProcessListener implements AutomationListenerInterface workHandler.sendMessage(answer); //activate rule(s) - /*ArrayList ruleCandidates = Rule.findRuleCandidatesByProcess(); + ArrayList ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.process_started_stopped); for(int i=0; i procInfos = activityManager.getRunningAppProcesses(); -// for(int i = 0; i < procInfos.size(); i++) -// { -// ArrayList runningPkgs = new ArrayList(Arrays.asList(procInfos.get(i).pkgList)); -// -// Collection diff = subtractSets(runningPkgs, stalkList); -// -// if(diff != null) -// { -// stalkList.removeAll(diff); -// } -// } // Set marker to the one to be written next. if(lastWritten == 1) @@ -351,7 +335,7 @@ public class ProcessListener implements AutomationListenerInterface return false; } - private boolean checkifThisIsActive(RunningAppProcessInfo target) + private boolean checkIfThisIsActive(RunningAppProcessInfo target) { boolean result = false; RunningTaskInfo info; @@ -397,7 +381,6 @@ public class ProcessListener implements AutomationListenerInterface Message message = new Message(); message.arg1 = 1; -// schedulingHandler.sendMessageDelayed(message, Settings.timeBetweenNoiseLevelMeasurements * 1000); schedulingHandler.sendMessageDelayed(message, 10000); } else @@ -444,7 +427,7 @@ public class ProcessListener implements AutomationListenerInterface public static boolean haveAllPermission() { - return ActivityPermissions.havePermission("android.permission.GET_TASKS", Miscellaneous.getAnyContext()); + return ActivityPermissions.havePermission(Manifest.permission.GET_TASKS, Miscellaneous.getAnyContext()); } @Override @@ -458,6 +441,4 @@ public class ProcessListener implements AutomationListenerInterface { return new Trigger_Enum[] { Trigger_Enum.process_started_stopped }; } - - -} +} \ No newline at end of file diff --git a/app/src/main/java/com/jens/automation2/receivers/ScreenStateReceiver.java b/app/src/main/java/com/jens/automation2/receivers/ScreenStateReceiver.java index e0c0ecd..034c1b0 100644 --- a/app/src/main/java/com/jens/automation2/receivers/ScreenStateReceiver.java +++ b/app/src/main/java/com/jens/automation2/receivers/ScreenStateReceiver.java @@ -27,6 +27,14 @@ public class ScreenStateReceiver extends BroadcastReceiver implements Automation private static Intent screenStatusIntent = null; private static BroadcastReceiver screenStateReceiverInstance = null; + public static BroadcastReceiver getScreenStateReceiverInstance() + { + if(screenStateReceiverInstance == null) + screenStateReceiverInstance = new ScreenStateReceiver(); + + return screenStateReceiverInstance; + } + public static void startScreenStateReceiver(final AutomationService automationServiceRef) { if(!screenStateReceiverActive) @@ -93,14 +101,14 @@ public class ScreenStateReceiver extends BroadcastReceiver implements Automation try { - if(intent.getAction().equals(Intent.ACTION_SCREEN_ON)) - { - ScreenStateReceiver.screenState = 1; - } - else if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) + if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { ScreenStateReceiver.screenState = 0; } + else if(intent.getAction().equals(Intent.ACTION_SCREEN_ON)) + { + ScreenStateReceiver.screenState = 1; + } else if(intent.getAction().equals(Intent.ACTION_USER_PRESENT)) { ScreenStateReceiver.screenState = 2; @@ -114,10 +122,6 @@ public class ScreenStateReceiver extends BroadcastReceiver implements Automation { Miscellaneous.logEvent("e", "ScreenStateReceiver", "Error receiving screen state: " + e.getMessage(), 3); } - } - - private void actionCharging(Context context, int state) - { ArrayList ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.screenState); for(int i=0; i