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

Commit 5a3498c9 authored by Menghan Li's avatar Menghan Li Committed by Android (Google) Code Review
Browse files

Merge "Refactor CaptionMoreOptionsFragment to improve maintainability"

parents dea413b5 deb72e29
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -22,8 +22,8 @@

    <com.android.settings.accessibility.LocalePreference
        android:key="captioning_locale"
        android:summary="%s"
        android:title="@string/captioning_locale" />
        android:title="@string/captioning_locale"
        settings:controller="com.android.settings.accessibility.CaptionLocalePreferenceController"/>

    <com.android.settings.accessibility.AccessibilityFooterPreference
        android:key="captioning_more_options_footer"
+66 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 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 android.content.Context;
import android.provider.Settings;
import android.view.accessibility.CaptioningManager;

import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;

import com.android.settings.core.BasePreferenceController;

/** Controller that shows the caption locale summary. */
public class CaptionLocalePreferenceController extends BasePreferenceController
        implements Preference.OnPreferenceChangeListener {

    private final CaptioningManager mCaptioningManager;
    private LocalePreference mPreference;

    public CaptionLocalePreferenceController(Context context, String preferenceKey) {
        super(context, preferenceKey);
        mCaptioningManager = context.getSystemService(CaptioningManager.class);
    }

    @Override
    public int getAvailabilityStatus() {
        return AVAILABLE;
    }

    @Override
    public void displayPreference(PreferenceScreen screen) {
        super.displayPreference(screen);
        mPreference = screen.findPreference(getPreferenceKey());
        final String rawLocale = mCaptioningManager.getRawLocale();
        mPreference.setValue(rawLocale == null ? "" : rawLocale);
    }

    @Override
    public CharSequence getSummary() {
        return mPreference.getEntry();
    }

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        Settings.Secure.putString(mContext.getContentResolver(),
                Settings.Secure.ACCESSIBILITY_CAPTIONING_LOCALE, (String) newValue);
        mPreference.setValue((String) newValue);
        mPreference.setSummary(mPreference.getEntry());
        return true;
    }
}
+1 −48
Original line number Diff line number Diff line
@@ -17,13 +17,6 @@
package com.android.settings.accessibility;

import android.app.settings.SettingsEnums;
import android.content.ContentResolver;
import android.content.Context;
import android.os.Bundle;
import android.provider.Settings;
import android.view.accessibility.CaptioningManager;

import androidx.preference.Preference;

import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment;
@@ -32,31 +25,15 @@ import com.android.settingslib.search.SearchIndexable;

/** Settings fragment containing more options of captioning properties. */
@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
public class CaptionMoreOptionsFragment extends DashboardFragment
        implements Preference.OnPreferenceChangeListener {
public class CaptionMoreOptionsFragment extends DashboardFragment {

    private static final String TAG = "CaptionMoreOptionsFragment";
    private static final String PREF_LOCALE = "captioning_locale";

    private CaptioningManager mCaptioningManager;
    private LocalePreference mLocale;

    @Override
    public int getMetricsCategory() {
        return SettingsEnums.ACCESSIBILITY_CAPTION_MORE_OPTIONS;
    }

    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        super.onCreatePreferences(savedInstanceState, rootKey);

        mCaptioningManager = (CaptioningManager) getSystemService(Context.CAPTIONING_SERVICE);

        initializeAllPreferences();
        updateAllPreferences();
        installUpdateListeners();
    }

    @Override
    protected int getPreferenceScreenResId() {
        return R.xml.captioning_more_options;
@@ -67,30 +44,6 @@ public class CaptionMoreOptionsFragment extends DashboardFragment
        return TAG;
    }

    private void initializeAllPreferences() {
        mLocale = (LocalePreference) findPreference(PREF_LOCALE);
    }

    private void installUpdateListeners() {
        mLocale.setOnPreferenceChangeListener(this);
    }

    private void updateAllPreferences() {
        final String rawLocale = mCaptioningManager.getRawLocale();
        mLocale.setValue(rawLocale == null ? "" : rawLocale);
    }

    @Override
    public boolean onPreferenceChange(Preference preference, Object value) {
        final ContentResolver cr = getActivity().getContentResolver();
        if (mLocale == preference) {
            Settings.Secure.putString(
                    cr, Settings.Secure.ACCESSIBILITY_CAPTIONING_LOCALE, (String) value);
        }

        return true;
    }

    @Override
    public int getHelpResource() {
        return R.string.help_url_caption;
+92 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 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.google.common.truth.Truth.assertThat;

import static org.mockito.Mockito.when;

import android.content.Context;
import android.provider.Settings;

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

import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;

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

/** Tests for {@link CaptionLocalePreferenceController}. */
@RunWith(RobolectricTestRunner.class)
public class CaptionLocalePreferenceControllerTest {

    @Rule
    public final MockitoRule mMockitoRule = MockitoJUnit.rule();
    @Mock
    private PreferenceScreen mScreen;
    private final Context mContext = ApplicationProvider.getApplicationContext();
    private CaptionLocalePreferenceController mController;
    private LocalePreference mPreference;

    @Before
    public void setUp() {
        mController = new CaptionLocalePreferenceController(mContext, "captioning_local_pref");
        mPreference = new LocalePreference(mContext);
        when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
    }

    @Test
    public void getAvailabilityStatus_shouldReturnAvailable() {
        assertThat(mController.getAvailabilityStatus())
                .isEqualTo(BasePreferenceController.AVAILABLE);
    }

    @Test
    public void getSummary_byDefault_shouldReturnDefault() {
        mController.displayPreference(mScreen);

        assertThat(mController.getSummary().toString()).isEqualTo(
                mContext.getResources().getString(R.string.locale_default));
    }

    @Test
    public void getSummary_byArabicLocale_shouldReturnArabic() {
        Settings.Secure.putString(mContext.getContentResolver(),
                Settings.Secure.ACCESSIBILITY_CAPTIONING_LOCALE, "af_ZA");

        mController.displayPreference(mScreen);

        assertThat(mController.getSummary().toString()).isEqualTo("Afrikaans");
    }

    @Test
    public void onPreferenceChange_byArabicLocale_shouldReturnArabic() {
        mController.displayPreference(mScreen);

        mController.onPreferenceChange(mPreference, "af_ZA");

        assertThat(mPreference.getSummary().toString()).isEqualTo("Afrikaans");
    }
}
+50 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 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.google.common.truth.Truth.assertThat;

import android.content.Context;

import androidx.test.core.app.ApplicationProvider;

import com.android.settings.R;
import com.android.settings.testutils.XmlTestUtils;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;

import java.util.List;

/** Tests for {@link CaptionMoreOptionsFragment}. */
@RunWith(RobolectricTestRunner.class)
public class CaptionMoreOptionsFragmentTest {

    private Context mContext = ApplicationProvider.getApplicationContext();

    @Test
    public void getNonIndexableKeys_existInXmlLayout() {
        final List<String> niks = CaptionMoreOptionsFragment.SEARCH_INDEX_DATA_PROVIDER
                .getNonIndexableKeys(mContext);
        final List<String> keys =
                XmlTestUtils.getKeysFromPreferenceXml(mContext,
                        R.xml.captioning_more_options);

        assertThat(keys).containsAtLeastElementsIn(niks);
    }
}