Skip to content

Commit bde8124

Browse files
committed
Restore touch exploration when Dim Screen is enabled on Android 15 QPR1+
- Matched window flag combination from TalkBack 15.2.1 (NOT_FOCUSABLE | NOT_TOUCHABLE | FULLSCREEN | LAYOUT_NO_LIMITS) - Removed DIM_BEHIND - Kept flag ordering identical to the upstream compiled binary - Replaced getDefaultDisplay().getRealSize() with the WindowMetrics API - Verified working on Android 15 QPR1+ (API 35+) Fixes an issue where touch exploration stops working when Dim Screen is active since Android 15 QPR1 (API 35). This change does not affect earlier Android versions (falls back to the Display API on < R). It complies with overlay security policies (WindowMetrics + Insets), does not violate the event delivery model on Android 15 QPR1+, and does not introduce any bypass of edge-gesture protection. Fixes #98 Signed-off-by: Patryk Miś <[email protected]>
1 parent 109795a commit bde8124

File tree

1 file changed

+26
-5
lines changed

1 file changed

+26
-5
lines changed

talkback/src/main/java/com/google/android/accessibility/talkback/actor/DimScreenActor.java

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import android.content.Context;
2222
import android.content.SharedPreferences;
2323
import android.content.res.Configuration;
24+
import android.graphics.Insets;
2425
import android.graphics.PixelFormat;
2526
import android.graphics.Point;
2627
import android.os.Handler;
@@ -29,8 +30,10 @@
2930
import android.provider.Settings;
3031
import android.view.WindowManager;
3132
import android.view.WindowManager.LayoutParams;
33+
import android.view.WindowMetrics;
3234
import androidx.annotation.Nullable;
3335
import androidx.annotation.VisibleForTesting;
36+
import androidx.core.view.WindowInsetsCompat;
3437
import com.google.android.accessibility.talkback.DeviceConfigurationMonitor;
3538
import com.google.android.accessibility.talkback.DimmingOverlayView;
3639
import com.google.android.accessibility.talkback.Feedback;
@@ -40,6 +43,7 @@
4043
import com.google.android.accessibility.talkback.TalkBackService;
4144
import com.google.android.accessibility.talkback.compositor.Compositor;
4245
import com.google.android.accessibility.talkback.gesture.GestureShortcutMapping;
46+
import com.google.android.accessibility.utils.BuildVersionUtils;
4347
import com.google.android.accessibility.utils.SharedPreferencesUtils;
4448
import com.google.android.accessibility.utils.monitor.ScreenMonitor;
4549
import com.google.android.accessibility.utils.widget.DialogUtils;
@@ -198,10 +202,10 @@ private void initView() {
198202

199203
viewParams = new LayoutParams();
200204
viewParams.type = DialogUtils.getDialogType();
201-
viewParams.flags |= LayoutParams.FLAG_DIM_BEHIND;
202205
viewParams.flags |= LayoutParams.FLAG_NOT_FOCUSABLE;
203206
viewParams.flags |= LayoutParams.FLAG_NOT_TOUCHABLE;
204207
viewParams.flags |= LayoutParams.FLAG_FULLSCREEN;
208+
viewParams.flags |= LayoutParams.FLAG_LAYOUT_NO_LIMITS;
205209
viewParams.flags &= ~LayoutParams.FLAG_TURN_SCREEN_ON;
206210
viewParams.flags &= ~LayoutParams.FLAG_KEEP_SCREEN_ON;
207211
viewParams.format = PixelFormat.OPAQUE;
@@ -219,11 +223,28 @@ private void initView() {
219223
}
220224

221225
private void initCurtainSize() {
222-
Point point = new Point();
223-
windowManager.getDefaultDisplay().getRealSize(point);
226+
if (viewParams == null) {
227+
return; // defensive check - just in case
228+
}
229+
230+
int iWidth;
231+
int iHeight;
232+
233+
if (BuildVersionUtils.isAtLeastR()) {
234+
WindowMetrics metrics = windowManager.getCurrentWindowMetrics();
235+
Insets insets = metrics.getWindowInsets().getInsets(WindowInsetsCompat.Type.systemBars());
236+
int insetSum = insets.top + insets.bottom;
237+
iWidth = metrics.getBounds().width();
238+
iHeight = metrics.getBounds().height() + insetSum;
239+
} else {
240+
Point point = new Point();
241+
windowManager.getDefaultDisplay().getRealSize(point);
242+
iWidth = point.x;
243+
iHeight = point.y;
244+
}
224245

225-
viewParams.width = point.x;
226-
viewParams.height = point.y;
246+
viewParams.width = iWidth;
247+
viewParams.height = iHeight - 1;
227248
}
228249

229250
private void addExitInstructionView() {

0 commit comments

Comments
 (0)