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

Commit 8bee3cf3 authored by Azhara Assanova's avatar Azhara Assanova Committed by Android (Google) Code Review
Browse files

Merge "Fix accessibility issue with RestrictedSwitchPreference" into main

parents 65ae124c 36060eb0
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");
    }
}