| /* |
| * Copyright (C) 2022 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.settings.accessibility; |
| |
| import static com.android.settings.accessibility.AccessibilityUtil.State.OFF; |
| import static com.android.settings.accessibility.AccessibilityUtil.State.ON; |
| |
| import android.content.ContentResolver; |
| import android.content.Context; |
| import android.provider.Settings; |
| import android.view.View; |
| import android.view.accessibility.CaptioningManager; |
| import android.view.accessibility.CaptioningManager.CaptionStyle; |
| |
| import com.android.internal.widget.SubtitleView; |
| import com.android.settings.R; |
| import com.android.settingslib.accessibility.AccessibilityUtils; |
| |
| import com.google.common.annotations.VisibleForTesting; |
| |
| import java.util.Locale; |
| |
| /** Helper class for caption. */ |
| public class CaptionHelper { |
| |
| /* WebVtt specifies line height as 5.3% of the viewport height. */ |
| @VisibleForTesting |
| static final float LINE_HEIGHT_RATIO = 0.0533f; |
| |
| private final Context mContext; |
| private final ContentResolver mContentResolver; |
| private final CaptioningManager mCaptioningManager; |
| |
| public CaptionHelper(Context context) { |
| mContext = context; |
| mContentResolver = mContext.getContentResolver(); |
| mCaptioningManager = context.getSystemService(CaptioningManager.class); |
| } |
| |
| /** |
| * Sets the user's preferred captioning enabled state. |
| * |
| * @param enabled Whether to enable or disable captioning manager. |
| */ |
| public void setEnabled(boolean enabled) { |
| if (isEnabled() == enabled) { |
| return; |
| } |
| |
| Settings.Secure.putInt(mContext.getContentResolver(), |
| Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED, enabled ? ON : OFF); |
| } |
| |
| /** |
| * Gets if the captioning manager is enabled. |
| * |
| * @return True if the captioning manager is enabled, false otherwise. |
| */ |
| public boolean isEnabled() { |
| return mCaptioningManager.isEnabled(); |
| } |
| |
| /** |
| * Updates font style of captioning properties for preview screen. |
| * |
| * @param previewText preview text |
| * @param previewWindow preview window |
| * @param styleId font style id |
| */ |
| public void applyCaptionProperties(SubtitleView previewText, View previewWindow, |
| int styleId) { |
| previewText.setStyle(styleId); |
| |
| final float fontScale = mCaptioningManager.getFontScale(); |
| if (previewWindow != null) { |
| // Assume the viewport is clipped with a 16:9 aspect ratio. |
| final float virtualHeight = Math.max(9 * previewWindow.getWidth(), |
| 16 * previewWindow.getHeight()) / 16.0f; |
| previewText.setTextSize(virtualHeight * LINE_HEIGHT_RATIO * fontScale); |
| } else { |
| final float textSize = mContext.getResources().getDimension( |
| R.dimen.captioning_preview_text_size); |
| previewText.setTextSize(textSize * fontScale); |
| } |
| |
| final Locale locale = mCaptioningManager.getLocale(); |
| if (locale != null) { |
| final CharSequence localizedText = AccessibilityUtils.getTextForLocale( |
| mContext, locale, R.string.captioning_preview_characters); |
| previewText.setText(localizedText); |
| } else { |
| previewText.setText(R.string.captioning_preview_characters); |
| } |
| } |
| |
| /** |
| * Sets the user's preferred captioning background color. |
| * |
| * @param color The captioning background color |
| */ |
| public void setBackgroundColor(int color) { |
| Settings.Secure.putInt(mContentResolver, |
| Settings.Secure.ACCESSIBILITY_CAPTIONING_BACKGROUND_COLOR, color); |
| } |
| |
| /** Returns the captioning background color.*/ |
| public int getBackgroundColor() { |
| final CaptionStyle attrs = CaptionStyle.getCustomStyle(mContentResolver); |
| return attrs.hasBackgroundColor() ? attrs.backgroundColor : CaptionStyle.COLOR_UNSPECIFIED; |
| } |
| |
| /** |
| * Sets the user's preferred captioning foreground color. |
| * |
| * @param color The captioning foreground color |
| */ |
| public void setForegroundColor(int color) { |
| Settings.Secure.putInt(mContentResolver, |
| Settings.Secure.ACCESSIBILITY_CAPTIONING_FOREGROUND_COLOR, color); |
| } |
| |
| /** Returns the captioning foreground color.*/ |
| public int getForegroundColor() { |
| final CaptionStyle attrs = CaptionStyle.getCustomStyle(mContentResolver); |
| return attrs.hasForegroundColor() ? attrs.foregroundColor : CaptionStyle.COLOR_UNSPECIFIED; |
| } |
| |
| /** |
| * Sets the user's preferred captioning window color. |
| * |
| * @param color The captioning window color |
| */ |
| public void setWindowColor(int color) { |
| Settings.Secure.putInt(mContentResolver, |
| Settings.Secure.ACCESSIBILITY_CAPTIONING_WINDOW_COLOR, color); |
| } |
| |
| /** Returns the captioning window color.*/ |
| public int getWindowColor() { |
| final CaptionStyle attrs = CaptionStyle.getCustomStyle(mContentResolver); |
| return attrs.hasWindowColor() ? attrs.windowColor : CaptionStyle.COLOR_UNSPECIFIED; |
| } |
| |
| /** |
| * Sets the user's preferred captioning edge color. |
| * |
| * @param color The captioning edge color |
| */ |
| public void setEdgeColor(int color) { |
| Settings.Secure.putInt(mContentResolver, |
| Settings.Secure.ACCESSIBILITY_CAPTIONING_EDGE_COLOR, color); |
| } |
| |
| /** Returns the captioning edge color.*/ |
| public int getEdgeColor() { |
| final CaptionStyle attrs = CaptionStyle.getCustomStyle(mContentResolver); |
| return attrs.edgeColor; |
| } |
| |
| /** |
| * Sets the user's preferred captioning edge type. |
| * |
| * @param type The captioning edge type |
| */ |
| public void setEdgeType(int type) { |
| Settings.Secure.putInt(mContentResolver, |
| Settings.Secure.ACCESSIBILITY_CAPTIONING_EDGE_TYPE, type); |
| } |
| |
| /** Returns the captioning edge type.*/ |
| public int getEdgeType() { |
| final CaptionStyle attrs = CaptionStyle.getCustomStyle(mContentResolver); |
| return attrs.edgeType; |
| } |
| |
| /** |
| * Sets the captioning raw user style. |
| * |
| * @param type The captioning raw user style |
| */ |
| public void setRawUserStyle(int type) { |
| Settings.Secure.putInt(mContentResolver, |
| Settings.Secure.ACCESSIBILITY_CAPTIONING_PRESET, type); |
| } |
| |
| /** Returns the captioning raw preset number.*/ |
| public int getRawUserStyle() { |
| return mCaptioningManager.getRawUserStyle(); |
| } |
| |
| /** Returns the captioning visual properties.*/ |
| public CaptionStyle getUserStyle() { |
| return mCaptioningManager.getUserStyle(); |
| } |
| |
| /** Returns the captioning locale language.*/ |
| public Locale getLocale() { |
| return mCaptioningManager.getLocale(); |
| } |
| } |