Compare commits

..
Author SHA1 Message Date
jens 2cb4a2f1d3 Deactivated unnecessary reading operations 2026-07-15 18:32:04 +02:00
jens 7a9e03ed4d Removed redundant space character in notification 2026-06-11 16:51:57 +02:00
7 changed files with 66 additions and 144 deletions
-2
View File
@@ -80,8 +80,6 @@
<uses-permission android:name="android.permission.USE_EXACT_ALARM" />-->
<uses-permission android:name="com.termux.permission.RUN_COMMAND" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
<uses-feature
android:name="android.hardware.telephony"
-2
View File
@@ -78,8 +78,6 @@
<uses-permission android:name="android.permission.USE_EXACT_ALARM" />-->
<uses-permission android:name="com.termux.permission.RUN_COMMAND" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
<uses-feature
android:name="android.hardware.telephony"
@@ -75,8 +75,6 @@
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="com.termux.permission.RUN_COMMAND" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
<application
android:allowBackup="true"
@@ -90,7 +90,6 @@ public class Actions
public static final String wireguard_tunnel_up = "com.wireguard.android.action.SET_TUNNEL_UP";
public static final String wireguard_tunnel_down = "com.wireguard.android.action.SET_TUNNEL_DOWN";
public static final String wireguard_tunnel_refresh = "com.wireguard.android.action.REFRESH_TUNNEL_STATES";
public static final String alarm_set = "android.intent.action.SET_TIMER";
public static void createNotification(Action action)
{
@@ -734,15 +734,12 @@ public class ActivityPermissions extends Activity
action.getParameter2().contains(Actions.wireguard_tunnel_refresh)
)
addToArrayListUnique(ActivityPermissions.permissionNameWireguard, requiredPermissions);
if(Miscellaneous.getTargetSDK(Miscellaneous.getAnyContext()) >= 34)
{
if(action.getParameter2().contains(Actions.alarm_set))
{
addToArrayListUnique(Manifest.permission.SET_ALARM, requiredPermissions);
addToArrayListUnique(Manifest.permission.USE_FULL_SCREEN_INTENT, requiredPermissions);
}
}
// if(
// action.getParameter2().contains("eu.faircode.netguard.START_PORT_FORWARD")
// ||
// action.getParameter2().contains("eu.faircode.netguard.STOP_PORT_FORWARD")
// )
// addToArrayListUnique("net.kollnig.missioncontrol.permission.ADMIN", requiredPermissions);
if(Build.VERSION.SDK_INT >= 29)
{
String[] parts;
@@ -826,7 +823,7 @@ public class ActivityPermissions extends Activity
return requiredPermissions;
}
protected ArrayList<String> getRulesAsStringUsing(Trigger.Trigger_Enum triggerType)
protected ArrayList<String> getRulesUsing(Trigger.Trigger_Enum triggerType)
{
ArrayList<String> returnList = new ArrayList<>();
@@ -845,7 +842,7 @@ public class ActivityPermissions extends Activity
return returnList;
}
protected ArrayList<String> getRulesAsStringUsing(Action.Action_Enum actionType)
protected ArrayList<String> getRulesUsing(Action.Action_Enum actionType)
{
ArrayList<String> returnList = new ArrayList<>();
@@ -864,44 +861,6 @@ public class ActivityPermissions extends Activity
return returnList;
}
protected ArrayList<Rule> getRulesUsing(Trigger.Trigger_Enum triggerType)
{
ArrayList<Rule> returnList = new ArrayList<>();
for (Rule rule : Rule.getRuleCollection())
{
if (rule.isRuleActive())
{
for (Trigger trigger : rule.getTriggerSet())
{
if(trigger.getTriggerType().equals(triggerType))
returnList.add(rule);
}
}
}
return returnList;
}
protected ArrayList<Rule> getRulesUsing(Action.Action_Enum actionType)
{
ArrayList<Rule> returnList = new ArrayList<>();
for (Rule rule : Rule.getRuleCollection())
{
if (rule.isRuleActive())
{
for (Action action : rule.getActionSet())
{
if(action.getAction().equals(actionType))
returnList.add(rule);
}
}
}
return returnList;
}
public ArrayList<String> getReasonForPermission(String permission)
{
ArrayList<String> usingElements = new ArrayList<String>();
@@ -918,139 +877,139 @@ public class ActivityPermissions extends Activity
usingElements.add(getResources().getString(R.string.storeSettings));
break;
case Manifest.permission.SCHEDULE_EXACT_ALARM:
for(String ruleName : getRulesAsStringUsing(Trigger.Trigger_Enum.timeFrame))
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.timeFrame))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesAsStringUsing(Trigger.Trigger_Enum.calendarEvent))
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.calendarEvent))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break;
case Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE:
for(String ruleName : getRulesAsStringUsing(Trigger.Trigger_Enum.notification))
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.notification))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesAsStringUsing(Action.Action_Enum.closeNotification))
for(String ruleName : getRulesUsing(Action.Action_Enum.closeNotification))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break;
case permissionNameGoogleActivityDetection:
case Manifest.permission.ACTIVITY_RECOGNITION:
for(String ruleName : getRulesAsStringUsing(Trigger.Trigger_Enum.activityDetection))
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.activityDetection))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break;
case Manifest.permission.ACCESS_COARSE_LOCATION:
case Manifest.permission.ACCESS_FINE_LOCATION:
usingElements.add(getResources().getString(R.string.manageLocations));
for(String ruleName : getRulesAsStringUsing(Trigger.Trigger_Enum.pointOfInterest))
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.pointOfInterest))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesAsStringUsing(Trigger.Trigger_Enum.speed))
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.speed))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break;
case Manifest.permission.ACCESS_BACKGROUND_LOCATION:
usingElements.add(getResources().getString(R.string.googleLocationChicanery));
usingElements.add(getResources().getString(R.string.wifiMonitoringAlsoRequiresThis));
for(String ruleName : getRulesAsStringUsing(Trigger.Trigger_Enum.pointOfInterest))
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.pointOfInterest))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesAsStringUsing(Trigger.Trigger_Enum.speed))
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.speed))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break;
case Manifest.permission.ACCESS_NETWORK_STATE:
for(String ruleName : getRulesAsStringUsing(Trigger.Trigger_Enum.airplaneMode))
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.airplaneMode))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesAsStringUsing(Trigger.Trigger_Enum.bluetoothConnection))
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.bluetoothConnection))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesAsStringUsing(Trigger.Trigger_Enum.pointOfInterest))
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.pointOfInterest))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesAsStringUsing(Trigger.Trigger_Enum.roaming))
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.roaming))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesAsStringUsing(Trigger.Trigger_Enum.speed))
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.speed))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesAsStringUsing(Trigger.Trigger_Enum.wifiConnection))
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.wifiConnection))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesAsStringUsing(Action.Action_Enum.setAirplaneMode))
for(String ruleName : getRulesUsing(Action.Action_Enum.setAirplaneMode))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesAsStringUsing(Action.Action_Enum.setBluetooth))
for(String ruleName : getRulesUsing(Action.Action_Enum.setBluetooth))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesAsStringUsing(Action.Action_Enum.setDataConnection))
for(String ruleName : getRulesUsing(Action.Action_Enum.setDataConnection))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesAsStringUsing(Action.Action_Enum.setWifi))
for(String ruleName : getRulesUsing(Action.Action_Enum.setWifi))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesAsStringUsing(Action.Action_Enum.setWifiTethering))
for(String ruleName : getRulesUsing(Action.Action_Enum.setWifiTethering))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break;
case Manifest.permission.ACCESS_WIFI_STATE:
for(String ruleName : getRulesAsStringUsing(Trigger.Trigger_Enum.pointOfInterest))
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.pointOfInterest))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesAsStringUsing(Trigger.Trigger_Enum.wifiConnection))
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.wifiConnection))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break;
case Manifest.permission.BLUETOOTH_ADMIN:
case Manifest.permission.BLUETOOTH:
case Manifest.permission.BLUETOOTH_CONNECT:
for(String ruleName : getRulesAsStringUsing(Trigger.Trigger_Enum.bluetoothConnection))
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.bluetoothConnection))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesAsStringUsing(Action.Action_Enum.setBluetooth))
for(String ruleName : getRulesUsing(Action.Action_Enum.setBluetooth))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break;
case Manifest.permission.GET_TASKS:
for(String ruleName : getRulesAsStringUsing(Trigger.Trigger_Enum.process_started_stopped))
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.process_started_stopped))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break;
case Manifest.permission.INTERNET:
for(String ruleName : getRulesAsStringUsing(Trigger.Trigger_Enum.pointOfInterest))
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.pointOfInterest))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesAsStringUsing(Trigger.Trigger_Enum.speed))
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.speed))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesAsStringUsing(Action.Action_Enum.triggerUrl))
for(String ruleName : getRulesUsing(Action.Action_Enum.triggerUrl))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break;
case Manifest.permission.NFC:
for(String ruleName : getRulesAsStringUsing(Trigger.Trigger_Enum.nfcTag))
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.nfcTag))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break;
case Manifest.permission.PROCESS_OUTGOING_CALLS:
case Manifest.permission.READ_CALL_LOG:
for(String ruleName : getRulesAsStringUsing(Trigger.Trigger_Enum.phoneCall))
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.phoneCall))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break;
case Manifest.permission.READ_PHONE_STATE:
for(String ruleName : getRulesAsStringUsing(Trigger.Trigger_Enum.batteryLevel))
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.batteryLevel))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesAsStringUsing(Trigger.Trigger_Enum.charging))
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.charging))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesAsStringUsing(Trigger.Trigger_Enum.headsetPlugged))
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.headsetPlugged))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesAsStringUsing(Trigger.Trigger_Enum.phoneCall))
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.phoneCall))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesAsStringUsing(Trigger.Trigger_Enum.usb_host_connection))
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.usb_host_connection))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break;
case Manifest.permission.RECORD_AUDIO:
for(String ruleName : getRulesAsStringUsing(Trigger.Trigger_Enum.noiseLevel))
for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.noiseLevel))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break;
case Manifest.permission.SEND_SMS:
for(String ruleName : getRulesAsStringUsing(Action.Action_Enum.sendTextMessage))
for(String ruleName : getRulesUsing(Action.Action_Enum.sendTextMessage))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break;
case Manifest.permission.CALL_PHONE:
for(String ruleName : getRulesAsStringUsing(Action.Action_Enum.startPhoneCall))
for(String ruleName : getRulesUsing(Action.Action_Enum.startPhoneCall))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break;
case Manifest.permission.SYSTEM_ALERT_WINDOW:
for(String ruleName : getRulesAsStringUsing(Action.Action_Enum.startOtherActivity))
for(String ruleName : getRulesUsing(Action.Action_Enum.startOtherActivity))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesAsStringUsing(Action.Action_Enum.startPhoneCall))
for(String ruleName : getRulesUsing(Action.Action_Enum.startPhoneCall))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break;
case Manifest.permission.ANSWER_PHONE_CALLS:
for(String ruleName : getRulesAsStringUsing(Action.Action_Enum.stopPhoneCall))
for(String ruleName : getRulesUsing(Action.Action_Enum.stopPhoneCall))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break;
case Manifest.permission.FOREGROUND_SERVICE:
usingElements.add(getResources().getString(R.string.startAutomationAsService));
break;
case Manifest.permission.READ_EXTERNAL_STORAGE:
for(String ruleName : getRulesAsStringUsing(Action.Action_Enum.playSound))
for(String ruleName : getRulesUsing(Action.Action_Enum.playSound))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesAsStringUsing(Action.Action_Enum.changeSoundProfile))
for(String ruleName : getRulesUsing(Action.Action_Enum.changeSoundProfile))
{
Rule tempRule = Rule.getByName(ruleName);
if(tempRule != null)
@@ -1077,7 +1036,7 @@ public class ActivityPermissions extends Activity
break;
case Manifest.permission.BIND_DEVICE_ADMIN:
for(String ruleName : getRulesAsStringUsing(Action.Action_Enum.turnScreenOnOrOff))
for(String ruleName : getRulesUsing(Action.Action_Enum.turnScreenOnOrOff))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break;
case Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS:
@@ -1087,17 +1046,17 @@ public class ActivityPermissions extends Activity
usingElements.add(getResources().getString(R.string.queryAllPackages));
break;
case Manifest.permission.BIND_ACCESSIBILITY_SERVICE:
for(String ruleName : getRulesAsStringUsing(Action.Action_Enum.takeScreenshot))
for(String ruleName : getRulesUsing(Action.Action_Enum.takeScreenshot))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break;
case Manifest.permission.WRITE_SECURE_SETTINGS:
for(String ruleName : getRulesAsStringUsing(Action.Action_Enum.setLocationService))
for(String ruleName : getRulesUsing(Action.Action_Enum.setLocationService))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
for(String ruleName : getRulesAsStringUsing(Action.Action_Enum.setSystemSetting))
for(String ruleName : getRulesUsing(Action.Action_Enum.setSystemSetting))
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
break;
case Manifest.permission.READ_CALENDAR:
for(String ruleName : getRulesAsStringUsing(Trigger.Trigger_Enum.calendarEvent))
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.
@@ -1105,40 +1064,6 @@ public class ActivityPermissions extends Activity
// for(String ruleName : getRulesUsing(Trigger.Trigger_Enum.proximity))
// usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), ruleName));
// break;
case Manifest.permission.SET_ALARM:
if(Miscellaneous.getTargetSDK(Miscellaneous.getAnyContext()) >= 34)
{
outerLoop:
for (Rule rule : getRulesUsing(Action.Action_Enum.startOtherActivity))
{
for(Action action : rule.getActionSet())
{
if(action.getParameter2().contains(Actions.alarm_set))
{
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), rule.getName()));
continue outerLoop;
}
}
}
}
break;
case Manifest.permission.USE_FULL_SCREEN_INTENT:
if(Miscellaneous.getTargetSDK(Miscellaneous.getAnyContext()) >= 34)
{
outerLoop:
for (Rule rule : getRulesUsing(Action.Action_Enum.startOtherActivity))
{
for(Action action : rule.getActionSet())
{
if(action.getParameter2().contains(Actions.alarm_set))
{
usingElements.add(String.format(getResources().getString(R.string.ruleXrequiresThis), rule.getName()));
continue outerLoop;
}
}
}
}
break;
}
return usingElements;
@@ -277,7 +277,7 @@ public class AutomationService extends Service implements OnInitListener
/*
On normal phones the app is supposed to automatically restart in case of any problems.
In the emulator we want it to stop to be able to better pinpoint the root cause.
In the emulator we want it to stop to be able to better pinpoint the root cause of sudden stops.
*/
if(Miscellaneous.isAndroidEmulator())
return START_NOT_STICKY;
@@ -672,7 +672,11 @@ public class AutomationService extends Service implements OnInitListener
lastRuleString = instance.getResources().getString(R.string.lastRule) + " n./a.";
}
String textToDisplay = bodyText + " " + lastRuleString;
String textToDisplay;
if(bodyText.length() > 0)
textToDisplay = bodyText + " " + lastRuleString;
else
textToDisplay = lastRuleString;
if(notificationBuilder == null)
notificationBuilder = createServiceNotificationBuilder();
@@ -730,7 +730,7 @@ public class Trigger
public boolean checkCalendarEvent(CalendarReceiver.CalendarEvent event, boolean ignoreActive)
{
String[] conditions = this.getTriggerParameter2().split(Trigger.triggerParameter2Split);
List<CalendarReceiver.CalendarEvent> calendarEvents = CalendarReceiver.readCalendarEvents(AutomationService.getInstance(), true,false);
// List<CalendarReceiver.CalendarEvent> calendarEvents = CalendarReceiver.readCalendarEvents(AutomationService.getInstance(), true,false);
/*
0 = titleDir
@@ -747,8 +747,8 @@ public class Trigger
11 = calendars list
*/
boolean isActive = getTriggerParameter();
if (!ignoreActive && isActive != event.isCurrentlyActive())
boolean shouldBeActive = getTriggerParameter();
if (!ignoreActive && shouldBeActive != event.isCurrentlyActive())
{
Miscellaneous.logEvent("i", "CalendarCheck", "Event " + event.title + " has to be currently active: " + String.valueOf(triggerParameter) + ", but is required otherwise.", 5);
return false;
@@ -1243,7 +1243,7 @@ public class Trigger
/*
There is no easy event to tell when a tag has been disconnected again.
*/
if(getTriggerType().equals(Trigger_Enum.nfcTag))
if(getTriggerType().equals(Trigger_Enum.nfcTag))
return true;
if(getParentRule().getLastExecution() == null)