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

Commit 606e8b1f authored by Jason Hsu's avatar Jason Hsu Committed by Android (Google) Code Review
Browse files

Merge "Fix crash when rotating the device on magnification mode dialog"

parents 1d4857d8 bab448a6
Loading
Loading
Loading
Loading
+46 −30
Original line number Diff line number Diff line
@@ -30,6 +30,9 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;

import com.android.settings.R;
@@ -45,20 +48,41 @@ public class MagnificationSettingsFragment extends DashboardFragment {

    private static final String TAG = "MagnificationSettingsFragment";
    private static final String PREF_KEY_MODE = "magnification_mode";
    private static final int DIALOG_MAGNIFICATION_CAPABILITY = 1;
    private static final int DIALOG_MAGNIFICATION_SWITCH_SHORTCUT = 2;
    private static final String EXTRA_CAPABILITY = "capability";
    @VisibleForTesting
    static final int DIALOG_MAGNIFICATION_CAPABILITY = 1;
    @VisibleForTesting
    static final int DIALOG_MAGNIFICATION_SWITCH_SHORTCUT = 2;
    @VisibleForTesting
    static final String EXTRA_CAPABILITY = "capability";
    private static final int NONE = 0;
    private static final char COMPONENT_NAME_SEPARATOR = ':';

    private Preference mModePreference;
    @VisibleForTesting
    Dialog mDialog;
    @VisibleForTesting
    CheckBox mMagnifyFullScreenCheckBox;
    @VisibleForTesting
    CheckBox mMagnifyWindowCheckBox;

    private int mCapabilities = NONE;
    private CheckBox mMagnifyFullScreenCheckBox;
    private CheckBox mMagnifyWindowCheckBox;
    private Dialog mDialog;

    @Override
    public int getMetricsCategory() {
        return SettingsEnums.ACCESSIBILITY_MAGNIFICATION_SETTINGS;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (savedInstanceState != null) {
            mCapabilities = savedInstanceState.getInt(EXTRA_CAPABILITY, NONE);
        }
        if (mCapabilities == NONE) {
            mCapabilities = MagnificationCapabilities.getCapabilities(getPrefContext());
        }
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        initModePreference();
    }

    @Override
@@ -68,14 +92,8 @@ public class MagnificationSettingsFragment extends DashboardFragment {
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        if (savedInstanceState != null) {
            mCapabilities = savedInstanceState.getInt(EXTRA_CAPABILITY, NONE);
        }
        if (mCapabilities == NONE) {
            mCapabilities = MagnificationCapabilities.getCapabilities(getPrefContext());
        }
    public int getMetricsCategory() {
        return SettingsEnums.ACCESSIBILITY_MAGNIFICATION_SETTINGS;
    }

    @Override
@@ -95,17 +113,6 @@ public class MagnificationSettingsFragment extends DashboardFragment {
        return TAG;
    }

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        mModePreference = findPreference(PREF_KEY_MODE);
        mModePreference.setOnPreferenceClickListener(preference -> {
            mCapabilities = MagnificationCapabilities.getCapabilities(getPrefContext());
            showDialog(DIALOG_MAGNIFICATION_CAPABILITY);
            return true;
        });
    }

    @Override
    protected int getPreferenceScreenResId() {
        return R.xml.accessibility_magnification_service_settings;
@@ -133,6 +140,15 @@ public class MagnificationSettingsFragment extends DashboardFragment {
        throw new IllegalArgumentException("Unsupported dialogId " + dialogId);
    }

    private void initModePreference() {
        mModePreference = findPreference(PREF_KEY_MODE);
        mModePreference.setOnPreferenceClickListener(preference -> {
            mCapabilities = MagnificationCapabilities.getCapabilities(getPrefContext());
            showDialog(DIALOG_MAGNIFICATION_CAPABILITY);
            return true;
        });
    }

    private void callOnAlertDialogCheckboxClicked(DialogInterface dialog, int which) {
        updateCapabilities(true);
        mModePreference.setSummary(
@@ -181,11 +197,11 @@ public class MagnificationSettingsFragment extends DashboardFragment {
        final View dialogWindowTextArea = dialogWidowView.findViewById(R.id.container);
        mMagnifyWindowCheckBox = dialogWidowView.findViewById(R.id.checkbox);

        setTextAreasClickListener(dialogFullScreenTextArea, mMagnifyFullScreenCheckBox,
                dialogWindowTextArea, mMagnifyWindowCheckBox);

        updateAlertDialogCheckState();
        updateAlertDialogEnableState(dialogFullScreenTextArea, dialogWindowTextArea);

        setTextAreasClickListener(dialogFullScreenTextArea, mMagnifyFullScreenCheckBox,
                dialogWindowTextArea, mMagnifyWindowCheckBox);
    }

    private void setTextAreasClickListener(View fullScreenTextArea, CheckBox fullScreenCheckBox,
+158 −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.settings.accessibility;

import static com.android.settings.accessibility.MagnificationPreferenceFragment.ON;

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

import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.content.Context;
import android.os.Bundle;
import android.provider.Settings;
import android.view.View;

import androidx.fragment.app.FragmentManager;
import androidx.preference.PreferenceManager;
import androidx.test.core.app.ApplicationProvider;

import com.android.settings.R;
import com.android.settings.testutils.shadow.ShadowDashboardFragment;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;

/** Tests for {@link MagnificationSettingsFragment} */
@RunWith(RobolectricTestRunner.class)
@Config(shadows = ShadowDashboardFragment.class)
public class MagnificationSettingsFragmentTest {

    @Rule
    public MockitoRule mocks = MockitoJUnit.rule();

    @Mock
    private PreferenceManager mPreferenceManager;

    private static final String EXTRA_CAPABILITY =
            MagnificationSettingsFragment.EXTRA_CAPABILITY;

    private final Context mContext = ApplicationProvider.getApplicationContext();
    private TestMagnificationSettingsFragment mFragment;

    @Before
    public void setUpFragment() {
        mFragment = spy(new TestMagnificationSettingsFragment());
        when(mFragment.getPreferenceManager()).thenReturn(mPreferenceManager);
        when(mFragment.getPreferenceManager().getContext()).thenReturn(mContext);
        doReturn(mock(FragmentManager.class, Answers.RETURNS_DEEP_STUBS)).when(
                mFragment).getChildFragmentManager();
        mContext.setTheme(R.style.Theme_AppCompat);
    }

    @Test
    public void onCreateDialog_capabilitiesInBundle_matchCheckBoxStatus() {
        final Bundle windowModeSavedInstanceState = new Bundle();
        windowModeSavedInstanceState.putInt(EXTRA_CAPABILITY,
                Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW);

        mFragment.onCreate(windowModeSavedInstanceState);
        mFragment.onCreateDialog(MagnificationSettingsFragment.DIALOG_MAGNIFICATION_CAPABILITY);

        assertThat(mFragment.mMagnifyFullScreenCheckBox.isChecked()).isFalse();
        assertThat(mFragment.mMagnifyWindowCheckBox.isChecked()).isTrue();
    }

    @Test
    public void onCreateDialog_capabilitiesInSettings_matchCheckBoxStatus() {
        MagnificationCapabilities.setCapabilities(mContext,
                Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN);
        mFragment.onCreate(Bundle.EMPTY);
        mFragment.onCreateDialog(MagnificationSettingsFragment.DIALOG_MAGNIFICATION_CAPABILITY);

        assertThat(mFragment.mMagnifyFullScreenCheckBox.isChecked()).isTrue();
        assertThat(mFragment.mMagnifyWindowCheckBox.isChecked()).isFalse();
    }

    @Test
    public void onCreateDialog_capabilitiesInSettingsAndBundle_matchBundleValueCheckBoxStatus() {
        final Bundle allModeSavedInstanceState = new Bundle();
        allModeSavedInstanceState.putInt(EXTRA_CAPABILITY,
                Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_ALL);

        MagnificationCapabilities.setCapabilities(mContext,
                Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW);
        mFragment.onCreate(allModeSavedInstanceState);
        mFragment.onCreateDialog(MagnificationSettingsFragment.DIALOG_MAGNIFICATION_CAPABILITY);

        assertThat(mFragment.mMagnifyFullScreenCheckBox.isChecked()).isTrue();
        assertThat(mFragment.mMagnifyWindowCheckBox.isChecked()).isTrue();
    }

    @Test
    public void onCreateDialog_emptySettingsAndBundle_matchDefaultValueCheckBoxStatus() {
        mFragment.onCreate(Bundle.EMPTY);
        mFragment.onCreateDialog(MagnificationSettingsFragment.DIALOG_MAGNIFICATION_CAPABILITY);

        // Compare to default Capabilities
        assertThat(mFragment.mMagnifyFullScreenCheckBox.isChecked()).isTrue();
        assertThat(mFragment.mMagnifyWindowCheckBox.isChecked()).isFalse();
    }

    @Test
    public void checkWindowModeCheckBox_tripleTapEnabled_showSwitchShortcutDialog() {
        final Bundle fullScreenModeSavedInstanceState = new Bundle();
        fullScreenModeSavedInstanceState.putInt(EXTRA_CAPABILITY,
                Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN);
        mFragment.onCreate(fullScreenModeSavedInstanceState);
        mFragment.onCreateDialog(MagnificationSettingsFragment.DIALOG_MAGNIFICATION_CAPABILITY);

        enableTripleTap();
        final View dialogWidowView = mFragment.mDialog.findViewById(R.id.magnify_window_screen);
        final View dialogWindowTextArea = dialogWidowView.findViewById(R.id.container);
        dialogWindowTextArea.performClick();

        verify(mFragment).showDialog(
                MagnificationSettingsFragment.DIALOG_MAGNIFICATION_SWITCH_SHORTCUT);
    }

    private void enableTripleTap() {
        Settings.Secure.putInt(mContext.getContentResolver(),
                Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, ON);
    }

    public static class TestMagnificationSettingsFragment extends MagnificationSettingsFragment {
        public TestMagnificationSettingsFragment() {}

        @Override
        protected void showDialog(int dialogId) {
            super.showDialog(dialogId);
        }
    }
}