From 09c44bf78dd5ed694ab224c0164a61c786f6f305 Mon Sep 17 00:00:00 2001 From: Wang wenrui Date: Mon, 13 Feb 2017 12:51:24 +0800 Subject: [PATCH] Fix screen freeze when changing display size in Multi-Window mode The device screen freezes when launching two Display size settings screen and changing display size in Multi-Window mode. To fix this issue, OnSeekBarChangeListener should be set in onStart() to avoid onProgressChanged() is called during onRestoreInstanceState which is caused by display size change. Fixes: 70253030 Test: manual - open two Display size settings in Multi-Window mode. Change-Id: I779954aeeb1da526ba1b0fac2676e2f7d8289352 --- .../PreviewSeekBarPreferenceFragment.java | 36 +++++++++++++------ 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/src/com/android/settings/PreviewSeekBarPreferenceFragment.java b/src/com/android/settings/PreviewSeekBarPreferenceFragment.java index 544999a3806..f5f3017af79 100644 --- a/src/com/android/settings/PreviewSeekBarPreferenceFragment.java +++ b/src/com/android/settings/PreviewSeekBarPreferenceFragment.java @@ -58,6 +58,7 @@ public abstract class PreviewSeekBarPreferenceFragment extends SettingsPreferenc private DotsPageIndicator mPageIndicator; private TextView mLabel; + private LabeledSeekBar mSeekBar; private View mLarger; private View mSmaller; @@ -110,19 +111,17 @@ public abstract class PreviewSeekBarPreferenceFragment extends SettingsPreferenc // seek bar. final int max = Math.max(1, mEntries.length - 1); - final LabeledSeekBar seekBar = (LabeledSeekBar) content.findViewById(R.id.seek_bar); - seekBar.setLabels(mEntries); - seekBar.setMax(max); - seekBar.setProgress(mInitialIndex); - seekBar.setOnSeekBarChangeListener(new onPreviewSeekBarChangeListener()); + mSeekBar = (LabeledSeekBar) content.findViewById(R.id.seek_bar); + mSeekBar.setLabels(mEntries); + mSeekBar.setMax(max); mSmaller = content.findViewById(R.id.smaller); mSmaller.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - final int progress = seekBar.getProgress(); + final int progress = mSeekBar.getProgress(); if (progress > 0) { - seekBar.setProgress(progress - 1, true); + mSeekBar.setProgress(progress - 1, true); } } }); @@ -131,9 +130,9 @@ public abstract class PreviewSeekBarPreferenceFragment extends SettingsPreferenc mLarger.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - final int progress = seekBar.getProgress(); - if (progress < seekBar.getMax()) { - seekBar.setProgress(progress + 1, true); + final int progress = mSeekBar.getProgress(); + if (progress < mSeekBar.getMax()) { + mSeekBar.setProgress(progress + 1, true); } } }); @@ -141,7 +140,7 @@ public abstract class PreviewSeekBarPreferenceFragment extends SettingsPreferenc if (mEntries.length == 1) { // The larger and smaller buttons will be disabled when we call // setPreviewLayer() later in this method. - seekBar.setEnabled(false); + mSeekBar.setEnabled(false); } final Context context = getContext(); @@ -172,6 +171,21 @@ public abstract class PreviewSeekBarPreferenceFragment extends SettingsPreferenc return root; } + @Override + public void onStart() { + super.onStart(); + // Set SeekBar listener here to avoid onProgressChanged() is called + // during onRestoreInstanceState(). + mSeekBar.setProgress(mCurrentIndex); + mSeekBar.setOnSeekBarChangeListener(new onPreviewSeekBarChangeListener()); + } + + @Override + public void onStop() { + super.onStop(); + mSeekBar.setOnSeekBarChangeListener(null); + } + /** * Creates new configuration based on the current position of the SeekBar. */