1cc0e782871eb6b946ded880e391866f27953654bAlan Viverette/*
2cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * Copyright (C) 2013 The Android Open Source Project
3cc0e782871eb6b946ded880e391866f27953654bAlan Viverette *
4cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * Licensed under the Apache License, Version 2.0 (the "License");
5cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * you may not use this file except in compliance with the License.
6cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * You may obtain a copy of the License at
7cc0e782871eb6b946ded880e391866f27953654bAlan Viverette *
8cc0e782871eb6b946ded880e391866f27953654bAlan Viverette *      http://www.apache.org/licenses/LICENSE-2.0
9cc0e782871eb6b946ded880e391866f27953654bAlan Viverette *
10cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * Unless required by applicable law or agreed to in writing, software
11cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * distributed under the License is distributed on an "AS IS" BASIS,
12cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * See the License for the specific language governing permissions and
14cc0e782871eb6b946ded880e391866f27953654bAlan Viverette * limitations under the License.
15cc0e782871eb6b946ded880e391866f27953654bAlan Viverette */
16cc0e782871eb6b946ded880e391866f27953654bAlan Viverette
17cc0e782871eb6b946ded880e391866f27953654bAlan Viverettepackage com.android.settings.accessibility;
18cc0e782871eb6b946ded880e391866f27953654bAlan Viverette
19cc0e782871eb6b946ded880e391866f27953654bAlan Viveretteimport android.app.ActionBar;
20cc0e782871eb6b946ded880e391866f27953654bAlan Viveretteimport android.app.Activity;
21cc0e782871eb6b946ded880e391866f27953654bAlan Viveretteimport android.app.Fragment;
22cc0e782871eb6b946ded880e391866f27953654bAlan Viveretteimport android.content.ContentResolver;
23cc0e782871eb6b946ded880e391866f27953654bAlan Viveretteimport android.content.Context;
24cc0e782871eb6b946ded880e391866f27953654bAlan Viveretteimport android.os.Bundle;
25cc0e782871eb6b946ded880e391866f27953654bAlan Viveretteimport android.preference.PreferenceFrameLayout;
26cc0e782871eb6b946ded880e391866f27953654bAlan Viveretteimport android.provider.Settings;
27cc0e782871eb6b946ded880e391866f27953654bAlan Viveretteimport android.view.Gravity;
28cc0e782871eb6b946ded880e391866f27953654bAlan Viveretteimport android.view.LayoutInflater;
29cc0e782871eb6b946ded880e391866f27953654bAlan Viveretteimport android.view.View;
30cc0e782871eb6b946ded880e391866f27953654bAlan Viveretteimport android.view.ViewGroup;
31cc0e782871eb6b946ded880e391866f27953654bAlan Viveretteimport android.view.accessibility.CaptioningManager;
32cc0e782871eb6b946ded880e391866f27953654bAlan Viverette
33e873aeb3a659ac970609cebb5ec2f460afd1206aAlan Viveretteimport com.android.internal.widget.SubtitleView;
34cc0e782871eb6b946ded880e391866f27953654bAlan Viveretteimport com.android.settings.R;
35cc0e782871eb6b946ded880e391866f27953654bAlan Viveretteimport com.android.settings.accessibility.ToggleSwitch.OnBeforeCheckedChangeListener;
36cc0e782871eb6b946ded880e391866f27953654bAlan Viverette
37cc0e782871eb6b946ded880e391866f27953654bAlan Viveretteimport java.util.Locale;
38cc0e782871eb6b946ded880e391866f27953654bAlan Viverette
39cc0e782871eb6b946ded880e391866f27953654bAlan Viverettepublic class ToggleCaptioningPreferenceFragment extends Fragment {
405ea751e48fc3d7c25cf4e44ef5926e8e70979b5aAlan Viverette    private static final float DEFAULT_FONT_SIZE = 48f;
415ea751e48fc3d7c25cf4e44ef5926e8e70979b5aAlan Viverette
42cc0e782871eb6b946ded880e391866f27953654bAlan Viverette    private CaptionPropertiesFragment mPropsFragment;
43e873aeb3a659ac970609cebb5ec2f460afd1206aAlan Viverette    private SubtitleView mPreviewText;
445ea751e48fc3d7c25cf4e44ef5926e8e70979b5aAlan Viverette    private CaptioningManager mCaptioningManager;
455ea751e48fc3d7c25cf4e44ef5926e8e70979b5aAlan Viverette
465ea751e48fc3d7c25cf4e44ef5926e8e70979b5aAlan Viverette    @Override
475ea751e48fc3d7c25cf4e44ef5926e8e70979b5aAlan Viverette    public void onCreate(Bundle savedInstanceState) {
485ea751e48fc3d7c25cf4e44ef5926e8e70979b5aAlan Viverette        super.onCreate(savedInstanceState);
495ea751e48fc3d7c25cf4e44ef5926e8e70979b5aAlan Viverette
505ea751e48fc3d7c25cf4e44ef5926e8e70979b5aAlan Viverette        mCaptioningManager = (CaptioningManager) getActivity()
515ea751e48fc3d7c25cf4e44ef5926e8e70979b5aAlan Viverette                .getSystemService(Context.CAPTIONING_SERVICE);
525ea751e48fc3d7c25cf4e44ef5926e8e70979b5aAlan Viverette    }
53cc0e782871eb6b946ded880e391866f27953654bAlan Viverette
54cc0e782871eb6b946ded880e391866f27953654bAlan Viverette    @Override
55cc0e782871eb6b946ded880e391866f27953654bAlan Viverette    public View onCreateView(
56cc0e782871eb6b946ded880e391866f27953654bAlan Viverette            LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
57cc0e782871eb6b946ded880e391866f27953654bAlan Viverette        final View rootView = inflater.inflate(R.layout.captioning_preview, container, false);
58cc0e782871eb6b946ded880e391866f27953654bAlan Viverette
59cc0e782871eb6b946ded880e391866f27953654bAlan Viverette        // We have to do this now because PreferenceFrameLayout looks at it
60cc0e782871eb6b946ded880e391866f27953654bAlan Viverette        // only when the view is added.
61cc0e782871eb6b946ded880e391866f27953654bAlan Viverette        if (container instanceof PreferenceFrameLayout) {
62cc0e782871eb6b946ded880e391866f27953654bAlan Viverette            ((PreferenceFrameLayout.LayoutParams) rootView.getLayoutParams()).removeBorders = true;
63cc0e782871eb6b946ded880e391866f27953654bAlan Viverette        }
64cc0e782871eb6b946ded880e391866f27953654bAlan Viverette
65cc0e782871eb6b946ded880e391866f27953654bAlan Viverette        return rootView;
66cc0e782871eb6b946ded880e391866f27953654bAlan Viverette    }
67cc0e782871eb6b946ded880e391866f27953654bAlan Viverette
68cc0e782871eb6b946ded880e391866f27953654bAlan Viverette    @Override
69cc0e782871eb6b946ded880e391866f27953654bAlan Viverette    public void onViewCreated(View view, Bundle savedInstanceState) {
70cc0e782871eb6b946ded880e391866f27953654bAlan Viverette        super.onViewCreated(view, savedInstanceState);
71cc0e782871eb6b946ded880e391866f27953654bAlan Viverette
72cc0e782871eb6b946ded880e391866f27953654bAlan Viverette        mPropsFragment = ((CaptionPropertiesFragment) getFragmentManager()
73cc0e782871eb6b946ded880e391866f27953654bAlan Viverette                .findFragmentById(R.id.properties_fragment));
74cc0e782871eb6b946ded880e391866f27953654bAlan Viverette        mPropsFragment.setParent(this);
75cc0e782871eb6b946ded880e391866f27953654bAlan Viverette
76e873aeb3a659ac970609cebb5ec2f460afd1206aAlan Viverette        mPreviewText = (SubtitleView) view.findViewById(R.id.preview_text);
77cc0e782871eb6b946ded880e391866f27953654bAlan Viverette
78cc0e782871eb6b946ded880e391866f27953654bAlan Viverette        installActionBarToggleSwitch();
79cc0e782871eb6b946ded880e391866f27953654bAlan Viverette        refreshPreviewText();
80cc0e782871eb6b946ded880e391866f27953654bAlan Viverette    }
81cc0e782871eb6b946ded880e391866f27953654bAlan Viverette
82cc0e782871eb6b946ded880e391866f27953654bAlan Viverette    public void refreshPreviewText() {
83e873aeb3a659ac970609cebb5ec2f460afd1206aAlan Viverette        final SubtitleView preview = mPreviewText;
84cc0e782871eb6b946ded880e391866f27953654bAlan Viverette        if (preview != null) {
85cc0e782871eb6b946ded880e391866f27953654bAlan Viverette            final Activity activity = getActivity();
86cc0e782871eb6b946ded880e391866f27953654bAlan Viverette            final ContentResolver cr = activity.getContentResolver();
875ea751e48fc3d7c25cf4e44ef5926e8e70979b5aAlan Viverette            final int styleId = mCaptioningManager.getRawUserStyle();
885ea751e48fc3d7c25cf4e44ef5926e8e70979b5aAlan Viverette            applyCaptionProperties(mCaptioningManager, preview, styleId);
89cc0e782871eb6b946ded880e391866f27953654bAlan Viverette
905ea751e48fc3d7c25cf4e44ef5926e8e70979b5aAlan Viverette            final Locale locale = mCaptioningManager.getLocale();
91cc0e782871eb6b946ded880e391866f27953654bAlan Viverette            if (locale != null) {
92cc0e782871eb6b946ded880e391866f27953654bAlan Viverette                final CharSequence localizedText = AccessibilityUtils.getTextForLocale(
93cc0e782871eb6b946ded880e391866f27953654bAlan Viverette                        activity, locale, R.string.captioning_preview_text);
94cc0e782871eb6b946ded880e391866f27953654bAlan Viverette                preview.setText(localizedText);
95c402322a5b7cbad0cb453c7bb00ad9a70c942ac1Alan Viverette            } else {
96c402322a5b7cbad0cb453c7bb00ad9a70c942ac1Alan Viverette                preview.setText(R.string.captioning_preview_text);
97cc0e782871eb6b946ded880e391866f27953654bAlan Viverette            }
98cc0e782871eb6b946ded880e391866f27953654bAlan Viverette        }
99cc0e782871eb6b946ded880e391866f27953654bAlan Viverette    }
100cc0e782871eb6b946ded880e391866f27953654bAlan Viverette
1015ea751e48fc3d7c25cf4e44ef5926e8e70979b5aAlan Viverette    public static void applyCaptionProperties(
1025ea751e48fc3d7c25cf4e44ef5926e8e70979b5aAlan Viverette            CaptioningManager manager, SubtitleView previewText, int styleId) {
103c30f124c917b55a93b3d4880d8d992d649a076f0Alan Viverette        previewText.setStyle(styleId);
104cc0e782871eb6b946ded880e391866f27953654bAlan Viverette
105cc0e782871eb6b946ded880e391866f27953654bAlan Viverette        final Context context = previewText.getContext();
106cc0e782871eb6b946ded880e391866f27953654bAlan Viverette        final ContentResolver cr = context.getContentResolver();
1075ea751e48fc3d7c25cf4e44ef5926e8e70979b5aAlan Viverette        final float fontScale = manager.getFontScale();
1085ea751e48fc3d7c25cf4e44ef5926e8e70979b5aAlan Viverette        previewText.setTextSize(fontScale * DEFAULT_FONT_SIZE);
109c30f124c917b55a93b3d4880d8d992d649a076f0Alan Viverette
1105ea751e48fc3d7c25cf4e44ef5926e8e70979b5aAlan Viverette        final Locale locale = manager.getLocale();
111cc0e782871eb6b946ded880e391866f27953654bAlan Viverette        if (locale != null) {
112cc0e782871eb6b946ded880e391866f27953654bAlan Viverette            final CharSequence localizedText = AccessibilityUtils.getTextForLocale(
113cc0e782871eb6b946ded880e391866f27953654bAlan Viverette                    context, locale, R.string.captioning_preview_characters);
114cc0e782871eb6b946ded880e391866f27953654bAlan Viverette            previewText.setText(localizedText);
115c402322a5b7cbad0cb453c7bb00ad9a70c942ac1Alan Viverette        } else {
116c402322a5b7cbad0cb453c7bb00ad9a70c942ac1Alan Viverette            previewText.setText(R.string.captioning_preview_characters);
117cc0e782871eb6b946ded880e391866f27953654bAlan Viverette        }
118cc0e782871eb6b946ded880e391866f27953654bAlan Viverette    }
119cc0e782871eb6b946ded880e391866f27953654bAlan Viverette
120cc0e782871eb6b946ded880e391866f27953654bAlan Viverette    private void installActionBarToggleSwitch() {
121cc0e782871eb6b946ded880e391866f27953654bAlan Viverette        final Activity activity = getActivity();
122cc0e782871eb6b946ded880e391866f27953654bAlan Viverette        final ToggleSwitch toggleSwitch = new ToggleSwitch(activity);
123cc0e782871eb6b946ded880e391866f27953654bAlan Viverette
124cc0e782871eb6b946ded880e391866f27953654bAlan Viverette        final int padding = getResources().getDimensionPixelSize(
125cc0e782871eb6b946ded880e391866f27953654bAlan Viverette                R.dimen.action_bar_switch_padding);
126cc0e782871eb6b946ded880e391866f27953654bAlan Viverette        toggleSwitch.setPaddingRelative(0, 0, padding, 0);
127cc0e782871eb6b946ded880e391866f27953654bAlan Viverette
128cc0e782871eb6b946ded880e391866f27953654bAlan Viverette        final ActionBar actionBar = activity.getActionBar();
129cc0e782871eb6b946ded880e391866f27953654bAlan Viverette        actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM, ActionBar.DISPLAY_SHOW_CUSTOM);
130cc0e782871eb6b946ded880e391866f27953654bAlan Viverette
131cc0e782871eb6b946ded880e391866f27953654bAlan Viverette        final ActionBar.LayoutParams params = new ActionBar.LayoutParams(
132cc0e782871eb6b946ded880e391866f27953654bAlan Viverette                ActionBar.LayoutParams.WRAP_CONTENT, ActionBar.LayoutParams.WRAP_CONTENT,
133cc0e782871eb6b946ded880e391866f27953654bAlan Viverette                        Gravity.CENTER_VERTICAL | Gravity.END);
134cc0e782871eb6b946ded880e391866f27953654bAlan Viverette        actionBar.setCustomView(toggleSwitch, params);
135cc0e782871eb6b946ded880e391866f27953654bAlan Viverette
1365ea751e48fc3d7c25cf4e44ef5926e8e70979b5aAlan Viverette        final boolean enabled = mCaptioningManager.isEnabled();
137cc0e782871eb6b946ded880e391866f27953654bAlan Viverette        mPropsFragment.getPreferenceScreen().setEnabled(enabled);
138cc0e782871eb6b946ded880e391866f27953654bAlan Viverette        mPreviewText.setVisibility(enabled ? View.VISIBLE : View.INVISIBLE);
139cc0e782871eb6b946ded880e391866f27953654bAlan Viverette        toggleSwitch.setCheckedInternal(enabled);
140cc0e782871eb6b946ded880e391866f27953654bAlan Viverette        toggleSwitch.setOnBeforeCheckedChangeListener(new OnBeforeCheckedChangeListener() {
141cc0e782871eb6b946ded880e391866f27953654bAlan Viverette            @Override
142cc0e782871eb6b946ded880e391866f27953654bAlan Viverette            public boolean onBeforeCheckedChanged(ToggleSwitch toggleSwitch, boolean checked) {
143cc0e782871eb6b946ded880e391866f27953654bAlan Viverette                toggleSwitch.setCheckedInternal(checked);
144cc0e782871eb6b946ded880e391866f27953654bAlan Viverette                Settings.Secure.putInt(getActivity().getContentResolver(),
145cc0e782871eb6b946ded880e391866f27953654bAlan Viverette                        Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED, checked ? 1 : 0);
146cc0e782871eb6b946ded880e391866f27953654bAlan Viverette                mPropsFragment.getPreferenceScreen().setEnabled(checked);
147cc0e782871eb6b946ded880e391866f27953654bAlan Viverette                mPreviewText.setVisibility(checked ? View.VISIBLE : View.INVISIBLE);
148cc0e782871eb6b946ded880e391866f27953654bAlan Viverette                return false;
149cc0e782871eb6b946ded880e391866f27953654bAlan Viverette            }
150cc0e782871eb6b946ded880e391866f27953654bAlan Viverette        });
151cc0e782871eb6b946ded880e391866f27953654bAlan Viverette    }
152cc0e782871eb6b946ded880e391866f27953654bAlan Viverette}
153