diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index b123b7dcce93f6f6068650299f8375508b507972..c64ca28fdd0d5708a94e30d47e7bf2f363fd4239 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -5640,6 +5640,12 @@ public final class Settings { */ public static final String FORCE_SHOW_NAVBAR = "force_show_navbar"; + /** + * Whether to take partial screenshot with volume down + power click. + * @hide + */ + public static final String CLICK_PARTIAL_SCREENSHOT = "click_partial_screenshot"; + /** * IMPORTANT: If you add a new public settings you also have to add it to * PUBLIC_SETTINGS below. If the new setting is hidden you have to add diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 9a189db254dd22c6039d33873d1c7586c8c71698..be4003bfa44b57707b0e17a9131632ecf9eff040 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -550,6 +550,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { boolean mVolumeAnswerCall; + // Click volume down + power for partial screenshot + boolean mClickPartialScreenshot; + private boolean mPendingKeyguardOccluded; private boolean mKeyguardOccludedChanged; @@ -906,6 +909,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { resolver.registerContentObserver(Settings.System.getUriFor( Settings.System.VOLUME_ANSWER_CALL), false, this, UserHandle.USER_ALL); + resolver.registerContentObserver(Settings.System.getUriFor( + Settings.System.CLICK_PARTIAL_SCREENSHOT), false, this, + UserHandle.USER_ALL); if (mLineageHardware.isSupported(LineageHardwareManager.FEATURE_KEY_SWAP)) { resolver.registerContentObserver(Settings.Secure.getUriFor( Settings.Secure.SWAP_CAPACITIVE_KEYS), false, this, @@ -1441,9 +1447,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { } private long getScreenshotChordLongPressDelay() { - long delayMs = DeviceConfig.getLong( + // If click to partial screenshot is enabled, restore pre Android QPR1 + // default delay (500ms) in case SCREENSHOT_KEYCHORD_DELAY is shorter than it. + long delayMs = Long.max(mClickPartialScreenshot ? 500 : 0, DeviceConfig.getLong( DeviceConfig.NAMESPACE_SYSTEMUI, SCREENSHOT_KEYCHORD_DELAY, - ViewConfiguration.get(mContext).getScreenshotChordKeyTimeout()); + ViewConfiguration.get(mContext).getScreenshotChordKeyTimeout())); if (mKeyguardDelegate.isShowing()) { // Double the time it takes to take a screenshot from the keyguard return (long) (KEYGUARD_SCREENSHOT_CHORD_DELAY_MULTIPLIER * delayMs); @@ -1457,7 +1465,13 @@ public class PhoneWindowManager implements WindowManagerPolicy { } private void cancelPendingScreenshotChordAction() { + boolean hadCallback = mHandler.hasCallbacks(mScreenshotRunnable); mHandler.removeCallbacks(mScreenshotRunnable); + if (mClickPartialScreenshot && hadCallback) { + mScreenshotRunnable.setScreenshotType( + TAKE_SCREENSHOT_SELECTED_REGION); + mHandler.post(mScreenshotRunnable); + } } private void cancelPendingAccessibilityShortcutAction() { @@ -2525,6 +2539,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { mCameraLaunch = Settings.System.getIntForUser(resolver, Settings.System.CAMERA_LAUNCH, 0, UserHandle.USER_CURRENT) == 1; + mClickPartialScreenshot = Settings.System.getIntForUser(resolver, + Settings.System.CLICK_PARTIAL_SCREENSHOT, 0, + UserHandle.USER_CURRENT) == 1; // Configure wake gesture. boolean wakeGestureEnabledSetting = Settings.Secure.getIntForUser(resolver,