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

Commit 36060eb0 authored by Azhara Assanova's avatar Azhara Assanova
Browse files

Fix accessibility issue with RestrictedSwitchPreference

This fixes an issue where the summary of the RestrictedSwitchPreference
got changed to the default summary when accessbility is enabled and the
preference that is disabled by an admin is clicked.

Bug: 363003265
Test: manual
Test: atest RestrictedSwitchPreferenceTest
Flag: EXEMPT bug fix
Change-Id: I6adc76ee12ea6697600c9979dc2c427376e2ef9e
parent ff6d28c6
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -199,6 +199,15 @@ public class RestrictedSwitchPreference extends SwitchPreferenceCompat implement
        }
    }

    @Override
    protected void syncSummaryView(@NonNull View view) {
        if (isDisabledByAdmin() || isDisabledByEcm()) {
            // Summary should already be set, so no need to sync.
            return;
        }
        super.syncSummaryView(view);
    }

    public void useAdminDisabledSummary(boolean useSummary) {
        mHelper.useAdminDisabledSummary(useSummary);
    }
+121 −2
Original line number Diff line number Diff line
@@ -16,40 +16,89 @@

package com.android.settingslib;

import static android.security.advancedprotection.AdvancedProtectionManager.ADVANCED_PROTECTION_SYSTEM_ENTITY;

import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin.createDefaultEnforcedAdminWithRestriction;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;

import android.app.admin.Authority;
import android.app.admin.DevicePolicyManager;
import android.app.admin.DevicePolicyResourcesManager;
import android.app.admin.EnforcingAdmin;
import android.app.admin.UnknownAuthority;
import android.app.ecm.EnhancedConfirmationManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.UserHandle;
import android.view.View;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityManager;
import android.widget.ImageView;

import androidx.preference.PreferenceViewHolder;
import androidx.test.core.app.ApplicationProvider;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;

@RunWith(RobolectricTestRunner.class)
public class RestrictedSwitchPreferenceTest {

    private static final int SIZE = 50;
    private final Authority mAdvancedProtectionAuthority = new UnknownAuthority(
            ADVANCED_PROTECTION_SYSTEM_ENTITY);

    private AutoCloseable mMockCloseable;
    private RestrictedSwitchPreference mPreference;
    private Context mContext;
    private PreferenceViewHolder mViewHolder;
    private View mRootView;
    private ImageView mImageView;
    @Mock
    private DevicePolicyManager mDevicePolicyManager;
    @Mock
    private DevicePolicyResourcesManager mDevicePolicyResourcesManager;
    @Mock
    private AccessibilityManager mAccessibilityManager;
    @Mock
    private EnhancedConfirmationManager mEcManager;

    @Before
    public void setUp() {
        mContext = RuntimeEnvironment.application;
        mMockCloseable = MockitoAnnotations.openMocks(this);
        mContext = spy(ApplicationProvider.getApplicationContext());
        mPreference = new RestrictedSwitchPreference(mContext);
        mRootView = View.inflate(mContext, R.layout.restricted_switch_preference,
                null /* parent */);
        mViewHolder = PreferenceViewHolder.createInstanceForTests(mRootView);
        mImageView = (ImageView) mViewHolder.findViewById(android.R.id.icon);
        doReturn(mDevicePolicyResourcesManager).when(mDevicePolicyManager).getResources();
        doReturn(mDevicePolicyManager).when(mContext).getSystemService(DevicePolicyManager.class);
        doReturn(mAccessibilityManager).when(mContext)
                .getSystemService(Context.ACCESSIBILITY_SERVICE);
        doReturn(mEcManager).when(mContext)
                .getSystemService(Context.ECM_ENHANCED_CONFIRMATION_SERVICE);
    }

    @After
    public void tearDown() throws Exception {
        mMockCloseable.close();
    }

    @Test
@@ -71,4 +120,74 @@ public class RestrictedSwitchPreferenceTest {
        assertThat(mImageView.getLayoutParams().width).isEqualTo(
                ViewGroup.LayoutParams.WRAP_CONTENT);
    }

    @Test
    public void performClick_withAccessibility_notDisabled_keepsDefaultSummary() {
        mPreference.setSummary("default summary");

        when(mAccessibilityManager.isEnabled()).thenReturn(true);

        assertThat(mPreference.getSummary().toString()).isEqualTo("default summary");

        mPreference.performClick();

        assertThat(mPreference.getSummary().toString()).isEqualTo("default summary");
    }

    @Test
    public void performClick_withAccessibility_disabledByAdmin_keepsDisabledSummary() {
        when(mDevicePolicyResourcesManager.getString(any(), any())).thenReturn("test");
        when(mContext.getString(
                com.android.settingslib.widget.restricted.R.string.disabled_by_admin))
                    .thenReturn("test");
        doNothing().when(mContext).startActivityAsUser(any(), any());
        when(mAccessibilityManager.isEnabled()).thenReturn(true);

        mPreference.setDisabledByAdmin(new RestrictedLockUtils.EnforcedAdmin());

        assertThat(mPreference.getSummary().toString()).isEqualTo("test");

        mPreference.performClick();

        assertThat(mPreference.getSummary().toString()).isEqualTo("test");
    }

    @Test
    public void performClick_withAccessibility_disabledByAdvancedProtection_keepsDefaultSummary() {
        mPreference.setSummary("default summary");

        when(mDevicePolicyManager.getEnforcingAdmin(anyInt(), any())).thenReturn(
                new EnforcingAdmin("pkg.test", mAdvancedProtectionAuthority, UserHandle.of(
                        UserHandle.myUserId()), new ComponentName("admin", "adminclass")));
        doNothing().when(mContext).startActivityAsUser(any(), any());
        when(mAccessibilityManager.isEnabled()).thenReturn(true);

        mPreference.setDisabledByAdmin(createDefaultEnforcedAdminWithRestriction("identifier"));

        assertThat(mPreference.getSummary().toString()).isEqualTo("default summary");

        mPreference.performClick();

        assertThat(mPreference.getSummary().toString()).isEqualTo("default summary");
    }

    @Test
    public void performClick_withAccessibility_disabledByEcm_keepsDisabledSummary()
            throws PackageManager.NameNotFoundException {
        when(mEcManager.isRestricted(any(), any())).thenReturn(true);
        when(mEcManager.createRestrictedSettingDialogIntent(any(), any()))
                .thenReturn(mock(Intent.class));
        when(mContext.getString(R.string.disabled_by_app_ops_text)).thenReturn("test");
        doNothing().when(mContext).startActivity(any());
        when(mAccessibilityManager.isEnabled()).thenReturn(true);

        mPreference.checkEcmRestrictionAndSetDisabled("setting", "pkg.test",
                /* settingEnabled */ false);

        assertThat(mPreference.getSummary().toString()).isEqualTo("test");

        mPreference.performClick();

        assertThat(mPreference.getSummary().toString()).isEqualTo("test");
    }
}