diff --git a/res/layout/font_size_activity.xml b/res/layout/font_size_activity.xml new file mode 100644 index 00000000000..9072d384366 --- /dev/null +++ b/res/layout/font_size_activity.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/layout/font_size_preview.xml b/res/layout/font_size_preview.xml new file mode 100644 index 00000000000..1e3f69aeb11 --- /dev/null +++ b/res/layout/font_size_preview.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + diff --git a/res/layout/screen_zoom_activity.xml b/res/layout/screen_zoom_activity.xml index 81ce1025d13..a00e7bda44b 100644 --- a/res/layout/screen_zoom_activity.xml +++ b/res/layout/screen_zoom_activity.xml @@ -23,7 +23,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingTop="16dp" - android:paddingLeft="?android:attr/listPreferredItemPaddingStart" + android:paddingStart="?android:attr/listPreferredItemPaddingStart" android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"> - + android:layout_weight="1" + style="@android:style/Widget.Material.SeekBar.Discrete"/> 24dp 18dp + + + 240dp diff --git a/res/values/strings.xml b/res/values/strings.xml index f329001b3c1..d14c37a7e8b 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -154,8 +154,16 @@ Large + + Make smaller + + Make larger + Servez à ce monsieur une bière et des kiwis. + Twenty Thousand Leagues Under The Sea + Chapter 23: The Coral Kingdom + The next day I woke with my head singularly clear. To my great surprise, I was in my own room. My companions, no doubt, had been reinstated in their cabin, without having perceived it any more than I. Of what had passed during the night they were as ignorant as I was, and to penetrate this mystery I only reckoned upon the chances of the future. OK diff --git a/res/xml/accessibility_settings.xml b/res/xml/accessibility_settings.xml index 591bdad5985..42537b040ad 100644 --- a/res/xml/accessibility_settings.xml +++ b/res/xml/accessibility_settings.xml @@ -43,6 +43,11 @@ android:key="screen_magnification_preference_screen" android:title="@string/accessibility_screen_magnification_title"/> + + - 0) { + seekBar.setProgress(progress - 1, true); + } + } + }); + + mLarger = content.findViewById(R.id.larger); + mLarger.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + final int progress = seekBar.getProgress(); + if (progress < seekBar.getMax()) { + seekBar.setProgress(progress + 1, true); + } + } + }); + + if (mEntries.length == 1) { + // The larger and smaller buttons will be disabled when we call + // setPreviewLayer() later in this method. + 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(); + 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); + } + + setPreviewLayer(mInitialIndex, false); + + return root; + } + + @Override + public void onDetach() { + super.onDetach(); + + // This will commit the change SLIGHTLY after the activity has + // finished, which could be considered a feature or a bug... + commit(); + } + + /** + * Creates new configuration based on the current position of the SeekBar. + */ + protected abstract Configuration createConfig(Configuration origConfig, int index); + + 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); + + mCurrentIndex = index; + } + + /** + * Persists the selected value and sends a configuration change. + */ + protected abstract void commit(); +} diff --git a/src/com/android/settings/display/TouchBlockingFrameLayout.java b/src/com/android/settings/TouchBlockingFrameLayout.java similarity index 97% rename from src/com/android/settings/display/TouchBlockingFrameLayout.java rename to src/com/android/settings/TouchBlockingFrameLayout.java index 3f5483d3d20..8b36635b4e4 100644 --- a/src/com/android/settings/display/TouchBlockingFrameLayout.java +++ b/src/com/android/settings/TouchBlockingFrameLayout.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.settings.display; +package com.android.settings; import android.annotation.Nullable; import android.content.Context; diff --git a/src/com/android/settings/accessibility/ToggleFontSizePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleFontSizePreferenceFragment.java new file mode 100644 index 00000000000..8b9e27bc0df --- /dev/null +++ b/src/com/android/settings/accessibility/ToggleFontSizePreferenceFragment.java @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2015 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.accessibility; + +import com.android.settings.InstrumentedFragment; +import com.android.settings.R; +import com.android.settings.PreviewSeekBarPreferenceFragment; + +import android.annotation.Nullable; +import android.app.ActivityManagerNative; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.os.Bundle; +import android.os.RemoteException; +import android.util.Log; + +/** + * Preference fragment used to control font size. + */ +public class ToggleFontSizePreferenceFragment extends PreviewSeekBarPreferenceFragment { + private static final String LOG_TAG = "ToggleFontSizePreferenceFragment"; + + private float[] mValues; + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + mActivityLayoutResId = R.layout.font_size_activity; + mPreviewSampleResId = R.layout.font_size_preview; + + Resources res = getContext().getResources(); + // Mark the appropriate item in the preferences list. + final Configuration origConfig = res.getConfiguration(); + mEntries = res.getStringArray(R.array.entries_font_size); + final String[] strEntryValues = res.getStringArray(R.array.entryvalues_font_size); + mInitialIndex = floatToIndex(origConfig.fontScale, strEntryValues); + mValues = new float[strEntryValues.length]; + for (int i = 0; i < strEntryValues.length; ++i) { + mValues[i] = Float.parseFloat(strEntryValues[i]); + } + } + + @Override + protected Configuration createConfig(Configuration origConfig, int index) { + // Populate the sample layouts. + final Configuration config = new Configuration(origConfig); + config.fontScale = mValues[index]; + return config; + } + + /** + * Persists the selected font size and sends a configuration change. + */ + @Override + protected void commit() { + Configuration config = getContext().getResources().getConfiguration(); + config.fontScale = mValues[mCurrentIndex]; + try { + ActivityManagerNative.getDefault().updatePersistentConfiguration(config); + } catch (RemoteException e) { + Log.w(LOG_TAG, "Unable to save font size setting"); + } + } + + @Override + protected int getMetricsCategory() { + return InstrumentedFragment.ACCESSIBILITY_FONT_SIZE; + } + + private int floatToIndex(float val, String[] indices) { + float lastVal = Float.parseFloat(indices[0]); + for (int i=1; i 0) { - seekBar.setProgress(progress - 1, true); - } - } - }); - - mLarger = content.findViewById(R.id.larger); - mLarger.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - final int progress = seekBar.getProgress(); - if (progress < seekBar.getMax()) { - seekBar.setProgress(progress + 1, true); - } - } - }); - - if (mValues.length == 1) { - // The larger and smaller buttons will be disabled when we call - // setPreviewLayer() later in this method. - seekBar.setEnabled(false); - } - - mPreviewFrame = (FrameLayout) content.findViewById(R.id.preview_frame); - + protected Configuration createConfig(Configuration origConfig, int index) { // Populate the sample layouts. - final Context context = getContext(); - final Configuration origConfig = context.getResources().getConfiguration(); - for (int mValue : mValues) { - final Configuration config = new Configuration(origConfig); - config.densityDpi = mValue; - - // Create a new configuration for the specified density. 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( - R.layout.screen_zoom_preview, mPreviewFrame, false); - sampleView.setAlpha(0); - sampleView.setVisibility(View.INVISIBLE); - - mPreviewFrame.addView(sampleView); - } - - setPreviewLayer(mInitialIndex, false); - - return root; - } - - @Override - public void onDetach() { - super.onDetach(); - - // This will adjust the density SLIGHTLY after the activity has - // finished, which could be considered a feature or a bug... - commit(); - } - - 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); - - mCurrentIndex = index; + final Configuration config = new Configuration(origConfig); + config.densityDpi = mValues[index]; + return config; } /** * Persists the selected density and sends a configuration change. */ - private void commit() { + @Override + protected void commit() { final int densityDpi = mValues[mCurrentIndex]; if (densityDpi == mNormalDensity) { DisplayDensityUtils.clearForcedDisplayDensity(Display.DEFAULT_DISPLAY);