101a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette/*
201a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette * Copyright (C) 2015 The Android Open Source Project
301a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette *
401a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette * Licensed under the Apache License, Version 2.0 (the "License");
501a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette * you may not use this file except in compliance with the License.
601a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette * You may obtain a copy of the License at
701a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette *
801a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette *      http://www.apache.org/licenses/LICENSE-2.0
901a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette *
1001a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette * Unless required by applicable law or agreed to in writing, software
1101a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette * distributed under the License is distributed on an "AS IS" BASIS,
1201a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1301a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette * See the License for the specific language governing permissions and
1401a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette * limitations under the License.
1501a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette */
1601a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette
1701a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverettepackage com.android.settings.display;
1801a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette
1901a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viveretteimport android.annotation.Nullable;
2001a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viveretteimport android.content.Context;
2101a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viveretteimport android.content.res.Configuration;
2201a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viveretteimport android.content.res.Resources;
2301a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viveretteimport android.os.Bundle;
2401a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viveretteimport android.view.Display;
253e19fc5600f739e7f172fb9331cfc0f4a884d4ceJason Monkimport com.android.internal.logging.MetricsProto.MetricsEvent;
263e19fc5600f739e7f172fb9331cfc0f4a884d4ceJason Monkimport com.android.settings.PreviewSeekBarPreferenceFragment;
273e19fc5600f739e7f172fb9331cfc0f4a884d4ceJason Monkimport com.android.settings.R;
283e19fc5600f739e7f172fb9331cfc0f4a884d4ceJason Monkimport com.android.settings.search.BaseSearchIndexProvider;
293e19fc5600f739e7f172fb9331cfc0f4a884d4ceJason Monkimport com.android.settings.search.Indexable;
303e19fc5600f739e7f172fb9331cfc0f4a884d4ceJason Monkimport com.android.settings.search.SearchIndexableRaw;
316b0b73fdc4e9fd2622e0f4c07cde06b1aff32468Alan Viveretteimport com.android.settingslib.display.DisplayDensityUtils;
3201a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette
3301a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viveretteimport java.util.ArrayList;
3401a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viveretteimport java.util.List;
3501a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette
3601a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette/**
3701a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette * Preference fragment used to control screen zoom.
3801a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette */
39e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wangpublic class ScreenZoomSettings extends PreviewSeekBarPreferenceFragment implements Indexable {
4001a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette
4194ecc8137633d4930c0c078c48ddd3c93aa84218Alan Viverette    private int mDefaultDensity;
42e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang    private int[] mValues;
4301a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette
4401a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette    @Override
4501a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette    public void onCreate(@Nullable Bundle savedInstanceState) {
4601a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette        super.onCreate(savedInstanceState);
4701a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette
48e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang        mActivityLayoutResId = R.layout.screen_zoom_activity;
4949fabb9b472ffa534f48fde4bab131a38dbaa072Noah Wang
5049fabb9b472ffa534f48fde4bab131a38dbaa072Noah Wang        // This should be replaced once the final preview sample screen is in place.
51b25ccce111298e869378cd846ca8b9c3c0980a8eNoah Wang        mPreviewSampleResIds = new int[]{R.layout.screen_zoom_preview_1,
52b25ccce111298e869378cd846ca8b9c3c0980a8eNoah Wang                R.layout.screen_zoom_preview_2,
53384fa2e3423741137eddc26b01fcac8bc9fef2e3Anna Galusza                R.layout.screen_zoom_preview_settings};
5449fabb9b472ffa534f48fde4bab131a38dbaa072Noah Wang
5501a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette        final DisplayDensityUtils density = new DisplayDensityUtils(getContext());
5601a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette
5701a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette        final int initialIndex = density.getCurrentIndex();
5801a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette        if (initialIndex < 0) {
5994ecc8137633d4930c0c078c48ddd3c93aa84218Alan Viverette            // Failed to obtain default density, which means we failed to
6001a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette            // connect to the window manager service. Just use the current
6101a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette            // density and don't let the user change anything.
6201a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette            final int densityDpi = getResources().getDisplayMetrics().densityDpi;
6301a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette            mValues = new int[] { densityDpi };
646b0b73fdc4e9fd2622e0f4c07cde06b1aff32468Alan Viverette            mEntries = new String[] { getString(DisplayDensityUtils.SUMMARY_DEFAULT) };
6501a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette            mInitialIndex = 0;
6694ecc8137633d4930c0c078c48ddd3c93aa84218Alan Viverette            mDefaultDensity = densityDpi;
6701a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette        } else {
6801a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette            mValues = density.getValues();
6901a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette            mEntries = density.getEntries();
7001a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette            mInitialIndex = initialIndex;
7194ecc8137633d4930c0c078c48ddd3c93aa84218Alan Viverette            mDefaultDensity = density.getDefaultDensity();
7201a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette        }
7301a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette    }
7401a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette
7501a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette    @Override
76e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang    protected Configuration createConfig(Configuration origConfig, int index) {
7701a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette        // Populate the sample layouts.
78e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang        final Configuration config = new Configuration(origConfig);
79e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang        config.densityDpi = mValues[index];
80e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang        return config;
8101a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette    }
8201a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette
8301a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette    /**
8401a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette     * Persists the selected density and sends a configuration change.
8501a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette     */
86e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang    @Override
87e64cc267e7090d407d756ff2aa2ca022d1772242Noah Wang    protected void commit() {
8801a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette        final int densityDpi = mValues[mCurrentIndex];
8994ecc8137633d4930c0c078c48ddd3c93aa84218Alan Viverette        if (densityDpi == mDefaultDensity) {
9001a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette            DisplayDensityUtils.clearForcedDisplayDensity(Display.DEFAULT_DISPLAY);
9101a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette        } else {
9201a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette            DisplayDensityUtils.setForcedDisplayDensity(Display.DEFAULT_DISPLAY, densityDpi);
9301a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette        }
9401a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette    }
9501a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette
9601a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette    @Override
9701a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette    protected int getMetricsCategory() {
983e19fc5600f739e7f172fb9331cfc0f4a884d4ceJason Monk        return MetricsEvent.DISPLAY_SCREEN_ZOOM;
9901a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette    }
10001a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette
10101a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette    /** Index provider used to expose this fragment in search. */
10201a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette    public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
10301a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette            new BaseSearchIndexProvider() {
10401a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette                @Override
10501a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette                public List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) {
10601a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette                    final Resources res = context.getResources();
10701a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette                    final SearchIndexableRaw data = new SearchIndexableRaw(context);
10801a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette                    data.title = res.getString(R.string.screen_zoom_title);
10901a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette                    data.screenTitle = res.getString(R.string.screen_zoom_title);
11001a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette                    data.keywords = res.getString(R.string.screen_zoom_keywords);
11101a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette
11201a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette                    final List<SearchIndexableRaw> result = new ArrayList<>(1);
11301a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette                    result.add(data);
11401a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette                    return result;
11501a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette                }
11601a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette            };
11701a04f132b2b2bd91967c2c7dc165ced7f72d9d9Alan Viverette}
118