proximity trigger

This commit is contained in:
2025-11-02 23:56:58 +01:00
parent 3497d7b8ea
commit ca88fbfb07
7 changed files with 112 additions and 169 deletions

View File

@@ -70,6 +70,7 @@
<uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" /> <uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.hardware.sensor.proximity"/>
<uses-permission android:name="android.permission.READ_CALL_LOG" /> <uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.READ_CALENDAR" /> <uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission <uses-permission

View File

@@ -68,6 +68,7 @@
<uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" /> <uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.hardware.sensor.proximity"/>
<uses-permission android:name="android.permission.READ_CALL_LOG" /> <uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.READ_CALENDAR" /> <uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission <uses-permission

View File

@@ -66,6 +66,7 @@
<uses-permission android:name="com.wireguard.android.permission.CONTROL_TUNNELS"/> <uses-permission android:name="com.wireguard.android.permission.CONTROL_TUNNELS"/>
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/> <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.hardware.sensor.proximity"/>
<uses-permission <uses-permission
android:name="android.permission.WRITE_SECURE_SETTINGS" android:name="android.permission.WRITE_SECURE_SETTINGS"
tools:ignore="ProtectedPermissions" /> tools:ignore="ProtectedPermissions" />

View File

@@ -147,6 +147,8 @@ public class ActivityManageRule extends Activity
final static int requestCodeTriggerCalendarEventEdit = 834; final static int requestCodeTriggerCalendarEventEdit = 834;
final static int requestCodeTriggerChargingAdd = 835; final static int requestCodeTriggerChargingAdd = 835;
final static int requestCodeTriggerChargingEdit = 836; final static int requestCodeTriggerChargingEdit = 836;
final static int requestCodeTriggerProximityAdd = 837;
final static int requestCodeTriggerProximityEdit = 838;
public static ActivityManageRule getInstance() public static ActivityManageRule getInstance()
{ {
@@ -365,6 +367,12 @@ public class ActivityManageRule extends Activity
chargingStateEditor.putExtra(intentNameTriggerParameter2, selectedTrigger.getTriggerParameter2()); chargingStateEditor.putExtra(intentNameTriggerParameter2, selectedTrigger.getTriggerParameter2());
startActivityForResult(chargingStateEditor, requestCodeTriggerChargingEdit); startActivityForResult(chargingStateEditor, requestCodeTriggerChargingEdit);
break; break;
case proximity:
Intent proximityEditor = new Intent(ActivityManageRule.this, ActivityManageTriggerProximity.class);
proximityEditor.putExtra(intentNameTriggerParameter1, selectedTrigger.getTriggerParameter());
proximityEditor.putExtra(intentNameTriggerParameter2, selectedTrigger.getTriggerParameter2());
startActivityForResult(proximityEditor, requestCodeTriggerProximityEdit);
break;
default: default:
break; break;
} }
@@ -727,6 +735,13 @@ public class ActivityManageRule extends Activity
startActivityForResult(triggerChargingIntent, requestCodeTriggerChargingAdd); startActivityForResult(triggerChargingIntent, requestCodeTriggerChargingAdd);
return; return;
} }
else if(triggerType == Trigger_Enum.proximity)
{
newTrigger.setTriggerType(Trigger_Enum.proximity);
Intent triggerProximityIntent = new Intent(myContext, ActivityManageTriggerProximity.class);
startActivityForResult(triggerProximityIntent, requestCodeTriggerProximityAdd);
return;
}
else if(triggerType == Trigger_Enum.musicPlaying) else if(triggerType == Trigger_Enum.musicPlaying)
booleanChoices = new String[]{getResources().getString(R.string.started), getResources().getString(R.string.stopped)}; booleanChoices = new String[]{getResources().getString(R.string.started), getResources().getString(R.string.stopped)};
else if(triggerType == Trigger_Enum.usb_host_connection) else if(triggerType == Trigger_Enum.usb_host_connection)
@@ -1488,19 +1503,43 @@ public class ActivityManageRule extends Activity
this.refreshTriggerList(); this.refreshTriggerList();
} }
} }
else if(requestCode == requestCodeTriggerProximityAdd)
{
if(resultCode == RESULT_OK)
{
newTrigger.setTriggerParameter(data.getBooleanExtra(ActivityManageRule.intentNameTriggerParameter1, false));
newTrigger.setTriggerParameter2(data.getStringExtra(ActivityManageRule.intentNameTriggerParameter2));
newTrigger.setParentRule(ruleToEdit);
ruleToEdit.getTriggerSet().add(newTrigger);
this.refreshTriggerList();
}
}
else if(requestCode == requestCodeTriggerChargingEdit) else if(requestCode == requestCodeTriggerChargingEdit)
{ {
if(resultCode == RESULT_OK) if(resultCode == RESULT_OK)
{ {
Trigger responseTimeFrame = new Trigger(); Trigger chargingStateTrigger = new Trigger();
responseTimeFrame.setTriggerType(Trigger_Enum.charging); chargingStateTrigger.setTriggerType(Trigger_Enum.charging);
responseTimeFrame.setTriggerParameter(data.getBooleanExtra(intentNameTriggerParameter1, true)); chargingStateTrigger.setTriggerParameter(data.getBooleanExtra(intentNameTriggerParameter1, true));
responseTimeFrame.setTriggerParameter2(data.getStringExtra(intentNameTriggerParameter2)); chargingStateTrigger.setTriggerParameter2(data.getStringExtra(intentNameTriggerParameter2));
responseTimeFrame.setParentRule(ruleToEdit); chargingStateTrigger.setParentRule(ruleToEdit);
ruleToEdit.getTriggerSet().set(editIndex, responseTimeFrame); ruleToEdit.getTriggerSet().set(editIndex, chargingStateTrigger);
this.refreshTriggerList(); this.refreshTriggerList();
} }
} }
else if(requestCode == requestCodeTriggerProximityEdit)
{
if(resultCode == RESULT_OK)
{
Trigger proximityTrigger = new Trigger();
proximityTrigger.setTriggerType(Trigger_Enum.proximity);
proximityTrigger.setTriggerParameter(data.getBooleanExtra(intentNameTriggerParameter1, true));
proximityTrigger.setTriggerParameter2(data.getStringExtra(intentNameTriggerParameter2));
proximityTrigger.setParentRule(ruleToEdit);
ruleToEdit.getTriggerSet().set(editIndex, proximityTrigger);
this.refreshTriggerList();
}
}
else if(requestCode == requestCodeActionStartActivityAdd) else if(requestCode == requestCodeActionStartActivityAdd)
{ {
// manage start of other activity // manage start of other activity

View File

@@ -7,6 +7,10 @@ import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.net.wifi.ScanResult; import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
@@ -31,6 +35,8 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat; import androidx.core.app.ActivityCompat;
import com.google.android.material.slider.RangeSlider;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@@ -39,7 +45,11 @@ public class ActivityManageTriggerProximity extends Activity
{ {
TextView tvTriggerProximityHint; TextView tvTriggerProximityHint;
Button bTriggerProximitySave; Button bTriggerProximitySave;
SeekBar sbProximity, sbProximityTest; RangeSlider rsProximity;
SeekBar sbProximityTest;
SensorManager sensorManager;
Sensor proximitySensor;
@Override @Override
protected void onCreate(@Nullable Bundle savedInstanceState) protected void onCreate(@Nullable Bundle savedInstanceState)
@@ -49,7 +59,7 @@ public class ActivityManageTriggerProximity extends Activity
Miscellaneous.setUiTheme(this); Miscellaneous.setUiTheme(this);
setContentView(R.layout.activity_manage_trigger_proximity); setContentView(R.layout.activity_manage_trigger_proximity);
sbProximity = (SeekBar) findViewById(R.id.sbProximity); rsProximity = (RangeSlider) findViewById(R.id.rsProximity);
sbProximityTest = (SeekBar) findViewById(R.id.sbProximityTest); sbProximityTest = (SeekBar) findViewById(R.id.sbProximityTest);
tvTriggerProximityHint = (TextView) findViewById(R.id.tvTriggerProximityHint); tvTriggerProximityHint = (TextView) findViewById(R.id.tvTriggerProximityHint);
bTriggerProximitySave = (Button) findViewById(R.id.bTriggerProximitySave); bTriggerProximitySave = (Button) findViewById(R.id.bTriggerProximitySave);
@@ -63,157 +73,64 @@ public class ActivityManageTriggerProximity extends Activity
public void onClick(View v) public void onClick(View v)
{ {
Intent response = new Intent(); Intent response = new Intent();
response.putExtra("wifiState", rbTriggerWifiConnected.isChecked()); // response.putExtra("wifiState", rbTriggerWifiConnected.isChecked());
response.putExtra("wifiName", etTriggerWifiName.getText().toString()); // response.putExtra("wifiName", etTriggerWifiName.getText().toString());
setResult(RESULT_OK, response); setResult(RESULT_OK, response);
finish(); finish();
} }
}); });
spinnerWifiList.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
{
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
{
etTriggerWifiName.setText(wifiList.get(position));
if(etTriggerWifiName.getText().toString().length() > 0 && rbTriggerWifiDisconnected.isChecked())
tvWifiTriggerDisconnectionHint.setVisibility(View.VISIBLE);
else
tvWifiTriggerDisconnectionHint.setVisibility(View.GONE);
}
@Override
public void onNothingSelected(AdapterView<?> parent)
{
}
});
bLoadWifiList.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
loadWifis();
}
});
rbTriggerWifiDisconnected.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b)
{
if(etTriggerWifiName.getText().toString().length() > 0 && b)
tvWifiTriggerDisconnectionHint.setVisibility(View.VISIBLE);
else
tvWifiTriggerDisconnectionHint.setVisibility(View.GONE);
}
});
etTriggerWifiName.addTextChangedListener(new TextWatcher()
{
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2)
{
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2)
{
if(etTriggerWifiName.getText().toString().length() > 0 && rbTriggerWifiDisconnected.isChecked())
tvWifiTriggerDisconnectionHint.setVisibility(View.VISIBLE);
else
tvWifiTriggerDisconnectionHint.setVisibility(View.GONE);
}
@Override
public void afterTextChanged(Editable editable)
{
}
});
} }
public void loadWifis() void startPreview()
{ {
if(!ActivityPermissions.havePermission(Manifest.permission.ACCESS_FINE_LOCATION, ActivityManageTriggerProximity.this)) sensorManager = (SensorManager) 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)
{ {
AlertDialog dialog = Miscellaneous.messageBox(getResources().getString(R.string.permissionsTitle), getResources().getString(R.string.needLocationPermForWifiList), ActivityManageTriggerProximity.this); tvTriggerProximityHint.setVisibility(View.VISIBLE);
dialog.setOnDismissListener(new DialogInterface.OnDismissListener() finish();
}
else
{
// registering our sensor with sensor manager.
sensorManager.registerListener(proximitySensorEventListener, proximitySensor, SensorManager.SENSOR_DELAY_NORMAL);
}
}
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)
{ {
@Override sbProximityTest.setProgress((int)sensorEvent.values[0] * 100);
public void onDismiss(DialogInterface dialog)
if (sensorEvent.values[0] == 0)
{ {
ActivityCompat.requestPermissions(ActivityManageTriggerProximity.this, new String[] { Manifest.permission.ACCESS_FINE_LOCATION }, requestCodeLocationPermission); // here we are setting our status to our textview..
// if sensor event return 0 then object is closed
// to sensor else object is away from sensor.
// sensorStatusTV.setText("Near");
} }
}); else
dialog.show(); {
// sensorStatusTV.setText("Away");
}
}
} }
else
@Override
public void onAccuracyChanged(Sensor sensor, int i)
{ {
reallyLoadWifiList();
} }
} };;;
void reallyLoadWifiList()
{
if(Build.VERSION.SDK_INT >= 30)
{
Miscellaneous.messageBox(getResources().getString(R.string.hint), getResources().getString(R.string.wifiApi30), ActivityManageTriggerProximity.this).show();
loadListOfVisibleWifis();
}
else
{
WifiManager myWifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
for (WifiConfiguration wifi : myWifiManager.getConfiguredNetworks())
wifiList.add(wifi.SSID.replaceAll("\"+$", "").replaceAll("^\"+", ""));
}
if (wifiList.size() > 0)
{
spinnerWifiList.setEnabled(true);
Collections.sort(wifiList);
}
else
{
spinnerWifiList.setEnabled(false);
Toast.makeText(ActivityManageTriggerProximity.this, getResources().getString(R.string.noKnownWifis), Toast.LENGTH_SHORT).show();
}
wifiSpinnerAdapter.notifyDataSetChanged();
}
void loadListOfVisibleWifis()
{
List<ScanResult> results = null;
try
{
WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);
results = wifiManager.getScanResults();
for (ScanResult wifi : results)
wifiList.add(wifi.SSID.replaceAll("\"+$", "").replaceAll("^\"+", ""));
}
catch(Exception e)
{
Miscellaneous.logEvent("e", "loadListOfVisibleWifis()", Log.getStackTraceString(e), 1);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
{
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode)
{
case requestCodeLocationPermission:
if(grantResults[0] == PackageManager.PERMISSION_GRANTED)
reallyLoadWifiList();
break;
}
}
} }

View File

@@ -67,6 +67,7 @@ public class Trigger
tethering, tethering,
subSystemState, subSystemState,
checkVariable, checkVariable,
proximity,
calendarEvent, calendarEvent,
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
@@ -128,6 +129,8 @@ public class Trigger
return context.getResources().getString(R.string.subSystemState); return context.getResources().getString(R.string.subSystemState);
case checkVariable: case checkVariable:
return context.getResources().getString(R.string.checkVariable); return context.getResources().getString(R.string.checkVariable);
case proximity:
return context.getResources().getString(R.string.proximity);
case calendarEvent: case calendarEvent:
return context.getResources().getString(R.string.calendarEventCapital); return context.getResources().getString(R.string.calendarEventCapital);
default: default:

View File

@@ -26,31 +26,12 @@
android:paddingRight="@dimen/default_margin" android:paddingRight="@dimen/default_margin"
android:text="@string/state"/> android:text="@string/state"/>
<RadioGroup <com.google.android.material.slider.RangeSlider
android:layout_height="wrap_content" android:id="@+id/rsProximity"
android:layout_width="match_parent">
<SeekBar
android:id="@+id/sbProximity"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:max="100" /> android:max="100" />
</RadioGroup>
</TableRow>
<TableRow>
<TextView
android:id="@+id/tvWifiTriggerNameLocationNotice"
android:layout_span="2"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:textColor="@color/red"
android:text="@string/locationRequiredToDetermineWifiName"
android:layout_marginVertical="@dimen/default_margin"
android:visibility="gone" />
</TableRow> </TableRow>
</TableLayout> </TableLayout>