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

Commit ba00aaa0 authored by Jeffrey Huang's avatar Jeffrey Huang Committed by Android (Google) Code Review
Browse files

Merge "Introduce HdcpCheckingPreferenceController"

parents b47c4a61 4acb1f66
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -248,7 +248,7 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra
        controllers.add(new BugReportPreferenceControllerV2(context));
        controllers.add(new LocalBackupPasswordPreferenceController(context));
        controllers.add(new StayAwakePreferenceController(context, lifecycle));
        // hdcp checking
        controllers.add(new HdcpCheckingPreferenceController(context));
        controllers.add(new BluetoothSnoopLogPreferenceController(context));
        controllers.add(new OemUnlockPreferenceController(context, activity, fragment));
        // running services
+109 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2017 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.development;

import android.content.Context;
import android.os.Build;
import android.os.SystemProperties;
import android.support.annotation.VisibleForTesting;
import android.support.v7.preference.ListPreference;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import android.text.TextUtils;

import com.android.settings.R;
import com.android.settingslib.development.SystemPropPoker;

public class HdcpCheckingPreferenceController extends
        DeveloperOptionsPreferenceController implements Preference.OnPreferenceChangeListener {

    private static final String HDCP_CHECKING_KEY = "hdcp_checking";

    @VisibleForTesting
    static final String HDCP_CHECKING_PROPERTY = "persist.sys.hdcp_checking";
    @VisibleForTesting
    static final String USER_BUILD_TYPE = "user";

    private final String[] mListValues;
    private final String[] mListSummaries;
    private ListPreference mPreference;

    public HdcpCheckingPreferenceController(Context context) {
        super(context);

        mListValues = mContext.getResources().getStringArray(R.array.hdcp_checking_values);
        mListSummaries = mContext.getResources().getStringArray(R.array.hdcp_checking_summaries);
    }

    @Override
    public boolean isAvailable() {
        return !TextUtils.equals(USER_BUILD_TYPE, getBuildType());
    }

    @Override
    public String getPreferenceKey() {
        return HDCP_CHECKING_KEY;
    }

    @Override
    public void displayPreference(PreferenceScreen screen) {
        super.displayPreference(screen);

        mPreference = (ListPreference) screen.findPreference(getPreferenceKey());
    }

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        SystemProperties.set(HDCP_CHECKING_PROPERTY, newValue.toString());
        updateHdcpValues();
        SystemPropPoker.getInstance().poke();
        return true;
    }

    @Override
    public void updateState(Preference preference) {
        updateHdcpValues();
    }

    @Override
    protected void onDeveloperOptionsSwitchEnabled() {
        mPreference.setEnabled(true);
    }

    @Override
    protected void onDeveloperOptionsSwitchDisabled() {
        mPreference.setEnabled(false);
    }

    private void updateHdcpValues() {
        final String currentValue = SystemProperties.get(HDCP_CHECKING_PROPERTY);
        int index = 1; // Defaults to drm-only. Needs to match with R.array.hdcp_checking_values
        for (int i = 0; i < mListValues.length; i++) {
            if (TextUtils.equals(currentValue, mListValues[i])) {
                index = i;
                break;
            }
        }
        mPreference.setValue(mListValues[index]);
        mPreference.setSummary(mListSummaries[index]);
    }

    @VisibleForTesting
    public String getBuildType() {
        return Build.TYPE;
    }
}
+164 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2017 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.development;

import static com.android.settings.development.HdcpCheckingPreferenceController
        .HDCP_CHECKING_PROPERTY;

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

import static org.mockito.Mockito.doReturn;
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.SystemProperties;
import android.support.v7.preference.ListPreference;
import android.support.v7.preference.PreferenceScreen;

import com.android.settings.R;
import com.android.settings.TestConfig;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.SettingsShadowSystemProperties;

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.RuntimeEnvironment;
import org.robolectric.annotation.Config;

@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH,
        sdk = TestConfig.SDK_VERSION,
        shadows = {SettingsShadowSystemProperties.class})
public class HdcpCheckingPreferenceControllerTest {

    private static final String USER_DEBUG = "userdebug";

    @Mock
    private ListPreference mPreference;
    @Mock
    private PreferenceScreen mScreen;

    private Context mContext;
    private HdcpCheckingPreferenceController mController;

    /**
     * Array Values Key
     *
     * 0: Never Check
     * 1: Check for DRM content only
     * 2: Always Check
     */
    private String[] mValues;
    private String[] mSummaries;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        mContext = RuntimeEnvironment.application;
        mValues = mContext.getResources().getStringArray(R.array.hdcp_checking_values);
        mSummaries = mContext.getResources().getStringArray(R.array.hdcp_checking_summaries);
        mController = new HdcpCheckingPreferenceController(mContext);
        when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
        mController.displayPreference(mScreen);

    }

    @After
    public void teardown() {
        SettingsShadowSystemProperties.clear();
    }

    @Test
    public void isAvailable_isUserBuildType_shouldReturnFalse() {
        mController = spy(mController);
        doReturn(HdcpCheckingPreferenceController.USER_BUILD_TYPE).when(mController).getBuildType();

        assertThat(mController.isAvailable()).isFalse();
    }

    @Test
    public void isAvailable_isUserDebugBuildType_shouldReturnTrue() {
        mController = spy(mController);
        doReturn(USER_DEBUG).when(mController).getBuildType();

        assertThat(mController.isAvailable()).isTrue();
    }

    @Test
    public void onPreferenceChange_setNeverCheckHdcp_shouldEnableNeverCheckHdcp() {
        mController.onPreferenceChange(mPreference, mValues[0]);

        assertThat(SystemProperties.get(HDCP_CHECKING_PROPERTY)).isEqualTo(mValues[0]);
    }

    @Test
    public void onPreferenceChange_setCheckDrm_shouldEnableCheckDrm() {
        mController.onPreferenceChange(mPreference, mValues[1]);

        assertThat(SystemProperties.get(HDCP_CHECKING_PROPERTY)).isEqualTo(mValues[1]);
    }

    @Test
    public void updateState_neverCheckHdcp_shouldEnableNeverCheckHdcp() {
        SystemProperties.set(HDCP_CHECKING_PROPERTY, mValues[0]);

        mController.updateState(mPreference);

        verify(mPreference).setValue(mValues[0]);
        verify(mPreference).setSummary(mSummaries[0]);
    }

    @Test
    public void updateState_checkDrm_shouldEnableCheckDrm() {
        SystemProperties.set(HDCP_CHECKING_PROPERTY, mValues[1]);

        mController.updateState(mPreference);

        verify(mPreference).setValue(mValues[1]);
        verify(mPreference).setSummary(mSummaries[1]);
    }

    @Test
    public void updateState_noValueSet_shouldEnableCheckDrmAsDefault() {
        SystemProperties.set(HDCP_CHECKING_PROPERTY, null);

        mController.updateState(mPreference);

        verify(mPreference).setValue(mValues[1]);
        verify(mPreference).setSummary(mSummaries[1]);
    }

    @Test
    public void onDeveloperOptionsSwitchDisabled_shouldDisablePreference() {
        mController.onDeveloperOptionsSwitchDisabled();

        verify(mPreference).setEnabled(false);
    }

    @Test
    public void onDeveloperOptionsSwitchEnabled_shouldEnablePreference() {
        mController.onDeveloperOptionsSwitchEnabled();

        verify(mPreference).setEnabled(true);
    }
}