diff --git a/app/src/apkFlavor/AndroidManifest.xml b/app/src/apkFlavor/AndroidManifest.xml
index 7d22bae..5c59e0c 100644
--- a/app/src/apkFlavor/AndroidManifest.xml
+++ b/app/src/apkFlavor/AndroidManifest.xml
@@ -168,6 +168,7 @@
+
diff --git a/app/src/fdroidFlavor/AndroidManifest.xml b/app/src/fdroidFlavor/AndroidManifest.xml
index d219b24..47a480d 100644
--- a/app/src/fdroidFlavor/AndroidManifest.xml
+++ b/app/src/fdroidFlavor/AndroidManifest.xml
@@ -166,6 +166,7 @@
+
diff --git a/app/src/googlePlayFlavor/AndroidManifest.xml b/app/src/googlePlayFlavor/AndroidManifest.xml
index dd34875..8410205 100644
--- a/app/src/googlePlayFlavor/AndroidManifest.xml
+++ b/app/src/googlePlayFlavor/AndroidManifest.xml
@@ -153,6 +153,7 @@
+
diff --git a/app/src/main/java/com/jens/automation2/ActivityMainScreen.java b/app/src/main/java/com/jens/automation2/ActivityMainScreen.java
index 52a9b7b..54f8ad4 100644
--- a/app/src/main/java/com/jens/automation2/ActivityMainScreen.java
+++ b/app/src/main/java/com/jens/automation2/ActivityMainScreen.java
@@ -77,17 +77,6 @@ public class ActivityMainScreen extends ActivityGeneric
tvLockSoundDuration = (TextView)findViewById(R.id.tvlockSoundDuration);
tbLockSound = (ToggleButton) findViewById(R.id.tbLockSound);
toggleService = (ToggleButton) findViewById(R.id.tbArmMastListener);
-
- Button bTether = (Button)findViewById(R.id.bTethering);
- bTether.setOnClickListener(new OnClickListener()
- {
- @Override
- public void onClick(View view)
- {
- Toast.makeText(ActivityMainScreen.this, "Tethering active: " + String.valueOf(Actions.isTetheringActive1(ActivityMainScreen.this)), Toast.LENGTH_LONG).show();
- }
- });
-
bDonate = (Button)findViewById(R.id.bDonate);
if(!BuildConfig.FLAVOR.equalsIgnoreCase(AutomationService.flavor_name_googleplay))
diff --git a/app/src/main/java/com/jens/automation2/ActivityManageRule.java b/app/src/main/java/com/jens/automation2/ActivityManageRule.java
index b3c353d..aa4cd1a 100644
--- a/app/src/main/java/com/jens/automation2/ActivityManageRule.java
+++ b/app/src/main/java/com/jens/automation2/ActivityManageRule.java
@@ -127,6 +127,8 @@ public class ActivityManageRule extends Activity
final static int requestCodeActionRunExecutableEdit = 814;
final static int requestCodeActionSetWifiAdd = 815;
final static int requestCodeActionSetWifiEdit = 816;
+ final static int requestCodeTriggerTetheringAdd = 817;
+ final static int requestCodeTriggerTetheringEdit = 818;
public static ActivityManageRule getInstance()
{
@@ -312,6 +314,11 @@ public class ActivityManageRule extends Activity
broadcastEditor.putExtra(intentNameTriggerParameter2, selectedTrigger.getTriggerParameter2());
startActivityForResult(broadcastEditor, requestCodeTriggerBroadcastReceivedEdit);
break;
+ case tethering:
+ Intent tetheringEditor = new Intent(ActivityManageRule.this, ActivityManageTriggerTethering.class);
+ tetheringEditor.putExtra(intentNameTriggerParameter1, selectedTrigger.getTriggerParameter());
+ startActivityForResult(tetheringEditor, requestCodeTriggerTetheringEdit);
+ break;
default:
break;
}
@@ -568,6 +575,8 @@ public class ActivityManageRule extends Activity
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 if(types[i].toString().equals(Trigger_Enum.tethering.toString()))
+ items.add(new Item(typesLong[i].toString(), R.drawable.router));
else
items.add(new Item(typesLong[i].toString(), R.drawable.placeholder));
}
@@ -767,6 +776,13 @@ public class ActivityManageRule extends Activity
startActivityForResult(broadcastTriggerEditor, requestCodeTriggerBroadcastReceivedAdd);
return;
}
+ else if(triggerType == Trigger_Enum.tethering)
+ {
+ newTrigger.setTriggerType(Trigger_Enum.tethering);
+ Intent tetheringTriggerEditor = new Intent(myContext, ActivityManageTriggerTethering.class);
+ startActivityForResult(tetheringTriggerEditor, requestCodeTriggerTetheringAdd);
+ return;
+ }
else
getTriggerParameterDialog(context, booleanChoices).show();
@@ -1782,6 +1798,28 @@ public class ActivityManageRule extends Activity
this.refreshTriggerList();
}
}
+ else if(requestCode == requestCodeTriggerTetheringAdd)
+ {
+ if(resultCode == RESULT_OK)
+ {
+ newTrigger.setTriggerParameter(data.getBooleanExtra(intentNameTriggerParameter1, true));
+ newTrigger.setParentRule(ruleToEdit);
+ ruleToEdit.getTriggerSet().add(newTrigger);
+ this.refreshTriggerList();
+ }
+ }
+ else if(requestCode == requestCodeTriggerTetheringEdit)
+ {
+ if(resultCode == RESULT_OK)
+ {
+ Trigger editedTrigger = new Trigger();
+ editedTrigger.setTriggerType(Trigger_Enum.tethering);
+ editedTrigger.setTriggerParameter(data.getBooleanExtra(intentNameTriggerParameter1, true));
+ editedTrigger.setParentRule(ruleToEdit);
+ ruleToEdit.getTriggerSet().set(editIndex, editedTrigger);
+ this.refreshTriggerList();
+ }
+ }
}
protected AlertDialog getActionTypeDialog()
diff --git a/app/src/main/java/com/jens/automation2/ActivityManageTriggerTethering.java b/app/src/main/java/com/jens/automation2/ActivityManageTriggerTethering.java
new file mode 100644
index 0000000..15ad0be
--- /dev/null
+++ b/app/src/main/java/com/jens/automation2/ActivityManageTriggerTethering.java
@@ -0,0 +1,46 @@
+package com.jens.automation2;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Build;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.RadioButton;
+import android.widget.TextView;
+
+import androidx.annotation.Nullable;
+
+public class ActivityManageTriggerTethering extends Activity
+{
+ RadioButton rbTetheringOn, rTetheringOff;
+ Button bTriggerTetheringSave;
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState)
+ {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_manage_trigger_tethering);
+
+ rbTetheringOn = (RadioButton) findViewById(R.id.rbTetheringOn);
+ rTetheringOff = (RadioButton)findViewById(R.id.rTetheringOff);
+ bTriggerTetheringSave = (Button) findViewById(R.id.bTriggerTetheringSave);
+
+ Intent input = getIntent();
+ if(input.hasExtra(ActivityManageRule.intentNameTriggerParameter1))
+ rbTetheringOn.setChecked(input.getBooleanExtra(ActivityManageRule.intentNameTriggerParameter1, true));
+
+ bTriggerTetheringSave.setOnClickListener(new View.OnClickListener()
+ {
+ @Override
+ public void onClick(View view)
+ {
+ Intent response = new Intent();
+ response.putExtra(ActivityManageRule.intentNameTriggerParameter1, rbTetheringOn.isChecked());
+ setResult(RESULT_OK, response);
+ finish();
+ }
+ });
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/jens/automation2/ReceiverCoordinator.java b/app/src/main/java/com/jens/automation2/ReceiverCoordinator.java
index 6ba9f9a..23a1f77 100644
--- a/app/src/main/java/com/jens/automation2/ReceiverCoordinator.java
+++ b/app/src/main/java/com/jens/automation2/ReceiverCoordinator.java
@@ -18,6 +18,7 @@ import com.jens.automation2.receivers.NoiseListener;
import com.jens.automation2.receivers.PhoneStatusListener;
import com.jens.automation2.receivers.ProcessListener;
import com.jens.automation2.receivers.ScreenStateReceiver;
+import com.jens.automation2.receivers.TetheringReceiver;
import com.jens.automation2.receivers.TimeZoneListener;
import androidx.annotation.RequiresApi;
@@ -59,7 +60,8 @@ public class ReceiverCoordinator
ProcessListener.class,
MediaPlayerListener.class,
ScreenStateReceiver.class,
- TimeZoneListener.class
+ TimeZoneListener.class,
+ TetheringReceiver.class
};
}
catch (ClassNotFoundException e)
@@ -77,7 +79,8 @@ public class ReceiverCoordinator
PhoneStatusListener.class,
ProcessListener.class,
ScreenStateReceiver.class,
- TimeZoneListener.class
+ TimeZoneListener.class,
+ TetheringReceiver.class
};
}
}
@@ -176,6 +179,9 @@ public class ReceiverCoordinator
if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.deviceOrientation))
DeviceOrientationListener.getInstance().startListener(AutomationService.getInstance());
+ if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.tethering))
+ TetheringReceiver.getInstance().startListener(AutomationService.getInstance());
+
try
{
Class testClass = Class.forName(ActivityManageRule.activityDetectionClassPath);
@@ -216,6 +222,7 @@ public class ReceiverCoordinator
ProcessListener.stopProcessListener(AutomationService.getInstance());
MediaPlayerListener.getInstance().stopListener(AutomationService.getInstance());
DeviceOrientationListener.getInstance().stopListener(AutomationService.getInstance());
+ TetheringReceiver.getInstance().stopListener(AutomationService.getInstance());
try
{
@@ -415,6 +422,24 @@ public class ReceiverCoordinator
}
}
+ if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.tethering))
+ {
+ if(!TetheringReceiver.getInstance().isListenerRunning())
+ {
+ Miscellaneous.logEvent("i", "TetheringReceiver", "Starting TetheringReceiver because used in a new/changed rule.", 4);
+// if(DevicePositionListener.getInstance().haveAllPermission())
+ TetheringReceiver.getInstance().startListener(AutomationService.getInstance());
+ }
+ }
+ else
+ {
+ if(TetheringReceiver.getInstance().isListenerRunning())
+ {
+ Miscellaneous.logEvent("i", "TetheringReceiver", "Shutting down TetheringReceiver because not used in any rule.", 4);
+ TetheringReceiver.getInstance().stopListener(AutomationService.getInstance());
+ }
+ }
+
AutomationService.updateNotification();
}
}
diff --git a/app/src/main/java/com/jens/automation2/Trigger.java b/app/src/main/java/com/jens/automation2/Trigger.java
index ae3e091..ba51232 100644
--- a/app/src/main/java/com/jens/automation2/Trigger.java
+++ b/app/src/main/java/com/jens/automation2/Trigger.java
@@ -24,10 +24,10 @@ import com.jens.automation2.receivers.NotificationListener;
import com.jens.automation2.receivers.PhoneStatusListener;
import com.jens.automation2.receivers.ProcessListener;
import com.jens.automation2.receivers.ScreenStateReceiver;
+import com.jens.automation2.receivers.TetheringReceiver;
import org.apache.commons.lang3.StringUtils;
-import java.sql.Time;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
@@ -59,6 +59,7 @@ public class Trigger
deviceStarts,
serviceStarts,
broadcastReceived,
+ tethering,
phoneCall; //phoneCall always needs to be at the very end because of Google's shitty so called privacy
public String getFullName(Context context)
@@ -113,6 +114,8 @@ public class Trigger
return context.getResources().getString(R.string.serviceStarts);
case broadcastReceived:
return context.getResources().getString(R.string.broadcastReceivedTitle);
+ case tethering:
+ return context.getResources().getString(R.string.tetheringState);
default:
return "Unknown";
}
@@ -228,6 +231,10 @@ public class Trigger
if(!checkBroadcastReceived())
result = false;
break;
+ case tethering:
+ if(!checkTetheringActive())
+ result = false;
+ break;
default:
break;
}
@@ -919,6 +926,11 @@ public class Trigger
return true;
}
+ boolean checkTetheringActive()
+ {
+ return TetheringReceiver.isTetheringActive() == triggerParameter;
+ }
+
public boolean checkDateTime(Object triggeringObject, boolean checkifStateChangedSinceLastRuleExecution)
{
/*
@@ -1636,6 +1648,12 @@ public class Trigger
returnString.append(": " + triggerParameter2);
break;
+ case tethering:
+ if(triggerParameter)
+ returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.tetheringActive));
+ else
+ returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.tetheringNotActive));
+ break;
default:
returnString.append("error");
break;
diff --git a/app/src/main/java/com/jens/automation2/receivers/BroadcastListener.java b/app/src/main/java/com/jens/automation2/receivers/BroadcastListener.java
index bec1fc7..204a3b5 100644
--- a/app/src/main/java/com/jens/automation2/receivers/BroadcastListener.java
+++ b/app/src/main/java/com/jens/automation2/receivers/BroadcastListener.java
@@ -6,6 +6,7 @@ import android.content.IntentFilter;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
+import android.widget.Toast;
import com.jens.automation2.ActivityPermissions;
import com.jens.automation2.AutomationService;
@@ -54,22 +55,6 @@ public class BroadcastListener extends android.content.BroadcastReceiver impleme
for(String key : intent.getExtras().keySet())
{
Miscellaneous.logEvent("i", "Broadcast extra", "Broadcast " + intent.getAction() + " has extra " + key + " and type " + intent.getExtras().get(key).getClass().getName(), 4);
- Object ob = intent.getExtras().get(key);
-
- String target = null;
-
- if(Build.VERSION.SDK_INT >= 26)
- target = "tetherArray";
- else
- target = "activeArray";
-
- if(key.equals(target) && ob instanceof ArrayList)
- {
- if(((ArrayList)ob).size() > 0)
- ;
- }
-
- Miscellaneous.logEvent("i", "Broadcast extra", "Broadcast " + intent.getAction() + " has extra " + key + " and type " + intent.getExtras().get(key).getClass().getName(), 4);
}
ArrayList ruleCandidates = Rule.findRuleCandidates(Trigger.Trigger_Enum.broadcastReceived);
diff --git a/app/src/main/java/com/jens/automation2/receivers/TetheringReceiver.java b/app/src/main/java/com/jens/automation2/receivers/TetheringReceiver.java
new file mode 100644
index 0000000..7f2b846
--- /dev/null
+++ b/app/src/main/java/com/jens/automation2/receivers/TetheringReceiver.java
@@ -0,0 +1,130 @@
+package com.jens.automation2.receivers;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Build;
+import android.util.Log;
+
+import com.jens.automation2.AutomationService;
+import com.jens.automation2.Miscellaneous;
+import com.jens.automation2.Rule;
+import com.jens.automation2.Trigger;
+
+import java.util.ArrayList;
+
+public class TetheringReceiver extends android.content.BroadcastReceiver implements AutomationListenerInterface
+{
+ public static AutomationService automationServiceRef = null;
+ private static boolean receiverActive = false;
+ private static TetheringReceiver receiverInstance = null;
+ private static IntentFilter intentFilter = null;
+
+ private static boolean tetheringActive = false;
+
+ public static TetheringReceiver getInstance()
+ {
+ if(receiverInstance == null)
+ receiverInstance = new TetheringReceiver();
+
+ return receiverInstance;
+ }
+
+ public static boolean isTetheringActive()
+ {
+ return tetheringActive;
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent)
+ {
+ for(String key : intent.getExtras().keySet())
+ {
+// Miscellaneous.logEvent("i", "Broadcast extra", "Broadcast " + intent.getAction() + " has extra " + key + " and type " + intent.getExtras().get(key).getClass().getName(), 4);
+ Object ob = intent.getExtras().get(key);
+
+ String target = null;
+
+ if(Build.VERSION.SDK_INT >= 26)
+ target = "tetherArray";
+ else
+ target = "activeArray";
+
+ if(key.equals(target) && ob instanceof ArrayList)
+ {
+ if(((ArrayList)ob).size() > 0)
+ tetheringActive = true;
+ else
+ tetheringActive = false;
+ }
+
+// Miscellaneous.logEvent("i", "Broadcast extra", "Broadcast " + intent.getAction() + " has extra " + key + " and type " + intent.getExtras().get(key).getClass().getName(), 4);
+ }
+
+ ArrayList ruleCandidates = Rule.findRuleCandidates(Trigger.Trigger_Enum.tethering);
+ for(int i=0; i
diff --git a/app/src/main/res/layout/activity_manage_trigger_tethering.xml b/app/src/main/res/layout/activity_manage_trigger_tethering.xml
new file mode 100644
index 0000000..24d6413
--- /dev/null
+++ b/app/src/main/res/layout/activity_manage_trigger_tethering.xml
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/main_overview_layout.xml b/app/src/main/res/layout/main_overview_layout.xml
index 038f010..32129c9 100644
--- a/app/src/main/res/layout/main_overview_layout.xml
+++ b/app/src/main/res/layout/main_overview_layout.xml
@@ -339,12 +339,6 @@
android:layout_marginTop="30dp"
android:gravity="center_horizontal" >
-
-
Um eine unnötige Abnutzung Ihres Speichers zu vermeiden, werden Protokolle standardmäßig nicht gespeichert. Wenn Sie also ein Problem haben, aktivieren Sie bitte zuerst die Anmeldeeinstellungen und setzen Sie den Protokollpegel auf 5. Reproduzieren Sie dann das Problem. Erst dann können Protokolle angehängt werden.enthält nicht
+ Pfad
+ Programm/Script ausführen
+ Parameter
+ Datei auswählen
+ Als root ausführen
+ Wählen Sie eine gültige ausführbare Datei aus.
+ Diese Datei ist nicht ausführbar.
+ als root
+ Tethering ist aktiv
+ Tethering ist nicht aktiv
+ Tethering Status
+ Während der Flugmodus aktiv ist, kann WLAN nur von Anwendungen ein- oder ausgeschaltet werden, wenn root-Rechte dafür verwendet werden.
+ Anwendungen, die auf Android Q oder höher ausgerichtet sind, können WLAN nicht mehr ein- oder ausschalten. Daran ist Google schuld, nicht ich.\n\nSie können diese Einschränkung umgehen, indem Sie Ihr Gerät rooten und die Checkbox unten aktivieren. Alternativ laden Sie sich diese Anwendung von F-Droid oder meiner Webseite herunter. In diesen Versionen bin ich nicht gezwungen, die Anwendungen auf die neuesten API Level zu unterstützen.
+ Sie können ein Script oder eine andere ausführbare Datei auswählen, die dann als Aktion ausgeführt wird.\n\nAllerdings gibt es ein paar Voraussetzungen, um die Sie sich selbst kümmern müssen. Google hat es sehr schwer gemacht, irgendetwas außer normalen Android Anwendungen auszuführen.\n\n1.\nDie Datei muß im Dateisystem als ausführbar markiert sein. Auf einem normalen Android-System (ohne Root) ist das in der Tat der schwierigste Teil.\n\n2.\nDas bedeutet auch, daß auch Automation in der Lage sein muß, die Datei auszuführen, nicht nur der Besitzer oder die Gruppe.\n\n3.\nWenn es ein Script ist, muß eine gültige Shell im Header des Scripts definiert sein.
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index c933d91..f3de464 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -831,4 +831,7 @@
While airplane mode is activated, wifi can only be toggled from applications when using root permissions for that.using rootYou can select a script or an executable file here that will be executed as an action.\n\nBut there are some prerequisites which you have to deal with on your own. Google has made it very hard to run anything other than regular Android applications.\n\n1.\nThe file must be marked as executable in the file system. On a regular Android system (without root) this is actually the hard part.\n\n2.\nThat also means Automation must be able to execute the file, not just the owner or the group.\n\n3.\nIf it is a script, a valid shell be specified in the script\'s header.
+ tethering is active
+ tethering is not active
+ Tethering state
\ No newline at end of file