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:
@@ -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();
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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 {
|
||||||
|
Reference in New Issue
Block a user