1e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang/* 2e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang * Copyright (C) 2015 The Android Open Source Project 3e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang * 4e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang * Licensed under the Apache License, Version 2.0 (the "License"); 5e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang * you may not use this file except in compliance with the License. 6e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang * You may obtain a copy of the License at 7e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang * 8e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang * http://www.apache.org/licenses/LICENSE-2.0 9e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang * 10e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang * Unless required by applicable law or agreed to in writing, software 11e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang * distributed under the License is distributed on an "AS IS" BASIS, 12e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang * See the License for the specific language governing permissions and 14e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang * limitations under the License. 15e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang */ 16e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang 17e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wangpackage com.android.settings.accessibility; 18e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang 19e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wangimport android.annotation.Nullable; 20a8b2a5072c75ec900acc6984bf3a06bffd221ecfCasey Burkhardtimport android.content.ContentResolver; 21e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wangimport android.content.res.Configuration; 22e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wangimport android.content.res.Resources; 23e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wangimport android.os.Bundle; 24a8b2a5072c75ec900acc6984bf3a06bffd221ecfCasey Burkhardtimport android.provider.Settings; 253e19fc5600f739e7f172fb9331cfc0f4a884d4ceJason Monkimport com.android.internal.logging.MetricsProto.MetricsEvent; 263e19fc5600f739e7f172fb9331cfc0f4a884d4ceJason Monkimport com.android.settings.PreviewSeekBarPreferenceFragment; 273e19fc5600f739e7f172fb9331cfc0f4a884d4ceJason Monkimport com.android.settings.R; 28e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang 29e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang/** 30e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang * Preference fragment used to control font size. 31e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang */ 32e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wangpublic class ToggleFontSizePreferenceFragment extends PreviewSeekBarPreferenceFragment { 33e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang 34e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang private float[] mValues; 35e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang 36e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang @Override 37e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang public void onCreate(@Nullable Bundle savedInstanceState) { 38e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang super.onCreate(savedInstanceState); 39e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang 40e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang mActivityLayoutResId = R.layout.font_size_activity; 4149fabb9b472ffa534f48fde4bab131a38dbaa072Noah Wang mPreviewSampleResIds = new int[]{R.layout.font_size_preview}; 42e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang 43e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang Resources res = getContext().getResources(); 44a8b2a5072c75ec900acc6984bf3a06bffd221ecfCasey Burkhardt final ContentResolver resolver = getContext().getContentResolver(); 45e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang // Mark the appropriate item in the preferences list. 46e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang mEntries = res.getStringArray(R.array.entries_font_size); 47e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang final String[] strEntryValues = res.getStringArray(R.array.entryvalues_font_size); 48a8b2a5072c75ec900acc6984bf3a06bffd221ecfCasey Burkhardt final float currentScale = 49a8b2a5072c75ec900acc6984bf3a06bffd221ecfCasey Burkhardt Settings.System.getFloat(resolver, Settings.System.FONT_SCALE, 1.0f); 50a8b2a5072c75ec900acc6984bf3a06bffd221ecfCasey Burkhardt mInitialIndex = fontSizeValueToIndex(currentScale, strEntryValues); 51e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang mValues = new float[strEntryValues.length]; 52e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang for (int i = 0; i < strEntryValues.length; ++i) { 53e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang mValues[i] = Float.parseFloat(strEntryValues[i]); 54e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang } 55e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang } 56e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang 57e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang @Override 58e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang protected Configuration createConfig(Configuration origConfig, int index) { 59e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang // Populate the sample layouts. 60e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang final Configuration config = new Configuration(origConfig); 61e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang config.fontScale = mValues[index]; 62e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang return config; 63e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang } 64e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang 65e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang /** 66a8b2a5072c75ec900acc6984bf3a06bffd221ecfCasey Burkhardt * Persists the selected font size. 67e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang */ 68e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang @Override 69e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang protected void commit() { 704f8f4f2ec2f06b1a94cbd7aa7c3be5243da2cbe1Jason Monk if (getContext() == null) return; 71a8b2a5072c75ec900acc6984bf3a06bffd221ecfCasey Burkhardt final ContentResolver resolver = getContext().getContentResolver(); 72a8b2a5072c75ec900acc6984bf3a06bffd221ecfCasey Burkhardt Settings.System.putFloat(resolver, Settings.System.FONT_SCALE, mValues[mCurrentIndex]); 73e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang } 74e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang 75e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang @Override 76e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang protected int getMetricsCategory() { 773e19fc5600f739e7f172fb9331cfc0f4a884d4ceJason Monk return MetricsEvent.ACCESSIBILITY_FONT_SIZE; 78e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang } 79e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang 8049fabb9b472ffa534f48fde4bab131a38dbaa072Noah Wang /** 8149fabb9b472ffa534f48fde4bab131a38dbaa072Noah Wang * Utility function that returns the index in a string array with which the represented value is 8249fabb9b472ffa534f48fde4bab131a38dbaa072Noah Wang * the closest to a given float value. 8349fabb9b472ffa534f48fde4bab131a38dbaa072Noah Wang */ 84a6bb3d23079b488f3dda8cbd2f8d79c61b024c44Noah Wang public static int fontSizeValueToIndex(float val, String[] indices) { 85e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang float lastVal = Float.parseFloat(indices[0]); 86e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang for (int i=1; i<indices.length; i++) { 87e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang float thisVal = Float.parseFloat(indices[i]); 88e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang if (val < (lastVal + (thisVal-lastVal)*.5f)) { 89e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang return i-1; 90e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang } 91e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang lastVal = thisVal; 92e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang } 93e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang return indices.length-1; 94e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang } 95e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang 96a8b2a5072c75ec900acc6984bf3a06bffd221ecfCasey Burkhardt} 97