Merge "Accomodating multiple preview screen with ViewPager for the users to swipe across, along with some UI refinements."

This commit is contained in:
Noah Wang
2016-01-15 18:30:26 +00:00
committed by Android (Google) Code Review
13 changed files with 317 additions and 132 deletions

View File

@@ -0,0 +1,131 @@
/*
* Copyright (C) 2016 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;
import android.content.Context;
import android.content.res.Configuration;
import android.support.v4.view.PagerAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.Interpolator;
import android.widget.FrameLayout;
/**
* A PagerAdapter used by PreviewSeekBarPreferenceFragment that for showing multiple preview screen
* regarding a single setting and allowing the user to swipe across them.
*/
public class PreviewPagerAdapter extends PagerAdapter {
private TouchBlockingFrameLayout[] mPreviewFrames;
/** Duration to use when cross-fading between previews. */
private static final long CROSS_FADE_DURATION_MS = 400;
/** Interpolator to use when cross-fading between previews. */
private static final Interpolator FADE_IN_INTERPOLATOR = new DecelerateInterpolator();
/** Interpolator to use when cross-fading between previews. */
private static final Interpolator FADE_OUT_INTERPOLATOR = new AccelerateInterpolator();
public PreviewPagerAdapter(Context context, int[] previewSampleResIds,
Configuration[] configurations) {
mPreviewFrames = new TouchBlockingFrameLayout[previewSampleResIds.length];
for (int i = 0; i < previewSampleResIds.length; ++i) {
mPreviewFrames[i] = (TouchBlockingFrameLayout) LayoutInflater.from(context)
.inflate(R.layout.preview_frame_container, null);
for (Configuration configuration : configurations) {
// Create a new configuration for the specified value. It won't
// have any theme set, so manually apply the current theme.
final Context configContext = context.createConfigurationContext(configuration);
configContext.setTheme(context.getThemeResId());
final LayoutInflater configInflater = LayoutInflater.from(configContext);
final View sampleView = configInflater.inflate(previewSampleResIds[i],
mPreviewFrames[i], false);
sampleView.setAlpha(0);
sampleView.setVisibility(View.INVISIBLE);
mPreviewFrames[i].addView(sampleView);
}
}
}
@Override
public void destroyItem (ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
@Override
public int getCount() {
return mPreviewFrames.length;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(mPreviewFrames[position]);
return mPreviewFrames[position];
}
@Override
public boolean isViewFromObject(View view, Object object) {
return (view == object);
}
void setPreviewLayer(int newIndex, int currentIndex, int currentItem, boolean animate) {
for (FrameLayout previewFrame : mPreviewFrames) {
if (currentIndex >= 0) {
final View lastLayer = previewFrame.getChildAt(currentIndex);
if (animate && previewFrame == mPreviewFrames[currentItem]) {
lastLayer.animate()
.alpha(0)
.setInterpolator(FADE_OUT_INTERPOLATOR)
.setDuration(CROSS_FADE_DURATION_MS)
.withEndAction(new Runnable() {
@Override
public void run() {
lastLayer.setVisibility(View.INVISIBLE);
}
});
} else {
lastLayer.setAlpha(0);
lastLayer.setVisibility(View.INVISIBLE);
}
}
final View nextLayer = previewFrame.getChildAt(newIndex);
if (animate && previewFrame == mPreviewFrames[currentItem]) {
nextLayer.animate()
.alpha(1)
.setInterpolator(FADE_IN_INTERPOLATOR)
.setDuration(CROSS_FADE_DURATION_MS)
.withStartAction(new Runnable() {
@Override
public void run() {
nextLayer.setVisibility(View.VISIBLE);
}
});
} else {
nextLayer.setVisibility(View.VISIBLE);
nextLayer.setAlpha(1);
}
}
}
}

View File

@@ -16,20 +16,14 @@
package com.android.settings;
import android.annotation.Nullable;
import android.content.Context;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.AttributeSet;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.Interpolator;
import android.widget.FrameLayout;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
@@ -53,18 +47,11 @@ public abstract class PreviewSeekBarPreferenceFragment extends SettingsPreferenc
protected int mActivityLayoutResId;
/** Resource id of the layout that defines the contents instide preview screen. */
protected int mPreviewSampleResId;
protected int[] mPreviewSampleResIds;
/** Duration to use when cross-fading between previews. */
private static final long CROSS_FADE_DURATION_MS = 400;
private ViewPager mPreviewPager;
private PreviewPagerAdapter mPreviewPagerAdapter;
/** Interpolator to use when cross-fading between previews. */
private static final Interpolator FADE_IN_INTERPOLATOR = new DecelerateInterpolator();
/** Interpolator to use when cross-fading between previews. */
private static final Interpolator FADE_OUT_INTERPOLATOR = new AccelerateInterpolator();
private ViewGroup mPreviewFrame;
private TextView mLabel;
private View mLarger;
private View mSmaller;
@@ -96,10 +83,12 @@ public abstract class PreviewSeekBarPreferenceFragment extends SettingsPreferenc
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {}
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {}
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
mSmaller = content.findViewById(R.id.smaller);
@@ -130,29 +119,19 @@ public abstract class PreviewSeekBarPreferenceFragment extends SettingsPreferenc
seekBar.setEnabled(false);
}
mPreviewFrame = (FrameLayout) content.findViewById(R.id.preview_frame);
// Populate the sample layouts.
final Context context = getContext();
final Configuration origConfig = context.getResources().getConfiguration();
Configuration[] configurations = new Configuration[mEntries.length];
for (int i = 0; i < mEntries.length; ++i) {
final Configuration config = createConfig(origConfig, i);
// Create a new configuration for the specified value. It won't
// have any theme set, so manually apply the current theme.
final Context configContext = context.createConfigurationContext(config);
configContext.setTheme(context.getThemeResId());
final LayoutInflater configInflater = LayoutInflater.from(configContext);
final View sampleView = configInflater.inflate(mPreviewSampleResId, mPreviewFrame, false);
sampleView.setAlpha(0);
sampleView.setVisibility(View.INVISIBLE);
mPreviewFrame.addView(sampleView);
configurations[i] = createConfig(origConfig, i);
}
setPreviewLayer(mInitialIndex, false);
mPreviewPagerAdapter = new PreviewPagerAdapter(context, mPreviewSampleResIds,
configurations);
mPreviewPager = (ViewPager) content.findViewById(R.id.preview_pager);
mPreviewPager.setAdapter(mPreviewPagerAdapter);
setPreviewLayer(mInitialIndex, false);
return root;
}
@@ -172,46 +151,11 @@ public abstract class PreviewSeekBarPreferenceFragment extends SettingsPreferenc
private void setPreviewLayer(int index, boolean animate) {
mLabel.setText(mEntries[index]);
if (mCurrentIndex >= 0) {
final View lastLayer = mPreviewFrame.getChildAt(mCurrentIndex);
if (animate) {
lastLayer.animate()
.alpha(0)
.setInterpolator(FADE_OUT_INTERPOLATOR)
.setDuration(CROSS_FADE_DURATION_MS)
.withEndAction(new Runnable() {
@Override
public void run() {
lastLayer.setVisibility(View.INVISIBLE);
}
});
} else {
lastLayer.setAlpha(0);
lastLayer.setVisibility(View.INVISIBLE);
}
}
final View nextLayer = mPreviewFrame.getChildAt(index);
if (animate) {
nextLayer.animate()
.alpha(1)
.setInterpolator(FADE_IN_INTERPOLATOR)
.setDuration(CROSS_FADE_DURATION_MS)
.withStartAction(new Runnable() {
@Override
public void run() {
nextLayer.setVisibility(View.VISIBLE);
}
});
} else {
nextLayer.setVisibility(View.VISIBLE);
nextLayer.setAlpha(1);
}
mSmaller.setEnabled(index > 0);
mLarger.setEnabled(index < mEntries.length - 1);
mPreviewPagerAdapter.setPreviewLayer(index, mCurrentIndex, mPreviewPager.getCurrentItem(),
animate);
mCurrentIndex = index;
}

View File

@@ -24,6 +24,7 @@ import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.ServiceInfo;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
@@ -95,6 +96,8 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
"captioning_preference_screen";
private static final String DISPLAY_MAGNIFICATION_PREFERENCE_SCREEN =
"screen_magnification_preference_screen";
private static final String FONT_SIZE_PREFERENCE_SCREEN =
"font_size_preference_screen";
private static final String AUTOCLICK_PREFERENCE_SCREEN =
"autoclick_preference_screen";
private static final String DISPLAY_DALTONIZER_PREFERENCE_SCREEN =
@@ -188,6 +191,7 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
private Preference mNoServicesMessagePreference;
private PreferenceScreen mCaptioningPreferenceScreen;
private PreferenceScreen mDisplayMagnificationPreferenceScreen;
private PreferenceScreen mFontSizePreferenceScreen;
private PreferenceScreen mAutoclickPreferenceScreen;
private PreferenceScreen mGlobalGesturePreferenceScreen;
private PreferenceScreen mDisplayDaltonizerPreferenceScreen;
@@ -419,6 +423,10 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
mDisplayMagnificationPreferenceScreen = (PreferenceScreen) findPreference(
DISPLAY_MAGNIFICATION_PREFERENCE_SCREEN);
// Font size.
mFontSizePreferenceScreen = (PreferenceScreen) findPreference(
FONT_SIZE_PREFERENCE_SCREEN);
// Autoclick after pointer stops.
mAutoclickPreferenceScreen = (PreferenceScreen) findPreference(
AUTOCLICK_PREFERENCE_SCREEN);
@@ -600,6 +608,8 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
updateFeatureSummary(Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED,
mDisplayDaltonizerPreferenceScreen);
updateFontSizeSummary(mFontSizePreferenceScreen);
updateAutoclickSummary(mAutoclickPreferenceScreen);
// Global gesture
@@ -634,6 +644,15 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
getResources(), delay));
}
private void updateFontSizeSummary(Preference pref) {
final Resources res = getContext().getResources();
final String[] entries = res.getStringArray(R.array.entries_font_size);
final String[] strEntryValues = res.getStringArray(R.array.entryvalues_font_size);
final int index = ToggleFontSizePreferenceFragment.floatToIndex(
res.getConfiguration().fontScale, strEntryValues);
pref.setSummary(entries[index]);
}
private void updateLockScreenRotationCheckbox() {
Context context = getActivity();
if (context != null) {

View File

@@ -16,6 +16,7 @@
package com.android.settings.accessibility;
import android.content.res.Resources;
import android.os.Bundle;
import android.provider.Settings;
import android.support.v7.preference.Preference;
@@ -35,12 +36,14 @@ public class AccessibilitySettingsForSetupWizard extends SettingsPreferenceFragm
"screen_magnification_preference";
private static final String DISPLAY_DALTONIZER_PREFERENCE = "daltonizer_preference";
private static final String TALKBACK_PREFERENCE = "talkback_preference";
private static final String FONT_SIZE_PREFERENCE = "font_size_preference";
private static final String TALKBACK_NAME = "Talkback";
// Preference controls.
private Preference mDisplayMagnificationPreference;
private Preference mDisplayDaltonizerPreference;
private Preference mFontSizePreference;
private Preference mTalkbackPreference;
@Override
@@ -60,6 +63,7 @@ public class AccessibilitySettingsForSetupWizard extends SettingsPreferenceFragm
mDisplayMagnificationPreference = findPreference(DISPLAY_MAGNIFICATION_PREFERENCE);
mDisplayDaltonizerPreference = findPreference(DISPLAY_DALTONIZER_PREFERENCE);
mFontSizePreference = findPreference(FONT_SIZE_PREFERENCE);
mTalkbackPreference = findPreference(TALKBACK_PREFERENCE);
mTalkbackPreference.setTitle(TALKBACK_NAME);
@@ -104,6 +108,7 @@ public class AccessibilitySettingsForSetupWizard extends SettingsPreferenceFragm
mDisplayMagnificationPreference);
updateFeatureSummary(Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED,
mDisplayDaltonizerPreference);
updateFontSizeSummary(mFontSizePreference);
}
private void updateFeatureSummary(String prefKey, Preference pref) {
@@ -111,4 +116,13 @@ public class AccessibilitySettingsForSetupWizard extends SettingsPreferenceFragm
pref.setSummary(enabled ? R.string.accessibility_feature_state_on
: R.string.accessibility_feature_state_off);
}
private void updateFontSizeSummary(Preference pref) {
final Resources res = getContext().getResources();
final String[] entries = res.getStringArray(R.array.entries_font_size);
final String[] strEntryValues = res.getStringArray(R.array.entryvalues_font_size);
final int index = ToggleFontSizePreferenceFragment.floatToIndex(
res.getConfiguration().fontScale, strEntryValues);
pref.setSummary(entries[index]);
}
}

View File

@@ -41,7 +41,7 @@ public class ToggleFontSizePreferenceFragment extends PreviewSeekBarPreferenceFr
super.onCreate(savedInstanceState);
mActivityLayoutResId = R.layout.font_size_activity;
mPreviewSampleResId = R.layout.font_size_preview;
mPreviewSampleResIds = new int[]{R.layout.font_size_preview};
Resources res = getContext().getResources();
// Mark the appropriate item in the preferences list.
@@ -82,7 +82,11 @@ public class ToggleFontSizePreferenceFragment extends PreviewSeekBarPreferenceFr
return InstrumentedFragment.ACCESSIBILITY_FONT_SIZE;
}
private int floatToIndex(float val, String[] indices) {
/**
* Utility function that returns the index in a string array with which the represented value is
* the closest to a given float value.
*/
static int floatToIndex(float val, String[] indices) {
float lastVal = Float.parseFloat(indices[0]);
for (int i=1; i<indices.length; i++) {
float thisVal = Float.parseFloat(indices[i]);

View File

@@ -46,7 +46,11 @@ public class ScreenZoomSettings extends PreviewSeekBarPreferenceFragment impleme
super.onCreate(savedInstanceState);
mActivityLayoutResId = R.layout.screen_zoom_activity;
mPreviewSampleResId = R.layout.screen_zoom_preview;
// This should be replaced once the final preview sample screen is in place.
mPreviewSampleResIds = new int[]{R.layout.screen_zoom_preview, R.layout.screen_zoom_preview,
R.layout.screen_zoom_preview};
final DisplayDensityUtils density = new DisplayDensityUtils(getContext());
final int initialIndex = density.getCurrentIndex();