<!-- 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>
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" />
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));
+++ /dev/null
-/*
- * 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
- }
- }
-}
+++ /dev/null
-/*
- * 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);
- }
-}