From bb1b3b014904c37a02f9b2119ab96a09d374c40a Mon Sep 17 00:00:00 2001 From: jens Date: Sat, 4 Jun 2022 02:44:26 +0200 Subject: [PATCH] tethering detection --- app/src/apkFlavor/AndroidManifest.xml | 1 + app/src/fdroidFlavor/AndroidManifest.xml | 1 + app/src/googlePlayFlavor/AndroidManifest.xml | 1 + .../jens/automation2/ActivityMainScreen.java | 11 -- .../jens/automation2/ActivityManageRule.java | 38 +++++ .../ActivityManageTriggerTethering.java | 46 +++++++ .../jens/automation2/ReceiverCoordinator.java | 29 +++- .../java/com/jens/automation2/Trigger.java | 20 ++- .../receivers/BroadcastListener.java | 17 +-- .../receivers/TetheringReceiver.java | 130 ++++++++++++++++++ .../layout/activity_manage_action_wifi.xml | 3 + .../activity_manage_trigger_tethering.xml | 72 ++++++++++ .../main/res/layout/main_overview_layout.xml | 6 - app/src/main/res/values-de/strings.xml | 14 ++ app/src/main/res/values/strings.xml | 3 + 15 files changed, 356 insertions(+), 36 deletions(-) create mode 100644 app/src/main/java/com/jens/automation2/ActivityManageTriggerTethering.java create mode 100644 app/src/main/java/com/jens/automation2/receivers/TetheringReceiver.java create mode 100644 app/src/main/res/layout/activity_manage_trigger_tethering.xml diff --git a/app/src/apkFlavor/AndroidManifest.xml b/app/src/apkFlavor/AndroidManifest.xml index 7d22baea..5c59e0cf 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 d219b249..47a480d7 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 dd348758..8410205e 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 52a9b7b8..54f8ad4f 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 b3c353df..aa4cd1ae 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 00000000..15ad0be0 --- /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 6ba9f9a7..23a1f77e 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 ae3e0919..ba51232b 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 bec1fc7d..204a3b5d 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 00000000..7f2b8461 --- /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 00000000..24d64133 --- /dev/null +++ b/app/src/main/res/layout/activity_manage_trigger_tethering.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +