diff --git a/app/src/main/java/com/jens/automation2/ActivityManageRule.java b/app/src/main/java/com/jens/automation2/ActivityManageRule.java index 1875480b7..4a70536e7 100644 --- a/app/src/main/java/com/jens/automation2/ActivityManageRule.java +++ b/app/src/main/java/com/jens/automation2/ActivityManageRule.java @@ -523,6 +523,8 @@ public class ActivityManageRule extends Activity items.add(new Item(typesLong[i].toString(), R.drawable.smartphone)); else if(types[i].toString().equals(Trigger_Enum.profileActive.toString())) items.add(new Item(typesLong[i].toString(), R.drawable.sound)); + else if(types[i].toString().equals(Trigger_Enum.screenState.toString())) + items.add(new Item(typesLong[i].toString(), R.drawable.smartphone)); else items.add(new Item(typesLong[i].toString(), R.drawable.placeholder)); } diff --git a/app/src/main/java/com/jens/automation2/Trigger.java b/app/src/main/java/com/jens/automation2/Trigger.java index 507c95d80..9d84132a6 100644 --- a/app/src/main/java/com/jens/automation2/Trigger.java +++ b/app/src/main/java/com/jens/automation2/Trigger.java @@ -22,6 +22,8 @@ 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.ScreenStateReceiver; + import static com.jens.automation2.receivers.NotificationListener.EXTRA_TEXT; import static com.jens.automation2.receivers.NotificationListener.EXTRA_TITLE; @@ -123,6 +125,10 @@ public class Trigger if(!checkProfileActive()) result = false; break; + case screenState: + if(!checkScreenState()) + result = false; + break; default: break; } @@ -308,6 +314,23 @@ public class Trigger return false; } + boolean checkScreenState() + { + try + { + int desiredState = Integer.parseInt(getTriggerParameter2()); + int currentState = ScreenStateReceiver.getScreenState(); + + return desiredState == currentState; + } + catch (Exception e) + { + Miscellaneous.logEvent("w", "Trigger", "Error checking profile trigger.", 4); + } + + return false; + } + boolean checkDeviceOrientation() { String deviceOrientationPieces[] = getTriggerParameter2().split(Trigger.triggerParameter2Split); @@ -1492,6 +1515,12 @@ public class Trigger else returnString.append(String.format(Miscellaneous.getAnyContext().getString(R.string.profileNotActive), getTriggerParameter2().split(Trigger.triggerParameter2Split)[0])); break; + case screenState: + if(triggerParameter) + returnString.append(String.format(Miscellaneous.getAnyContext().getString(R.string.screenIs), getTriggerParameter2().split(Trigger.triggerParameter2Split)[0])); + else + returnString.append(String.format(Miscellaneous.getAnyContext().getString(R.string.profileNotActive), getTriggerParameter2().split(Trigger.triggerParameter2Split)[0])); + break; default: returnString.append("error"); break; diff --git a/app/src/main/java/com/jens/automation2/receivers/ScreenStateReceiver.java b/app/src/main/java/com/jens/automation2/receivers/ScreenStateReceiver.java new file mode 100644 index 000000000..d3971adbd --- /dev/null +++ b/app/src/main/java/com/jens/automation2/receivers/ScreenStateReceiver.java @@ -0,0 +1,163 @@ +package com.jens.automation2.receivers; + +import android.Manifest; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.BatteryManager; +import android.util.Log; +import android.widget.Toast; + +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 ScreenStateReceiver extends BroadcastReceiver implements AutomationListenerInterface +{ + static int screenState = -1; // initialize with a better value than this + public static AutomationService automationServiceRef = null; + + private static boolean screenStateReceiverActive = false; + private static IntentFilter screenStateIntentFilter = null; + private static Intent screenStatusIntent = null; + private static BroadcastReceiver screenStateReceiverInstance = null; + + public static void startScreenStateReceiver(final AutomationService automationServiceRef) + { + if(!screenStateReceiverActive) + { + ScreenStateReceiver.automationServiceRef = automationServiceRef; + + if(screenStateReceiverInstance == null) + screenStateReceiverInstance = new ScreenStateReceiver(); + + if(screenStateIntentFilter == null) + { + screenStateIntentFilter = new IntentFilter(); + screenStateIntentFilter.addAction(Intent.ACTION_SCREEN_OFF); + screenStateIntentFilter.addAction(Intent.ACTION_SCREEN_ON); + screenStateIntentFilter.addAction(Intent.ACTION_USER_PRESENT); +// Intent.ACTION_USER_UNLOCKED + } + + screenStatusIntent = automationServiceRef.registerReceiver(screenStateReceiverInstance, screenStateIntentFilter); + + screenStateReceiverActive = true; + } + } + public static void stopScreenStateReceiver() + { + if(screenStateReceiverActive) + { + if(screenStateReceiverInstance != null) + { + automationServiceRef.unregisterReceiver(screenStateReceiverInstance); + screenStateReceiverInstance = null; + } + + screenStateReceiverActive = false; + } + } + + public static boolean isScreenStateReceiverActive() + { + return screenStateReceiverActive; + } + + public static boolean isUsbHostConnected() + { + return usbHostConnected; + } + + public static int getScreenState() + { + return screenState; + } + + private static int currentChargingState = 0; //0=unknown, 1=no, 2=yes + + public static int getCurrentChargingState() + { + return currentChargingState; + } + + @Override + public void onReceive(Context context, Intent intent) + { + if (intent == null) + return; + if (context == null) + return; + + Miscellaneous.logEvent("e", "ScreenStateReceiver", "Received: " + intent.getAction(), 3); + + try + { + if(intent.getAction().equals(Intent.ACTION_SCREEN_ON)) + { + ScreenStateReceiver.screenState = 1; + } + else if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) + { + ScreenStateReceiver.screenState = 0; + } + else if(intent.getAction().equals(Intent.ACTION_USER_PRESENT)) + { + ScreenStateReceiver.screenState = 2; + } + else + { + Miscellaneous.logEvent("e", "ScreenStateReceiver", "Unknown state received: " + intent.getAction(), 3); + } + } + catch(Exception e) + { + Miscellaneous.logEvent("e", "ScreenStateReceiver", "Error receiving screen state: " + e.getMessage(), 3); + } + } + + private void actionCharging(Context context, int state) + { + + ArrayList ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.screenState); + for(int i=0; i ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.charging); -// ArrayList ruleCandidates = Rule.findRuleCandidatesByCharging(true); - for(int i=0; i ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.batteryLevel); - for(int i=0; i ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.charging); -// ArrayList ruleCandidates = Rule.findRuleCandidatesByCharging(false); - for(int i=0; i ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.usb_host_connection); -// ArrayList ruleCandidates = Rule.findRuleCandidatesByUsbHost(true); - for(Rule oneRule : ruleCandidates) - { - if(oneRule.getsGreenLight(context)) - oneRule.activate(automationServiceRef, false); - } - - this.actionCharging(context); - } - } - - private void actionUsbDisconnected(Context context) - { - // Event usbDisConnected - - if(usbHostConnected) - { - usbHostConnected = false; - Miscellaneous.logEvent("i", "BatteryReceiver", "Disconnected from computer.", 3); - Toast.makeText(context, "Disconnected from computer.", Toast.LENGTH_LONG).show(); - - ArrayList ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.usb_host_connection); -// ArrayList ruleCandidates = Rule.findRuleCandidatesByUsbHost(false); - for(Rule oneRule : ruleCandidates) - { - if(oneRule.getsGreenLight(context)) - oneRule.activate(automationServiceRef, false); - } - } - } - @Override - public void startListener(AutomationService automationService) - { - ScreenStatusReceiver.startScreenStateReceiver(automationService); - } - @Override - public void stopListener(AutomationService automationService) - { - ScreenStatusReceiver.stopScreenStateReceiver(); - } - - public static boolean haveAllPermission() - { - return ActivityPermissions.havePermission(Manifest.permission.READ_PHONE_STATE, Miscellaneous.getAnyContext()) && - ActivityPermissions.havePermission(Manifest.permission.BATTERY_STATS, Miscellaneous.getAnyContext()); - } - - @Override - public boolean isListenerRunning() - { - return ScreenStatusReceiver.isScreenStateReceiverActive(); - } - @Override - public Trigger_Enum[] getMonitoredTrigger() - { - return new Trigger_Enum[] { Trigger_Enum.screenState }; - } -} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c32ad3456..b67c87c89 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -768,4 +768,5 @@ Email is my preferred method of contact to report bugs, ask questions or make proposals. Go to control center to learn more. Control center Send email to developer + screen is %1$s \ No newline at end of file