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