variables as triggers and actions

This commit is contained in:
jens 2022-10-09 17:14:02 +02:00
parent 4abce042eb
commit c868d45896
21 changed files with 589 additions and 58 deletions

View File

@ -174,6 +174,9 @@
<activity android:name=".ActivityManageActionWakeLock" /> <activity android:name=".ActivityManageActionWakeLock" />
<activity android:name=".ActivityManageTriggerSubSystemState" /> <activity android:name=".ActivityManageTriggerSubSystemState" />
<activity android:name=".ActivityManageActionMakePhoneCall" /> <activity android:name=".ActivityManageActionMakePhoneCall" />
<activity android:name=".ActivityManageActionSetVariable" />
<activity android:name=".ActivityManageTriggerCheckVariable" />
<activity <activity
android:name=".ActivityMainTabLayout" android:name=".ActivityMainTabLayout"
android:launchMode="singleTask"> android:launchMode="singleTask">

View File

@ -172,6 +172,8 @@
<activity android:name=".ActivityManageActionWakeLock" /> <activity android:name=".ActivityManageActionWakeLock" />
<activity android:name=".ActivityManageTriggerSubSystemState" /> <activity android:name=".ActivityManageTriggerSubSystemState" />
<activity android:name=".ActivityManageMakePhoneCall" /> <activity android:name=".ActivityManageMakePhoneCall" />
<activity android:name=".ActivityManageActionSetVariable" />
<activity android:name=".ActivityManageTriggerCheckVariable" />
<activity <activity
android:name=".ActivityMainTabLayout" android:name=".ActivityMainTabLayout"
android:launchMode="singleTask"> android:launchMode="singleTask">

View File

@ -156,6 +156,8 @@
<activity android:name=".ActivityManageTriggerTethering" /> <activity android:name=".ActivityManageTriggerTethering" />
<activity android:name=".ActivityManageActionWakeLock" /> <activity android:name=".ActivityManageActionWakeLock" />
<activity android:name=".ActivityManageTriggerSubSystemState" /> <activity android:name=".ActivityManageTriggerSubSystemState" />
<activity android:name=".ActivityManageActionSetVariable" />
<activity android:name=".ActivityManageTriggerCheckVariable" />
<activity <activity
android:name=".ActivityMainTabLayout" android:name=".ActivityMainTabLayout"
android:launchMode="singleTask"> android:launchMode="singleTask">

View File

@ -52,6 +52,7 @@ public class Action
sendBroadcast, sendBroadcast,
runExecutable, runExecutable,
wakelock, wakelock,
setVariable,
startPhoneCall, startPhoneCall,
stopPhoneCall, stopPhoneCall,
sendTextMessage; sendTextMessage;
@ -130,6 +131,8 @@ public class Action
return context.getResources().getString(R.string.runExecutable); return context.getResources().getString(R.string.runExecutable);
case wakelock: case wakelock:
return context.getResources().getString(R.string.keepDeviceAwake); return context.getResources().getString(R.string.keepDeviceAwake);
case setVariable:
return context.getResources().getString(R.string.setVariable);
case startPhoneCall: case startPhoneCall:
return context.getResources().getString(R.string.startPhoneCall); return context.getResources().getString(R.string.startPhoneCall);
case stopPhoneCall: case stopPhoneCall:
@ -283,6 +286,16 @@ public class Action
case wakelock: case wakelock:
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.keepDeviceAwake) + " (" + String.valueOf(getParameter1()) + ")"); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.keepDeviceAwake) + " (" + String.valueOf(getParameter1()) + ")");
break; 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: case startPhoneCall:
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.startPhoneCall)); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.startPhoneCall));
break; break;
@ -347,24 +360,24 @@ 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.length >= 6)
{ {
if(!parts[5].equals(ActivityManageActionCloseNotification.dismissRegularString)) if (!parts[5].equals(ActivityManageActionCloseNotification.dismissRegularString))
{ {
returnString.append(" " + String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.withButton), parts[5])); returnString.append(" " + String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.withButton), parts[5]));
} }
} }
} }
else if(this.getAction().equals(Action_Enum.setWifi)) else if (this.getAction().equals(Action_Enum.setWifi))
{ {
if(!StringUtils.isEmpty(this.parameter2)) if (!StringUtils.isEmpty(this.parameter2))
{ {
boolean useRoot = Boolean.parseBoolean(this.parameter2); boolean useRoot = Boolean.parseBoolean(this.parameter2);
if(useRoot) if (useRoot)
returnString.append(" " + Miscellaneous.getAnyContext().getResources().getString(R.string.usingRoot)); returnString.append(" " + Miscellaneous.getAnyContext().getResources().getString(R.string.usingRoot));
} }
} }
else if(this.getAction().equals(Action_Enum.controlMediaPlayback)) else if (this.getAction().equals(Action_Enum.controlMediaPlayback))
{ {
returnString.append(": "); returnString.append(": ");
@ -392,10 +405,12 @@ 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)) else if (this.getAction().equals(Action_Enum.sendBroadcast))
{ {
returnString.append(": " + parameter2.replace(Action.actionParameter2Split, "; ").replace(Action.intentPairSeparator, "/")); returnString.append(": " + parameter2.replace(Action.actionParameter2Split, "; ").replace(Action.intentPairSeparator, "/"));
} }
else if (this.getAction().equals(Action_Enum.setVariable))
; // 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, "; "));
} }
@ -600,6 +615,9 @@ public class Action
else else
Actions.wakeLockStop(); Actions.wakeLockStop();
break; break;
case setVariable:
Actions.setVariable(this.getParameter2());
break;
case startPhoneCall: case startPhoneCall:
Actions.startPhoneCall(context, this.getParameter2()); Actions.startPhoneCall(context, this.getParameter2());
break; break;

View File

@ -66,6 +66,7 @@ import java.util.Calendar;
import java.util.Collections; import java.util.Collections;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -212,7 +213,35 @@ public class Actions
context.sendBroadcast(broadcastIntent); context.sendBroadcast(broadcastIntent);
} }
public static class WifiStuff 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)
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 Boolean setWifi(Context context, Boolean desiredState, String parameter2, boolean toggleActionIfPossible) public static Boolean setWifi(Context context, Boolean desiredState, String parameter2, boolean toggleActionIfPossible)
{ {

View File

@ -0,0 +1,64 @@
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);
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

@ -135,6 +135,10 @@ public class ActivityManageRule extends Activity
final static int requestCodeTriggerSubSystemStateEdit = 822; final static int requestCodeTriggerSubSystemStateEdit = 822;
final static int requestCodeActionMakePhoneCallAdd = 823; final static int requestCodeActionMakePhoneCallAdd = 823;
final static int requestCodeActionMakePhoneCallEdit = 824; 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;
public static ActivityManageRule getInstance() public static ActivityManageRule getInstance()
{ {
@ -332,6 +336,12 @@ public class ActivityManageRule extends Activity
subSystemStateEditor.putExtra(intentNameTriggerParameter2, selectedTrigger.getTriggerParameter2()); subSystemStateEditor.putExtra(intentNameTriggerParameter2, selectedTrigger.getTriggerParameter2());
startActivityForResult(subSystemStateEditor, requestCodeTriggerSubSystemStateEdit); startActivityForResult(subSystemStateEditor, requestCodeTriggerSubSystemStateEdit);
break; 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;
default: default:
break; break;
} }
@ -424,6 +434,11 @@ public class ActivityManageRule extends Activity
activityEditMakePhoneCallIntent.putExtra(intentNameActionParameter2, a.getParameter2()); activityEditMakePhoneCallIntent.putExtra(intentNameActionParameter2, a.getParameter2());
startActivityForResult(activityEditMakePhoneCallIntent, requestCodeActionMakePhoneCallEdit); startActivityForResult(activityEditMakePhoneCallIntent, requestCodeActionMakePhoneCallEdit);
break; break;
case setVariable:
Intent activityEditSetVariableIntent = new Intent(ActivityManageRule.this, ActivityManageActionSetVariable.class);
activityEditSetVariableIntent.putExtra(intentNameActionParameter2, a.getParameter2());
startActivityForResult(activityEditSetVariableIntent, requestCodeActionSetVariableEdit);
break;
case setWifi: case setWifi:
Intent activityEditSetWifiIntent = new Intent(ActivityManageRule.this, ActivityManageActionWifi.class); Intent activityEditSetWifiIntent = new Intent(ActivityManageRule.this, ActivityManageActionWifi.class);
activityEditSetWifiIntent.putExtra(intentNameActionParameter1, a.getParameter1()); activityEditSetWifiIntent.putExtra(intentNameActionParameter1, a.getParameter1());
@ -822,6 +837,13 @@ public class ActivityManageRule extends Activity
startActivityForResult(subSystemStateTriggerEditor, requestCodeTriggerSubSystemStateAdd); startActivityForResult(subSystemStateTriggerEditor, requestCodeTriggerSubSystemStateAdd);
return; return;
} }
else if(triggerType == Trigger_Enum.checkVariable)
{
newTrigger.setTriggerType(Trigger_Enum.checkVariable);
Intent variableTriggerEditor = new Intent(myContext, ActivityManageTriggerCheckVariable.class);
startActivityForResult(variableTriggerEditor, requestCodeTriggerCheckVariableAdd);
return;
}
else else
getTriggerParameterDialog(context, booleanChoices).show(); getTriggerParameterDialog(context, booleanChoices).show();
@ -1601,6 +1623,16 @@ public class ActivityManageRule extends Activity
this.refreshActionList(); 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) else if(requestCode == requestCodeActionWakeLockAdd)
{ {
if(resultCode == RESULT_OK) if(resultCode == RESULT_OK)
@ -1726,6 +1758,20 @@ public class ActivityManageRule extends Activity
this.refreshActionList(); this.refreshActionList();
} }
} }
else if(requestCode == requestCodeActionSetVariableEdit)
{
if(resultCode == RESULT_OK)
{
ruleToEdit.getActionSet().get(editIndex).setParentRule(ruleToEdit);
if(data.hasExtra(intentNameActionParameter1) && data.hasExtra(intentNameActionParameter2))
{
ruleToEdit.getActionSet().get(editIndex).setParameter2(data.getStringExtra(intentNameActionParameter2));
}
this.refreshActionList();
}
}
else if(requestCode == requestCodeActionSetWifiEdit) else if(requestCode == requestCodeActionSetWifiEdit)
{ {
if(resultCode == RESULT_OK) if(resultCode == RESULT_OK)
@ -1920,6 +1966,17 @@ public class ActivityManageRule extends Activity
this.refreshTriggerList(); 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 == requestCodeTriggerTetheringEdit) else if(requestCode == requestCodeTriggerTetheringEdit)
{ {
if(resultCode == RESULT_OK) if(resultCode == RESULT_OK)
@ -1946,6 +2003,19 @@ public class ActivityManageRule extends Activity
this.refreshTriggerList(); 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();
}
}
} }
protected AlertDialog getActionTypeDialog() protected AlertDialog getActionTypeDialog()
@ -2192,6 +2262,12 @@ public class ActivityManageRule extends Activity
Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionMakePhoneCall.class); Intent intent = new Intent(ActivityManageRule.this, ActivityManageActionMakePhoneCall.class);
startActivityForResult(intent, requestCodeActionMakePhoneCallAdd); 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())) else if(Action.getActionTypesAsArray()[which].toString().equals(Action_Enum.stopPhoneCall.toString()))
{ {
newAction.setAction(Action_Enum.stopPhoneCall); newAction.setAction(Action_Enum.stopPhoneCall);

View File

@ -0,0 +1,56 @@
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);
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

@ -33,6 +33,8 @@ 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.Map;
import java.util.Set; import java.util.Set;
@SuppressLint("NewApi") @SuppressLint("NewApi")
@ -63,6 +65,8 @@ 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()
@ -457,6 +461,10 @@ 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();
@ -692,13 +700,18 @@ public class AutomationService extends Service implements OnInitListener
} }
} }
public static boolean isMainActivityRunning(Context context) public Map<String, String> getVariableMap()
{ {
return variableMap;
}
public static boolean isMainActivityRunning(Context context)
{
if(ActivityMainScreen.getActivityMainScreenInstance() == null) if(ActivityMainScreen.getActivityMainScreenInstance() == null)
return false; return false;
else else
return true; return true;
} }
public static boolean isMyServiceRunning(Context context) public static boolean isMyServiceRunning(Context context)
{ {

View File

@ -568,17 +568,17 @@ public class Profile implements Comparable<Profile>
} }
finally finally
{ {
Miscellaneous.logEvent("i", "POI", "Checking for applicable rule after profile " + this.getName() + " has been activated.", 2); Miscellaneous.logEvent("i", "Profile", "Checking for applicable rules 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", "POI", "Rule " + ruleCandidates.get(i).getName() + " applies after " + this.getName() + " has been activated.", 2); Miscellaneous.logEvent("i", "Profile", "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", "POI", "Done checking for applicable rule after profile " + this.getName() + " has been activated.", 2); Miscellaneous.logEvent("i", "Profile", "Done checking for applicable rules after profile " + this.getName() + " has been activated.", 2);
} }
} }
else else

View File

@ -31,6 +31,7 @@ import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date; import java.util.Date;
import java.util.Map;
public class Trigger public class Trigger
{ {
@ -61,6 +62,7 @@ public class Trigger
broadcastReceived, broadcastReceived,
tethering, tethering,
subSystemState, subSystemState,
checkVariable,
phoneCall; //phoneCall always needs to be at the very end because of Google's shitty so called privacy phoneCall; //phoneCall always needs to be at the very end because of Google's shitty so called privacy
public String getFullName(Context context) public String getFullName(Context context)
@ -119,6 +121,8 @@ public class Trigger
return context.getResources().getString(R.string.tetheringState); return context.getResources().getString(R.string.tetheringState);
case subSystemState: case subSystemState:
return context.getResources().getString(R.string.subSystemState); return context.getResources().getString(R.string.subSystemState);
case checkVariable:
return context.getResources().getString(R.string.checkVariable);
default: default:
return "Unknown"; return "Unknown";
} }
@ -244,6 +248,10 @@ public class Trigger
if(!checkSubSystemState()) if(!checkSubSystemState())
result = false; result = false;
break; break;
case checkVariable:
if(!checkVariable())
result = false;
break;
default: default:
break; break;
} }
@ -574,6 +582,33 @@ public class Trigger
return false; return false;
} }
boolean checkVariable()
{
try
{
Map<String,String> map = AutomationService.getInstance().getVariableMap();
String[] conditions = this.getTriggerParameter2().split(Trigger.triggerParameter2Split);
if(conditions.length == 1) // no real condition
return true;
else
{
if (map.containsKey(conditions[0]))
{
if (map.get(conditions[0]).equals(conditions[1]))
return true;
}
}
}
catch(Exception e)
{
Miscellaneous.logEvent("e", "checkVariable()", Log.getStackTraceString(e), 1);
}
return false;
}
boolean checkBluetooth() boolean checkBluetooth()
{ {
Miscellaneous.logEvent("i", Miscellaneous.getAnyContext().getResources().getString(R.string.ruleCheckOf), String.format("Checking for bluetooth...", this.getParentRule().getName()), 4); Miscellaneous.logEvent("i", Miscellaneous.getAnyContext().getResources().getString(R.string.ruleCheckOf), String.format("Checking for bluetooth...", this.getParentRule().getName()), 4);
@ -1418,7 +1453,7 @@ public class Trigger
switch(this.getTriggerType()) switch(this.getTriggerType())
{ {
case charging: case charging:
if(getTriggerParameter()) if (getTriggerParameter())
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.starting) + " "); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.starting) + " ");
else else
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.stopping) + " "); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.stopping) + " ");
@ -1426,14 +1461,14 @@ public class Trigger
break; break;
case batteryLevel: case batteryLevel:
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.batteryLevel)); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.batteryLevel));
if(getTriggerParameter()) if (getTriggerParameter())
returnString.append(" " + Miscellaneous.getAnyContext().getResources().getString(R.string.exceeds) + " "); returnString.append(" " + Miscellaneous.getAnyContext().getResources().getString(R.string.exceeds) + " ");
else else
returnString.append(" " + Miscellaneous.getAnyContext().getResources().getString(R.string.dropsBelow) + " "); returnString.append(" " + Miscellaneous.getAnyContext().getResources().getString(R.string.dropsBelow) + " ");
returnString.append(String.valueOf(this.getBatteryLevel()) + " %"); returnString.append(String.valueOf(this.getBatteryLevel()) + " %");
break; break;
case usb_host_connection: case usb_host_connection:
if(getTriggerParameter()) if (getTriggerParameter())
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.connecting) + " "); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.connecting) + " ");
else else
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.disconnecting) + " "); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.disconnecting) + " ");
@ -1441,9 +1476,9 @@ public class Trigger
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.triggerUsb_host_connection)); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.triggerUsb_host_connection));
break; break;
case pointOfInterest: case pointOfInterest:
if(this.getPointOfInterest() != null) if (this.getPointOfInterest() != null)
{ {
if(getTriggerParameter()) if (getTriggerParameter())
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.entering) + " "); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.entering) + " ");
else else
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.leaving) + " "); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.leaving) + " ");
@ -1452,33 +1487,33 @@ public class Trigger
} }
else else
{ {
if(getTriggerParameter()) if (getTriggerParameter())
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.leaving) + " " + Miscellaneous.getAnyContext().getResources().getString(R.string.anyLocation)); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.leaving) + " " + Miscellaneous.getAnyContext().getResources().getString(R.string.anyLocation));
else else
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.entering) + " " + Miscellaneous.getAnyContext().getResources().getString(R.string.anyLocation)); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.entering) + " " + Miscellaneous.getAnyContext().getResources().getString(R.string.anyLocation));
} }
break; break;
case timeFrame: case timeFrame:
if(getTriggerParameter()) if (getTriggerParameter())
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.entering) + " "); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.entering) + " ");
else else
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.leaving) + " "); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.leaving) + " ");
String repeat = ", " + Miscellaneous.getAnyContext().getResources().getString(R.string.noRepetition); String repeat = ", " + Miscellaneous.getAnyContext().getResources().getString(R.string.noRepetition);
if(this.getTimeFrame().getRepetition() > 0) if (this.getTimeFrame().getRepetition() > 0)
repeat = ", " + String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.repeatEveryXsecondsWithVariable), String.valueOf(this.getTimeFrame().getRepetition())); repeat = ", " + String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.repeatEveryXsecondsWithVariable), String.valueOf(this.getTimeFrame().getRepetition()));
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.triggerTimeFrame) + ": " + this.getTimeFrame().getTriggerTimeStart().toString() + " " + Miscellaneous.getAnyContext().getResources().getString(R.string.until) + " " + this.getTimeFrame().getTriggerTimeStop().toString() + " " + Miscellaneous.getAnyContext().getResources().getString(R.string.onDays) + " " + this.getTimeFrame().getDayList().toString() + repeat); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.triggerTimeFrame) + ": " + this.getTimeFrame().getTriggerTimeStart().toString() + " " + Miscellaneous.getAnyContext().getResources().getString(R.string.until) + " " + this.getTimeFrame().getTriggerTimeStop().toString() + " " + Miscellaneous.getAnyContext().getResources().getString(R.string.onDays) + " " + this.getTimeFrame().getDayList().toString() + repeat);
break; break;
case speed: case speed:
if(getTriggerParameter()) if (getTriggerParameter())
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.exceeding) + " "); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.exceeding) + " ");
else else
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.droppingBelow) + " "); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.droppingBelow) + " ");
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.triggerSpeed) + ": " + String.valueOf(this.getSpeed()) + " km/h"); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.triggerSpeed) + ": " + String.valueOf(this.getSpeed()) + " km/h");
break; break;
case noiseLevel: case noiseLevel:
if(getTriggerParameter()) if (getTriggerParameter())
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.exceeding) + " "); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.exceeding) + " ");
else else
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.droppingBelow) + " "); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.droppingBelow) + " ");
@ -1487,12 +1522,12 @@ public class Trigger
break; break;
case wifiConnection: case wifiConnection:
String wifiDisplayName = ""; String wifiDisplayName = "";
if(this.getTriggerParameter2().length() == 0) if (this.getTriggerParameter2().length() == 0)
wifiDisplayName += Miscellaneous.getAnyContext().getResources().getString(R.string.anyWifi); wifiDisplayName += Miscellaneous.getAnyContext().getResources().getString(R.string.anyWifi);
else else
wifiDisplayName += this.getTriggerParameter2(); wifiDisplayName += this.getTriggerParameter2();
if(getTriggerParameter()) if (getTriggerParameter())
returnString.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.connectedToWifi), wifiDisplayName)); returnString.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.connectedToWifi), wifiDisplayName));
else else
returnString.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.disconnectedFromWifi), wifiDisplayName)); returnString.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.disconnectedFromWifi), wifiDisplayName));
@ -1500,13 +1535,13 @@ public class Trigger
break; break;
case process_started_stopped: case process_started_stopped:
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.application) + " " + this.getProcessName() + " " + Miscellaneous.getAnyContext().getResources().getString(R.string.is) + " "); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.application) + " " + this.getProcessName() + " " + Miscellaneous.getAnyContext().getResources().getString(R.string.is) + " ");
if(this.triggerParameter) if (this.triggerParameter)
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.started)); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.started));
else else
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.stopped)); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.stopped));
break; break;
case airplaneMode: case airplaneMode:
if(getTriggerParameter()) if (getTriggerParameter())
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.activated) + " "); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.activated) + " ");
else else
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.deactivated) + " "); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.deactivated) + " ");
@ -1514,7 +1549,7 @@ public class Trigger
break; break;
case roaming: case roaming:
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.roaming)); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.roaming));
if(getTriggerParameter()) if (getTriggerParameter())
returnString.append(" " + Miscellaneous.getAnyContext().getResources().getString(R.string.activated)); returnString.append(" " + Miscellaneous.getAnyContext().getResources().getString(R.string.activated));
else else
returnString.append(" " + Miscellaneous.getAnyContext().getResources().getString(R.string.deactivated)); returnString.append(" " + Miscellaneous.getAnyContext().getResources().getString(R.string.deactivated));
@ -1526,27 +1561,27 @@ public class Trigger
returnString.append(" "); returnString.append(" ");
if(elements[1].equals(triggerPhoneCallDirectionAny)) if (elements[1].equals(triggerPhoneCallDirectionAny))
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.with)); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.with));
else if(elements[1].equals(triggerPhoneCallDirectionIncoming)) else if (elements[1].equals(triggerPhoneCallDirectionIncoming))
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.from)); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.from));
else if(elements[1].equals(triggerPhoneCallDirectionOutgoing)) else if (elements[1].equals(triggerPhoneCallDirectionOutgoing))
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.to)); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.to));
returnString.append(" "); returnString.append(" ");
if(elements[2].equals(Trigger.triggerPhoneCallNumberAny)) if (elements[2].equals(Trigger.triggerPhoneCallNumberAny))
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.any) + " " + Miscellaneous.getAnyContext().getResources().getString(R.string.number)); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.any) + " " + Miscellaneous.getAnyContext().getResources().getString(R.string.number));
else else
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.number) + " " + Miscellaneous.getAnyContext().getResources().getString(R.string.matching) + " " + elements[2]); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.number) + " " + Miscellaneous.getAnyContext().getResources().getString(R.string.matching) + " " + elements[2]);
returnString.append(" "); returnString.append(" ");
if(elements[0].equals(Trigger.triggerPhoneCallStateRinging)) if (elements[0].equals(Trigger.triggerPhoneCallStateRinging))
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.ringing)); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.ringing));
else if(elements[0].equals(Trigger.triggerPhoneCallStateStarted)) else if (elements[0].equals(Trigger.triggerPhoneCallStateStarted))
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.started)); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.started));
else if(elements[0].equals(Trigger.triggerPhoneCallStateStopped)) else if (elements[0].equals(Trigger.triggerPhoneCallStateStopped))
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.stopped)); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.stopped));
break; break;
@ -1566,18 +1601,18 @@ public class Trigger
else else
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.featureNotInFdroidVersion)); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.featureNotInFdroidVersion));
} }
catch(ClassNotFoundException e) catch (ClassNotFoundException e)
{ {
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.featureNotInFdroidVersion)); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.featureNotInFdroidVersion));
} }
break; break;
case bluetoothConnection: case bluetoothConnection:
String device = Miscellaneous.getAnyContext().getResources().getString(R.string.anyDevice); String device = Miscellaneous.getAnyContext().getResources().getString(R.string.anyDevice);
if(bluetoothDeviceAddress.equals("<any>")) if (bluetoothDeviceAddress.equals("<any>"))
{ {
device = Miscellaneous.getAnyContext().getResources().getString(R.string.any); device = Miscellaneous.getAnyContext().getResources().getString(R.string.any);
} }
else if(bluetoothDeviceAddress.equals("<none>")) else if (bluetoothDeviceAddress.equals("<none>"))
{ {
device = Miscellaneous.getAnyContext().getResources().getString(R.string.noDevice); device = Miscellaneous.getAnyContext().getResources().getString(R.string.noDevice);
} }
@ -1587,21 +1622,21 @@ public class Trigger
{ {
device = BluetoothReceiver.getDeviceByAddress(bluetoothDeviceAddress).getName() + " (" + this.bluetoothDeviceAddress + ")"; device = BluetoothReceiver.getDeviceByAddress(bluetoothDeviceAddress).getName() + " (" + this.bluetoothDeviceAddress + ")";
} }
catch(NullPointerException e) catch (NullPointerException e)
{ {
device = Miscellaneous.getAnyContext().getResources().getString(R.string.invalidDevice) + ": " + this.bluetoothDeviceAddress; device = Miscellaneous.getAnyContext().getResources().getString(R.string.invalidDevice) + ": " + this.bluetoothDeviceAddress;
Miscellaneous.logEvent("w", "Trigger", device, 3); Miscellaneous.logEvent("w", "Trigger", device, 3);
} }
} }
if(bluetoothEvent.equals(BluetoothDevice.ACTION_ACL_CONNECTED) || bluetoothEvent.equals(BluetoothDevice.ACTION_ACL_DISCONNECTED)) if (bluetoothEvent.equals(BluetoothDevice.ACTION_ACL_CONNECTED) || bluetoothEvent.equals(BluetoothDevice.ACTION_ACL_DISCONNECTED))
{ {
if (this.triggerParameter) if (this.triggerParameter)
returnString.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.bluetoothConnectionTo), device)); returnString.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.bluetoothConnectionTo), device));
else else
returnString.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.bluetoothDisconnectFrom), device)); returnString.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.bluetoothDisconnectFrom), device));
} }
else if(bluetoothEvent.equals(BluetoothDevice.ACTION_FOUND)) else if (bluetoothEvent.equals(BluetoothDevice.ACTION_FOUND))
{ {
if (this.triggerParameter) if (this.triggerParameter)
returnString.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.bluetoothDeviceInRange), device)); returnString.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.bluetoothDeviceInRange), device));
@ -1611,7 +1646,7 @@ public class Trigger
break; break;
case headsetPlugged: case headsetPlugged:
String type; String type;
switch(headphoneType) switch (headphoneType)
{ {
case 0: case 0:
type = Miscellaneous.getAnyContext().getResources().getString(R.string.headphoneSimple); type = Miscellaneous.getAnyContext().getResources().getString(R.string.headphoneSimple);
@ -1626,13 +1661,13 @@ public class Trigger
type = Miscellaneous.getAnyContext().getResources().getString(R.string.notSet); type = Miscellaneous.getAnyContext().getResources().getString(R.string.notSet);
break; break;
} }
if(getTriggerParameter()) if (getTriggerParameter())
returnString.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.headsetConnected), type)); returnString.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.headsetConnected), type));
else else
returnString.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.headsetDisconnected), type)); returnString.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.headsetDisconnected), type));
break; break;
case notification: case notification:
if(this.getTriggerParameter2().contains(triggerParameter2Split)) if (this.getTriggerParameter2().contains(triggerParameter2Split))
{ {
String[] params = getTriggerParameter2().split(triggerParameter2Split); String[] params = getTriggerParameter2().split(triggerParameter2Split);
@ -1653,7 +1688,7 @@ public class Trigger
else else
appString = "app " + app; appString = "app " + app;
if(triggerParameter) if (triggerParameter)
triggerBuilder.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.postsNotification), appString)); triggerBuilder.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.postsNotification), appString));
else else
triggerBuilder.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.removedNotification), appString)); triggerBuilder.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.removedNotification), appString));
@ -1675,26 +1710,26 @@ public class Trigger
returnString.append(Miscellaneous.getAnyContext().getString(R.string.deviceIsInCertainOrientation)); returnString.append(Miscellaneous.getAnyContext().getString(R.string.deviceIsInCertainOrientation));
break; break;
case profileActive: case profileActive:
if(triggerParameter) if (triggerParameter)
returnString.append(String.format(Miscellaneous.getAnyContext().getString(R.string.profileActive), getTriggerParameter2().split(Trigger.triggerParameter2Split)[0])); returnString.append(String.format(Miscellaneous.getAnyContext().getString(R.string.profileActive), getTriggerParameter2().split(Trigger.triggerParameter2Split)[0]));
else else
returnString.append(String.format(Miscellaneous.getAnyContext().getString(R.string.profileNotActive), getTriggerParameter2().split(Trigger.triggerParameter2Split)[0])); returnString.append(String.format(Miscellaneous.getAnyContext().getString(R.string.profileNotActive), getTriggerParameter2().split(Trigger.triggerParameter2Split)[0]));
break; break;
case musicPlaying: case musicPlaying:
if(triggerParameter) if (triggerParameter)
returnString.append(Miscellaneous.getAnyContext().getString(R.string.musicIsPlaying)); returnString.append(Miscellaneous.getAnyContext().getString(R.string.musicIsPlaying));
else else
returnString.append(Miscellaneous.getAnyContext().getString(R.string.musicIsNotPlaying)); returnString.append(Miscellaneous.getAnyContext().getString(R.string.musicIsNotPlaying));
break; break;
case screenState: case screenState:
String state; String state;
switch(triggerParameter2) switch (triggerParameter2)
{ {
case "0": case "0":
state = Miscellaneous.getAnyContext().getString(R.string.off); state = Miscellaneous.getAnyContext().getString(R.string.off);
break; break;
case "1": case "1":
state = Miscellaneous.getAnyContext().getString(R.string.on); state = Miscellaneous.getAnyContext().getString(R.string.on);
break; break;
case "2": case "2":
state = Miscellaneous.getAnyContext().getString(R.string.unlocked); state = Miscellaneous.getAnyContext().getString(R.string.unlocked);
@ -1719,7 +1754,7 @@ public class Trigger
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.serviceIsStarting) + ": " + String.valueOf(triggerParameter)); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.serviceIsStarting) + ": " + String.valueOf(triggerParameter));
break; break;
case broadcastReceived: case broadcastReceived:
if(triggerParameter) if (triggerParameter)
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.broadcastReceived)); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.broadcastReceived));
else else
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.broadcastNotReceived)); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.broadcastNotReceived));
@ -1727,7 +1762,7 @@ public class Trigger
returnString.append(": " + triggerParameter2); returnString.append(": " + triggerParameter2);
break; break;
case tethering: case tethering:
if(triggerParameter) if (triggerParameter)
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.tetheringActive)); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.tetheringActive));
else else
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.tetheringNotActive)); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.tetheringNotActive));
@ -1736,7 +1771,7 @@ public class Trigger
break; break;
case subSystemState: case subSystemState:
Trigger.subSystemStates desiredState = subSystemStates.valueOf(triggerParameter2); Trigger.subSystemStates desiredState = subSystemStates.valueOf(triggerParameter2);
switch(desiredState) switch (desiredState)
{ {
case wifi: case wifi:
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.wifi)); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.wifi));
@ -1748,11 +1783,20 @@ public class Trigger
returnString.append(" " + Miscellaneous.getAnyContext().getResources().getString(R.string.is) + " "); returnString.append(" " + Miscellaneous.getAnyContext().getResources().getString(R.string.is) + " ");
if(triggerParameter) if (triggerParameter)
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.activated)); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.activated));
else else
returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.deactivated)); returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.deactivated));
break; break;
case checkVariable:
if (triggerParameter2.contains(triggerParameter2Split))
{
String[] parts = triggerParameter2.split(triggerParameter2Split);
returnString.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.variableCheckString), parts[0], parts[1]));
}
else
returnString.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.variableCheckStringDeleted), triggerParameter2));
break;
default: default:
returnString.append("error"); returnString.append("error");
break; break;

View File

@ -0,0 +1,73 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="@dimen/default_margin" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/setVariable"
android:textSize="25dp"
android:layout_marginBottom="@dimen/default_margin" />
<TableLayout
android:layout_marginLeft="@dimen/default_margin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:shrinkColumns="1"
android:stretchColumns="1" >
<TableRow>
<TextView
android:text="@string/VariableKey"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/etVariableSetKey"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="text" />
</TableRow>
<TableRow>
<TextView
android:text="@string/variableValue"
android:layout_marginRight="@dimen/default_margin"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/etVariableSetValue"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</TableRow>
</TableLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginVertical="@dimen/default_margin"
android:text="@string/setVariableExplanation" />
<Button
android:id="@+id/bSaveVariable"
android:layout_marginTop="@dimen/default_margin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/save" />
</LinearLayout>
</ScrollView>

View File

@ -0,0 +1,80 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_margin="@dimen/default_margin" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_span="2"
android:textSize="25dp"
android:textStyle="bold"
android:layout_marginBottom="@dimen/default_margin"
android:text="@string/checkVariable"/>
<TableLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/default_margin"
android:stretchColumns="1"
android:shrinkColumns="1" >
<TableRow
android:layout_marginTop="@dimen/default_margin">
<TextView
android:layout_gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/default_margin"
android:text="@string/VariableKey" />
<EditText
android:id="@+id/etVariableKeyTrigger"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</TableRow>
<TableRow
android:layout_marginTop="@dimen/default_margin">
<TextView
android:layout_gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/default_margin"
android:text="@string/variableValue" />
<EditText
android:id="@+id/etVariableValueTrigger"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</TableRow>
</TableLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/default_margin"
android:text="@string/checkVariableExplanation" />
<Button
android:id="@+id/bTriggerVariableSave"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/default_margin"
android:text="@string/save" />
</LinearLayout>
</ScrollView>

View File

@ -761,4 +761,14 @@
<string name="endPhoneCall">Telefonanruf beenden</string> <string name="endPhoneCall">Telefonanruf beenden</string>
<string name="android.permission.ANSWER_PHONE_CALLS">Telefonanruf beenden</string> <string name="android.permission.ANSWER_PHONE_CALLS">Telefonanruf beenden</string>
<string name="settingsReferringToRestrictedFeaturesInGoogle">Ihre Einstellungen und/oder Regeln verweisen derzeit auf Funktionen, die in der Google Play-Version nicht bereitgestellt werden können. Dazu gehört unter anderem alles, was mit Telefonaten und Textnachrichten zu tun hat.</string> <string name="settingsReferringToRestrictedFeaturesInGoogle">Ihre Einstellungen und/oder Regeln verweisen derzeit auf Funktionen, die in der Google Play-Version nicht bereitgestellt werden können. Dazu gehört unter anderem alles, was mit Telefonaten und Textnachrichten zu tun hat.</string>
<string name="setVariable">Variable festlegen</string>
<string name="deleteVariable">Variable löschen</string>
<string name="VariableKey">Variablenname</string>
<string name="variableValue">Variablenwert</string>
<string name="setVariableExplanation">Wenn Sie für eine Variable einen leeren Wert angeben, wird sie gelöscht.</string>
<string name="enterVariableKey">Geben Sie einen Namen für die Variable an.</string>
<string name="checkVariable">Variable prüfen</string>
<string name="checkVariableExplanation">Wenn Sie den Wert der Variablen leer lassen, darf sie nicht gesetzt sein, damit die Bedingung als erfüllt gilt.</string>
<string name="variableCheckString">wenn Variable %1$s den Wert %2$s hat</string>
<string name="variableCheckStringDeleted">wenn Variable %1$s nicht gesetzt ist</string>
</resources> </resources>

View File

@ -760,4 +760,14 @@
<string name="endPhoneCall">Terminar llamda de teléfono</string> <string name="endPhoneCall">Terminar llamda de teléfono</string>
<string name="android.permission.ANSWER_PHONE_CALLS">Terminar llamda de teléfono</string> <string name="android.permission.ANSWER_PHONE_CALLS">Terminar llamda de teléfono</string>
<string name="settingsReferringToRestrictedFeaturesInGoogle">La configuración y/o las reglas hacen referencia a funciones que no se pueden proporcionar en la versión de Google Play. Entre otras cosas que incluye todo lo relacionado con llamadas telefónicas y mensajes de texto.</string> <string name="settingsReferringToRestrictedFeaturesInGoogle">La configuración y/o las reglas hacen referencia a funciones que no se pueden proporcionar en la versión de Google Play. Entre otras cosas que incluye todo lo relacionado con llamadas telefónicas y mensajes de texto.</string>
<string name="variableCheckStringDeleted">Si la variable %1$s no está establecida</string>
<string name="variableCheckString">Si la variable %1$s es %2$s</string>
<string name="checkVariableExplanation">Si deja el valor vacío, no se debe establecer la variable para que la condición devuelva true.</string>
<string name="checkVariable">Comprobar variable</string>
<string name="enterVariableKey">Introduzca una clave para la variable.</string>
<string name="setVariableExplanation">Si establece una variable en un valor vacío, se eliminará.</string>
<string name="variableValue">Valor variable</string>
<string name="VariableKey">Clave variable</string>
<string name="deleteVariable">Eliminar variable</string>
<string name="setVariable">Establecer una variable</string>
</resources> </resources>

View File

@ -760,4 +760,14 @@
<string name="endPhoneCall">Mettre fin à l\'appel téléphonique</string> <string name="endPhoneCall">Mettre fin à l\'appel téléphonique</string>
<string name="android.permission.ANSWER_PHONE_CALLS">Mettre fin à l\'appel téléphonique</string> <string name="android.permission.ANSWER_PHONE_CALLS">Mettre fin à l\'appel téléphonique</string>
<string name="settingsReferringToRestrictedFeaturesInGoogle">Vos paramètres et/ou règles font actuellement référence à des fonctionnalités qui ne peuvent pas être fournies dans la version Google Play. Entre autres choses, cela inclut tout ce qui concerne les appels téléphoniques et les messages texte.</string> <string name="settingsReferringToRestrictedFeaturesInGoogle">Vos paramètres et/ou règles font actuellement référence à des fonctionnalités qui ne peuvent pas être fournies dans la version Google Play. Entre autres choses, cela inclut tout ce qui concerne les appels téléphoniques et les messages texte.</string>
<string name="variableCheckStringDeleted">si la variable %1$s n\'est pas définie</string>
<string name="variableCheckString">si la variable %1$s est %2$s</string>
<string name="checkVariableExplanation">Si vous laissez la valeur vide, la variable ne doit pas être définie pour que la condition renvoie true.</string>
<string name="checkVariable">Vérifier la variable</string>
<string name="enterVariableKey">Entrez une clé pour la variable.</string>
<string name="setVariableExplanation">Si vous définissez une variable sur une valeur vide, elle sera supprimée.</string>
<string name="variableValue">Valeur variable</string>
<string name="VariableKey">Clé variable</string>
<string name="deleteVariable">Supprimer la variable</string>
<string name="setVariable">Définir une variable</string>
</resources> </resources>

View File

@ -761,4 +761,14 @@
<string name="android.permission.ANSWER_PHONE_CALLS">Termina telefonata</string> <string name="android.permission.ANSWER_PHONE_CALLS">Termina telefonata</string>
<string name="endPhoneCall">Termina telefonata</string> <string name="endPhoneCall">Termina telefonata</string>
<string name="settingsReferringToRestrictedFeaturesInGoogle">Le tue impostazioni e/o regole fanno attualmente riferimento a funzioni che non possono essere fornite nella versione di Google Play. Tra le altre cose che include tutto ciò che riguarda le telefonate e i messaggi di testo.</string> <string name="settingsReferringToRestrictedFeaturesInGoogle">Le tue impostazioni e/o regole fanno attualmente riferimento a funzioni che non possono essere fornite nella versione di Google Play. Tra le altre cose che include tutto ciò che riguarda le telefonate e i messaggi di testo.</string>
<string name="setVariable">Impostare una variabile</string>
<string name="deleteVariable">Elimina variabile</string>
<string name="VariableKey">Chiave variabile</string>
<string name="variableValue">Valore variabile</string>
<string name="setVariableExplanation">Se si imposta una variabile su un valore vuoto, questa verrà eliminata.</string>
<string name="enterVariableKey">Immettere una chiave per la variabile.</string>
<string name="checkVariable">Controlla variabile</string>
<string name="checkVariableExplanation">Se si lascia vuoto il valore, la variabile non deve essere impostata affinché la condizione restituisca true.</string>
<string name="variableCheckString">Se la variabile %1$s è %2$s</string>
<string name="variableCheckStringDeleted">Se la variabile %1$s non è impostata</string>
</resources> </resources>

View File

@ -759,5 +759,15 @@
<string name="android.permission.ANSWER_PHONE_CALLS">Telefoongesprek beëindigen</string> <string name="android.permission.ANSWER_PHONE_CALLS">Telefoongesprek beëindigen</string>
<string name="endPhoneCall">Telefoongesprek beëindigen</string> <string name="endPhoneCall">Telefoongesprek beëindigen</string>
<string name="settingsReferringToRestrictedFeaturesInGoogle">Uw instellingen en/of regels verwijzen momenteel naar functies die niet kunnen worden geleverd in de Google Play-versie. Dat omvat onder andere alles wat te maken heeft met telefoontjes en sms-berichten.</string> <string name="settingsReferringToRestrictedFeaturesInGoogle">Uw instellingen en/of regels verwijzen momenteel naar functies die niet kunnen worden geleverd in de Google Play-versie. Dat omvat onder andere alles wat te maken heeft met telefoontjes en sms-berichten.</string>
<string name="setVariable">Een variabele instellen</string>
<string name="deleteVariable">Variabele verwijderen</string>
<string name="VariableKey">Variabele sleutel</string>
<string name="variableValue">Variabele waarde</string>
<string name="setVariableExplanation">Als u een variabele instelt op een lege waarde, wordt deze verwijderd.</string>
<string name="enterVariableKey">Voer een sleutel in voor de variabele.</string>
<string name="checkVariable">Variabele controleren</string>
<string name="checkVariableExplanation">Als u de waarde leeg laat, mag de variabele niet worden ingesteld om de voorwaarde true te laten retourneren.</string>
<string name="variableCheckString">als variabele %1$s %2$s is</string>
<string name="variableCheckStringDeleted">als variabele %1$s niet is ingesteld</string>
</resources> </resources>

View File

@ -818,4 +818,14 @@
<string name="endPhoneCall">Завершение телефонного звонка</string> <string name="endPhoneCall">Завершение телефонного звонка</string>
<string name="android.permission.ANSWER_PHONE_CALLS">Завершение телефонного звонка</string> <string name="android.permission.ANSWER_PHONE_CALLS">Завершение телефонного звонка</string>
<string name="settingsReferringToRestrictedFeaturesInGoogle">Ваши настройки и/или правила в настоящее время ссылаются на функции, которые не могут быть предоставлены в версии Google Play. Среди прочего, это включает в себя все, что связано с телефонными звонками и текстовыми сообщениями.</string> <string name="settingsReferringToRestrictedFeaturesInGoogle">Ваши настройки и/или правила в настоящее время ссылаются на функции, которые не могут быть предоставлены в версии Google Play. Среди прочего, это включает в себя все, что связано с телефонными звонками и текстовыми сообщениями.</string>
<string name="setVariable">Задание переменной</string>
<string name="deleteVariable">Удалить переменную</string>
<string name="VariableKey">Клавиша переменной</string>
<string name="variableValue">Значение переменной</string>
<string name="setVariableExplanation">Если для переменной задано пустое значение, она будет удалена.</string>
<string name="enterVariableKey">Введите ключ для переменной.</string>
<string name="checkVariable">Проверить переменную</string>
<string name="checkVariableExplanation">Если оставить значение пустым, переменная не должна быть задана для того, чтобы условие возвращало значение true.</string>
<string name="variableCheckString">если переменная %1$s равно %2$s</string>
<string name="variableCheckStringDeleted">Если переменная %1$s не задана</string>
</resources> </resources>

View File

@ -858,4 +858,14 @@
<string name="makePhoneCallExplanation1">Here you can enter a phone number that will be called without further prompts. You may use this to make settings like making adjustments to call routing, etc.. Please search for the codes required for this on your own.</string> <string name="makePhoneCallExplanation1">Here you can enter a phone number that will be called without further prompts. You may use this to make settings like making adjustments to call routing, etc.. Please search for the codes required for this on your own.</string>
<string name="endPhoneCall">End phone call</string> <string name="endPhoneCall">End phone call</string>
<string name="android.permission.ANSWER_PHONE_CALLS">End phone call</string> <string name="android.permission.ANSWER_PHONE_CALLS">End phone call</string>
<string name="setVariable">Set a variable</string>
<string name="deleteVariable">Delete variable</string>
<string name="VariableKey">Variable key</string>
<string name="variableValue">Variable value</string>
<string name="setVariableExplanation">If you set a variable to an empty value it will be deleted.</string>
<string name="enterVariableKey">Enter a key for the variable.</string>
<string name="checkVariable">Check variable</string>
<string name="checkVariableExplanation">If you leave the value empty the variable must not be set for the condition to return true.</string>
<string name="variableCheckString">if variable %1$s is %2$s</string>
<string name="variableCheckStringDeleted">if variable %1$s is not set</string>
</resources> </resources>

View File

@ -1,3 +1,4 @@
* New: Confirmation dialog before deleting locations, rules and profile * New: Confirmation dialog before deleting locations, rules and profile
* New action: Make phone call without further prompt * New action: Make phone call without further prompt
* New trigger/action: Set custom variables as actions and check for them in triggers
* Fixed: Battery receiver could trigger above 100% or below 0% * Fixed: Battery receiver could trigger above 100% or below 0%