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

Commit 34537c1c authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Revert "Add Support for Virtual High Refresh Rate mode""

parents 2f5200ea 86d0b282
Loading
Loading
Loading
Loading
+0 −6
Original line number Diff line number Diff line
@@ -10084,12 +10084,6 @@
    <!-- Title for Connected device shortcut [CHAR LIMIT=30] -->
    <string name="devices_title">Devices</string>
    <!-- UI debug setting: Enable High Refresh Rate virtual panel [CHAR LIMIT=25] -->
    <string name="high_frequency_display_device_title">High Frequency Panel</string>
    <!-- UI debug setting: Enable High Refresh Rate virtual panel [CHAR LIMIT=50] -->
    <string name="high_frequency_display_device_summary">Enable Virtual High Frequency Panel</string>
    <!-- Homepage bottom menu. Title for display all Settings [CHAR LIMIT=30] -->
    <string name="homepage_all_settings">All Settings</string>
+0 −5
Original line number Diff line number Diff line
@@ -364,11 +364,6 @@
            android:entries="@array/overlay_display_devices_entries"
            android:entryValues="@array/overlay_display_devices_values" />

        <SwitchPreference
            android:key="high_frequency_display_device"
            android:title="@string/high_frequency_display_device_title"
            android:summary="@string/high_frequency_display_device_summary" />

        <com.android.settings.display.DensityPreference
            android:key="density"
            android:title="@string/developer_smallest_width" />
+0 −1
Original line number Diff line number Diff line
@@ -440,7 +440,6 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra
        controllers.add(new TransitionAnimationScalePreferenceController(context));
        controllers.add(new AnimatorDurationScalePreferenceController(context));
        controllers.add(new SecondaryDisplayPreferenceController(context));
        controllers.add(new HighFrequencyDisplayPreferenceController(context));
        controllers.add(new GpuViewUpdatesPreferenceController(context));
        controllers.add(new HardwareLayersUpdatesPreferenceController(context));
        controllers.add(new DebugGpuOverdrawPreferenceController(context));
+0 −126
Original line number Diff line number Diff line
/*
 * Copyright (C) 2018 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.IBinder;
import android.os.Parcel;
import android.os.RemoteException;
import android.os.ServiceManager;

import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import androidx.preference.SwitchPreference;

import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.development.DeveloperOptionsPreferenceController;

public class HighFrequencyDisplayPreferenceController extends DeveloperOptionsPreferenceController
        implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin {

    private static final String HIGH_FREQUENCY_DISPLAY_KEY = "high_frequency_display_device";

    private static final String SURFACE_FLINGER_SERVICE_KEY = "SurfaceFlinger";
    private static final String SURFACE_COMPOSER_INTERFACE_KEY = "android.ui.ISurfaceComposer";
    private static final int SURFACE_FLINGER_HIGH_FREQUENCY_DISPLAY_CODE = 1029;

    private final IBinder mSurfaceFlingerBinder;

    public HighFrequencyDisplayPreferenceController(Context context) {
        super(context);
        mSurfaceFlingerBinder = ServiceManager.getService(SURFACE_FLINGER_SERVICE_KEY);
    }

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

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        Boolean isEnabled = (Boolean) newValue;
        writeHighFrequencyDisplaySetting(isEnabled);
        ((SwitchPreference) preference).setChecked(isEnabled);
        return true;
    }

    @Override
    public void updateState(Preference preference) {
        boolean enableHighFrequencyPanel = readHighFrequencyDisplaySetting();
        ((SwitchPreference) preference).setChecked(enableHighFrequencyPanel);
    }

    @Override
    protected void onDeveloperOptionsSwitchDisabled() {
        super.onDeveloperOptionsSwitchDisabled();
        writeHighFrequencyDisplaySetting(false);
        ((SwitchPreference) mPreference).setChecked(false);
    }

    @VisibleForTesting
    boolean readHighFrequencyDisplaySetting() {
        boolean isEnabled = false;
        try {
            if (mSurfaceFlingerBinder != null) {
                final Parcel data = Parcel.obtain();
                final Parcel result = Parcel.obtain();
                data.writeInterfaceToken(SURFACE_COMPOSER_INTERFACE_KEY);
                data.writeInt(0);
                data.writeInt(0);
                mSurfaceFlingerBinder.transact(
                        SURFACE_FLINGER_HIGH_FREQUENCY_DISPLAY_CODE,
                        data, result, 0);

                if (result.readInt() != 1 || result.readInt() != 1) {
                    isEnabled = true;
                }
            }
        } catch (RemoteException ex) {
            // intentional no-op
        }
        return isEnabled;
    }

    @VisibleForTesting
    void writeHighFrequencyDisplaySetting(boolean isEnabled) {
        int multiplier;
        int divisor;

        if (isEnabled) {
            // 60Hz * 3/2 = 90Hz
            multiplier = 2;
            divisor = 3;
        } else {
            multiplier = 1;
            divisor = 1;
        }

        try {
            if (mSurfaceFlingerBinder != null) {
                final Parcel data = Parcel.obtain();
                data.writeInterfaceToken(SURFACE_COMPOSER_INTERFACE_KEY);
                data.writeInt(multiplier);
                data.writeInt(divisor);
                mSurfaceFlingerBinder.transact(
                        SURFACE_FLINGER_HIGH_FREQUENCY_DISPLAY_CODE,
                        data, null, 0);
            }
        } catch (RemoteException ex) {
            // intentional no-op
        }
    }
}
+0 −107
Original line number Diff line number Diff line
/*
 * Copyright (C) 2018 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 org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.content.Context;
import android.os.IBinder;
import android.os.RemoteException;

import androidx.preference.PreferenceScreen;
import androidx.preference.SwitchPreference;

import com.android.settings.testutils.SettingsRobolectricTestRunner;

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.util.ReflectionHelpers;

@RunWith(SettingsRobolectricTestRunner.class)
public class HighFrequencyPreferenceControllerTest {

    private Context mContext;
    private SwitchPreference mPreference;

    @Mock
    private PreferenceScreen mScreen;
    @Mock
    private IBinder mSurfaceFlingerBinder;

    private HighFrequencyDisplayPreferenceController mController;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        mContext = RuntimeEnvironment.application;
        mPreference = new SwitchPreference(mContext);
        mController = spy(new HighFrequencyDisplayPreferenceController(mContext));
        ReflectionHelpers.setField(mController, "mSurfaceFlingerBinder", mSurfaceFlingerBinder);
        when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
        mController.displayPreference(mScreen);
    }

    @Test
    public void onPreferenceChange_settingToggledOn_shouldWriteTrueToHighFrequencySetting() {
        mController.onPreferenceChange(mPreference, true /* new value */);

        verify(mController).writeHighFrequencyDisplaySetting(true);
    }

    @Test
    public void onPreferenceChange_settingToggledOff_shouldWriteFalseToHighFrequencySetting() {
        mController.onPreferenceChange(mPreference, false /* new value */);

        verify(mController).writeHighFrequencyDisplaySetting(false);
    }

    @Test
    public void updateState_settingEnabled_shouldCheckPreference() throws RemoteException {
        mController.writeHighFrequencyDisplaySetting(true);
        mController.updateState(mPreference);

        verify(mController).readHighFrequencyDisplaySetting();
    }

    @Test
    public void updateState_settingDisabled_shouldUnCheckPreference() throws RemoteException {
        mController.writeHighFrequencyDisplaySetting(true);
        mController.updateState(mPreference);

        verify(mController).readHighFrequencyDisplaySetting();
    }

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

        verify(mController).writeHighFrequencyDisplaySetting(false);
    }

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

        verify(mController).writeHighFrequencyDisplaySetting(false);
    }
}