Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 93c518e4 authored by Jim Miller's avatar Jim Miller
Browse files

Fix 5863053: Add method to lock screen immediately.

This fixes a bug where the device fails to lock when DevicePolicyManagerService
requests the device to be locked and the screen was off because the user hit
the power button.

The change allows DPMS to directly invoke screen lock, bypasssing the screen state.

Change-Id: Iecdda6fc61e9c519119de495be23c69c3b983921
parent ff321d49
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -229,4 +229,9 @@ interface IWindowManager
     * Device has a software navigation bar (separate from the status bar).
     */
    boolean hasNavigationBar();

    /**
     * Lock the device immediately.
     */
    void lockNow();
}
+5 −0
Original line number Diff line number Diff line
@@ -1022,6 +1022,11 @@ public interface WindowManagerPolicy {
     */
    public boolean hasNavigationBar();

    /**
     * Lock the device now.
     */
    public void lockNow();

    /**
     * Print the WindowManagerPolicy's state into the given stream.
     *
+6 −0
Original line number Diff line number Diff line
@@ -3488,6 +3488,12 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        }
    };

    public void lockNow() {
        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null);
        mHandler.removeCallbacks(mScreenLockTimeout);
        mHandler.post(mScreenLockTimeout);
    }

    private void updateLockScreenTimeout() {
        synchronized (mScreenLockTimeout) {
            boolean enable = (mAllowLockscreenWhenOn && mScreenOnEarly && mKeyguardMediator.isSecure());
+13 −0
Original line number Diff line number Diff line
@@ -60,6 +60,7 @@ import android.util.PrintWriterPrinter;
import android.util.Printer;
import android.util.Slog;
import android.util.Xml;
import android.view.IWindowManager;
import android.view.WindowManagerPolicy;

import java.io.File;
@@ -96,6 +97,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
    final PowerManager.WakeLock mWakeLock;

    IPowerManager mIPowerManager;
    IWindowManager mIWindowManager;

    int mActivePasswordQuality = DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
    int mActivePasswordLength = 0;
@@ -506,6 +508,14 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
        return mIPowerManager;
    }

    private IWindowManager getWindowManager() {
        if (mIWindowManager == null) {
            IBinder b = ServiceManager.getService(Context.WINDOW_SERVICE);
            mIWindowManager = IWindowManager.Stub.asInterface(b);
        }
        return mIWindowManager;
    }

    ActiveAdmin getActiveAdminUncheckedLocked(ComponentName who) {
        ActiveAdmin admin = mAdminMap.get(who);
        if (admin != null
@@ -1649,8 +1659,11 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
                    DeviceAdminInfo.USES_POLICY_FORCE_LOCK);
            long ident = Binder.clearCallingIdentity();
            try {
                // Power off the display
                mIPowerManager.goToSleepWithReason(SystemClock.uptimeMillis(),
                        WindowManagerPolicy.OFF_BECAUSE_OF_ADMIN);
                // Ensure the device is locked
                getWindowManager().lockNow();
            } catch (RemoteException e) {
            } finally {
                Binder.restoreCallingIdentity(ident);
+4 −0
Original line number Diff line number Diff line
@@ -9411,6 +9411,10 @@ public class WindowManagerService extends IWindowManager.Stub
        return mPolicy.hasNavigationBar();
    }

    public void lockNow() {
        mPolicy.lockNow();
    }

    void dumpInput(FileDescriptor fd, PrintWriter pw, boolean dumpAll) {
        pw.println("WINDOW MANAGER INPUT (dumpsys window input)");
        mInputManager.dump(pw);
Loading