1 /* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.settings.accessibility; 18 19 import android.content.ContentResolver; 20 import android.content.Context; 21 import android.content.res.Resources; 22 import android.graphics.Point; 23 import android.media.AudioManager; 24 import android.media.MediaPlayer; 25 import android.media.MediaPlayer.OnPreparedListener; 26 import android.net.Uri; 27 import android.os.Bundle; 28 import android.support.v7.preference.Preference; 29 import android.support.v7.preference.PreferenceScreen; 30 import android.support.v7.preference.PreferenceViewHolder; 31 import android.view.Display; 32 import android.view.ViewTreeObserver.OnGlobalLayoutListener; 33 import android.view.WindowManager; 34 import android.widget.ImageView; 35 import android.widget.RelativeLayout.LayoutParams; 36 import android.widget.Switch; 37 import android.widget.VideoView; 38 39 import com.android.internal.logging.nano.MetricsProto.MetricsEvent; 40 import com.android.settings.R; 41 import com.android.settings.widget.SwitchBar; 42 43 public class ToggleScreenMagnificationPreferenceFragment extends 44 ToggleFeaturePreferenceFragment implements SwitchBar.OnSwitchChangeListener { 45 46 protected class VideoPreference extends Preference { 47 private ImageView mVideoBackgroundView; 48 private OnGlobalLayoutListener mLayoutListener; 49 VideoPreference(Context context)50 public VideoPreference(Context context) { 51 super(context); 52 } 53 54 @Override onBindViewHolder(PreferenceViewHolder view)55 public void onBindViewHolder(PreferenceViewHolder view) { 56 super.onBindViewHolder(view); 57 Resources res = getPrefContext().getResources(); 58 final int backgroundAssetWidth = res.getDimensionPixelSize( 59 R.dimen.screen_magnification_video_background_width); 60 final int videoAssetWidth = res 61 .getDimensionPixelSize(R.dimen.screen_magnification_video_width); 62 final int videoAssetHeight = res 63 .getDimensionPixelSize(R.dimen.screen_magnification_video_height); 64 final int videoAssetMarginTop = res.getDimensionPixelSize( 65 R.dimen.screen_magnification_video_margin_top); 66 view.setDividerAllowedAbove(false); 67 view.setDividerAllowedBelow(false); 68 mVideoBackgroundView = (ImageView) view.findViewById(R.id.video_background); 69 final VideoView videoView = (VideoView) view.findViewById(R.id.video); 70 71 // Loop the video. 72 videoView.setOnPreparedListener(new OnPreparedListener() { 73 @Override 74 public void onPrepared(MediaPlayer mediaPlayer) { 75 mediaPlayer.setLooping(true); 76 } 77 }); 78 79 // Make sure the VideoView does not request audio focus. 80 videoView.setAudioFocusRequest(AudioManager.AUDIOFOCUS_NONE); 81 82 // Resolve and set the video content 83 Bundle args = getArguments(); 84 if ((args != null) && args.containsKey( 85 AccessibilitySettings.EXTRA_VIDEO_RAW_RESOURCE_ID)) { 86 videoView.setVideoURI(Uri.parse(String.format("%s://%s/%s", 87 ContentResolver.SCHEME_ANDROID_RESOURCE, 88 getPrefContext().getPackageName(), 89 args.getInt(AccessibilitySettings.EXTRA_VIDEO_RAW_RESOURCE_ID)))); 90 } 91 92 // Make sure video controls (e.g. for pausing) are not displayed. 93 videoView.setMediaController(null); 94 95 // LayoutListener for adjusting the position of the VideoView on the background image. 96 mLayoutListener = new OnGlobalLayoutListener() { 97 @Override 98 public void onGlobalLayout() { 99 final int backgroundViewWidth = mVideoBackgroundView.getWidth(); 100 101 LayoutParams videoLp = (LayoutParams) videoView.getLayoutParams(); 102 videoLp.width = videoAssetWidth * backgroundViewWidth / backgroundAssetWidth; 103 videoLp.height = videoAssetHeight * backgroundViewWidth / backgroundAssetWidth; 104 videoLp.setMargins(0, 105 videoAssetMarginTop * backgroundViewWidth / backgroundAssetWidth, 0, 0); 106 videoView.setLayoutParams(videoLp); 107 videoView.invalidate(); 108 videoView.start(); 109 } 110 }; 111 112 mVideoBackgroundView.getViewTreeObserver().addOnGlobalLayoutListener(mLayoutListener); 113 } 114 115 @Override onPrepareForRemoval()116 protected void onPrepareForRemoval() { 117 mVideoBackgroundView.getViewTreeObserver() 118 .removeOnGlobalLayoutListener(mLayoutListener); 119 } 120 } 121 122 protected VideoPreference mVideoPreference; 123 protected Preference mConfigWarningPreference; 124 125 private boolean mLaunchFromSuw = false; 126 private boolean mInitialSetting = false; 127 128 @Override onCreate(Bundle savedInstanceState)129 public void onCreate(Bundle savedInstanceState) { 130 super.onCreate(savedInstanceState); 131 132 mVideoPreference = new VideoPreference(getPrefContext()); 133 mVideoPreference.setSelectable(false); 134 mVideoPreference.setPersistent(false); 135 mVideoPreference.setLayoutResource(R.layout.magnification_video_preference); 136 137 mConfigWarningPreference = new Preference(getPrefContext()); 138 mConfigWarningPreference.setSelectable(false); 139 mConfigWarningPreference.setPersistent(false); 140 mConfigWarningPreference.setVisible(false); 141 mConfigWarningPreference.setIcon(R.drawable.ic_warning_24dp); 142 143 final PreferenceScreen preferenceScreen = getPreferenceManager().getPreferenceScreen(); 144 preferenceScreen.setOrderingAsAdded(false); 145 mVideoPreference.setOrder(0); 146 mConfigWarningPreference.setOrder(2); 147 preferenceScreen.addPreference(mVideoPreference); 148 preferenceScreen.addPreference(mConfigWarningPreference); 149 } 150 151 @Override onResume()152 public void onResume() { 153 super.onResume(); 154 155 VideoView videoView = (VideoView) getView().findViewById(R.id.video); 156 if (videoView != null) { 157 videoView.start(); 158 } 159 160 updateConfigurationWarningIfNeeded(); 161 } 162 163 @Override getMetricsCategory()164 public int getMetricsCategory() { 165 // TODO: Distinguish between magnification modes 166 return MetricsEvent.ACCESSIBILITY_TOGGLE_SCREEN_MAGNIFICATION; 167 } 168 169 @Override onSwitchChanged(Switch switchView, boolean isChecked)170 public void onSwitchChanged(Switch switchView, boolean isChecked) { 171 onPreferenceToggled(mPreferenceKey, isChecked); 172 } 173 174 @Override onPreferenceToggled(String preferenceKey, boolean enabled)175 protected void onPreferenceToggled(String preferenceKey, boolean enabled) { 176 MagnificationPreferenceFragment.setChecked(getContentResolver(), preferenceKey, enabled); 177 updateConfigurationWarningIfNeeded(); 178 } 179 180 @Override onInstallSwitchBarToggleSwitch()181 protected void onInstallSwitchBarToggleSwitch() { 182 super.onInstallSwitchBarToggleSwitch(); 183 184 mSwitchBar.setCheckedInternal( 185 MagnificationPreferenceFragment.isChecked(getContentResolver(), mPreferenceKey)); 186 mSwitchBar.addOnSwitchChangeListener(this); 187 } 188 189 @Override onRemoveSwitchBarToggleSwitch()190 protected void onRemoveSwitchBarToggleSwitch() { 191 super.onRemoveSwitchBarToggleSwitch(); 192 mSwitchBar.removeOnSwitchChangeListener(this); 193 } 194 195 @Override onProcessArguments(Bundle arguments)196 protected void onProcessArguments(Bundle arguments) { 197 super.onProcessArguments(arguments); 198 if (arguments == null) { 199 return; 200 } 201 202 if (arguments.containsKey(AccessibilitySettings.EXTRA_VIDEO_RAW_RESOURCE_ID)) { 203 mVideoPreference.setVisible(true); 204 final int resId = arguments.getInt( 205 AccessibilitySettings.EXTRA_VIDEO_RAW_RESOURCE_ID); 206 } else { 207 mVideoPreference.setVisible(false); 208 } 209 210 if (arguments.containsKey(AccessibilitySettings.EXTRA_LAUNCHED_FROM_SUW)) { 211 mLaunchFromSuw = arguments.getBoolean(AccessibilitySettings.EXTRA_LAUNCHED_FROM_SUW); 212 } 213 214 if (arguments.containsKey(AccessibilitySettings.EXTRA_CHECKED)) { 215 mInitialSetting = arguments.getBoolean(AccessibilitySettings.EXTRA_CHECKED); 216 } 217 218 if (arguments.containsKey(AccessibilitySettings.EXTRA_TITLE_RES)) { 219 final int titleRes = arguments.getInt(AccessibilitySettings.EXTRA_TITLE_RES); 220 if (titleRes > 0) { 221 getActivity().setTitle(titleRes); 222 } 223 } 224 } 225 updateConfigurationWarningIfNeeded()226 private void updateConfigurationWarningIfNeeded() { 227 final CharSequence warningMessage = 228 MagnificationPreferenceFragment.getConfigurationWarningStringForSecureSettingsKey( 229 mPreferenceKey, getPrefContext()); 230 if (warningMessage != null) { 231 mConfigWarningPreference.setSummary(warningMessage); 232 } 233 mConfigWarningPreference.setVisible(warningMessage != null); 234 } 235 getScreenWidth(Context context)236 private static int getScreenWidth(Context context) { 237 WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 238 Display display = wm.getDefaultDisplay(); 239 Point size = new Point(); 240 display.getSize(size); 241 return size.x; 242 } 243 } 244