diff --git a/app/src/main/java/com/jens/automation2/ActivityManageRule.java b/app/src/main/java/com/jens/automation2/ActivityManageRule.java index c3e434b..1cba9ce 100644 --- a/app/src/main/java/com/jens/automation2/ActivityManageRule.java +++ b/app/src/main/java/com/jens/automation2/ActivityManageRule.java @@ -1523,7 +1523,7 @@ public class ActivityManageRule extends Activity chargingStateTrigger.setTriggerParameter(data.getBooleanExtra(intentNameTriggerParameter1, true)); chargingStateTrigger.setTriggerParameter2(data.getStringExtra(intentNameTriggerParameter2)); chargingStateTrigger.setParentRule(ruleToEdit); - ruleToEdit.getTriggerSet().set(editIndex, chargingStateTrigger); + ruleToEdit.getTriggerSet().set(editIndex, chargingStateTrigger); this.refreshTriggerList(); } } diff --git a/app/src/main/java/com/jens/automation2/ActivityManageTriggerProximity.java b/app/src/main/java/com/jens/automation2/ActivityManageTriggerProximity.java index 31f0874..2c6fd73 100644 --- a/app/src/main/java/com/jens/automation2/ActivityManageTriggerProximity.java +++ b/app/src/main/java/com/jens/automation2/ActivityManageTriggerProximity.java @@ -43,7 +43,7 @@ import java.util.List; public class ActivityManageTriggerProximity extends Activity { - TextView tvTriggerProximityHint; + TextView tvTriggerProximityHint, tvProximityCurrentValue; Button bTriggerProximitySave; RangeSlider rsProximity; SeekBar sbProximityTest; @@ -68,6 +68,7 @@ public class ActivityManageTriggerProximity extends Activity rsProximity = (RangeSlider) findViewById(R.id.rsProximity); sbProximityTest = (SeekBar) findViewById(R.id.sbProximityTest); tvTriggerProximityHint = (TextView) findViewById(R.id.tvTriggerProximityHint); + tvProximityCurrentValue = (TextView) findViewById(R.id.tvProximityCurrentValue); bTriggerProximitySave = (Button) findViewById(R.id.bTriggerProximitySave); sbProximityTest.setEnabled(false); @@ -79,14 +80,20 @@ public class ActivityManageTriggerProximity extends Activity public void onClick(View v) { Intent response = new Intent(); -// response.putExtra("wifiState", rbTriggerWifiConnected.isChecked()); -// response.putExtra("wifiName", etTriggerWifiName.getText().toString()); + + response.putExtra(ActivityManageRule.intentNameTriggerParameter2, String.valueOf(rsProximity.getValues().get(0)) + Trigger.triggerParameter2Split + String.valueOf(rsProximity.getValues().get(1))); setResult(RESULT_OK, response); finish(); } }); - rsProximity.setValues(20f, 80f); + if(getIntent().hasExtra(ActivityManageRule.intentNameTriggerParameter2)) + { + String[] values = getIntent().getStringExtra(ActivityManageRule.intentNameTriggerParameter2).split(Trigger.triggerParameter2Split); + rsProximity.setValues(Float.parseFloat(values[0]), Float.parseFloat(values[1])); + } + else + rsProximity.setValues(0f, 10f); } @Override @@ -139,7 +146,8 @@ public class ActivityManageTriggerProximity extends Activity // check if the sensor type is proximity sensor. if (sensorEvent.sensor.getType() == Sensor.TYPE_PROXIMITY) { - sbProximityTest.setProgress((int)sensorEvent.values[0] * 100); + sbProximityTest.setProgress((int)sensorEvent.values[0]); + tvProximityCurrentValue.setText((String.valueOf(sensorEvent.values[0]))); if (sensorEvent.values[0] == 0) { @@ -160,5 +168,5 @@ public class ActivityManageTriggerProximity extends Activity { } - };;; + }; } \ No newline at end of file diff --git a/app/src/main/java/com/jens/automation2/ActivityPermissions.java b/app/src/main/java/com/jens/automation2/ActivityPermissions.java index fcef240..bf36127 100644 --- a/app/src/main/java/com/jens/automation2/ActivityPermissions.java +++ b/app/src/main/java/com/jens/automation2/ActivityPermissions.java @@ -66,6 +66,7 @@ public class ActivityPermissions extends Activity public final static String permissionNameWireguard = "com.wireguard.android.permission.CONTROL_TUNNELS"; public final static String permissionNameGoogleActivityDetection = "com.google.android.gms.permission.ACTIVITY_RECOGNITION"; public final static String permissionNameSuperuser = "android.permission.ACCESS_SUPERUSER"; + public final static String permissionNameProximity = "android.hardware.sensor.proximity"; public static ActivityPermissions getInstance() { @@ -603,6 +604,10 @@ public class ActivityPermissions extends Activity if(Build.VERSION.SDK_INT >= 31 && Miscellaneous.getTargetSDK(Miscellaneous.getAnyContext()) >= 31) addToArrayListUnique(Manifest.permission.SCHEDULE_EXACT_ALARM, requiredPermissions); break; + // Proximity permission cannot be requested, but is always granted. + case proximity: +// addToArrayListUnique(ActivityPermissions.permissionNameProximity, requiredPermissions); + break; default: break; } @@ -1013,6 +1018,11 @@ public class ActivityPermissions extends Activity for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.calendarEvent)) usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName)); break; + // Proximity permission cannot be requested, but is always granted. +// case ActivityPermissions.permissionNameProximity: +// for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.proximity)) +// usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName)); +// break; } return usingElements; diff --git a/app/src/main/java/com/jens/automation2/ReceiverCoordinator.java b/app/src/main/java/com/jens/automation2/ReceiverCoordinator.java index 9afb3ac..01ac65b 100644 --- a/app/src/main/java/com/jens/automation2/ReceiverCoordinator.java +++ b/app/src/main/java/com/jens/automation2/ReceiverCoordinator.java @@ -19,6 +19,7 @@ import com.jens.automation2.receivers.MediaPlayerListener; import com.jens.automation2.receivers.NoiseListener; import com.jens.automation2.receivers.PhoneStatusListener; import com.jens.automation2.receivers.ProcessListener; +import com.jens.automation2.receivers.ProximityReceiver; import com.jens.automation2.receivers.ScreenStateReceiver; import com.jens.automation2.receivers.SubSystemStateReceiver; import com.jens.automation2.receivers.TetheringReceiver; @@ -215,6 +216,9 @@ public class ReceiverCoordinator if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.calendarEvent) && ActivityPermissions.isPermissionDeclaredInManifest(AutomationService.getInstance(), Manifest.permission.READ_CALENDAR) && ActivityPermissions.havePermission(Manifest.permission.READ_CALENDAR, AutomationService.getInstance())) CalendarReceiver.startCalendarReceiver(AutomationService.getInstance()); + + if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.proximity)) + ProximityReceiver.startProximityReceiver(AutomationService.getInstance()); } public static void stopAllReceivers() @@ -234,6 +238,7 @@ public class ReceiverCoordinator DeviceOrientationListener.getInstance().stopListener(AutomationService.getInstance()); TetheringReceiver.getInstance().stopListener(AutomationService.getInstance()); SubSystemStateReceiver.getInstance().stopListener(AutomationService.getInstance()); + ProximityReceiver.stopProximityReceiver(); try { diff --git a/app/src/main/java/com/jens/automation2/Trigger.java b/app/src/main/java/com/jens/automation2/Trigger.java index 6dd1fb5..5b58dd5 100644 --- a/app/src/main/java/com/jens/automation2/Trigger.java +++ b/app/src/main/java/com/jens/automation2/Trigger.java @@ -26,6 +26,7 @@ import com.jens.automation2.receivers.NoiseListener; import com.jens.automation2.receivers.NotificationListener; import com.jens.automation2.receivers.PhoneStatusListener; import com.jens.automation2.receivers.ProcessListener; +import com.jens.automation2.receivers.ProximityReceiver; import com.jens.automation2.receivers.ScreenStateReceiver; import com.jens.automation2.receivers.TetheringReceiver; @@ -294,6 +295,10 @@ public class Trigger if(!checkCalendarEvent(false)) result = false; break; + case proximity: + if(!checkProximity()) + result = false; + break; default: break; } @@ -828,6 +833,27 @@ public class Trigger return true; } + public boolean checkProximity() + { + try + { + float currentLevel = ProximityReceiver.getProximityLevel(); + String[] values = this.getTriggerParameter2().split(Trigger.triggerParameter2Split); + float part1 = Float.parseFloat(values[0]); + float part2 = Float.parseFloat(values[1]); + + // Are we within the defined scope? + if(part1 <= currentLevel && currentLevel <= part2) + return true; + } + catch(Exception e) + { + Miscellaneous.logEvent("e", "checkProximity()", Log.getStackTraceString(e), 1); + } + + return false; + } + boolean checkBluetooth() { Miscellaneous.logEvent("i", Miscellaneous.getAnyContext().getResources().getString(R.string.ruleCheckOf), String.format("Checking for bluetooth...", this.getParentRule().getName()), 4); @@ -1965,6 +1991,10 @@ public class Trigger returnString.append(")"); break; + case proximity: + String[] parts = triggerParameter2.split(triggerParameter2Split); + returnString.append(String.format(Miscellaneous.getAnyContext().getResources().getString(R.string.proximityText), parts[0], parts[1])); + break; default: returnString.append("error"); break; diff --git a/app/src/main/java/com/jens/automation2/receivers/BatteryReceiver.java b/app/src/main/java/com/jens/automation2/receivers/BatteryReceiver.java index 463fe6b..e168c75 100644 --- a/app/src/main/java/com/jens/automation2/receivers/BatteryReceiver.java +++ b/app/src/main/java/com/jens/automation2/receivers/BatteryReceiver.java @@ -300,7 +300,7 @@ public class BatteryReceiver extends BroadcastReceiver implements AutomationList @Override public Trigger_Enum[] getMonitoredTrigger() { - // actually monitores several + // actually monitors several return new Trigger_Enum[] { Trigger_Enum.batteryLevel, Trigger_Enum.charging, Trigger_Enum.usb_host_connection }; } } \ No newline at end of file diff --git a/app/src/main/java/com/jens/automation2/receivers/ProximityReceiver.java b/app/src/main/java/com/jens/automation2/receivers/ProximityReceiver.java new file mode 100644 index 0000000..38fbe35 --- /dev/null +++ b/app/src/main/java/com/jens/automation2/receivers/ProximityReceiver.java @@ -0,0 +1,162 @@ +package com.jens.automation2.receivers; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.hardware.Sensor; +import android.hardware.SensorEvent; +import android.hardware.SensorEventListener; +import android.hardware.SensorManager; + +import com.jens.automation2.ActivityPermissions; +import com.jens.automation2.AutomationService; +import com.jens.automation2.Miscellaneous; +import com.jens.automation2.Rule; +import com.jens.automation2.Trigger.Trigger_Enum; + +import java.util.ArrayList; + +public class ProximityReceiver implements AutomationListenerInterface +{ + public static AutomationService automationServiceRef = null; + static float proximityLevel = -1; // initialize with a better value than this + static boolean proximityReceiverActive = false; + + SensorManager sensorManager; + Sensor proximitySensor; + + static ProximityReceiver proximityReceiverInstance = null; + + public static float getProximityLevel() + { + return proximityLevel; + } + + public static void startProximityReceiver(final AutomationService automationServiceRef) + { + if(!proximityReceiverActive) + { + ProximityReceiver.automationServiceRef = automationServiceRef; + + if(proximityReceiverInstance == null) + proximityReceiverInstance = new ProximityReceiver(); + + proximityReceiverInstance.startListener(automationServiceRef); + + proximityReceiverActive = true; + } + } + public static void stopProximityReceiver() + { + if(proximityReceiverActive) + { + if(proximityReceiverInstance != null) + { + proximityReceiverInstance = null; + } + + proximityReceiverActive = false; + } + } + + @Override + public void startListener(AutomationService automationService) + { + if(!proximityReceiverActive) + { + ProximityReceiver.automationServiceRef = automationServiceRef; + + sensorManager = (SensorManager) automationService.getSystemService(Context.SENSOR_SERVICE); + + // from sensor service we are + // calling proximity sensor + proximitySensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); + + // handling the case if the proximity + // sensor is not present in users device. + if (proximitySensor == null) + { + Miscellaneous.logEvent("w", "No proximity sensor", "Device doesn\'t seem to have a proximity sensor.", 4); + } + else + { + // registering our sensor with sensor manager. + sensorManager.registerListener(proximitySensorEventListener, proximitySensor, SensorManager.SENSOR_DELAY_NORMAL); + } + + proximityReceiverActive = true; + } + } + + @Override + public void stopListener(AutomationService automationService) + { + if(proximityReceiverActive) + { + if(proximityReceiverInstance != null) + { + if(proximitySensor != null) + sensorManager.unregisterListener(proximitySensorEventListener); + + proximityReceiverInstance = null; + } + + proximityReceiverActive = false; + } + } + + SensorEventListener proximitySensorEventListener = new SensorEventListener() + { + @Override + public void onSensorChanged(SensorEvent sensorEvent) + { + // check if the sensor type is proximity sensor. + if (sensorEvent.sensor.getType() == Sensor.TYPE_PROXIMITY) + { + proximityLevel = (int)sensorEvent.values[0]; + + Miscellaneous.logEvent("i", "Proximity", String.valueOf(proximityLevel), 5); + +// if (sensorEvent.values[0] == 0) +// { +//// sensorStatusTV.setText("Near"); +// } +// else +// { +//// sensorStatusTV.setText("Away"); +// } + + ArrayList ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.proximity); + for(Rule oneRule : ruleCandidates) + { + if(oneRule.getsGreenLight(automationServiceRef)) + oneRule.activate(automationServiceRef, false); + } + } + } + + @Override + public void onAccuracyChanged(Sensor sensor, int i) + { + + } + }; + + public static boolean haveAllPermission() + { + return ActivityPermissions.havePermission(ActivityPermissions.permissionNameProximity, Miscellaneous.getAnyContext()); + } + + @Override + public boolean isListenerRunning() + { + return proximityReceiverActive; + } + @Override + public Trigger_Enum[] getMonitoredTrigger() + { + // actually monitors several + return new Trigger_Enum[] { Trigger_Enum.proximity }; + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_manage_trigger_proximity.xml b/app/src/main/res/layout/activity_manage_trigger_proximity.xml index 77f2b70..1d1613d 100644 --- a/app/src/main/res/layout/activity_manage_trigger_proximity.xml +++ b/app/src/main/res/layout/activity_manage_trigger_proximity.xml @@ -37,8 +37,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:valueFrom="0" - android:valueTo="100" - android:stepSize="1" + android:valueTo="10" + android:stepSize="0.1" android:theme="@style/AppThemeCompat" /> + +