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