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

Commit 8054a152 authored by Ebru Kurnaz's avatar Ebru Kurnaz
Browse files

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
parent bdd9cca6
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -19,6 +19,8 @@ package com.android.settings.accessibility;
import android.content.Context;
import android.content.res.Resources;

import androidx.annotation.NonNull;

import com.android.settingslib.display.DisplayDensityUtils;

import java.util.Arrays;
@@ -28,13 +30,17 @@ import java.util.stream.Collectors;
/**
 * 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;

    DisplaySizeData(Context context) {
        this(context, new DisplayDensityUtils(context));
    }

    public DisplaySizeData(@NonNull Context context, @NonNull DisplayDensityUtils util) {
        super(context);

        mDensity = new DisplayDensityUtils(getContext());
        mDensity = util;
        final int initialIndex = mDensity.getCurrentIndex();
        if (initialIndex < 0) {
            // Failed to obtain default density, which means we failed to
@@ -54,7 +60,7 @@ class DisplaySizeData extends PreviewSizeData<Integer> {
    }

    @Override
    void commit(int currentProgress) {
    public void commit(int currentProgress) {
        final int densityDpi = getValues().get(currentProgress);
        if (densityDpi == getDefaultValue()) {
            mDensity.clearForcedDisplayDensity();
+3 −2
Original line number Diff line number Diff line
@@ -40,7 +40,8 @@ abstract class PreviewSizeData<T extends Number> {
        return mContext;
    }

    List<T> getValues() {
    @NonNull
    public List<T> getValues() {
        return mValues;
    }

@@ -56,7 +57,7 @@ abstract class PreviewSizeData<T extends Number> {
        mDefaultValue = defaultValue;
    }

    int getInitialIndex() {
    public int getInitialIndex() {
        return mInitialIndex;
    }

+75 −6
Original line number Diff line number Diff line
@@ -32,8 +32,11 @@ import android.app.Activity;
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.Choreographer;
import android.view.Display;
import android.view.View;
import android.widget.SeekBar;
import android.widget.TextView;
import android.window.DesktopExperienceFlags;

@@ -48,10 +51,12 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragmentBase;
import com.android.settings.accessibility.AccessibilitySeekBarPreference;
import com.android.settings.accessibility.DisplaySizeData;
import com.android.settings.accessibility.TextReadingPreferenceFragment;
import com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.DisplayListener;
import com.android.settings.connecteddevice.display.ExternalDisplaySettingsConfiguration.Injector;
import com.android.settings.core.SubSettingLauncher;
import com.android.settingslib.display.DisplayDensityUtils;
import com.android.settingslib.widget.FooterPreference;
import com.android.settingslib.widget.IllustrationPreference;
import com.android.settingslib.widget.MainSwitchPreference;
@@ -368,7 +373,7 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen

    @NonNull
    private AccessibilitySeekBarPreference reuseSizePreference(Context context,
            PrefRefresh refresh) {
            PrefRefresh refresh,  int displayId) {
        AccessibilitySeekBarPreference pref =
                refresh.findUnusedPreference(PrefBasics.EXTERNAL_DISPLAY_SIZE.key);
        if (pref == null) {
@@ -378,11 +383,27 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
            pref.setIconEnd(R.drawable.ic_add_24dp);
            pref.setIconEndContentDescription(R.string.screen_zoom_make_larger_desc);
            PrefBasics.EXTERNAL_DISPLAY_SIZE.apply(pref);

            setStateForDisplaySizePreference(context, displayId, pref);
        }
        refresh.addPreference(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) {
        if (savedInstanceState == null) {
            return;
@@ -514,7 +535,7 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
            }
        }
        if (isDisplaySizeSettingEnabled(mInjector)) {
            addSizePreference(context, refresh);
            addSizePreference(context, refresh, display.getDisplayId());
        }
    }

@@ -685,8 +706,8 @@ public class ExternalDisplayPreferenceFragment extends SettingsPreferenceFragmen
        pref.setEnabled(isResolutionSettingEnabled(mInjector));
    }

    private void addSizePreference(final Context context, PrefRefresh refresh) {
        var pref = reuseSizePreference(context, refresh);
    private void addSizePreference(final Context context, PrefRefresh refresh, int displayId) {
        var pref = reuseSizePreference(context, refresh, displayId);
        pref.setSummary(EXTERNAL_DISPLAY_SIZE_SUMMARY_RESOURCE);
        pref.setOnPreferenceClickListener(
                (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
    class DisplayPreference extends TwoTargetPreference
            implements Preference.OnPreferenceClickListener {