Call DisplayDensityUtils from ExternalDisplay settings to adjust display size

Flag: com.android.settings.flags.display_size_connected_display_setting
Test: atest ExternalDisplayPreferenceFragmentTest
Bug: 392853666
Change-Id: Iaa97f461e80a4e749ec3d2b47985a6be4a81a95b
This commit is contained in:
Ebru Kurnaz
2025-02-18 16:08:55 +00:00
parent bdd9cca602
commit 8054a152b9
3 changed files with 87 additions and 11 deletions

View File

@@ -19,6 +19,8 @@ package com.android.settings.accessibility;
import android.content.Context; import android.content.Context;
import android.content.res.Resources; import android.content.res.Resources;
import androidx.annotation.NonNull;
import com.android.settingslib.display.DisplayDensityUtils; import com.android.settingslib.display.DisplayDensityUtils;
import java.util.Arrays; import java.util.Arrays;
@@ -28,13 +30,17 @@ import java.util.stream.Collectors;
/** /**
* Data class for storing the configurations related to the display size. * Data class for storing the configurations related to the display size.
*/ */
class DisplaySizeData extends PreviewSizeData<Integer> { public class DisplaySizeData extends PreviewSizeData<Integer> {
private final DisplayDensityUtils mDensity; private final DisplayDensityUtils mDensity;
DisplaySizeData(Context context) { DisplaySizeData(Context context) {
this(context, new DisplayDensityUtils(context));
}
public DisplaySizeData(@NonNull Context context, @NonNull DisplayDensityUtils util) {
super(context); super(context);
mDensity = new DisplayDensityUtils(getContext()); mDensity = util;
final int initialIndex = mDensity.getCurrentIndex(); final int initialIndex = mDensity.getCurrentIndex();
if (initialIndex < 0) { if (initialIndex < 0) {
// Failed to obtain default density, which means we failed to // Failed to obtain default density, which means we failed to
@@ -54,7 +60,7 @@ class DisplaySizeData extends PreviewSizeData<Integer> {
} }
@Override @Override
void commit(int currentProgress) { public void commit(int currentProgress) {
final int densityDpi = getValues().get(currentProgress); final int densityDpi = getValues().get(currentProgress);
if (densityDpi == getDefaultValue()) { if (densityDpi == getDefaultValue()) {
mDensity.clearForcedDisplayDensity(); mDensity.clearForcedDisplayDensity();

View File

@@ -40,7 +40,8 @@ abstract class PreviewSizeData<T extends Number> {
return mContext; return mContext;
} }
List<T> getValues() { @NonNull
public List<T> getValues() {
return mValues; return mValues;
} }
@@ -56,7 +57,7 @@ abstract class PreviewSizeData<T extends Number> {
mDefaultValue = defaultValue; mDefaultValue = defaultValue;
} }
int getInitialIndex() { public int getInitialIndex() {
return mInitialIndex; return mInitialIndex;
} }

View File

@@ -32,8 +32,11 @@ import android.app.Activity;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.content.Context; import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.os.SystemClock;
import android.view.Choreographer;
import android.view.Display; import android.view.Display;
import android.view.View; import android.view.View;
import android.widget.SeekBar;
import android.widget.TextView; import android.widget.TextView;
import android.window.DesktopExperienceFlags; import android.window.DesktopExperienceFlags;
@@ -48,10 +51,12 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragmentBase; import com.android.settings.SettingsPreferenceFragmentBase;
import com.android.settings.accessibility.AccessibilitySeekBarPreference; import com.android.settings.accessibility.AccessibilitySeekBarPreference;
import com.android.settings.accessibility.DisplaySizeData;
import com.android.settings.accessibility.TextReadingPreferenceFragment; import com.android.settings.accessibility.TextReadingPreferenceFragment;
import com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.DisplayListener; import com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.DisplayListener;
import com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.Injector; import com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.Injector;
import com.android.settings.core.SubSettingLauncher; import com.android.settings.core.SubSettingLauncher;
import com.android.settingslib.display.DisplayDensityUtils;
import com.android.settingslib.widget.FooterPreference; import com.android.settingslib.widget.FooterPreference;
import com.android.settingslib.widget.IllustrationPreference; import com.android.settingslib.widget.IllustrationPreference;
import com.android.settingslib.widget.MainSwitchPreference; import com.android.settingslib.widget.MainSwitchPreference;
@@ -368,7 +373,7 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
@NonNull @NonNull
private AccessibilitySeekBarPreference reuseSizePreference(Context context, private AccessibilitySeekBarPreference reuseSizePreference(Context context,
PrefRefresh refresh) { PrefRefresh refresh, int displayId) {
AccessibilitySeekBarPreference pref = AccessibilitySeekBarPreference pref =
refresh.findUnusedPreference(PrefBasics.EXTERNAL_DISPLAY_SIZE.key); refresh.findUnusedPreference(PrefBasics.EXTERNAL_DISPLAY_SIZE.key);
if (pref == null) { if (pref == null) {
@@ -378,11 +383,27 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
pref.setIconEnd(R.drawable.ic_add_24dp); pref.setIconEnd(R.drawable.ic_add_24dp);
pref.setIconEndContentDescription(R.string.screen_zoom_make_larger_desc); pref.setIconEndContentDescription(R.string.screen_zoom_make_larger_desc);
PrefBasics.EXTERNAL_DISPLAY_SIZE.apply(pref); PrefBasics.EXTERNAL_DISPLAY_SIZE.apply(pref);
setStateForDisplaySizePreference(context, displayId, pref);
} }
refresh.addPreference(pref); refresh.addPreference(pref);
return pref; return pref;
} }
private void setStateForDisplaySizePreference(Context context, int displayId,
AccessibilitySeekBarPreference preference) {
var displaySizeData = new DisplaySizeData(context,
new DisplayDensityUtils(context, (info) -> info.displayId == displayId));
ExternalDisplaySizePreferenceStateHandler seekBarChangeHandler =
new ExternalDisplaySizePreferenceStateHandler(
displaySizeData, preference);
preference.setMax(displaySizeData.getValues().size() - 1);
preference.setProgress(displaySizeData.getInitialIndex());
preference.setContinuousUpdates(false);
preference.setOnSeekBarChangeListener(seekBarChangeHandler);
}
private void restoreState(@Nullable Bundle savedInstanceState) { private void restoreState(@Nullable Bundle savedInstanceState) {
if (savedInstanceState == null) { if (savedInstanceState == null) {
return; return;
@@ -514,7 +535,7 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
} }
} }
if (isDisplaySizeSettingEnabled(mInjector)) { if (isDisplaySizeSettingEnabled(mInjector)) {
addSizePreference(context, refresh); addSizePreference(context, refresh, display.getDisplayId());
} }
} }
@@ -685,8 +706,8 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
pref.setEnabled(isResolutionSettingEnabled(mInjector)); pref.setEnabled(isResolutionSettingEnabled(mInjector));
} }
private void addSizePreference(final Context context, PrefRefresh refresh) { private void addSizePreference(final Context context, PrefRefresh refresh, int displayId) {
var pref = reuseSizePreference(context, refresh); var pref = reuseSizePreference(context, refresh, displayId);
pref.setSummary(EXTERNAL_DISPLAY_SIZE_SUMMARY_RESOURCE); pref.setSummary(EXTERNAL_DISPLAY_SIZE_SUMMARY_RESOURCE);
pref.setOnPreferenceClickListener( pref.setOnPreferenceClickListener(
(Preference p) -> { (Preference p) -> {
@@ -735,6 +756,54 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
} }
} }
private static class ExternalDisplaySizePreferenceStateHandler
implements SeekBar.OnSeekBarChangeListener {
private static final long MIN_COMMIT_INTERVAL_MS = 800;
private static final long CHANGE_BY_BUTTON_DELAY_MS = 300;
private final DisplaySizeData mDisplaySizeData;
private int mLastDisplayProgress;
private long mLastCommitTime;
private final AccessibilitySeekBarPreference mPreference;
ExternalDisplaySizePreferenceStateHandler(DisplaySizeData displaySizeData,
AccessibilitySeekBarPreference preference) {
mDisplaySizeData = displaySizeData;
mPreference = preference;
}
final Choreographer.FrameCallback mCommit = this::tryCommitDisplaySizeConfig;
private void tryCommitDisplaySizeConfig(long unusedFrameTimeNanos) {
final int displayProgress = mPreference.getProgress();
if (displayProgress != mLastDisplayProgress) {
mDisplaySizeData.commit(displayProgress);
mLastDisplayProgress = displayProgress;
}
mLastCommitTime = SystemClock.elapsedRealtime();
}
private void postCommitDelayed() {
var commitDelayMs = CHANGE_BY_BUTTON_DELAY_MS;
if (SystemClock.elapsedRealtime() - mLastCommitTime < MIN_COMMIT_INTERVAL_MS) {
commitDelayMs += MIN_COMMIT_INTERVAL_MS;
}
final Choreographer choreographer = Choreographer.getInstance();
choreographer.removeFrameCallback(mCommit);
choreographer.postFrameCallbackDelayed(mCommit, commitDelayMs);
}
@Override
public void onProgressChanged(@NonNull SeekBar seekBar, int i, boolean b) {
postCommitDelayed();
}
@Override
public void onStartTrackingTouch(@NonNull SeekBar seekBar) {}
@Override
public void onStopTrackingTouch(@NonNull SeekBar seekBar) {}
}
@VisibleForTesting @VisibleForTesting
class DisplayPreference extends TwoTargetPreference class DisplayPreference extends TwoTargetPreference
implements Preference.OnPreferenceClickListener { implements Preference.OnPreferenceClickListener {