Compare commits
3 Commits
v1.7.4
...
9bf353ea3a
Author | SHA1 | Date | |
---|---|---|---|
9bf353ea3a | |||
af90b566c8 | |||
0e51c577d5 |
@ -11,8 +11,8 @@
|
||||
"type": "SINGLE",
|
||||
"filters": [],
|
||||
"attributes": [],
|
||||
"versionCode": 118,
|
||||
"versionName": "1.7.4-googlePlay",
|
||||
"versionCode": 116,
|
||||
"versionName": "1.7.2-googlePlay",
|
||||
"outputFile": "app-googlePlayFlavor-release.apk"
|
||||
}
|
||||
],
|
||||
|
@ -5,7 +5,6 @@ import static com.jens.automation2.Trigger.triggerParameter2Split;
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Build;
|
||||
import android.os.Looper;
|
||||
import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
@ -22,6 +21,7 @@ import java.util.List;
|
||||
public class Rule implements Comparable<Rule>
|
||||
{
|
||||
private static ArrayList<Rule> ruleCollection = new ArrayList<Rule>();
|
||||
public static boolean isAnyRuleActive = false;
|
||||
|
||||
private static List<Rule> ruleRunHistory = new ArrayList<Rule>();
|
||||
|
||||
@ -312,12 +312,19 @@ public class Rule implements Comparable<Rule>
|
||||
switch(action.getAction())
|
||||
{
|
||||
case setAirplaneMode:
|
||||
return true;
|
||||
case setBluetooth:
|
||||
return true;
|
||||
case setDataConnection:
|
||||
return true;
|
||||
case setDisplayRotation:
|
||||
return true;
|
||||
case setUsbTethering:
|
||||
return true;
|
||||
case setWifi:
|
||||
return true;
|
||||
case setWifiTethering:
|
||||
return true;
|
||||
case setBluetoothTethering:
|
||||
return true;
|
||||
default:
|
||||
@ -344,10 +351,7 @@ public class Rule implements Comparable<Rule>
|
||||
if(applies(context))
|
||||
{
|
||||
if(hasNotAppliedSinceLastExecution())
|
||||
{
|
||||
Miscellaneous.logEvent("i", "getsGreenLight()", "Rule " + getName() + " applies and has flipped since its last execution.", 4);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
Miscellaneous.logEvent("i", "getsGreenLight()", "Rule " + getName() + " has not flipped since its last execution.", 4);
|
||||
}
|
||||
@ -373,6 +377,7 @@ public class Rule implements Comparable<Rule>
|
||||
return false;
|
||||
}
|
||||
|
||||
Miscellaneous.logEvent("i", String.format(context.getResources().getString(R.string.ruleCheckOf), this.getName()), String.format("Rule %1$s generally applies currently. Checking if it's really due, yet will be done separately.", this.getName()), 3);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -429,7 +434,7 @@ public class Rule implements Comparable<Rule>
|
||||
|
||||
Thread.setDefaultUncaughtExceptionHandler(Miscellaneous.uncaughtExceptionHandler);
|
||||
|
||||
// without this line the debugger will - for some reason - skip all breakpoints in this class
|
||||
// without this line debugger will - for some reason - skip all breakpoints in this class
|
||||
if(android.os.Debug.isDebuggerConnected())
|
||||
android.os.Debug.waitForDebugger();
|
||||
|
||||
@ -437,7 +442,7 @@ public class Rule implements Comparable<Rule>
|
||||
Looper.prepare();
|
||||
|
||||
setLastExecution(Calendar.getInstance());
|
||||
wasActivated = activateInternally((AutomationService)params[0]);
|
||||
wasActivated = activateInternally((AutomationService)params[0], (Boolean)params[1]);
|
||||
|
||||
return null;
|
||||
}
|
||||
@ -472,57 +477,66 @@ public class Rule implements Comparable<Rule>
|
||||
* Will activate the rule. Should be called by a separate execution thread
|
||||
* @param automationService
|
||||
*/
|
||||
protected boolean activateInternally(AutomationService automationService)
|
||||
protected boolean activateInternally(AutomationService automationService, boolean force)
|
||||
{
|
||||
boolean isActuallyToggleable = isActuallyToggable();
|
||||
boolean isActuallyToggable = isActuallyToggable();
|
||||
|
||||
boolean notLastActive = getLastActivatedRule() == null || !getLastActivatedRule().equals(Rule.this);
|
||||
boolean doToggle = ruleToggle && isActuallyToggleable;
|
||||
boolean doToggle = ruleToggle && isActuallyToggable;
|
||||
|
||||
String message;
|
||||
if(!doToggle)
|
||||
message = String.format(automationService.getResources().getString(R.string.ruleActivate), Rule.this.getName());
|
||||
else
|
||||
message = String.format(automationService.getResources().getString(R.string.ruleActivateToggle), Rule.this.getName());
|
||||
//if(notLastActive || force || doToggle)
|
||||
// if(force || doToggle)
|
||||
// {
|
||||
String message;
|
||||
if(!doToggle)
|
||||
message = String.format(automationService.getResources().getString(R.string.ruleActivate), Rule.this.getName());
|
||||
else
|
||||
message = String.format(automationService.getResources().getString(R.string.ruleActivateToggle), Rule.this.getName());
|
||||
Miscellaneous.logEvent("i", "Rule", message, 2);
|
||||
// automationService.speak(message);
|
||||
// Toast.makeText(automationService, message, Toast.LENGTH_LONG).show();
|
||||
if(Settings.startNewThreadForRuleActivation)
|
||||
publishProgress(message);
|
||||
|
||||
Miscellaneous.logEvent("i", "Rule", message, 2);
|
||||
for(int i = 0; i< Rule.this.getActionSet().size(); i++)
|
||||
{
|
||||
try
|
||||
{
|
||||
Rule.this.getActionSet().get(i).run(automationService, doToggle);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
Miscellaneous.logEvent("e", "RuleExecution", "Error running action of rule " + Rule.this.getName() + ": " + Log.getStackTraceString(e), 1);
|
||||
}
|
||||
}
|
||||
|
||||
if(Settings.startNewThreadForRuleActivation)
|
||||
publishProgress(message);
|
||||
|
||||
for(int i = 0; i< Rule.this.getActionSet().size(); i++)
|
||||
{
|
||||
// Keep log of last x rule activations (Settings)
|
||||
try
|
||||
{
|
||||
Rule.this.getActionSet().get(i).run(automationService, doToggle);
|
||||
Rule.ruleRunHistory.add(0, Rule.this); // add at beginning for better visualization
|
||||
Rule.lastActivatedRuleActivationTime = new Date();
|
||||
|
||||
while(ruleRunHistory.size() > Settings.rulesThatHaveBeenRanHistorySize)
|
||||
ruleRunHistory.remove(ruleRunHistory.size()-1);
|
||||
String history = "";
|
||||
for(Rule rule : ruleRunHistory)
|
||||
history += rule.getName() + ", ";
|
||||
if(history.length() > 0)
|
||||
history = history.substring(0, history.length()-2);
|
||||
Miscellaneous.logEvent("i", "Rule history", "Most recent first: " + history, 4);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
Miscellaneous.logEvent("e", "RuleExecution", "Error running action of rule " + Rule.this.getName() + ": " + Log.getStackTraceString(e), 1);
|
||||
Miscellaneous.logEvent("e", "Rule history error", Log.getStackTraceString(e), 3);
|
||||
}
|
||||
}
|
||||
|
||||
// Keep log of last x rule activations (Settings)
|
||||
try
|
||||
{
|
||||
Rule.ruleRunHistory.add(0, Rule.this); // add at beginning for better visualization
|
||||
Rule.lastActivatedRuleActivationTime = new Date();
|
||||
|
||||
while(ruleRunHistory.size() > Settings.rulesThatHaveBeenRanHistorySize)
|
||||
ruleRunHistory.remove(ruleRunHistory.size()-1);
|
||||
String history = "";
|
||||
for(Rule rule : ruleRunHistory)
|
||||
history += rule.getName() + ", ";
|
||||
if(history.length() > 0)
|
||||
history = history.substring(0, history.length()-2);
|
||||
Miscellaneous.logEvent("i", "Rule history", "Most recent first: " + history, 4);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
Miscellaneous.logEvent("e", "Rule history error", Log.getStackTraceString(e), 3);
|
||||
}
|
||||
|
||||
Miscellaneous.logEvent("i", "Rule", String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.ruleActivationComplete), Rule.this.getName()), 2);
|
||||
Miscellaneous.logEvent("i", "Rule", String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.ruleActivationComplete), Rule.this.getName()), 2);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// Miscellaneous.logEvent("i", "Rule", "Request to activate rule " + Rule.this.getName() + ", but it is the last one that was activated. Won't do it again.", 3);
|
||||
// return false;
|
||||
// }
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -531,10 +545,7 @@ public class Rule implements Comparable<Rule>
|
||||
public void activate(AutomationService automationService, boolean force)
|
||||
{
|
||||
ActivateRuleTask task = new ActivateRuleTask();
|
||||
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
|
||||
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, automationService, force);
|
||||
else
|
||||
task.execute(automationService, force);
|
||||
task.execute(automationService, force);
|
||||
}
|
||||
|
||||
public static ArrayList<Rule> findRuleCandidates(Trigger.Trigger_Enum triggerType)
|
||||
@ -543,13 +554,13 @@ public class Rule implements Comparable<Rule>
|
||||
|
||||
for(Rule oneRule : ruleCollection)
|
||||
{
|
||||
innerLoop:
|
||||
innerloop:
|
||||
for(Trigger oneTrigger : oneRule.getTriggerSet())
|
||||
{
|
||||
if(oneTrigger.getTriggerType().equals(triggerType))
|
||||
{
|
||||
ruleCandidates.add(oneRule);
|
||||
break innerLoop; // we don't need to check the other triggers in the same rule
|
||||
break innerloop; // we don't need to check the other triggers in the same rule
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -5,7 +5,6 @@ import static com.jens.automation2.Trigger.triggerParameter2Split;
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Build;
|
||||
import android.os.Looper;
|
||||
import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
@ -19,6 +18,7 @@ import java.util.List;
|
||||
public class Rule implements Comparable<Rule>
|
||||
{
|
||||
private static ArrayList<Rule> ruleCollection = new ArrayList<Rule>();
|
||||
public static boolean isAnyRuleActive = false;
|
||||
|
||||
private static List<Rule> ruleRunHistory = new ArrayList<Rule>();
|
||||
|
||||
@ -309,12 +309,19 @@ public class Rule implements Comparable<Rule>
|
||||
switch(action.getAction())
|
||||
{
|
||||
case setAirplaneMode:
|
||||
return true;
|
||||
case setBluetooth:
|
||||
return true;
|
||||
case setDataConnection:
|
||||
return true;
|
||||
case setDisplayRotation:
|
||||
return true;
|
||||
case setUsbTethering:
|
||||
return true;
|
||||
case setWifi:
|
||||
return true;
|
||||
case setWifiTethering:
|
||||
return true;
|
||||
case setBluetoothTethering:
|
||||
return true;
|
||||
default:
|
||||
@ -341,10 +348,7 @@ public class Rule implements Comparable<Rule>
|
||||
if(applies(context))
|
||||
{
|
||||
if(hasNotAppliedSinceLastExecution())
|
||||
{
|
||||
Miscellaneous.logEvent("i", "getsGreenLight()", "Rule " + getName() + " applies and has flipped since its last execution.", 4);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
Miscellaneous.logEvent("i", "getsGreenLight()", "Rule " + getName() + " has not flipped since its last execution.", 4);
|
||||
}
|
||||
@ -402,7 +406,7 @@ public class Rule implements Comparable<Rule>
|
||||
|
||||
Thread.setDefaultUncaughtExceptionHandler(Miscellaneous.uncaughtExceptionHandler);
|
||||
|
||||
// without this line the debugger will - for some reason - skip all breakpoints in this class
|
||||
// without this line debugger will - for some reason - skip all breakpoints in this class
|
||||
if(android.os.Debug.isDebuggerConnected())
|
||||
android.os.Debug.waitForDebugger();
|
||||
|
||||
@ -410,7 +414,7 @@ public class Rule implements Comparable<Rule>
|
||||
Looper.prepare();
|
||||
|
||||
setLastExecution(Calendar.getInstance());
|
||||
wasActivated = activateInternally((AutomationService)params[0]);
|
||||
wasActivated = activateInternally((AutomationService)params[0], (Boolean)params[1]);
|
||||
|
||||
return null;
|
||||
}
|
||||
@ -445,57 +449,66 @@ public class Rule implements Comparable<Rule>
|
||||
* Will activate the rule. Should be called by a separate execution thread
|
||||
* @param automationService
|
||||
*/
|
||||
protected boolean activateInternally(AutomationService automationService)
|
||||
protected boolean activateInternally(AutomationService automationService, boolean force)
|
||||
{
|
||||
boolean isActuallyToggleable = isActuallyToggable();
|
||||
boolean isActuallyToggable = isActuallyToggable();
|
||||
|
||||
boolean notLastActive = getLastActivatedRule() == null || !getLastActivatedRule().equals(Rule.this);
|
||||
boolean doToggle = ruleToggle && isActuallyToggleable;
|
||||
boolean doToggle = ruleToggle && isActuallyToggable;
|
||||
|
||||
String message;
|
||||
if(!doToggle)
|
||||
message = String.format(automationService.getResources().getString(R.string.ruleActivate), Rule.this.getName());
|
||||
else
|
||||
message = String.format(automationService.getResources().getString(R.string.ruleActivateToggle), Rule.this.getName());
|
||||
//if(notLastActive || force || doToggle)
|
||||
// if(force || doToggle)
|
||||
// {
|
||||
String message;
|
||||
if(!doToggle)
|
||||
message = String.format(automationService.getResources().getString(R.string.ruleActivate), Rule.this.getName());
|
||||
else
|
||||
message = String.format(automationService.getResources().getString(R.string.ruleActivateToggle), Rule.this.getName());
|
||||
Miscellaneous.logEvent("i", "Rule", message, 2);
|
||||
// automationService.speak(message);
|
||||
// Toast.makeText(automationService, message, Toast.LENGTH_LONG).show();
|
||||
if(Settings.startNewThreadForRuleActivation)
|
||||
publishProgress(message);
|
||||
|
||||
Miscellaneous.logEvent("i", "Rule", message, 2);
|
||||
for(int i = 0; i< Rule.this.getActionSet().size(); i++)
|
||||
{
|
||||
try
|
||||
{
|
||||
Rule.this.getActionSet().get(i).run(automationService, doToggle);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
Miscellaneous.logEvent("e", "RuleExecution", "Error running action of rule " + Rule.this.getName() + ": " + Log.getStackTraceString(e), 1);
|
||||
}
|
||||
}
|
||||
|
||||
if(Settings.startNewThreadForRuleActivation)
|
||||
publishProgress(message);
|
||||
|
||||
for(int i = 0; i< Rule.this.getActionSet().size(); i++)
|
||||
{
|
||||
// Keep log of last x rule activations (Settings)
|
||||
try
|
||||
{
|
||||
Rule.this.getActionSet().get(i).run(automationService, doToggle);
|
||||
Rule.ruleRunHistory.add(0, Rule.this); // add at beginning for better visualization
|
||||
Rule.lastActivatedRuleActivationTime = new Date();
|
||||
|
||||
while(ruleRunHistory.size() > Settings.rulesThatHaveBeenRanHistorySize)
|
||||
ruleRunHistory.remove(ruleRunHistory.size()-1);
|
||||
String history = "";
|
||||
for(Rule rule : ruleRunHistory)
|
||||
history += rule.getName() + ", ";
|
||||
if(history.length() > 0)
|
||||
history = history.substring(0, history.length()-2);
|
||||
Miscellaneous.logEvent("i", "Rule history", "Most recent first: " + history, 4);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
Miscellaneous.logEvent("e", "RuleExecution", "Error running action of rule " + Rule.this.getName() + ": " + Log.getStackTraceString(e), 1);
|
||||
Miscellaneous.logEvent("e", "Rule history error", Log.getStackTraceString(e), 3);
|
||||
}
|
||||
}
|
||||
|
||||
// Keep log of last x rule activations (Settings)
|
||||
try
|
||||
{
|
||||
Rule.ruleRunHistory.add(0, Rule.this); // add at beginning for better visualization
|
||||
Rule.lastActivatedRuleActivationTime = new Date();
|
||||
|
||||
while(ruleRunHistory.size() > Settings.rulesThatHaveBeenRanHistorySize)
|
||||
ruleRunHistory.remove(ruleRunHistory.size()-1);
|
||||
String history = "";
|
||||
for(Rule rule : ruleRunHistory)
|
||||
history += rule.getName() + ", ";
|
||||
if(history.length() > 0)
|
||||
history = history.substring(0, history.length()-2);
|
||||
Miscellaneous.logEvent("i", "Rule history", "Most recent first: " + history, 4);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
Miscellaneous.logEvent("e", "Rule history error", Log.getStackTraceString(e), 3);
|
||||
}
|
||||
|
||||
Miscellaneous.logEvent("i", "Rule", String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.ruleActivationComplete), Rule.this.getName()), 2);
|
||||
Miscellaneous.logEvent("i", "Rule", String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.ruleActivationComplete), Rule.this.getName()), 2);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// Miscellaneous.logEvent("i", "Rule", "Request to activate rule " + Rule.this.getName() + ", but it is the last one that was activated. Won't do it again.", 3);
|
||||
// return false;
|
||||
// }
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -504,10 +517,7 @@ public class Rule implements Comparable<Rule>
|
||||
public void activate(AutomationService automationService, boolean force)
|
||||
{
|
||||
ActivateRuleTask task = new ActivateRuleTask();
|
||||
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
|
||||
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, automationService, force);
|
||||
else
|
||||
task.execute(automationService, force);
|
||||
task.execute(automationService, force);
|
||||
}
|
||||
|
||||
public static ArrayList<Rule> findRuleCandidates(Trigger.Trigger_Enum triggerType)
|
||||
@ -516,13 +526,13 @@ public class Rule implements Comparable<Rule>
|
||||
|
||||
for(Rule oneRule : ruleCollection)
|
||||
{
|
||||
innerLoop:
|
||||
innerloop:
|
||||
for(Trigger oneTrigger : oneRule.getTriggerSet())
|
||||
{
|
||||
if(oneTrigger.getTriggerType().equals(triggerType))
|
||||
{
|
||||
ruleCandidates.add(oneRule);
|
||||
break innerLoop; // we don't need to check the other triggers in the same rule
|
||||
break innerloop; // we don't need to check the other triggers in the same rule
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -5,7 +5,6 @@ import static com.jens.automation2.Trigger.triggerParameter2Split;
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Build;
|
||||
import android.os.Looper;
|
||||
import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
@ -22,6 +21,7 @@ import java.util.List;
|
||||
public class Rule implements Comparable<Rule>
|
||||
{
|
||||
private static ArrayList<Rule> ruleCollection = new ArrayList<Rule>();
|
||||
public static boolean isAnyRuleActive = false;
|
||||
|
||||
private static List<Rule> ruleRunHistory = new ArrayList<Rule>();
|
||||
|
||||
@ -312,12 +312,19 @@ public class Rule implements Comparable<Rule>
|
||||
switch(action.getAction())
|
||||
{
|
||||
case setAirplaneMode:
|
||||
return true;
|
||||
case setBluetooth:
|
||||
return true;
|
||||
case setDataConnection:
|
||||
return true;
|
||||
case setDisplayRotation:
|
||||
return true;
|
||||
case setUsbTethering:
|
||||
return true;
|
||||
case setWifi:
|
||||
return true;
|
||||
case setWifiTethering:
|
||||
return true;
|
||||
case setBluetoothTethering:
|
||||
return true;
|
||||
default:
|
||||
@ -344,10 +351,7 @@ public class Rule implements Comparable<Rule>
|
||||
if(applies(context))
|
||||
{
|
||||
if(hasNotAppliedSinceLastExecution())
|
||||
{
|
||||
Miscellaneous.logEvent("i", "getsGreenLight()", "Rule " + getName() + " applies and has flipped since its last execution.", 4);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
Miscellaneous.logEvent("i", "getsGreenLight()", "Rule " + getName() + " has not flipped since its last execution.", 4);
|
||||
}
|
||||
@ -429,7 +433,7 @@ public class Rule implements Comparable<Rule>
|
||||
|
||||
Thread.setDefaultUncaughtExceptionHandler(Miscellaneous.uncaughtExceptionHandler);
|
||||
|
||||
// without this line the debugger will - for some reason - skip all breakpoints in this class
|
||||
// without this line debugger will - for some reason - skip all breakpoints in this class
|
||||
if(android.os.Debug.isDebuggerConnected())
|
||||
android.os.Debug.waitForDebugger();
|
||||
|
||||
@ -437,7 +441,7 @@ public class Rule implements Comparable<Rule>
|
||||
Looper.prepare();
|
||||
|
||||
setLastExecution(Calendar.getInstance());
|
||||
wasActivated = activateInternally((AutomationService)params[0]);
|
||||
wasActivated = activateInternally((AutomationService)params[0], (Boolean)params[1]);
|
||||
|
||||
return null;
|
||||
}
|
||||
@ -472,57 +476,66 @@ public class Rule implements Comparable<Rule>
|
||||
* Will activate the rule. Should be called by a separate execution thread
|
||||
* @param automationService
|
||||
*/
|
||||
protected boolean activateInternally(AutomationService automationService)
|
||||
protected boolean activateInternally(AutomationService automationService, boolean force)
|
||||
{
|
||||
boolean isActuallyToggleable = isActuallyToggable();
|
||||
boolean isActuallyToggable = isActuallyToggable();
|
||||
|
||||
boolean notLastActive = getLastActivatedRule() == null || !getLastActivatedRule().equals(Rule.this);
|
||||
boolean doToggle = ruleToggle && isActuallyToggleable;
|
||||
boolean doToggle = ruleToggle && isActuallyToggable;
|
||||
|
||||
String message;
|
||||
if(!doToggle)
|
||||
message = String.format(automationService.getResources().getString(R.string.ruleActivate), Rule.this.getName());
|
||||
else
|
||||
message = String.format(automationService.getResources().getString(R.string.ruleActivateToggle), Rule.this.getName());
|
||||
//if(notLastActive || force || doToggle)
|
||||
// if(force || doToggle)
|
||||
// {
|
||||
String message;
|
||||
if(!doToggle)
|
||||
message = String.format(automationService.getResources().getString(R.string.ruleActivate), Rule.this.getName());
|
||||
else
|
||||
message = String.format(automationService.getResources().getString(R.string.ruleActivateToggle), Rule.this.getName());
|
||||
Miscellaneous.logEvent("i", "Rule", message, 2);
|
||||
// automationService.speak(message);
|
||||
// Toast.makeText(automationService, message, Toast.LENGTH_LONG).show();
|
||||
if(Settings.startNewThreadForRuleActivation)
|
||||
publishProgress(message);
|
||||
|
||||
Miscellaneous.logEvent("i", "Rule", message, 2);
|
||||
for(int i = 0; i< Rule.this.getActionSet().size(); i++)
|
||||
{
|
||||
try
|
||||
{
|
||||
Rule.this.getActionSet().get(i).run(automationService, doToggle);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
Miscellaneous.logEvent("e", "RuleExecution", "Error running action of rule " + Rule.this.getName() + ": " + Log.getStackTraceString(e), 1);
|
||||
}
|
||||
}
|
||||
|
||||
if(Settings.startNewThreadForRuleActivation)
|
||||
publishProgress(message);
|
||||
|
||||
for(int i = 0; i< Rule.this.getActionSet().size(); i++)
|
||||
{
|
||||
// Keep log of last x rule activations (Settings)
|
||||
try
|
||||
{
|
||||
Rule.this.getActionSet().get(i).run(automationService, doToggle);
|
||||
Rule.ruleRunHistory.add(0, Rule.this); // add at beginning for better visualization
|
||||
Rule.lastActivatedRuleActivationTime = new Date();
|
||||
|
||||
while(ruleRunHistory.size() > Settings.rulesThatHaveBeenRanHistorySize)
|
||||
ruleRunHistory.remove(ruleRunHistory.size()-1);
|
||||
String history = "";
|
||||
for(Rule rule : ruleRunHistory)
|
||||
history += rule.getName() + ", ";
|
||||
if(history.length() > 0)
|
||||
history = history.substring(0, history.length()-2);
|
||||
Miscellaneous.logEvent("i", "Rule history", "Most recent first: " + history, 4);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
Miscellaneous.logEvent("e", "RuleExecution", "Error running action of rule " + Rule.this.getName() + ": " + Log.getStackTraceString(e), 1);
|
||||
Miscellaneous.logEvent("e", "Rule history error", Log.getStackTraceString(e), 3);
|
||||
}
|
||||
}
|
||||
|
||||
// Keep log of last x rule activations (Settings)
|
||||
try
|
||||
{
|
||||
Rule.ruleRunHistory.add(0, Rule.this); // add at beginning for better visualization
|
||||
Rule.lastActivatedRuleActivationTime = new Date();
|
||||
|
||||
while(ruleRunHistory.size() > Settings.rulesThatHaveBeenRanHistorySize)
|
||||
ruleRunHistory.remove(ruleRunHistory.size()-1);
|
||||
String history = "";
|
||||
for(Rule rule : ruleRunHistory)
|
||||
history += rule.getName() + ", ";
|
||||
if(history.length() > 0)
|
||||
history = history.substring(0, history.length()-2);
|
||||
Miscellaneous.logEvent("i", "Rule history", "Most recent first: " + history, 4);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
Miscellaneous.logEvent("e", "Rule history error", Log.getStackTraceString(e), 3);
|
||||
}
|
||||
|
||||
Miscellaneous.logEvent("i", "Rule", String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.ruleActivationComplete), Rule.this.getName()), 2);
|
||||
Miscellaneous.logEvent("i", "Rule", String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.ruleActivationComplete), Rule.this.getName()), 2);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// Miscellaneous.logEvent("i", "Rule", "Request to activate rule " + Rule.this.getName() + ", but it is the last one that was activated. Won't do it again.", 3);
|
||||
// return false;
|
||||
// }
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -531,10 +544,7 @@ public class Rule implements Comparable<Rule>
|
||||
public void activate(AutomationService automationService, boolean force)
|
||||
{
|
||||
ActivateRuleTask task = new ActivateRuleTask();
|
||||
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
|
||||
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, automationService, force);
|
||||
else
|
||||
task.execute(automationService, force);
|
||||
task.execute(automationService, force);
|
||||
}
|
||||
|
||||
public static ArrayList<Rule> findRuleCandidates(Trigger.Trigger_Enum triggerType)
|
||||
@ -543,13 +553,13 @@ public class Rule implements Comparable<Rule>
|
||||
|
||||
for(Rule oneRule : ruleCollection)
|
||||
{
|
||||
innerLoop:
|
||||
innerloop:
|
||||
for(Trigger oneTrigger : oneRule.getTriggerSet())
|
||||
{
|
||||
if(oneTrigger.getTriggerType().equals(triggerType))
|
||||
{
|
||||
ruleCandidates.add(oneRule);
|
||||
break innerLoop; // we don't need to check the other triggers in the same rule
|
||||
break innerloop; // we don't need to check the other triggers in the same rule
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -21,108 +21,109 @@ public class Action
|
||||
public static final String intentPairSeparator = "intPairSplit";
|
||||
public static final String vibrateSeparator = ",";
|
||||
|
||||
public enum Action_Enum {
|
||||
setWifi,
|
||||
setBluetooth,
|
||||
setUsbTethering,
|
||||
setWifiTethering,
|
||||
setBluetoothTethering,
|
||||
setDisplayRotation,
|
||||
turnWifiOn,turnWifiOff,
|
||||
turnBluetoothOn,turnBluetoothOff,
|
||||
triggerUrl,
|
||||
changeSoundProfile,
|
||||
turnUsbTetheringOn,turnUsbTetheringOff,
|
||||
turnWifiTetheringOn,turnWifiTetheringOff,
|
||||
enableScreenRotation,disableScreenRotation,
|
||||
startOtherActivity,
|
||||
waitBeforeNextAction,
|
||||
turnScreenOnOrOff,
|
||||
setAirplaneMode,
|
||||
setDataConnection,
|
||||
speakText,
|
||||
playMusic,
|
||||
controlMediaPlayback,
|
||||
setScreenBrightness,
|
||||
playSound,
|
||||
vibrate,
|
||||
createNotification,
|
||||
closeNotification,
|
||||
sendTextMessage;
|
||||
public enum Action_Enum
|
||||
{
|
||||
setWifi,
|
||||
setBluetooth,
|
||||
setUsbTethering,
|
||||
setWifiTethering,
|
||||
setBluetoothTethering,
|
||||
setDisplayRotation,
|
||||
turnWifiOn,turnWifiOff,
|
||||
turnBluetoothOn,turnBluetoothOff,
|
||||
triggerUrl,
|
||||
changeSoundProfile,
|
||||
turnUsbTetheringOn,turnUsbTetheringOff,
|
||||
turnWifiTetheringOn,turnWifiTetheringOff,
|
||||
enableScreenRotation,disableScreenRotation,
|
||||
startOtherActivity,
|
||||
waitBeforeNextAction,
|
||||
turnScreenOnOrOff,
|
||||
setAirplaneMode,
|
||||
setDataConnection,
|
||||
speakText,
|
||||
playMusic,
|
||||
controlMediaPlayback,
|
||||
setScreenBrightness,
|
||||
playSound,
|
||||
vibrate,
|
||||
createNotification,
|
||||
closeNotification,
|
||||
sendTextMessage;
|
||||
|
||||
public String getFullName(Context context)
|
||||
{
|
||||
switch(this)
|
||||
{
|
||||
case setWifi:
|
||||
return context.getResources().getString(R.string.actionSetWifi);
|
||||
case setBluetooth:
|
||||
return context.getResources().getString(R.string.actionSetBluetooth);
|
||||
case setWifiTethering:
|
||||
return context.getResources().getString(R.string.actionSetWifiTethering);
|
||||
case setBluetoothTethering:
|
||||
return context.getResources().getString(R.string.actionSetBluetoothTethering);
|
||||
case setUsbTethering:
|
||||
return context.getResources().getString(R.string.actionSetUsbTethering);
|
||||
case setDisplayRotation:
|
||||
return context.getResources().getString(R.string.actionSetDisplayRotation);
|
||||
case turnWifiOn:
|
||||
return context.getResources().getString(R.string.actionTurnWifiOn);
|
||||
case turnWifiOff:
|
||||
return context.getResources().getString(R.string.actionTurnWifiOff);
|
||||
case turnBluetoothOn:
|
||||
return context.getResources().getString(R.string.actionTurnBluetoothOn);
|
||||
case turnBluetoothOff:
|
||||
return context.getResources().getString(R.string.actionTurnBluetoothOff);
|
||||
case triggerUrl:
|
||||
return context.getResources().getString(R.string.actionTriggerUrl);
|
||||
case changeSoundProfile:
|
||||
return context.getResources().getString(R.string.actionChangeSoundProfile);
|
||||
case turnUsbTetheringOn:
|
||||
return context.getResources().getString(R.string.actionTurnUsbTetheringOn);
|
||||
case turnUsbTetheringOff:
|
||||
return context.getResources().getString(R.string.actionTurnUsbTetheringOff);
|
||||
case turnWifiTetheringOn:
|
||||
return context.getResources().getString(R.string.actionTurnWifiTetheringOn);
|
||||
case turnWifiTetheringOff:
|
||||
return context.getResources().getString(R.string.actionTurnWifiTetheringOff);
|
||||
case enableScreenRotation:
|
||||
return context.getResources().getString(R.string.actionEnableScreenRotation);
|
||||
case disableScreenRotation:
|
||||
return context.getResources().getString(R.string.actionDisableScreenRotation);
|
||||
case startOtherActivity:
|
||||
return context.getResources().getString(R.string.startOtherActivity);
|
||||
case waitBeforeNextAction:
|
||||
return context.getResources().getString(R.string.waitBeforeNextAction);
|
||||
case turnScreenOnOrOff:
|
||||
return context.getResources().getString(R.string.turnScreenOnOrOff);
|
||||
case vibrate:
|
||||
return context.getResources().getString(R.string.vibrate);
|
||||
case setAirplaneMode:
|
||||
return context.getResources().getString(R.string.airplaneMode);
|
||||
case setDataConnection:
|
||||
return context.getResources().getString(R.string.actionDataConnection);
|
||||
case speakText:
|
||||
return context.getResources().getString(R.string.actionSpeakText);
|
||||
case playMusic:
|
||||
return context.getResources().getString(R.string.actionPlayMusic);
|
||||
case controlMediaPlayback:
|
||||
return context.getResources().getString(R.string.actionMediaControl);
|
||||
case playSound:
|
||||
return context.getResources().getString(R.string.playSound);
|
||||
case sendTextMessage:
|
||||
return context.getResources().getString(R.string.sendTextMessage);
|
||||
case setScreenBrightness:
|
||||
return context.getResources().getString(R.string.setScreenBrightness);
|
||||
case createNotification:
|
||||
return context.getResources().getString(R.string.createNotification);
|
||||
case closeNotification:
|
||||
return context.getResources().getString(R.string.closeNotifications);
|
||||
default:
|
||||
return "Unknown";
|
||||
}
|
||||
}
|
||||
};
|
||||
public String getFullName(Context context)
|
||||
{
|
||||
switch(this)
|
||||
{
|
||||
case setWifi:
|
||||
return context.getResources().getString(R.string.actionSetWifi);
|
||||
case setBluetooth:
|
||||
return context.getResources().getString(R.string.actionSetBluetooth);
|
||||
case setWifiTethering:
|
||||
return context.getResources().getString(R.string.actionSetWifiTethering);
|
||||
case setBluetoothTethering:
|
||||
return context.getResources().getString(R.string.actionSetBluetoothTethering);
|
||||
case setUsbTethering:
|
||||
return context.getResources().getString(R.string.actionSetUsbTethering);
|
||||
case setDisplayRotation:
|
||||
return context.getResources().getString(R.string.actionSetDisplayRotation);
|
||||
case turnWifiOn:
|
||||
return context.getResources().getString(R.string.actionTurnWifiOn);
|
||||
case turnWifiOff:
|
||||
return context.getResources().getString(R.string.actionTurnWifiOff);
|
||||
case turnBluetoothOn:
|
||||
return context.getResources().getString(R.string.actionTurnBluetoothOn);
|
||||
case turnBluetoothOff:
|
||||
return context.getResources().getString(R.string.actionTurnBluetoothOff);
|
||||
case triggerUrl:
|
||||
return context.getResources().getString(R.string.actionTriggerUrl);
|
||||
case changeSoundProfile:
|
||||
return context.getResources().getString(R.string.actionChangeSoundProfile);
|
||||
case turnUsbTetheringOn:
|
||||
return context.getResources().getString(R.string.actionTurnUsbTetheringOn);
|
||||
case turnUsbTetheringOff:
|
||||
return context.getResources().getString(R.string.actionTurnUsbTetheringOff);
|
||||
case turnWifiTetheringOn:
|
||||
return context.getResources().getString(R.string.actionTurnWifiTetheringOn);
|
||||
case turnWifiTetheringOff:
|
||||
return context.getResources().getString(R.string.actionTurnWifiTetheringOff);
|
||||
case enableScreenRotation:
|
||||
return context.getResources().getString(R.string.actionEnableScreenRotation);
|
||||
case disableScreenRotation:
|
||||
return context.getResources().getString(R.string.actionDisableScreenRotation);
|
||||
case startOtherActivity:
|
||||
return context.getResources().getString(R.string.startOtherActivity);
|
||||
case waitBeforeNextAction:
|
||||
return context.getResources().getString(R.string.waitBeforeNextAction);
|
||||
case turnScreenOnOrOff:
|
||||
return context.getResources().getString(R.string.turnScreenOnOrOff);
|
||||
case vibrate:
|
||||
return context.getResources().getString(R.string.vibrate);
|
||||
case setAirplaneMode:
|
||||
return context.getResources().getString(R.string.airplaneMode);
|
||||
case setDataConnection:
|
||||
return context.getResources().getString(R.string.actionDataConnection);
|
||||
case speakText:
|
||||
return context.getResources().getString(R.string.actionSpeakText);
|
||||
case playMusic:
|
||||
return context.getResources().getString(R.string.actionPlayMusic);
|
||||
case controlMediaPlayback:
|
||||
return context.getResources().getString(R.string.actionMediaControl);
|
||||
case playSound:
|
||||
return context.getResources().getString(R.string.playSound);
|
||||
case sendTextMessage:
|
||||
return context.getResources().getString(R.string.sendTextMessage);
|
||||
case setScreenBrightness:
|
||||
return context.getResources().getString(R.string.setScreenBrightness);
|
||||
case createNotification:
|
||||
return context.getResources().getString(R.string.createNotification);
|
||||
case closeNotification:
|
||||
return context.getResources().getString(R.string.closeNotifications);
|
||||
default:
|
||||
return "Unknown";
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private Action_Enum action;
|
||||
private boolean parameter1 = false;
|
||||
|
@ -199,7 +199,6 @@ public class ActivityMainRules extends ActivityGeneric
|
||||
AutomationService runContext = AutomationService.getInstance();
|
||||
if(runContext != null)
|
||||
{
|
||||
Miscellaneous.logEvent("i", "ActivityMainRules", "Initiating manual execution of rule " + ruleThisIsAbout.getName(), 3);
|
||||
ruleThisIsAbout.activate(runContext, true);
|
||||
break;
|
||||
}
|
||||
|
@ -374,7 +374,7 @@ public class ActivityMainScreen extends ActivityGeneric
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
activityMainScreenInstance.tvLastProfile.setText("n./a.");
|
||||
activityMainScreenInstance.tvLastRule.setText("n./a.");
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -529,6 +529,10 @@ public class ActivityManageRule extends Activity
|
||||
items.add(new Item(typesLong[i].toString(), R.drawable.sound));
|
||||
else if(types[i].toString().equals(Trigger_Enum.screenState.toString()))
|
||||
items.add(new Item(typesLong[i].toString(), R.drawable.smartphone));
|
||||
else if(types[i].toString().equals(Trigger_Enum.deviceStarts.toString()))
|
||||
items.add(new Item(typesLong[i].toString(), R.drawable.alarm));
|
||||
else if(types[i].toString().equals(Trigger_Enum.serviceStarts.toString()))
|
||||
items.add(new Item(typesLong[i].toString(), R.drawable.alarm));
|
||||
else
|
||||
items.add(new Item(typesLong[i].toString(), R.drawable.placeholder));
|
||||
}
|
||||
@ -593,7 +597,7 @@ public class ActivityManageRule extends Activity
|
||||
booleanChoices = new String[]{getResources().getString(R.string.started), getResources().getString(R.string.stopped)};
|
||||
else if(triggerType == Trigger_Enum.usb_host_connection)
|
||||
booleanChoices = new String[]{getResources().getString(R.string.connected), getResources().getString(R.string.disconnected)};
|
||||
else if(triggerType == Trigger_Enum.speed | triggerType == Trigger_Enum.noiseLevel | triggerType == Trigger_Enum.batteryLevel)
|
||||
else if(triggerType == Trigger_Enum.speed || triggerType == Trigger_Enum.noiseLevel || triggerType == Trigger_Enum.batteryLevel)
|
||||
booleanChoices = new String[]{getResources().getString(R.string.exceeds), getResources().getString(R.string.dropsBelow)};
|
||||
else if(triggerType == Trigger_Enum.wifiConnection)
|
||||
{
|
||||
@ -698,6 +702,20 @@ public class ActivityManageRule extends Activity
|
||||
getTriggerScreenStateDialog().show();
|
||||
return;
|
||||
}
|
||||
else if(triggerType == Trigger_Enum.deviceStarts)
|
||||
{
|
||||
newTrigger.setTriggerType(Trigger_Enum.deviceStarts);
|
||||
ruleToEdit.getTriggerSet().add(newTrigger);
|
||||
refreshTriggerList();
|
||||
return;
|
||||
}
|
||||
else if(triggerType == Trigger_Enum.serviceStarts)
|
||||
{
|
||||
newTrigger.setTriggerType(Trigger_Enum.serviceStarts);
|
||||
ruleToEdit.getTriggerSet().add(newTrigger);
|
||||
refreshTriggerList();
|
||||
return;
|
||||
}
|
||||
else if(triggerType == Trigger_Enum.headsetPlugged)
|
||||
booleanChoices = new String[]{getResources().getString(R.string.connected), getResources().getString(R.string.disconnected)};
|
||||
|
||||
|
@ -32,6 +32,7 @@ import com.jens.automation2.receivers.PackageReplacedReceiver;
|
||||
import com.jens.automation2.receivers.PhoneStatusListener;
|
||||
|
||||
import java.util.Calendar;
|
||||
import java.util.Set;
|
||||
|
||||
@SuppressLint("NewApi")
|
||||
public class AutomationService extends Service implements OnInitListener
|
||||
@ -192,6 +193,9 @@ public class AutomationService extends Service implements OnInitListener
|
||||
{
|
||||
Bundle b = intent.getExtras();
|
||||
startAtBoot = b.getBoolean("startAtBoot", false);
|
||||
|
||||
if(startAtBoot)
|
||||
Settings.deviceStartDone = false;
|
||||
}
|
||||
|
||||
if (checkStartupRequirements(this, startAtBoot))
|
||||
@ -211,12 +215,9 @@ public class AutomationService extends Service implements OnInitListener
|
||||
ActivityMainScreen.updateMainScreen();
|
||||
|
||||
this.isRunning = true;
|
||||
|
||||
Miscellaneous.logEvent("i", "Service", this.getResources().getString(R.string.serviceStarted) + " VERSION_CODE: " + BuildConfig.VERSION_CODE + ", VERSION_NAME: " + BuildConfig.VERSION_NAME + ", flavor: " + BuildConfig.FLAVOR, 1);
|
||||
Toast.makeText(this, this.getResources().getString(R.string.serviceStarted), Toast.LENGTH_LONG).show();
|
||||
// ********** Test area **********
|
||||
// Miscellaneous.logEvent("i", "setNetworkType", "bin hier.", 3);
|
||||
// Actions.setData(true);
|
||||
// ********** Test area **********
|
||||
|
||||
/*
|
||||
On normal phones the app is supposed to automatically restart in case of any problems.
|
||||
@ -315,6 +316,8 @@ public class AutomationService extends Service implements OnInitListener
|
||||
|
||||
private void startUpRoutine()
|
||||
{
|
||||
Settings.serviceStartDone = false;
|
||||
|
||||
checkForTtsEngine();
|
||||
checkForPermissions();
|
||||
checkForRestrictedFeatures();
|
||||
@ -333,6 +336,9 @@ public class AutomationService extends Service implements OnInitListener
|
||||
if(r.getsGreenLight(AutomationService.this))
|
||||
r.activate(AutomationService.this, false);
|
||||
}
|
||||
|
||||
Settings.serviceStartDone = true;
|
||||
Settings.deviceStartDone = true;
|
||||
}
|
||||
|
||||
protected void startLocationProvider()
|
||||
|
@ -458,17 +458,29 @@ public class Profile implements Comparable<Profile>
|
||||
|
||||
public boolean delete(Context context)
|
||||
{
|
||||
Rule usingRule = this.isInUseByRules();
|
||||
if(usingRule != null)
|
||||
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.profileActive))
|
||||
{
|
||||
Toast.makeText(context, String.format(context.getResources().getString(R.string.ruleXIsUsingProfileY), usingRule.getName(), this.getName()), Toast.LENGTH_LONG).show();
|
||||
return false;
|
||||
for (Rule rule : Rule.findRuleCandidatesByTriggerProfile(this))
|
||||
{
|
||||
Toast.makeText(context, String.format(context.getResources().getString(R.string.ruleXIsUsingProfileY), rule.getName(), this.getName()), Toast.LENGTH_LONG).show();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if(Rule.isAnyRuleUsing(Action_Enum.changeSoundProfile))
|
||||
{
|
||||
for (Rule rule : Rule.findRuleCandidatesByActionProfile(this))
|
||||
{
|
||||
Toast.makeText(context, String.format(context.getResources().getString(R.string.ruleXIsUsingProfileY), rule.getName(), this.getName()), Toast.LENGTH_LONG).show();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
profileCollection.remove(this);
|
||||
return XmlFileInterface.writeFile();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private boolean plausibilityCheck()
|
||||
|
@ -215,7 +215,7 @@ public class ReceiverCoordinator
|
||||
Class testClass = Class.forName(ActivityManageRule.activityDetectionClassPath);
|
||||
Miscellaneous.runMethodReflective("ActivityDetectionReceiver", "stopActivityDetectionReceiver", null);
|
||||
}
|
||||
catch(ClassNotFoundException e)
|
||||
catch(Exception e)
|
||||
{
|
||||
// Nothing to do, just not stopping this one.
|
||||
}
|
||||
|
@ -12,7 +12,7 @@ import java.util.Set;
|
||||
public class Settings implements SharedPreferences
|
||||
{
|
||||
public static final int rulesThatHaveBeenRanHistorySize = 10;
|
||||
public final static int lockSoundChangesInterval = 15;
|
||||
public static final int lockSoundChangesInterval = 15;
|
||||
public static final int newsPollEveryXDays = 3;
|
||||
public static final int newsDisplayForXDays = 3;
|
||||
public static final int updateCheckFrequencyDays = 7;
|
||||
@ -77,7 +77,13 @@ public class Settings implements SharedPreferences
|
||||
public static ArrayList<String> whatHasBeenDone;
|
||||
|
||||
/*
|
||||
Generic settings valid for all installations and not changable
|
||||
Not saved permanently.
|
||||
*/
|
||||
public static boolean deviceStartDone = true; // by default assume device has not just been started
|
||||
public static boolean serviceStartDone = false;
|
||||
|
||||
/*
|
||||
Generic settings valid for all installations and not changeable
|
||||
*/
|
||||
public static final String dateFormat = "E dd.MM.yyyy HH:mm:ss:ssss";
|
||||
|
||||
@ -600,5 +606,4 @@ public class Settings implements SharedPreferences
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
@ -3,7 +3,7 @@ package com.jens.automation2;
|
||||
import android.bluetooth.BluetoothDevice;
|
||||
import android.content.Context;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.SystemClock;
|
||||
import android.service.notification.StatusBarNotification;
|
||||
import android.telephony.TelephonyManager;
|
||||
import android.util.Log;
|
||||
@ -25,10 +25,6 @@ import com.jens.automation2.receivers.PhoneStatusListener;
|
||||
import com.jens.automation2.receivers.ProcessListener;
|
||||
import com.jens.automation2.receivers.ScreenStateReceiver;
|
||||
|
||||
import static com.jens.automation2.Trigger.triggerParameter2Split;
|
||||
import static com.jens.automation2.receivers.NotificationListener.EXTRA_TEXT;
|
||||
import static com.jens.automation2.receivers.NotificationListener.EXTRA_TITLE;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.sql.Time;
|
||||
@ -38,8 +34,31 @@ import java.util.Date;
|
||||
|
||||
public class Trigger
|
||||
{
|
||||
public enum Trigger_Enum {
|
||||
pointOfInterest, timeFrame, charging, batteryLevel, usb_host_connection, speed, noiseLevel, wifiConnection, process_started_stopped, airplaneMode, roaming, nfcTag, activityDetection, bluetoothConnection, headsetPlugged, notification, deviceOrientation, profileActive, screenState, musicPlaying, phoneCall; //phoneCall always needs to be at the very end because of Google's shitty so called privacy
|
||||
public enum Trigger_Enum
|
||||
{
|
||||
pointOfInterest,
|
||||
timeFrame,
|
||||
charging,
|
||||
batteryLevel,
|
||||
usb_host_connection,
|
||||
speed,
|
||||
noiseLevel,
|
||||
wifiConnection,
|
||||
process_started_stopped,
|
||||
airplaneMode,
|
||||
roaming,
|
||||
nfcTag,
|
||||
activityDetection,
|
||||
bluetoothConnection,
|
||||
headsetPlugged,
|
||||
notification,
|
||||
deviceOrientation,
|
||||
profileActive,
|
||||
screenState,
|
||||
musicPlaying,
|
||||
deviceStarts,
|
||||
serviceStarts,
|
||||
phoneCall; //phoneCall always needs to be at the very end because of Google's shitty so called privacy
|
||||
|
||||
public String getFullName(Context context)
|
||||
{
|
||||
@ -87,6 +106,10 @@ public class Trigger
|
||||
return context.getResources().getString(R.string.musicPlaying);
|
||||
case screenState:
|
||||
return context.getResources().getString(R.string.screenState);
|
||||
case deviceStarts:
|
||||
return context.getResources().getString(R.string.deviceStarts);
|
||||
case serviceStarts:
|
||||
return context.getResources().getString(R.string.serviceStarts);
|
||||
default:
|
||||
return "Unknown";
|
||||
}
|
||||
@ -190,6 +213,14 @@ public class Trigger
|
||||
if(!checkScreenState())
|
||||
result = false;
|
||||
break;
|
||||
case deviceStarts:
|
||||
if(!checkDeviceStarts())
|
||||
result = false;
|
||||
break;
|
||||
case serviceStarts:
|
||||
if(!checkServiceStarts())
|
||||
result = false;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -343,6 +374,16 @@ public class Trigger
|
||||
return triggerParameter == MediaPlayerListener.isAudioPlaying(Miscellaneous.getAnyContext());
|
||||
}
|
||||
|
||||
boolean checkDeviceStarts()
|
||||
{
|
||||
return checkServiceStarts() && !Settings.deviceStartDone;
|
||||
}
|
||||
|
||||
boolean checkServiceStarts()
|
||||
{
|
||||
return !Settings.serviceStartDone;
|
||||
}
|
||||
|
||||
boolean checkProfileActive()
|
||||
{
|
||||
String demandedProfileName = getTriggerParameter2().split(Trigger.triggerParameter2Split)[0];
|
||||
@ -1546,8 +1587,13 @@ public class Trigger
|
||||
default:
|
||||
state = Miscellaneous.getAnyContext().getString(R.string.unknown);
|
||||
}
|
||||
|
||||
returnString.append(String.format(Miscellaneous.getAnyContext().getString(R.string.screenIs), state));
|
||||
case deviceStarts:
|
||||
// This type doesn't have an activate/deactivate equivalent
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.deviceHasJustStarted));
|
||||
break;
|
||||
case serviceStarts:
|
||||
// This type doesn't have an activate/deactivate equivalent
|
||||
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.serviceHasJustStarted));
|
||||
break;
|
||||
default:
|
||||
returnString.append("error");
|
||||
|
@ -189,7 +189,7 @@ public class LocationProvider
|
||||
/*
|
||||
Due to strange factors the time difference might be 0 resulting in mathematical error.
|
||||
*/
|
||||
if (Double.isInfinite(currentSpeed) || Double.isNaN(currentSpeed))
|
||||
if (Double.isInfinite(currentSpeed) | Double.isNaN(currentSpeed))
|
||||
Miscellaneous.logEvent("i", "Speed", "Error while calculating speed.", 4);
|
||||
else
|
||||
{
|
||||
@ -240,7 +240,7 @@ public class LocationProvider
|
||||
|
||||
if(Settings.positioningEngine == 0)
|
||||
{
|
||||
if(Rule.isAnyRuleUsing(Trigger_Enum.pointOfInterest) || Rule.isAnyRuleUsing(Trigger_Enum.speed))
|
||||
if(Rule.isAnyRuleUsing(Trigger_Enum.pointOfInterest) | Rule.isAnyRuleUsing(Trigger_Enum.speed))
|
||||
{
|
||||
// startCellLocationChangedReceiver
|
||||
if (CellLocationChangedReceiver.isCellLocationChangedReceiverPossible())
|
||||
@ -424,7 +424,7 @@ public class LocationProvider
|
||||
}
|
||||
|
||||
// *********** RULE CHANGES ***********
|
||||
if(!CellLocationChangedReceiver.isCellLocationListenerActive() && (Rule.isAnyRuleUsing(Trigger_Enum.pointOfInterest) || Rule.isAnyRuleUsing(Trigger_Enum.speed)))
|
||||
if(!CellLocationChangedReceiver.isCellLocationListenerActive() && (Rule.isAnyRuleUsing(Trigger_Enum.pointOfInterest) | Rule.isAnyRuleUsing(Trigger_Enum.speed)))
|
||||
{
|
||||
Miscellaneous.logEvent("i", "LocationProvider", "Starting NoiseListener CellLocationChangedReceiver because used in a new/changed rule.", 4);
|
||||
if(CellLocationChangedReceiver.haveAllPermission())
|
||||
|
@ -217,24 +217,21 @@ public class NfcReceiver
|
||||
|
||||
NdefMessage ndefMessage = ndef.getCachedNdefMessage();
|
||||
|
||||
if(ndefMessage != null)
|
||||
{
|
||||
NdefRecord[] records = ndefMessage.getRecords();
|
||||
for (NdefRecord ndefRecord : records)
|
||||
{
|
||||
if (ndefRecord.getTnf() == NdefRecord.TNF_WELL_KNOWN && Arrays.equals(ndefRecord.getType(), NdefRecord.RTD_TEXT))
|
||||
{
|
||||
try
|
||||
{
|
||||
return readText(ndefRecord);
|
||||
}
|
||||
catch (UnsupportedEncodingException e)
|
||||
{
|
||||
Miscellaneous.logEvent("w", "NFC", "Unsupported Encoding: " + Log.getStackTraceString(e), 3);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
NdefRecord[] records = ndefMessage.getRecords();
|
||||
for (NdefRecord ndefRecord : records)
|
||||
{
|
||||
if (ndefRecord.getTnf() == NdefRecord.TNF_WELL_KNOWN && Arrays.equals(ndefRecord.getType(), NdefRecord.RTD_TEXT))
|
||||
{
|
||||
try
|
||||
{
|
||||
return readText(ndefRecord);
|
||||
}
|
||||
catch (UnsupportedEncodingException e)
|
||||
{
|
||||
Miscellaneous.logEvent("w", "NFC", "Unsupported Encoding: " + Log.getStackTraceString(e), 3);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
@ -89,6 +89,11 @@ public class NotificationListener extends NotificationListenerService// implemen
|
||||
{
|
||||
lastNotification = convertNotificationToSimpleNotification(created, sbn);
|
||||
|
||||
if(created)
|
||||
Miscellaneous.logEvent("i", "New notification", lastNotification.toString(), 5);
|
||||
else
|
||||
Miscellaneous.logEvent("i", "Notification removed", lastNotification.toString(), 5);
|
||||
|
||||
ArrayList<Rule> ruleCandidates = Rule.findRuleCandidates(Trigger.Trigger_Enum.notification);
|
||||
for (int i = 0; i < ruleCandidates.size(); i++)
|
||||
{
|
||||
|
@ -11,7 +11,7 @@
|
||||
<string name="pleaseSpecifiyTrigger">Bitte geben Sie mindestens einen Auslöser an.</string>
|
||||
<string name="pleaseSpecifiyAction">Bitte geben Sie mindestens eine Aktion an.</string>
|
||||
<string name="serviceWontStart">Weder Orte noch Regeln sind definitiv. Dienst wird nicht starten.</string>
|
||||
<string name="serviceStarted">Automations-Dienst gestartet.</string>
|
||||
<string name="serviceStarted">Automations-Dienst gestarted.</string>
|
||||
<string name="version">Version %1$s.</string>
|
||||
<string name="distanceBetween">Der Abstand zwischen GPS- und Mobilfunk-Position beträgt %1$d m. Dies +1 sollte der minimale Radius sein.</string>
|
||||
<string name="positioningWindowNotice">Falls Sie in einem Gebäude sind, wird empfohlen das Gerät in die Nähe eines Fensters zu bringen bis eine Position ermittelt werden konnte. Andernfalls kann es sehr lange dauern oder es funktioniert gar nicht.</string>
|
||||
@ -700,4 +700,8 @@
|
||||
<string name="locationNotWorkingOn12">Das Abrufen des Standorts scheint unter Android 12 derzeit nicht zu funktionieren. Wenn es bei Ihnen nicht klappt, tut mir das leid. Ich werde versuchen die Ursache zu beheben, sobald mir die Ursache bekannt ist. Wenn der Donut bei Ihnen also nicht aufhört sich zu drehen, wissen Sie warum.</string>
|
||||
<string name="profileXrequiresThis">Profil \"%1$s\" benötigt dies.</string>
|
||||
<string name="lastProfile">Letztes Profil:</string>
|
||||
<string name="serviceStarts">Dienst startet</string>
|
||||
<string name="deviceStarts">Gerät startet</string>
|
||||
<string name="deviceHasJustStarted">Gerät ist gerade gestartet</string>
|
||||
<string name="serviceHasJustStarted">Dienst ist gerade gestartet</string>
|
||||
</resources>
|
@ -699,4 +699,8 @@
|
||||
<string name="locationNotWorkingOn12">Obtener la locación no parece estar funcionando en dispositivos Android 12 actualmente. Si no está funcionando para ti, lo siento. Intentaré arreglar esto tan pronto como conozca la causa. Así que si la rosquilla no deja de girar, ya sabes por qué.</string>
|
||||
<string name="profileXrequiresThis">El perfil \"%1$s\" requiere esto.</string>
|
||||
<string name="lastProfile">Último perfil:</string>
|
||||
<string name="deviceStarts">Dispositivo esta enciendo</string>
|
||||
<string name="serviceStarts">Servicio esta enciendo</string>
|
||||
<string name="deviceHasJustStarted">el dispositivo justamente ha encendido</string>
|
||||
<string name="serviceHasJustStarted">el servicio justamente ha encendido</string>
|
||||
</resources>
|
@ -700,4 +700,8 @@
|
||||
<string name="profileXrequiresThis">Questo è richiesto dal profilo \"%1$s\".</string>
|
||||
<string name="locationNotWorkingOn12">Ottenere la posizione non sembra funzionare su dispositivi Android 12 al momento. Se non funziona per te, mi dispiace. Cercherò di risolvere questo problema non appena conoscerò la causa. Quindi, se cerchio rotante non smette di girare, sai perché.</string>
|
||||
<string name="lastProfile">Ultimo profilo:</string>
|
||||
<string name="deviceStarts">Device starts</string>
|
||||
<string name="serviceStarts">Avvio del servizio</string>
|
||||
<string name="deviceHasJustStarted">Il dispositivo è appena stato avviato</string>
|
||||
<string name="serviceHasJustStarted">il servizio è appena iniziato</string>
|
||||
</resources>
|
||||
|
@ -698,4 +698,8 @@
|
||||
<string name="locationNotWorkingOn12">Het verkrijgen van de locatie lijkt momenteel niet te werken op Android 12-apparaten. Als het niet voor je werkt, spijt het me. Ik zal proberen dit op te lossen zodra ik de oorzaak ken. Dus als de donut niet stopt met draaien, weet je waarom.</string>
|
||||
<string name="profileXrequiresThis">Profiel \"%1$s\" vereist dit.</string>
|
||||
<string name="lastProfile">Laatste profiel:</string>
|
||||
<string name="deviceHasJustStarted">apparaat is net gestart</string>
|
||||
<string name="serviceHasJustStarted">service is net begonnen</string>
|
||||
<string name="serviceStarts">Service start</string>
|
||||
<string name="deviceStarts">Apparaat start</string>
|
||||
</resources>
|
||||
|
@ -796,4 +796,8 @@
|
||||
<string name="musicCheckFrequencySummary">Milliseconds between checks</string>
|
||||
<string name="locationNotWorkingOn12">Getting the location does not seem to be working on Android 12 devices currently. If it isn\'t working for you, I\'m sorry. I\'ll try to fix this as soon as I know the cause. So if the donut doesn\'t stop spinning, you know why.</string>
|
||||
<string name="lastProfile">Last profile:</string>
|
||||
<string name="deviceStarts">Device starts</string>
|
||||
<string name="serviceStarts">Service starts</string>
|
||||
<string name="deviceHasJustStarted">device has just started</string>
|
||||
<string name="serviceHasJustStarted">service has just started</string>
|
||||
</resources>
|
@ -1,14 +0,0 @@
|
||||
Neuer Auslöser:
|
||||
* Bildschirmstatus (ein/aus)
|
||||
Neue Aktionen:
|
||||
* Benachrichtigung erstellen
|
||||
* Benachrichtigung(en) schließen
|
||||
* Medienwiedergabe steuern
|
||||
Fehler behoben:
|
||||
* Übersetzungsfehler im niederländischen Variablentext
|
||||
* Variablen wurden beim Senden von Textnachrichten nicht ersetzt
|
||||
* Der Dienst startete nicht immer, nachdem das Gerät eingeschaltet wurde
|
||||
* Setzen von Klingeltönen auf Android 11 und höher
|
||||
* Für das Ändern von Klingeltönen ist die Speicher-lesen-Berechtigung nötig
|
||||
* Profil, das nicht verwendet wurde, konnte nicht gelöscht werden
|
||||
* Orientierungssensor an Geräten ohne Magnet-Sensor
|
@ -7,5 +7,3 @@
|
||||
* Fixed: Service wouldn't always start after device has been powered on
|
||||
* Fixed: Set ringtones on Android 11 and above
|
||||
* Fixed: Permission read storage required for changing ringtones
|
||||
* Fixed: Profile that were not in use, could not be deleted.
|
||||
* Fixed: Orientation sensor on devices that have no magnetic sensor.
|
2
fastlane/metadata/android/en-US/changelogs/119.txt
Normal file
2
fastlane/metadata/android/en-US/changelogs/119.txt
Normal file
@ -0,0 +1,2 @@
|
||||
* New trigger: device has just started
|
||||
* New trigger: service has just started
|
@ -1,14 +0,0 @@
|
||||
Nuevo disparador:
|
||||
* estado de la pantalla (encendido / apagado)
|
||||
Nuevas acciones:
|
||||
* Crear notificación
|
||||
* Cerrar notificación(es)
|
||||
* Controlar la reproducción de medios
|
||||
Corregido:
|
||||
* Error de traducción en texto de variables holandesas
|
||||
* Las variables no fueron reemplazadas al enviar mensajes de texto
|
||||
* El servicio no siempre se iniciaría después de que el dispositivo se haya encendido
|
||||
* Establecer tonos de llamada en Android 11 y superior
|
||||
* Se requiere almacenamiento de lectura de permisos para cambiar los tonos de llamada
|
||||
* Perfil que no estaba en uso, no se pudo eliminar
|
||||
* Sensor de orientación en dispositivos que no tienen sensor magnético
|
@ -1,14 +0,0 @@
|
||||
Nuovo trigger:
|
||||
* stato dello schermo (on / off)
|
||||
Nuove azioni:
|
||||
* Crea notifica
|
||||
* Chiudi notifica (s)
|
||||
* Controlla la riproduzione multimediale
|
||||
Fissato:
|
||||
* Bug di traduzione nel testo delle variabili olandesi
|
||||
* Le variabili non sono state sostituite durante l'invio di messaggi di testo
|
||||
* Il servizio non si avvia sempre dopo l'accensione del dispositivo
|
||||
* Imposta suonerie su Android 11 e versioni successive
|
||||
* Autorizzazione di lettura necessaria per cambiare le suonerie
|
||||
* Profilo che non era in uso, non poteva essere eliminato
|
||||
* Sensore di orientamento su dispositivi che non hanno sensore mag.
|
@ -1,11 +0,0 @@
|
||||
* Nieuwe trigger: schermstatus (aan / uit)
|
||||
* Nieuwe actie: Melding maken
|
||||
* Nieuwe actie: Sluit melding (en)
|
||||
* Nieuwe actie: Bedien het afspelen van media
|
||||
* Fixed: Vertaling bug in Nederlandse variabelen tekst
|
||||
* Opgelost: Variabelen zijn niet vervangen bij het verzenden van sms-berichten
|
||||
* Opgelost: service start niet altijd nadat het apparaat is ingeschakeld
|
||||
* Opgelost: stel beltonen in op Android 11 en hoger
|
||||
* Opgelost: Toestemming leesopslag vereist voor het wijzigen van beltonen
|
||||
* Opgelost: Profiel dat niet in gebruik was, kon niet worden verwijderd.
|
||||
* Vast: Oriëntatiesensor op apparaten die geen magnetische sensor hebben.
|
Reference in New Issue
Block a user