diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl index 93a9d50ac4790..c54d09e168fc4 100644 --- a/core/java/android/view/IWindowManager.aidl +++ b/core/java/android/view/IWindowManager.aidl @@ -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(); } diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index 8ab468d441440..cbaa3dffd47e8 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -1027,6 +1027,11 @@ public interface WindowManagerPolicy { */ public boolean hasNavigationBar(); + /** + * Lock the device now. + */ + public void lockNow(); + /** * Print the WindowManagerPolicy's state into the given stream. * diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index eeade0528b735..7c9f0b5d4a429 100755 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -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()); diff --git a/services/java/com/android/server/DevicePolicyManagerService.java b/services/java/com/android/server/DevicePolicyManagerService.java index e8ca3ce8475d3..d8e3d59639646 100644 --- a/services/java/com/android/server/DevicePolicyManagerService.java +++ b/services/java/com/android/server/DevicePolicyManagerService.java @@ -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); diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index 47a7e16b0990b..4dcf59b0564ea 100644 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -9415,6 +9415,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); diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java index 1e66ca2ce1a07..516725e02174c 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java @@ -471,4 +471,8 @@ public class BridgeWindowManager implements IWindowManager { public boolean hasNavigationBar() { return false; // should this return something else? } + + public void lockNow() { + // TODO Auto-generated method stub + } }