diff --git a/app/src/main/java/com/jens/automation2/receivers/ScreenStateReceiver.java b/app/src/main/java/com/jens/automation2/receivers/ScreenStateReceiver.java index 5ea93163..670a3e35 100644 --- a/app/src/main/java/com/jens/automation2/receivers/ScreenStateReceiver.java +++ b/app/src/main/java/com/jens/automation2/receivers/ScreenStateReceiver.java @@ -3,12 +3,14 @@ package com.jens.automation2.receivers; import android.Manifest; import android.app.KeyguardManager; import android.content.BroadcastReceiver; +import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.BatteryManager; import android.os.Build; import android.os.PowerManager; +import android.provider.Settings; import android.util.Log; import android.widget.Toast; @@ -21,10 +23,13 @@ import com.jens.automation2.Rule; import com.jens.automation2.Trigger.Trigger_Enum; import java.util.ArrayList; +import java.util.List; +import java.util.Timer; +import java.util.TimerTask; public class ScreenStateReceiver extends BroadcastReceiver implements AutomationListenerInterface { - static int screenState = -1; // initialize with a better value than this + static int screenState = -1; // initialize with a better value than this public static AutomationService automationServiceRef = null; private static boolean screenStateReceiverActive = false; @@ -36,7 +41,7 @@ public class ScreenStateReceiver extends BroadcastReceiver implements Automation public static BroadcastReceiver getScreenStateReceiverInstance() { - if(screenStateReceiverInstance == null) + if (screenStateReceiverInstance == null) screenStateReceiverInstance = new ScreenStateReceiver(); return screenStateReceiverInstance; @@ -44,42 +49,43 @@ public class ScreenStateReceiver extends BroadcastReceiver implements Automation public static void startScreenStateReceiver(final AutomationService automationServiceRef) { - if(!screenStateReceiverActive) + if (!screenStateReceiverActive) { ScreenStateReceiver.automationServiceRef = automationServiceRef; - - if(screenStateReceiverInstance == null) + + if (screenStateReceiverInstance == null) screenStateReceiverInstance = new ScreenStateReceiver(); - - if(screenStateIntentFilter == null) + + if (screenStateIntentFilter == null) { screenStateIntentFilter = new IntentFilter(); screenStateIntentFilter.addAction(Intent.ACTION_SCREEN_OFF); screenStateIntentFilter.addAction(Intent.ACTION_SCREEN_ON); - screenStateIntentFilter.addAction(Intent.ACTION_USER_PRESENT); // also fired when device is unlocked + screenStateIntentFilter.addAction(Intent.ACTION_USER_PRESENT); // also fired when device is unlocked screenStateIntentFilter.addAction(broadcastScreenLocked); // Intent.ACTION_USER_UNLOCKED } - + screenStatusIntent = automationServiceRef.registerReceiver(screenStateReceiverInstance, screenStateIntentFilter); - + screenStateReceiverActive = true; } } + public static void stopScreenStateReceiver() { - if(screenStateReceiverActive) + if (screenStateReceiverActive) { - if(screenStateReceiverInstance != null) + if (screenStateReceiverInstance != null) { automationServiceRef.unregisterReceiver(screenStateReceiverInstance); screenStateReceiverInstance = null; } - + screenStateReceiverActive = false; } } - + public static boolean isScreenStateReceiverActive() { return screenStateReceiverActive; @@ -91,7 +97,7 @@ public class ScreenStateReceiver extends BroadcastReceiver implements Automation } private static int currentChargingState = 0; //0=unknown, 1=no, 2=yes - + public static int getCurrentChargingState() { return currentChargingState; @@ -110,45 +116,45 @@ public class ScreenStateReceiver extends BroadcastReceiver implements Automation try { - if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) + if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { ScreenStateReceiver.screenState = 0; -// Method 1 - Miscellaneous.logEvent("i", "ScreenStateReceiver", "Method 1: " + String.valueOf(LockScreenHelper.isScreenUnlocked(context)), 4); - if(!LockScreenHelper.isScreenUnlocked(context)) - { - Intent lockedBroadcastIntent = new Intent(); - lockedBroadcastIntent.setAction(broadcastScreenLocked); - context.sendBroadcast(lockedBroadcastIntent); - } - // Method 2 - PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); +// PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); KeyguardManager keyguardManager = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE); - Miscellaneous.logEvent("i", "ScreenStateReceiver", "Method 2: " + String.valueOf(pm.isInteractive() && pm.isScreenOn() && keyguardManager.isKeyguardLocked() && keyguardManager.isDeviceLocked()), 4); - if (pm.isInteractive() && pm.isScreenOn() && keyguardManager.isKeyguardLocked() && keyguardManager.isDeviceLocked()) - { +// Miscellaneous.logEvent("i", "ScreenStateReceiver", "Method 2: " + String.valueOf(pm.isInteractive() && pm.isScreenOn() && keyguardManager.isKeyguardLocked() && keyguardManager.isDeviceLocked()), 4); +// if (pm.isInteractive() && pm.isScreenOn() && keyguardManager.isKeyguardLocked() && keyguardManager.isDeviceLocked()) +// { +// +// } +// Miscellaneous.logEvent("i", "ScreenStateReceiver", "pm.isInteractive(): " + String.valueOf(pm.isInteractive()), 4); +// Miscellaneous.logEvent("i", "ScreenStateReceiver", "pm.isScreenOn(): " + String.valueOf(pm.isScreenOn()), 4); + Miscellaneous.logEvent("i", "ScreenStateReceiver", "keyguardManager.isKeyguardLocked(): " + String.valueOf(keyguardManager.isKeyguardLocked()), 4); + Miscellaneous.logEvent("i", "ScreenStateReceiver", "keyguardManager.isDeviceLocked(): " + String.valueOf(keyguardManager.isDeviceLocked()), 4); + + boolean locked = keyguardManager.isKeyguardLocked() && keyguardManager.isDeviceLocked(); + if (locked) + { + sendLockBroadcast(context); } - -// Method 3 - KeyguardManager kgMgr = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE); - boolean unlocked = kgMgr.inKeyguardRestrictedInputMode(); - Miscellaneous.logEvent("i", "ScreenStateReceiver", "Method 3: " + String.valueOf(kgMgr.inKeyguardRestrictedInputMode()), 4); - if(!unlocked) + else { + // Lock may be activated delayed, not at power button press + ScreenLockMonitor mon = new ScreenLockMonitor(); + mon.startMonitor(); } } - else if(intent.getAction().equals(Intent.ACTION_SCREEN_ON)) + else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { ScreenStateReceiver.screenState = 1; } - else if(intent.getAction().equals(Intent.ACTION_USER_PRESENT)) + else if (intent.getAction().equals(Intent.ACTION_USER_PRESENT)) { ScreenStateReceiver.screenState = 2; } - else if(intent.getAction().equals(broadcastScreenLocked)) + else if (intent.getAction().equals(broadcastScreenLocked)) { ScreenStateReceiver.screenState = 3; } @@ -157,15 +163,15 @@ public class ScreenStateReceiver extends BroadcastReceiver implements Automation Miscellaneous.logEvent("e", "ScreenStateReceiver", "Unknown state received: " + intent.getAction(), 3); } } - catch(Exception e) + catch (Exception e) { Miscellaneous.logEvent("e", "ScreenStateReceiver", "Error receiving screen state: " + e.getMessage(), 3); } ArrayList ruleCandidates = Rule.findRuleCandidates(Trigger_Enum.screenState); - for(int i=0; i maxRuns) + { + Miscellaneous.logEvent("w", "ScreenStateReceiver->ScreenLockMonitor", "Lock never came.", 4); + timer.purge(); + timer.cancel(); + } + } } + }; + + public void startMonitor() + { + ContentResolver mResolver = Miscellaneous.getAnyContext().getContentResolver(); + long lockscreen_timeout = 0; + + if(Build.VERSION.SDK_INT < Build.VERSION_CODES.N_MR1) + lockscreen_timeout = Settings.System.getInt(mResolver, "lock_screen_lock_after_timeout", 0); else - { - Log.i(TAG, "device is interactive"); - } + lockscreen_timeout = Settings.Secure.getInt(mResolver, "lock_screen_lock_after_timeout", 0); - if (!isDeviceProvisioned(context)) - { - Log.i(TAG, "device is not provisioned"); - return true; - } - - Object keyguardService = context.getSystemService(Context.KEYGUARD_SERVICE); - return !((KeyguardManager) keyguardService).inKeyguardRestrictedInputMode(); - } - - /** - * @return Whether the screen of the device is interactive (screen may or may not be locked at the time). - */ - @SuppressWarnings("deprecation") - public static boolean isInteractive(Context context) - { - PowerManager manager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) - { - return manager.isInteractive(); - } + if(lockscreen_timeout > 0) + timer.schedule(task, lockscreen_timeout); else - { - return manager.isScreenOn(); - } + timer.scheduleAtFixedRate(task, 0, interval); } + } - /** - * @return Whether the device has been provisioned (0 = false, 1 = true). - * On a multiuser device with a separate system user, the screen may be locked as soon as this - * is set to true and further activities cannot be launched on the system user unless they are - * marked to show over keyguard. - */ - private static boolean isDeviceProvisioned(Context context) - { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) - { - return true; - } - - if (context == null) - { - return true; - } - - if (context.getContentResolver() == null) - { - return true; - } - - return android.provider.Settings.Global.getInt(context.getContentResolver(), android.provider.Settings.Global.DEVICE_PROVISIONED, 0) != 0; - } + static void sendLockBroadcast(Context context) + { + Intent lockedBroadcastIntent = new Intent(); + lockedBroadcastIntent.setAction(broadcastScreenLocked); + context.sendBroadcast(lockedBroadcastIntent); } } \ No newline at end of file