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

Commit 899c88b0 authored by Evan Severson's avatar Evan Severson Committed by Android Build Coastguard Worker
Browse files

Create button which ignores clicks when window is partially obscured

Currently there is a protection to prevent clicks which go through an
overlay, but the overlay might be covering sensitive information rather
than the button. We now prevent clicks if there is any overlay over any part
of the window.

[DO NOT MERGE] PermissionController moved to different project

Test: Manual
Test: atest PermissionTapjackingTest
Bug: 175190844
Bug: 196389741

Merged-In: Ie0238aede5fb1d781e71c3c6f30b63dd02a1eb2c
Change-Id: Ie0238aede5fb1d781e71c3c6f30b63dd02a1eb2c
(cherry picked from commit 7bba0cc89e96d9c52a5fb3e53bd4fbdd83119a4f)
Merged-In: Ie0238aede5fb1d781e71c3c6f30b63dd02a1eb2c
parent a200773e
Loading
Loading
Loading
Loading
+11 −11
Original line number Diff line number Diff line
@@ -63,52 +63,52 @@
                <Space
                    style="@style/PermissionGrantButtonBarSpace"/>

                <Button
                <com.android.permissioncontroller.permission.ui.widget.SecureButton
                    android:id="@+id/permission_allow_button"
                    android:text="@string/grant_dialog_button_allow"
                    style="@style/PermissionGrantButtonAllow" />

                <Button
                <com.android.permissioncontroller.permission.ui.widget.SecureButton
                    android:id="@+id/permission_allow_always_button"
                    android:text="@string/grant_dialog_button_allow_always"
                    style="@style/PermissionGrantButtonAllowAlways" />

                <Button
                <com.android.permissioncontroller.permission.ui.widget.SecureButton
                    android:id="@+id/permission_allow_foreground_only_button"
                    android:text="@string/grant_dialog_button_allow_foreground"
                    style="@style/PermissionGrantButtonAllowForeground" />

                <Button
                <com.android.permissioncontroller.permission.ui.widget.SecureButton
                    android:id="@+id/permission_allow_one_time_button"
                    android:text="@string/grant_dialog_button_allow_one_time"
                    style="@style/PermissionGrantButtonAllowOneTime" />

                <Button
                <com.android.permissioncontroller.permission.ui.widget.SecureButton
                    android:id="@+id/permission_deny_button"
                    android:text="@string/grant_dialog_button_deny"
                    style="@style/PermissionGrantButtonDeny" />

                <Button
                <com.android.permissioncontroller.permission.ui.widget.SecureButton
                    android:id="@+id/permission_deny_and_dont_ask_again_button"
                    android:text="@string/grant_dialog_button_deny"
                    style="@style/PermissionGrantButtonDeny" />

                <Button
                <com.android.permissioncontroller.permission.ui.widget.SecureButton
                    android:id="@+id/permission_no_upgrade_button"
                    android:text="@string/grant_dialog_button_no_upgrade"
                    style="@style/PermissionGrantButtonNoUpgrade" />

                <Button
                <com.android.permissioncontroller.permission.ui.widget.SecureButton
                    android:id="@+id/permission_no_upgrade_and_dont_ask_again_button"
                    android:text="@string/grant_dialog_button_no_upgrade"
                    style="@style/PermissionGrantButtonNoUpgrade" />

                <Button
                <com.android.permissioncontroller.permission.ui.widget.SecureButton
                    android:id="@+id/permission_no_upgrade_one_time_button"
                    android:text="@string/grant_dialog_button_no_upgrade_one_time"
                    style="@style/PermissionGrantButtonNoUpgrade" />

                <Button
                <com.android.permissioncontroller.permission.ui.widget.SecureButton
                    android:id="@+id/permission_no_upgrade_one_time_and_dont_ask_again_button"
                    android:text="@string/grant_dialog_button_no_upgrade_one_time"
                    style="@style/PermissionGrantButtonNoUpgrade" />
+53 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2021 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.permissioncontroller.permission.ui.widget;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.Button;

/**
 * A button which doesn't allow clicking when any part of the window is obscured
 */
public class SecureButton extends Button {

    private static final int FLAGS_WINDOW_IS_OBSCURED =
            MotionEvent.FLAG_WINDOW_IS_OBSCURED | MotionEvent.FLAG_WINDOW_IS_PARTIALLY_OBSCURED;

    public SecureButton(Context context) {
        super(context);
    }

    public SecureButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public SecureButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public SecureButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    public boolean onFilterTouchEventForSecurity(MotionEvent event) {
        return (event.getFlags() & FLAGS_WINDOW_IS_OBSCURED) == 0
                && super.onFilterTouchEventForSecurity(event);
    }
}