ToggleCaptioningPreferenceFragment.java revision 5ea751e48fc3d7c25cf4e44ef5926e8e70979b5a
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); 95cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 96cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 97cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 98cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 995ea751e48fc3d7c25cf4e44ef5926e8e70979b5aAlan Viverette public static void applyCaptionProperties( 1005ea751e48fc3d7c25cf4e44ef5926e8e70979b5aAlan Viverette CaptioningManager manager, SubtitleView previewText, int styleId) { 101c30f124c917b55a93b3d4880d8d992d649a076f0Alan Viverette previewText.setStyle(styleId); 102cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 103cc0e782871eb6b946ded880e391866f27953654bAlan Viverette final Context context = previewText.getContext(); 104cc0e782871eb6b946ded880e391866f27953654bAlan Viverette final ContentResolver cr = context.getContentResolver(); 1055ea751e48fc3d7c25cf4e44ef5926e8e70979b5aAlan Viverette final float fontScale = manager.getFontScale(); 1065ea751e48fc3d7c25cf4e44ef5926e8e70979b5aAlan Viverette previewText.setTextSize(fontScale * DEFAULT_FONT_SIZE); 107c30f124c917b55a93b3d4880d8d992d649a076f0Alan Viverette 1085ea751e48fc3d7c25cf4e44ef5926e8e70979b5aAlan Viverette final Locale locale = manager.getLocale(); 109cc0e782871eb6b946ded880e391866f27953654bAlan Viverette if (locale != null) { 110cc0e782871eb6b946ded880e391866f27953654bAlan Viverette final CharSequence localizedText = AccessibilityUtils.getTextForLocale( 111cc0e782871eb6b946ded880e391866f27953654bAlan Viverette context, locale, R.string.captioning_preview_characters); 112cc0e782871eb6b946ded880e391866f27953654bAlan Viverette previewText.setText(localizedText); 113cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 114cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 115cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 116cc0e782871eb6b946ded880e391866f27953654bAlan Viverette private void installActionBarToggleSwitch() { 117cc0e782871eb6b946ded880e391866f27953654bAlan Viverette final Activity activity = getActivity(); 118cc0e782871eb6b946ded880e391866f27953654bAlan Viverette final ToggleSwitch toggleSwitch = new ToggleSwitch(activity); 119cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 120cc0e782871eb6b946ded880e391866f27953654bAlan Viverette final int padding = getResources().getDimensionPixelSize( 121cc0e782871eb6b946ded880e391866f27953654bAlan Viverette R.dimen.action_bar_switch_padding); 122cc0e782871eb6b946ded880e391866f27953654bAlan Viverette toggleSwitch.setPaddingRelative(0, 0, padding, 0); 123cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 124cc0e782871eb6b946ded880e391866f27953654bAlan Viverette final ActionBar actionBar = activity.getActionBar(); 125cc0e782871eb6b946ded880e391866f27953654bAlan Viverette actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM, ActionBar.DISPLAY_SHOW_CUSTOM); 126cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 127cc0e782871eb6b946ded880e391866f27953654bAlan Viverette final ActionBar.LayoutParams params = new ActionBar.LayoutParams( 128cc0e782871eb6b946ded880e391866f27953654bAlan Viverette ActionBar.LayoutParams.WRAP_CONTENT, ActionBar.LayoutParams.WRAP_CONTENT, 129cc0e782871eb6b946ded880e391866f27953654bAlan Viverette Gravity.CENTER_VERTICAL | Gravity.END); 130cc0e782871eb6b946ded880e391866f27953654bAlan Viverette actionBar.setCustomView(toggleSwitch, params); 131cc0e782871eb6b946ded880e391866f27953654bAlan Viverette 1325ea751e48fc3d7c25cf4e44ef5926e8e70979b5aAlan Viverette final boolean enabled = mCaptioningManager.isEnabled(); 133cc0e782871eb6b946ded880e391866f27953654bAlan Viverette mPropsFragment.getPreferenceScreen().setEnabled(enabled); 134cc0e782871eb6b946ded880e391866f27953654bAlan Viverette mPreviewText.setVisibility(enabled ? View.VISIBLE : View.INVISIBLE); 135cc0e782871eb6b946ded880e391866f27953654bAlan Viverette toggleSwitch.setCheckedInternal(enabled); 136cc0e782871eb6b946ded880e391866f27953654bAlan Viverette toggleSwitch.setOnBeforeCheckedChangeListener(new OnBeforeCheckedChangeListener() { 137cc0e782871eb6b946ded880e391866f27953654bAlan Viverette @Override 138cc0e782871eb6b946ded880e391866f27953654bAlan Viverette public boolean onBeforeCheckedChanged(ToggleSwitch toggleSwitch, boolean checked) { 139cc0e782871eb6b946ded880e391866f27953654bAlan Viverette toggleSwitch.setCheckedInternal(checked); 140cc0e782871eb6b946ded880e391866f27953654bAlan Viverette Settings.Secure.putInt(getActivity().getContentResolver(), 141cc0e782871eb6b946ded880e391866f27953654bAlan Viverette Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED, checked ? 1 : 0); 142cc0e782871eb6b946ded880e391866f27953654bAlan Viverette mPropsFragment.getPreferenceScreen().setEnabled(checked); 143cc0e782871eb6b946ded880e391866f27953654bAlan Viverette mPreviewText.setVisibility(checked ? View.VISIBLE : View.INVISIBLE); 144cc0e782871eb6b946ded880e391866f27953654bAlan Viverette return false; 145cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 146cc0e782871eb6b946ded880e391866f27953654bAlan Viverette }); 147cc0e782871eb6b946ded880e391866f27953654bAlan Viverette } 148cc0e782871eb6b946ded880e391866f27953654bAlan Viverette} 149