From e39a2411badb32b58394647ee802feac1c906ed0 Mon Sep 17 00:00:00 2001 From: jens Date: Sun, 22 May 2022 17:31:55 +0200 Subject: [PATCH] broadcast trigger --- app/build.gradle | 1 + app/src/apkFlavor/AndroidManifest.xml | 4 +- app/src/fdroidFlavor/AndroidManifest.xml | 4 +- app/src/googlePlayFlavor/AndroidManifest.xml | 4 +- app/src/main/AndroidManifest.xml | 2 +- .../jens/automation2/ActivityManageRule.java | 43 +- .../ActivityManageTriggerBroadcast.java | 421 ++++++++++++++++++ .../ActivityManageTriggerPhoneCall.java | 4 +- .../jens/automation2/ActivityPermissions.java | 2 +- .../jens/automation2/AutomationService.java | 2 - .../jens/automation2/ReceiverCoordinator.java | 18 + .../java/com/jens/automation2/Trigger.java | 41 +- .../receivers/BatteryReceiver.java | 84 ++-- .../receivers/BroadcastListener.java | 130 ++++++ app/src/main/res/drawable/satellite.png | Bin 0 -> 2993 bytes .../res/layout/activity_control_center.xml | 5 + .../activity_manage_trigger_broadcasts.xml | 81 ++++ app/src/main/res/values/strings.xml | 8 + build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 20 files changed, 790 insertions(+), 68 deletions(-) create mode 100644 app/src/main/java/com/jens/automation2/ActivityManageTriggerBroadcast.java create mode 100644 app/src/main/java/com/jens/automation2/receivers/BroadcastListener.java create mode 100644 app/src/main/res/drawable/satellite.png create mode 100644 app/src/main/res/layout/activity_manage_trigger_broadcasts.xml diff --git a/app/build.gradle b/app/build.gradle index b81c169..a862e2a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -57,6 +57,7 @@ android { abortOnError false checkReleaseBuilds false } + namespace 'com.jens.automation2' } dependencies { diff --git a/app/src/apkFlavor/AndroidManifest.xml b/app/src/apkFlavor/AndroidManifest.xml index 4b0687f..4756587 100644 --- a/app/src/apkFlavor/AndroidManifest.xml +++ b/app/src/apkFlavor/AndroidManifest.xml @@ -1,6 +1,5 @@ - + + diff --git a/app/src/fdroidFlavor/AndroidManifest.xml b/app/src/fdroidFlavor/AndroidManifest.xml index a3826ad..821c7fc 100644 --- a/app/src/fdroidFlavor/AndroidManifest.xml +++ b/app/src/fdroidFlavor/AndroidManifest.xml @@ -1,6 +1,5 @@ - + + diff --git a/app/src/googlePlayFlavor/AndroidManifest.xml b/app/src/googlePlayFlavor/AndroidManifest.xml index c0b847a..736f13f 100644 --- a/app/src/googlePlayFlavor/AndroidManifest.xml +++ b/app/src/googlePlayFlavor/AndroidManifest.xml @@ -1,6 +1,5 @@ - + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 952775b..b93358b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,5 +1,5 @@ - + diff --git a/app/src/main/java/com/jens/automation2/ActivityManageRule.java b/app/src/main/java/com/jens/automation2/ActivityManageRule.java index 1a45d8c..29eb736 100644 --- a/app/src/main/java/com/jens/automation2/ActivityManageRule.java +++ b/app/src/main/java/com/jens/automation2/ActivityManageRule.java @@ -119,6 +119,8 @@ public class ActivityManageRule extends Activity final static int requestCodeActionCloseNotificationEdit = 806; final static int requestCodeActionControlMediaAdd = 807; final static int requestCodeActionControlMediaEdit = 808; + final static int requestCodeTriggerBroadcastReceivedAdd = 809; + final static int requestCodeTriggerBroadcastReceivedEdit = 810; public static ActivityManageRule getInstance() { @@ -298,6 +300,12 @@ public class ActivityManageRule extends Activity devicePositionEditor.putExtra(ActivityManageTriggerDeviceOrientation.vectorFieldName, selectedTrigger.getTriggerParameter2()); startActivityForResult(devicePositionEditor, requestCodeTriggerDeviceOrientationEdit); break; + case broadcastReceived: + Intent broadcastEditor = new Intent(ActivityManageRule.this, ActivityManageTriggerBroadcast.class); + broadcastEditor.putExtra(intentNameTriggerParameter1, selectedTrigger.getTriggerParameter()); + broadcastEditor.putExtra(intentNameTriggerParameter2, selectedTrigger.getTriggerParameter2()); + startActivityForResult(broadcastEditor, requestCodeTriggerBroadcastReceivedEdit); + break; default: break; } @@ -508,6 +516,8 @@ public class ActivityManageRule extends Activity items.add(new Item(typesLong[i].toString(), R.drawable.plane)); else if(types[i].toString().equals(Trigger_Enum.roaming.toString())) items.add(new Item(typesLong[i].toString(), R.drawable.roaming)); + else if(types[i].toString().equals(Trigger_Enum.broadcastReceived.toString())) + items.add(new Item(typesLong[i].toString(), R.drawable.satellite)); else if(types[i].toString().equals(Trigger_Enum.phoneCall.toString())) { if(ActivityPermissions.isPermissionDeclaratedInManifest(ActivityManageRule.this, "android.permission.SEND_SMS")) @@ -726,6 +736,13 @@ public class ActivityManageRule extends Activity if (NfcReceiver.checkNfcRequirements(ActivityManageRule.this, true)) getTriggerParameterDialog(context, booleanChoices).show(); } + else if(triggerType == Trigger_Enum.broadcastReceived) + { + newTrigger.setTriggerType(Trigger_Enum.broadcastReceived); + Intent broadcastTriggerEditor = new Intent(myContext, ActivityManageTriggerBroadcast.class); + startActivityForResult(broadcastTriggerEditor, requestCodeTriggerBroadcastReceivedAdd); + return; + } else getTriggerParameterDialog(context, booleanChoices).show(); @@ -1359,7 +1376,7 @@ public class ActivityManageRule extends Activity { newTrigger.setParentRule(ruleToEdit); ruleToEdit.getTriggerSet().add(newTrigger); - newTrigger.setTriggerParameter2(data.getStringExtra("triggerParameter2")); + newTrigger.setTriggerParameter2(data.getStringExtra(intentNameTriggerParameter2)); this.refreshTriggerList(); } } @@ -1630,6 +1647,30 @@ public class ActivityManageRule extends Activity this.refreshTriggerList(); } } + else if(requestCode == requestCodeTriggerBroadcastReceivedAdd) + { + if(resultCode == RESULT_OK) + { + newTrigger.setTriggerParameter(data.getBooleanExtra(ActivityManageRule.intentNameTriggerParameter1, true)); + newTrigger.setTriggerParameter2(data.getStringExtra(ActivityManageRule.intentNameTriggerParameter2)); + newTrigger.setParentRule(ruleToEdit); + ruleToEdit.getTriggerSet().add(newTrigger); + this.refreshTriggerList(); + } + } + else if(requestCode == requestCodeTriggerBroadcastReceivedEdit) + { + if(resultCode == RESULT_OK) + { + Trigger editedTrigger = new Trigger(); + editedTrigger.setTriggerType(Trigger_Enum.broadcastReceived); + editedTrigger.setTriggerParameter(data.getBooleanExtra(ActivityManageRule.intentNameTriggerParameter1, true)); + editedTrigger.setTriggerParameter2(data.getStringExtra(ActivityManageRule.intentNameTriggerParameter2)); + editedTrigger.setParentRule(ruleToEdit); + ruleToEdit.getTriggerSet().set(editIndex, editedTrigger); + this.refreshTriggerList(); + } + } } protected AlertDialog getActionTypeDialog() diff --git a/app/src/main/java/com/jens/automation2/ActivityManageTriggerBroadcast.java b/app/src/main/java/com/jens/automation2/ActivityManageTriggerBroadcast.java new file mode 100644 index 0000000..eb366e1 --- /dev/null +++ b/app/src/main/java/com/jens/automation2/ActivityManageTriggerBroadcast.java @@ -0,0 +1,421 @@ +package com.jens.automation2; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.RadioButton; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.Nullable; + +import org.apache.commons.lang3.StringUtils; + +public class ActivityManageTriggerBroadcast extends Activity +{ + RadioButton rbBroadcastReceived, rbBroadcastNotReceived; + EditText etBroadcastTriggerAction; + Button bBroadcastShowSuggestions, bSaveTriggerBroadcast; + TextView tvBroadcastUrl; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_manage_trigger_broadcasts); + + bBroadcastShowSuggestions = findViewById(R.id.bBroadcastShowSuggestions); + bSaveTriggerBroadcast = findViewById(R.id.bSaveTriggerBroadcast); + etBroadcastTriggerAction = findViewById(R.id.etBroadcastTriggerAction); + rbBroadcastReceived = findViewById(R.id.rbBroadcastReceived); + rbBroadcastNotReceived = findViewById(R.id.rbBroadcastNotReceived); + tvBroadcastUrl = findViewById(R.id.tvBroadcastUrl); + + if(getIntent().hasExtra(ActivityManageRule.intentNameTriggerParameter1) && getIntent().hasExtra(ActivityManageRule.intentNameTriggerParameter2)) + { + if(getIntent().getBooleanExtra(ActivityManageRule.intentNameTriggerParameter1, true)) + rbBroadcastReceived.setChecked(true); + else + rbBroadcastNotReceived.setChecked(true); + + etBroadcastTriggerAction.setText(getIntent().getStringExtra(ActivityManageRule.intentNameTriggerParameter2)); + } + + tvBroadcastUrl.setOnClickListener(new View.OnClickListener() + { + @Override + public void onClick(View view) + { + Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(getResources().getString(R.string.broadcastListUrl))); + startActivity(browserIntent); + } + }); + + bBroadcastShowSuggestions.setOnClickListener(new View.OnClickListener() + { + @Override + public void onClick(View view) + { + AlertDialog.Builder builder = new AlertDialog.Builder(ActivityManageTriggerBroadcast.this); + builder.setTitle(getResources().getString(R.string.selectBroadcast)); + builder.setItems(broadcastSuggestions, new DialogInterface.OnClickListener() + { + @Override + public void onClick(DialogInterface dialogInterface, int which) + { + etBroadcastTriggerAction.setText(broadcastSuggestions[which]); + } + }); + builder.create().show(); + } + }); + + bSaveTriggerBroadcast.setOnClickListener(new View.OnClickListener() + { + @Override + public void onClick(View v) + { + if(etBroadcastTriggerAction.getText() != null && !StringUtils.isEmpty(etBroadcastTriggerAction.getText().toString())) + { + Intent data = new Intent(); + data.putExtra(ActivityManageRule.intentNameTriggerParameter1, rbBroadcastReceived.isChecked()); + data.putExtra(ActivityManageRule.intentNameTriggerParameter2, etBroadcastTriggerAction.getText().toString()); + ActivityManageTriggerBroadcast.this.setResult(RESULT_OK, data); + + finish(); + } + else + Toast.makeText(ActivityManageTriggerBroadcast.this, getResources().getString(R.string.enterText), Toast.LENGTH_SHORT).show(); + } + }); + } + + String[] broadcastSuggestions = { + "android.accounts.LOGIN_ACCOUNTS_CHANGED", + "android.accounts.action.ACCOUNT_REMOVED", + "android.app.action.ACTION_PASSWORD_CHANGED", + "android.app.action.ACTION_PASSWORD_EXPIRING", + "android.app.action.ACTION_PASSWORD_FAILED", + "android.app.action.ACTION_PASSWORD_SUCCEEDED", + "android.app.action.AFFILIATED_PROFILE_TRANSFER_OWNERSHIP_COMPLETE", + "android.app.action.APPLICATION_DELEGATION_SCOPES_CHANGED", + "android.app.action.APP_BLOCK_STATE_CHANGED", + "android.app.action.AUTOMATIC_ZEN_RULE_STATUS_CHANGED", + "android.app.action.BUGREPORT_FAILED", + "android.app.action.BUGREPORT_SHARE", + "android.app.action.BUGREPORT_SHARING_DECLINED", + "android.app.action.DATA_SHARING_RESTRICTION_APPLIED", + "android.app.action.DATA_SHARING_RESTRICTION_CHANGED", + "android.app.action.DEVICE_ADMIN_DISABLED", + "android.app.action.DEVICE_ADMIN_DISABLE_REQUESTED", + "android.app.action.DEVICE_ADMIN_ENABLED", + "android.app.action.DEVICE_OWNER_CHANGED", + "android.app.action.INTERRUPTION_FILTER_CHANGED", + "android.app.action.INTERRUPTION_FILTER_CHANGED_INTERNAL", + "android.app.action.LOCK_TASK_ENTERING", + "android.app.action.LOCK_TASK_EXITING", + "android.app.action.MANAGED_USER_CREATED", + "android.app.action.NETWORK_LOGS_AVAILABLE", + "android.app.action.NEXT_ALARM_CLOCK_CHANGED", + "android.app.action.NOTIFICATION_CHANNEL_BLOCK_STATE_CHANGED", + "android.app.action.NOTIFICATION_CHANNEL_GROUP_BLOCK_STATE_CHANGED", + "android.app.action.NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED", + "android.app.action.NOTIFICATION_POLICY_CHANGED", + "android.app.action.NOTIFY_PENDING_SYSTEM_UPDATE", + "android.app.action.PROFILE_OWNER_CHANGED", + "android.app.action.PROFILE_PROVISIONING_COMPLETE", + "android.app.action.SECURITY_LOGS_AVAILABLE", + "android.app.action.SYSTEM_UPDATE_POLICY_CHANGED", + "android.app.action.TRANSFER_OWNERSHIP_COMPLETE", + "android.app.action.USER_ADDED", + "android.app.action.USER_REMOVED", + "android.app.action.USER_STARTED", + "android.app.action.USER_STOPPED", + "android.app.action.USER_SWITCHED", + "android.appwidget.action.APPWIDGET_DELETED", + "android.appwidget.action.APPWIDGET_DISABLED", + "android.appwidget.action.APPWIDGET_ENABLED", + "android.appwidget.action.APPWIDGET_HOST_RESTORED", + "android.appwidget.action.APPWIDGET_RESTORED", + "android.appwidget.action.APPWIDGET_UPDATE", + "android.appwidget.action.APPWIDGET_UPDATE_OPTIONS", + "android.bluetooth.a2dp.profile.action.ACTIVE_DEVICE_CHANGED", + "android.bluetooth.a2dp.profile.action.AVRCP_CONNECTION_STATE_CHANGED", + "android.bluetooth.a2dp.profile.action.CODEC_CONFIG_CHANGED", + "android.bluetooth.a2dp.profile.action.CONNECTION_STATE_CHANGED", + "android.bluetooth.a2dp.profile.action.PLAYING_STATE_CHANGED", + "android.bluetooth.adapter.action.CONNECTION_STATE_CHANGED", + "android.bluetooth.adapter.action.DISCOVERY_FINISHED", + "android.bluetooth.adapter.action.DISCOVERY_STARTED", + "android.bluetooth.adapter.action.LOCAL_NAME_CHANGED", + "android.bluetooth.adapter.action.SCAN_MODE_CHANGED", + "android.bluetooth.adapter.action.STATE_CHANGED", + "android.bluetooth.device.action.ACL_CONNECTED", + "android.bluetooth.device.action.ACL_DISCONNECTED", + "android.bluetooth.device.action.ACL_DISCONNECT_REQUESTED", + "android.bluetooth.device.action.ALIAS_CHANGED", + "android.bluetooth.device.action.BATTERY_LEVEL_CHANGED", + "android.bluetooth.device.action.BOND_STATE_CHANGED", + "android.bluetooth.device.action.CLASS_CHANGED", + "android.bluetooth.device.action.CONNECTION_ACCESS_CANCEL", + "android.bluetooth.device.action.CONNECTION_ACCESS_REPLY", + "android.bluetooth.device.action.CONNECTION_ACCESS_REQUEST", + "android.bluetooth.device.action.FOUND", + "android.bluetooth.device.action.MAS_INSTANCE", + "android.bluetooth.device.action.NAME_CHANGED", + "android.bluetooth.device.action.NAME_FAILED", + "android.bluetooth.device.action.PAIRING_CANCEL", + "android.bluetooth.device.action.PAIRING_REQUEST", + "android.bluetooth.device.action.SDP_RECORD", + "android.bluetooth.device.action.SILENCE_MODE_CHANGED", + "android.bluetooth.device.action.UUID", + "android.bluetooth.devicepicker.action.DEVICE_SELECTED", + "android.bluetooth.devicepicker.action.LAUNCH", + "android.bluetooth.headset.action.VENDOR_SPECIFIC_HEADSET_EVENT", + "android.bluetooth.headset.profile.action.ACTIVE_DEVICE_CHANGED", + "android.bluetooth.headset.profile.action.AUDIO_STATE_CHANGED", + "android.bluetooth.headset.profile.action.CONNECTION_STATE_CHANGED", + "android.bluetooth.hearingaid.profile.action.ACTIVE_DEVICE_CHANGED", + "android.bluetooth.hearingaid.profile.action.CONNECTION_STATE_CHANGED", + "android.bluetooth.hiddevice.profile.action.CONNECTION_STATE_CHANGED", + "android.bluetooth.input.profile.action.CONNECTION_STATE_CHANGED", + "android.bluetooth.input.profile.action.HANDSHAKE", + "android.bluetooth.input.profile.action.IDLE_TIME_CHANGED", + "android.bluetooth.input.profile.action.PROTOCOL_MODE_CHANGED", + "android.bluetooth.input.profile.action.REPORT", + "android.bluetooth.input.profile.action.VIRTUAL_UNPLUG_STATUS", + "android.bluetooth.pan.profile.action.CONNECTION_STATE_CHANGED", + "android.bluetooth.pbap.profile.action.CONNECTION_STATE_CHANGED", + "android.content.pm.action.SESSION_COMMITTED", + "android.content.pm.action.SESSION_UPDATED", + "android.hardware.action.NEW_PICTURE", + "android.hardware.action.NEW_VIDEO", + "android.hardware.hdmi.action.OSD_MESSAGE", + "android.hardware.input.action.QUERY_KEYBOARD_LAYOUTS", + "android.hardware.usb.action.USB_ACCESSORY_ATTACHED", + "android.hardware.usb.action.USB_ACCESSORY_DETACHED", + "android.hardware.usb.action.USB_DEVICE_ATTACHED", + "android.hardware.usb.action.USB_DEVICE_DETACHED", + "android.intent.action.ACTION_IDLE_MAINTENANCE_END", + "android.intent.action.ACTION_IDLE_MAINTENANCE_START", + "android.intent.action.ACTION_POWER_CONNECTED", + "android.intent.action.ACTION_POWER_DISCONNECTED", + "android.intent.action.ACTION_PREFERRED_ACTIVITY_CHANGED", + "android.intent.action.ACTION_SHUTDOWN", + "android.intent.action.AIRPLANE_MODE", + "android.intent.action.ALARM_CHANGED", + "android.intent.action.APPLICATION_RESTRICTIONS_CHANGED", + "android.intent.action.BATTERY_CHANGED", + "android.intent.action.BATTERY_LOW", + "android.intent.action.BATTERY_OKAY", + "android.intent.action.BOOT_COMPLETED", + "android.intent.action.CALL_DISCONNECT_CAUSE", + "android.intent.action.CAMERA_BUTTON", + "android.intent.action.CANCEL_ENABLE_ROLLBACK", + "android.intent.action.CLEAR_DNS_CACHE", + "android.intent.action.CLOSE_SYSTEM_DIALOGS", + "android.intent.action.CONFIGURATION_CHANGED", + "android.intent.action.CONTENT_CHANGED", + "android.intent.action.DATA_SMS_RECEIVED", + "android.intent.action.DATA_STALL_DETECTED", + "android.intent.action.DATE_CHANGED", + "android.intent.action.DEVICE_STORAGE_FULL", + "android.intent.action.DEVICE_STORAGE_LOW", + "android.intent.action.DEVICE_STORAGE_NOT_FULL", + "android.intent.action.DEVICE_STORAGE_OK", + "android.intent.action.DISTRACTING_PACKAGES_CHANGED", + "android.intent.action.DOCK_EVENT", + "android.intent.action.DOWNLOAD_COMPLETE", + "android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED", + "android.intent.action.DREAMING_STARTED", + "android.intent.action.DREAMING_STOPPED", + "android.intent.action.DROPBOX_ENTRY_ADDED", + "android.intent.action.DYNAMIC_SENSOR_CHANGED", + "android.intent.action.EMERGENCY_CALLBACK_MODE_CHANGED", + "android.intent.action.EMERGENCY_CALL_STATE_CHANGED", + "android.intent.action.EXTERNAL_APPLICATIONS_AVAILABLE", + "android.intent.action.EXTERNAL_APPLICATIONS_UNAVAILABLE", + "android.intent.action.FACTORY_RESET", + "android.intent.action.FETCH_VOICEMAIL", + "android.intent.action.GTALK_CONNECTED", + "android.intent.action.GTALK_DISCONNECTED", + "android.intent.action.HEADSET_PLUG", + "android.intent.action.HEADSET_PLUG", + "android.intent.action.INPUT_METHOD_CHANGED", + "android.intent.action.INTENT_FILTER_NEEDS_VERIFICATION", + "android.intent.action.LOCALE_CHANGED", + "android.intent.action.LOCKED_BOOT_COMPLETED", + "android.intent.action.MANAGE_PACKAGE_STORAGE", + "android.intent.action.MASTER_CLEAR_NOTIFICATION", + "android.intent.action.MEDIA_BAD_REMOVAL", + "android.intent.action.MEDIA_BUTTON", + "android.intent.action.MEDIA_CHECKING", + "android.intent.action.MEDIA_EJECT", + "android.intent.action.MEDIA_MOUNTED", + "android.intent.action.MEDIA_NOFS", + "android.intent.action.MEDIA_REMOVED", + "android.intent.action.MEDIA_SCANNER_FINISHED", + "android.intent.action.MEDIA_SCANNER_SCAN_FILE", + "android.intent.action.MEDIA_SCANNER_STARTED", + "android.intent.action.MEDIA_SHARED", + "android.intent.action.MEDIA_UNMOUNTABLE", + "android.intent.action.MEDIA_UNMOUNTED", + "android.intent.action.MY_PACKAGE_REPLACED", + "android.intent.action.MY_PACKAGE_SUSPENDED", + "android.intent.action.MY_PACKAGE_UNSUSPENDED", + "android.intent.action.NEW_OUTGOING_CALL", + "android.intent.action.NEW_VOICEMAIL", + "android.intent.action.PACKAGES_SUSPENDED", + "android.intent.action.PACKAGES_UNSUSPENDED", + "android.intent.action.PACKAGE_ADDED", + "android.intent.action.PACKAGE_CHANGED", + "android.intent.action.PACKAGE_DATA_CLEARED", + "android.intent.action.PACKAGE_ENABLE_ROLLBACK", + "android.intent.action.PACKAGE_FIRST_LAUNCH", + "android.intent.action.PACKAGE_FULLY_REMOVED", + "android.intent.action.PACKAGE_INSTALL", + "android.intent.action.PACKAGE_NEEDS_INTEGRITY_VERIFICATION", + "android.intent.action.PACKAGE_NEEDS_VERIFICATION", + "android.intent.action.PACKAGE_REMOVED", + "android.intent.action.PACKAGE_REPLACED", + "android.intent.action.PACKAGE_RESTARTED", + "android.intent.action.PACKAGE_UNSUSPENDED_MANUALLY", + "android.intent.action.PACKAGE_VERIFIED", + "android.intent.action.PHONE_STATE", + "android.intent.action.PROVIDER_CHANGED", + "android.intent.action.PROXY_CHANGE", + "android.intent.action.QUERY_PACKAGE_RESTART", + "android.intent.action.REBOOT", + "android.intent.action.ROLLBACK_COMMITTED", + "android.intent.action.SCREEN_OFF", + "android.intent.action.SCREEN_ON", + "android.intent.action.SERVICE_STATE", + "android.intent.action.SIM_STATE_CHANGED", + "android.intent.action.SPLIT_CONFIGURATION_CHANGED", + "android.intent.action.SUB_DEFAULT_CHANGED", + "android.intent.action.TIMEZONE_CHANGED", + "android.intent.action.TIME_SET", + "android.intent.action.TIME_TICK", + "android.intent.action.UID_REMOVED", + "android.intent.action.UMS_CONNECTED", + "android.intent.action.UMS_DISCONNECTED", + "android.intent.action.USER_PRESENT", + "android.intent.action.USER_UNLOCKED", + "android.intent.action.WALLPAPER_CHANGED", + "android.media.ACTION_SCO_AUDIO_STATE_UPDATED", + "android.media.AUDIO_BECOMING_NOISY", + "android.media.INTERNAL_RINGER_MODE_CHANGED_ACTION", + "android.media.MASTER_MUTE_CHANGED_ACTION", + "android.media.RINGER_MODE_CHANGED", + "android.media.SCO_AUDIO_STATE_CHANGED", + "android.media.STREAM_DEVICES_CHANGED_ACTION", + "android.media.STREAM_MUTE_CHANGED_ACTION", + "android.media.VIBRATE_SETTING_CHANGED", + "android.media.VOLUME_CHANGED_ACTION", + "android.media.action.CLOSE_AUDIO_EFFECT_CONTROL_SESSION", + "android.media.action.HDMI_AUDIO_PLUG", + "android.media.action.MICROPHONE_MUTE_CHANGED", + "android.media.action.OPEN_AUDIO_EFFECT_CONTROL_SESSION", + "android.media.action.SPEAKERPHONE_STATE_CHANGED", + "android.media.tv.action.CHANNEL_BROWSABLE_REQUESTED", + "android.media.tv.action.INITIALIZE_PROGRAMS", + "android.media.tv.action.PREVIEW_PROGRAM_ADDED_TO_WATCH_NEXT", + "android.media.tv.action.PREVIEW_PROGRAM_BROWSABLE_DISABLED", + "android.media.tv.action.WATCH_NEXT_PROGRAM_BROWSABLE_DISABLED", + "android.net.conn.BACKGROUND_DATA_SETTING_CHANGED", + "android.net.conn.CAPTIVE_PORTAL_TEST_COMPLETED", + "android.net.conn.CONNECTIVITY_CHANGE", + "android.net.conn.DATA_ACTIVITY_CHANGE", + "android.net.conn.INET_CONDITION_ACTION", + "android.net.conn.RESTRICT_BACKGROUND_CHANGED", + "android.net.conn.TETHER_STATE_CHANGED", + "android.net.nsd.STATE_CHANGED", + "android.net.scoring.SCORER_CHANGED", + "android.net.scoring.SCORE_NETWORKS", + "android.net.sip.action.SIP_CALL_OPTION_CHANGED", + "android.net.sip.action.SIP_INCOMING_CALL", + "android.net.sip.action.SIP_REMOVE_PROFILE", + "android.net.sip.action.SIP_SERVICE_UP", + "android.net.sip.action.START_SIP", + "android.net.wifi.BATCHED_RESULTS", + "android.net.wifi.NETWORK_IDS_CHANGED", + "android.net.wifi.RSSI_CHANGED", + "android.net.wifi.SCAN_RESULTS", + "android.net.wifi.STATE_CHANGE", + "android.net.wifi.WIFI_STATE_CHANGED", + "android.net.wifi.action.WIFI_NETWORK_SUGGESTION_POST_CONNECTION", + "android.net.wifi.action.WIFI_SCAN_AVAILABILITY_CHANGED", + "android.net.wifi.aware.action.WIFI_AWARE_STATE_CHANGED", + "android.net.wifi.p2p.CONNECTION_STATE_CHANGE", + "android.net.wifi.p2p.DISCOVERY_STATE_CHANGE", + "android.net.wifi.p2p.PEERS_CHANGED", + "android.net.wifi.p2p.STATE_CHANGED", + "android.net.wifi.p2p.THIS_DEVICE_CHANGED", + "android.net.wifi.rtt.action.WIFI_RTT_STATE_CHANGED", + "android.net.wifi.supplicant.CONNECTION_CHANGE", + "android.net.wifi.supplicant.STATE_CHANGE", + "android.nfc.action.ADAPTER_STATE_CHANGED", + "android.nfc.action.PREFERRED_PAYMENT_CHANGED", + "android.nfc.action.TRANSACTION_DETECTED", + "android.os.action.ACTION_EFFECTS_SUPPRESSOR_CHANGED", + "android.os.action.DEVICE_IDLE_MODE_CHANGED", + "android.os.action.LIGHT_DEVICE_IDLE_MODE_CHANGED", + "android.os.action.POWER_SAVE_MODE_CHANGED", + "android.os.action.POWER_SAVE_MODE_CHANGED_INTERNAL", + "android.os.action.POWER_SAVE_MODE_CHANGING", + "android.os.action.POWER_SAVE_TEMP_WHITELIST_CHANGED", + "android.os.action.POWER_SAVE_WHITELIST_CHANGED", + "android.os.action.UPDATE_EMERGENCY_NUMBER_DB", + "android.provider.Telephony.MMS_DOWNLOADED", + "android.provider.Telephony.SECRET_CODE", + "android.provider.Telephony.SIM_FULL", + "android.provider.Telephony.SMS_CARRIER_PROVISION", + "android.provider.Telephony.SMS_CB_RECEIVED", + "android.provider.Telephony.SMS_DELIVER", + "android.provider.Telephony.SMS_RECEIVED", + "android.provider.Telephony.SMS_REJECTED", + "android.provider.Telephony.SMS_SERVICE_CATEGORY_PROGRAM_DATA_RECEIVED", + "android.provider.Telephony.WAP_PUSH_DELIVER", + "android.provider.Telephony.WAP_PUSH_RECEIVED", + "android.provider.action.DEFAULT_SMS_PACKAGE_CHANGED", + "android.provider.action.EXTERNAL_PROVIDER_CHANGE", + "android.provider.action.SMS_EMERGENCY_CB_RECEIVED", + "android.provider.action.SMS_MMS_DB_CREATED", + "android.provider.action.SMS_MMS_DB_LOST", + "android.provider.action.SYNC_VOICEMAIL", + "android.security.STORAGE_CHANGED", + "android.security.action.KEYCHAIN_CHANGED", + "android.security.action.KEY_ACCESS_CHANGED", + "android.security.action.TRUST_STORE_CHANGED", + "android.service.controls.action.ADD_CONTROL", + "android.settings.ENABLE_MMS_DATA_REQUEST", + "android.speech.tts.TTS_QUEUE_PROCESSING_COMPLETED", + "android.speech.tts.engine.TTS_DATA_INSTALLED", + "android.telephony.action.AREA_INFO_UPDATED", + "android.telephony.action.DEFAULT_SMS_SUBSCRIPTION_CHANGED", + "android.telephony.action.DEFAULT_SUBSCRIPTION_CHANGED", + "android.telephony.action.PRIMARY_SUBSCRIPTION_LIST_CHANGED", + "android.telephony.action.REFRESH_SUBSCRIPTION_PLANS", + "android.telephony.action.SECRET_CODE", + "android.telephony.action.SERVICE_PROVIDERS_UPDATED", + "android.telephony.action.SIM_APPLICATION_STATE_CHANGED", + "android.telephony.action.SIM_CARD_STATE_CHANGED", + "android.telephony.action.SIM_SLOT_STATUS_CHANGED", + "android.telephony.action.SUBSCRIPTION_CARRIER_IDENTITY_CHANGED", + "android.telephony.action.SUBSCRIPTION_PLANS_CHANGED", + "android.telephony.action.SUBSCRIPTION_SPECIFIC_CARRIER_IDENTITY_CHANGED", + "android.telephony.euicc.action.NOTIFY_CARRIER_SETUP_INCOMPLETE", + "android.telephony.euicc.action.OTA_STATUS_CHANGED", + "android.telephony.ims.action.WFC_IMS_REGISTRATION_ERROR", + "com.android.intent.action.DISMISS_KEYBOARD_SHORTCUTS", + "com.android.intent.action.SHOW_KEYBOARD_SHORTCUTS", + "com.android.internal.intent.action.ACTION_FORBIDDEN_NO_SERVICE_AUTHORIZATION", + "com.android.internal.provider.action.VOICEMAIL_SMS_RECEIVED" + }; +} \ No newline at end of file diff --git a/app/src/main/java/com/jens/automation2/ActivityManageTriggerPhoneCall.java b/app/src/main/java/com/jens/automation2/ActivityManageTriggerPhoneCall.java index f55148f..56103af 100644 --- a/app/src/main/java/com/jens/automation2/ActivityManageTriggerPhoneCall.java +++ b/app/src/main/java/com/jens/automation2/ActivityManageTriggerPhoneCall.java @@ -86,8 +86,8 @@ public class ActivityManageTriggerPhoneCall extends Activity else { Intent data = new Intent(); - data.putExtra("triggerParameter", false); - data.putExtra("triggerParameter2", tp2Result); + data.putExtra(ActivityManageRule.intentNameTriggerParameter1, false); + data.putExtra(ActivityManageRule.intentNameTriggerParameter2, tp2Result); ActivityManageTriggerPhoneCall.this.setResult(RESULT_OK, data); } diff --git a/app/src/main/java/com/jens/automation2/ActivityPermissions.java b/app/src/main/java/com/jens/automation2/ActivityPermissions.java index 9711b1f..62a47c5 100644 --- a/app/src/main/java/com/jens/automation2/ActivityPermissions.java +++ b/app/src/main/java/com/jens/automation2/ActivityPermissions.java @@ -224,7 +224,7 @@ public class ActivityPermissions extends Activity } } - protected static void addToArrayListUnique(String value, ArrayList list) + public static void addToArrayListUnique(String value, List list) { if (!list.contains(value)) list.add(value); diff --git a/app/src/main/java/com/jens/automation2/AutomationService.java b/app/src/main/java/com/jens/automation2/AutomationService.java index ab4e21f..ed8fd32 100644 --- a/app/src/main/java/com/jens/automation2/AutomationService.java +++ b/app/src/main/java/com/jens/automation2/AutomationService.java @@ -248,8 +248,6 @@ public class AutomationService extends Service implements OnInitListener reloadSettings, reloadPointsOfInterest, reloadRules, updateNotification } - ; - public void serviceInterface(serviceCommands command) { Miscellaneous.logEvent("i", "Bind", "Ahhhh, customers... How can I help you?", 5); diff --git a/app/src/main/java/com/jens/automation2/ReceiverCoordinator.java b/app/src/main/java/com/jens/automation2/ReceiverCoordinator.java index 64ea318..4d75953 100644 --- a/app/src/main/java/com/jens/automation2/ReceiverCoordinator.java +++ b/app/src/main/java/com/jens/automation2/ReceiverCoordinator.java @@ -5,6 +5,7 @@ import android.util.Log; import com.jens.automation2.location.CellLocationChangedReceiver; import com.jens.automation2.location.WifiBroadcastReceiver; +import com.jens.automation2.receivers.BroadcastListener; import com.jens.automation2.receivers.DateTimeListener; import com.jens.automation2.receivers.AutomationListenerInterface; import com.jens.automation2.receivers.BatteryReceiver; @@ -67,6 +68,7 @@ public class ReceiverCoordinator DateTimeListener.class, BatteryReceiver.class, BluetoothReceiver.class, + BroadcastListener.class, ConnectivityReceiver.class, DeviceOrientationListener.class, HeadphoneJackListener.class, @@ -163,6 +165,10 @@ public class ReceiverCoordinator if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.noiseLevel)) NoiseListener.startNoiseListener(AutomationService.getInstance()); + // startBroadcastListener + if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.broadcastReceived)) + BroadcastListener.getInstance().startListener(AutomationService.getInstance()); + // startProcessListener if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.process_started_stopped)) ProcessListener.startProcessListener(AutomationService.getInstance()); @@ -206,6 +212,7 @@ public class ReceiverCoordinator TimeZoneListener.stopTimeZoneListener(); DateTimeListener.stopAlarmListener(AutomationService.getInstance()); NoiseListener.stopNoiseListener(); + BroadcastListener.getInstance().stopListener(AutomationService.getInstance()); ProcessListener.stopProcessListener(AutomationService.getInstance()); MediaPlayerListener.getInstance().stopListener(AutomationService.getInstance()); DeviceOrientationListener.getInstance().stopListener(AutomationService.getInstance()); @@ -266,6 +273,17 @@ public class ReceiverCoordinator NoiseListener.stopNoiseListener(); } + if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.broadcastReceived)) + { + Miscellaneous.logEvent("i", "LocationProvider", "Starting BroadcastReceiver because used in a new/changed rule.", 4); + BroadcastListener.getInstance().startListener(AutomationService.getInstance()); + } + else + { + Miscellaneous.logEvent("i", "LocationProvider", "Shutting down BroadcastReceiver because not used in any rule.", 4); + BroadcastListener.getInstance().stopListener(AutomationService.getInstance()); + } + if(Rule.isAnyRuleUsing(Trigger.Trigger_Enum.process_started_stopped)) { Miscellaneous.logEvent("i", "LocationProvider", "Starting ProcessListener because used in a new/changed rule.", 4); diff --git a/app/src/main/java/com/jens/automation2/Trigger.java b/app/src/main/java/com/jens/automation2/Trigger.java index 4cce7c9..f57b8c3 100644 --- a/app/src/main/java/com/jens/automation2/Trigger.java +++ b/app/src/main/java/com/jens/automation2/Trigger.java @@ -3,7 +3,6 @@ package com.jens.automation2; import android.bluetooth.BluetoothDevice; import android.content.Context; import android.os.Build; -import android.os.SystemClock; import android.service.notification.StatusBarNotification; import android.telephony.TelephonyManager; import android.util.Log; @@ -14,6 +13,7 @@ import com.jens.automation2.location.LocationProvider; import com.jens.automation2.location.WifiBroadcastReceiver; import com.jens.automation2.receivers.BatteryReceiver; import com.jens.automation2.receivers.BluetoothReceiver; +import com.jens.automation2.receivers.BroadcastListener; import com.jens.automation2.receivers.ConnectivityReceiver; import com.jens.automation2.receivers.DeviceOrientationListener; import com.jens.automation2.receivers.HeadphoneJackListener; @@ -58,6 +58,7 @@ public class Trigger musicPlaying, deviceStarts, serviceStarts, + broadcastReceived, phoneCall; //phoneCall always needs to be at the very end because of Google's shitty so called privacy public String getFullName(Context context) @@ -110,6 +111,8 @@ public class Trigger return context.getResources().getString(R.string.deviceStarts); case serviceStarts: return context.getResources().getString(R.string.serviceStarts); + case broadcastReceived: + return context.getResources().getString(R.string.broadcastReceivedTitle); default: return "Unknown"; } @@ -221,6 +224,10 @@ public class Trigger if(!checkServiceStarts()) result = false; break; + case broadcastReceived: + if(!checkBroadcastReceived()) + result = false; + break; default: break; } @@ -237,7 +244,19 @@ public class Trigger return result; } - boolean checkNotification() + boolean checkBroadcastReceived() + { + /* + We cannot reasonably check the current state for every broadcast event. + We can only hope that when starting the receiver we get an initial broadcast + for every current state. That collection of states will be saved and checked if + it contains the specific event of this trigger. + */ + + return triggerParameter == BroadcastListener.getInstance().broadcastsCollectionContains(triggerParameter2); + } + + boolean checkNotification() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { @@ -1262,9 +1281,9 @@ public class Trigger return triggerType; } - public void setTriggerType(Trigger_Enum settriggerType) + public void setTriggerType(Trigger_Enum setTriggerType) { - this.triggerType = settriggerType; + this.triggerType = setTriggerType; } public boolean getTriggerParameter() @@ -1601,6 +1620,14 @@ public class Trigger // This type doesn't have an activate/deactivate equivalent returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.serviceHasJustStarted)); break; + case broadcastReceived: + if(triggerParameter) + returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.broadcastReceived)); + else + returnString.append(Miscellaneous.getAnyContext().getResources().getString(R.string.broadcastNotReceived)); + + returnString.append(": " + triggerParameter2); + break; default: returnString.append("error"); break; @@ -1664,11 +1691,7 @@ public class Trigger public static String[] getTriggerTypesStringAsArray(Context context) { ArrayList triggerTypesList = new ArrayList(); - - /*for(int i=0; i broadcastsCollection = new ArrayList<>(); + public static AutomationService automationServiceRef = null; + private static boolean broadcastReceiverActive = false; + private static BroadcastListener broadcastReceiverInstance = null; + private static IntentFilter broadcastIntentFilter = null; + private static Intent broadcastStatus = null; + + public static BroadcastListener getInstance() + { + if(broadcastReceiverInstance == null) + broadcastReceiverInstance = new BroadcastListener(); + + return broadcastReceiverInstance; + } + + @Override + public void onReceive(Context context, Intent intent) + { + broadcastsCollection.add(intent.getAction()); + + ArrayList ruleCandidates = Rule.findRuleCandidates(Trigger.Trigger_Enum.broadcastReceived); + for(int i=0; i getBroadcastsCollection() + { + return broadcastsCollection; + } + + public boolean broadcastsCollectionContains(String event) + { + return broadcastsCollection.contains(event); + } + + @Override + public void startListener(AutomationService automationService) + { + if(!broadcastReceiverActive) + { + BroadcastListener.automationServiceRef = automationService; + + if(broadcastReceiverInstance == null) + broadcastReceiverInstance = new BroadcastListener(); + + if(broadcastIntentFilter == null) + { + broadcastIntentFilter = new IntentFilter(); + + List actionList = new ArrayList<>(); + ArrayList ruleCandidates = Rule.findRuleCandidates(Trigger.Trigger_Enum.broadcastReceived); + for(int i=0; i2{c6t~MvvKPEKBP$~Spd?;s69Z(g1<0qJ`~d)9+Vf+10`BoYR4!~^f|1-0LxSg<9{{e{&*spfQ9@&syhKs#`saxdTazd*{Y7) zs%YO!e(qR+7llIh*Mq@)$ym}~F<(C%%mYio;0Z9eHXIJuhW!^(b%&_xHcwTzAl3iz zQsu~seeGhq%&~#=B?tN8ab6Sv5~&VBU2-Gf-61BvL=2t;F~NG^-7(wDA=@0-6x{u= z?Db`=yDyRGOY&FSra}Irr6+? zYmXT56qF>$`3M%0aQST%Emul!wTTef(BPG-mKK}piU1pJJw3hdt}gud z$=UW-p;O)AjlM(cSLYd$$`?-94)Zk_gJq@4PoWcIEDxg!x?FKM{)zTJ;n%qfYBboH*4-32jqY>eihD&XRa_bLtJ86(URG2r@$$Dw?wSfAEiB&Q);_W?4gN;#ExAry-$Cp-8DVsJ zK{2q|V|a3;Zhk%ieq?rb_Ecl7X}}9hY+&z;D8`BV9DcX(S>Xnn2YGR^vOZ$@;+}%D zsEiD`;h7oWiNQf~3rvPSjf# z(a`$wuGDDoDzr(r^;+<#|2hmox$NQVj}`?MJYum#FBdW6h9`8Q08-ZRotbS9chGX>a?Ec&=EooMyAhO%l z-ZC@->azS9)^k z2FGh5b1{|Q&!3c~6Pt7l6?SL(DB7cw9$DSE{^h7SVZrI4R6=B=9!#6RcznEce+E-Q zTPd}ntPBAWdiQ$ljoEbLHCCE@j;?f+#jPDY{8}mYnPz8K+~dRlV)TXIiKj?)f<4it zWrz{)3u@wDCXi<_T;E~^v+0mbqn;&avX;o=g8u5knfMp!4J5T)=Y7<`OIIBVLdTl# z95|`HfA_JZRR?lrLBJa$oebDh58`CTdrKKA4-4mb6Dtykngv~`=aEQ5g zP3~Finb z9&}h{ue^*cLelPyjjn0VwRHxS zR(LaZef@L;r?S#~w$_(xj$fYMzvr{ckuC}D^z1VfQ$j5`pRP#9f~CJdgv!nkSp!`H z#|QqIW)zh1=;?oQs^pT=tpXVq}m!?L@%XfZ6HH$*{h@zA`dxll$mG z_Dt$uJc$%rtH#QW_VLja!L2}asA}i_{N600H^EgEnPkM5ps*EM6<0kd&ANVgS+S== zUp|EC-}K56T1K}G1A#zq1}cI$eSuQsSTfobEhKruvFeHzp|7-Id?-_X2v=B~Mj+-l z?L(AGxsep|MG@{ot7OgeBIqd(JvSUtOeym@&89cS^=bM&N>5>LH8d1n5s9 zflzHz5-$6D+Lf65%NlnyrK6jBpx3w)VJF42RpknniBR|m=|335R~I$@GzrtP`gkM2 z;Aqur(kAcU2zkA4(WT5&c={8gAY`aI)VTBQcUE0Z80tal@!o;%xF0z@SEBbRf|?UX zQjzM2kh@jo$G}QeRaLf~-plb(nJ3S3as^wFtoDz0f5oMvGCJg1`&~{;-4%>h2_r5i z=KRKS*&L@tpa z{iu0liUzLTLjLn?xv)U;eW|5GAUh+^UqPE1WD4amPF{Ot>b*Fp=)r~fi)YG-pNCo5 z$h%%`XdKU$S?A{3kMNZZ*_w^kq1$1L@kQqcH$Jx9RbmK6KU%E62})M_jJwHc5f2za zKRh#!2d|(Q;zHRI9qsA*HB^I@!bQ!$ZKWF1hq7BvV525qyU}eL*Z|tb-ku&%fyuO65y$U#?p3#3; literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/activity_control_center.xml b/app/src/main/res/layout/activity_control_center.xml index 49aaa0e..4fd32cf 100644 --- a/app/src/main/res/layout/activity_control_center.xml +++ b/app/src/main/res/layout/activity_control_center.xml @@ -96,6 +96,11 @@ android:layout_height="wrap_content" android:text="@string/sendEmailToDev" /> + + + + + + + + + + + + + + + + + + + + + + + + +