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.provider.Settings; 29 import android.support.v7.preference.Preference; 30 import android.support.v7.preference.PreferenceScreen; 31 import android.support.v7.preference.PreferenceViewHolder; 32 import android.view.Display; 33 import android.view.ViewTreeObserver.OnGlobalLayoutListener; 34 import android.view.WindowManager; 35 import android.widget.ImageView; 36 import android.widget.RelativeLayout.LayoutParams; 37 import android.widget.Switch; 38 import android.widget.VideoView; 39 40 import com.android.internal.logging.nano.MetricsProto.MetricsEvent; 41 import com.android.settings.R; 42 import com.android.settings.widget.SwitchBar; 43 44 public class ToggleScreenMagnificationPreferenceFragment extends 45 ToggleFeaturePreferenceFragment implements SwitchBar.OnSwitchChangeListener { 46 47 protected class VideoPreference extends Preference { 48 private ImageView mVideoBackgroundView; 49 private OnGlobalLayoutListener mLayoutListener; 50 VideoPreference(Context context)51 public VideoPreference(Context context) { 52 super(context); 53 } 54 55 @Override onBindViewHolder(PreferenceViewHolder view)56 public void onBindViewHolder(PreferenceViewHolder view) { 57 super.onBindViewHolder(view); 58 Resources res = getPrefContext().getResources(); 59 final int backgroundAssetWidth = res.getDimensionPixelSize( 60 R.dimen.screen_magnification_video_background_width); 61 final int videoAssetWidth = res 62 .getDimensionPixelSize(R.dimen.screen_magnification_video_width); 63 final int videoAssetHeight = res 64 .getDimensionPixelSize(R.dimen.screen_magnification_video_height); 65 final int videoAssetMarginTop = res.getDimensionPixelSize( 66 R.dimen.screen_magnification_video_margin_top); 67 view.setDividerAllowedAbove(false); 68 view.setDividerAllowedBelow(false); 69 mVideoBackgroundView = (ImageView) view.findViewById(R.id.video_background); 70 final VideoView videoView = (VideoView) view.findViewById(R.id.video); 71 72 // Loop the video. 73 videoView.setOnPreparedListener(new OnPreparedListener() { 74 @Override 75 public void onPrepared(MediaPlayer mediaPlayer) { 76 mediaPlayer.setLooping(true); 77 } 78 }); 79 80 // Make sure the VideoView does not request audio focus. 81 videoView.setAudioFocusRequest(AudioManager.AUDIOFOCUS_NONE); 82 83 // Resolve and set the video content 84 Bundle args = getArguments(); 85 if ((args != null) && args.containsKey( 86 AccessibilitySettings.EXTRA_VIDEO_RAW_RESOURCE_ID)) { 87 videoView.setVideoURI(Uri.parse(String.format("%s://%s/%s", 88 ContentResolver.SCHEME_ANDROID_RESOURCE, 89 getPrefContext().getPackageName(), 90 args.getInt(AccessibilitySettings.EXTRA_VIDEO_RAW_RESOURCE_ID)))); 91 } 92 93 // Make sure video controls (e.g. for pausing) are not displayed. 94 videoView.setMediaController(null); 95 96 // LayoutListener for adjusting the position of the VideoView on the background image. 97 mLayoutListener = new OnGlobalLayoutListener() { 98 @Override 99 public void onGlobalLayout() { 100 final int backgroundViewWidth = mVideoBackgroundView.getWidth(); 101 102 LayoutParams videoLp = (LayoutParams) videoView.getLayoutParams(); 103 videoLp.width = videoAssetWidth * backgroundViewWidth / backgroundAssetWidth; 104 videoLp.height = videoAssetHeight * backgroundViewWidth / backgroundAssetWidth; 105 videoLp.setMargins(0, 106 videoAssetMarginTop * backgroundViewWidth / backgroundAssetWidth, 0, 0); 107 videoView.setLayoutParams(videoLp); 108 videoView.invalidate(); 109 videoView.start(); 110 mVideoBackgroundView.getViewTreeObserver() 111 .removeOnGlobalLayoutListener(mLayoutListener); 112 } 113 }; 114 115 mVideoBackgroundView.getViewTreeObserver().addOnGlobalLayoutListener(mLayoutListener); 116 } 117 118 @Override onPrepareForRemoval()119 protected void onPrepareForRemoval() { 120 mVideoBackgroundView.getViewTreeObserver() 121 .removeOnGlobalLayoutListener(mLayoutListener); 122 } 123 } 124 125 protected VideoPreference mVideoPreference; 126 protected Preference mConfigWarningPreference; 127 128 private boolean mLaunchFromSuw = false; 129 private boolean mInitialSetting = false; 130 131 @Override onCreate(Bundle savedInstanceState)132 public void onCreate(Bundle savedInstanceState) { 133 super.onCreate(savedInstanceState); 134 135 mVideoPreference = new VideoPreference(getPrefContext()); 136 mVideoPreference.setSelectable(false); 137 mVideoPreference.setPersistent(false); 138 mVideoPreference.setLayoutResource(R.layout.magnification_video_preference); 139 140 mConfigWarningPreference = new Preference(getPrefContext()); 141 mConfigWarningPreference.setSelectable(false); 142 mConfigWarningPreference.setPersistent(false); 143 mConfigWarningPreference.setVisible(false); 144 mConfigWarningPreference.setIcon(R.drawable.ic_warning_24dp); 145 146 final PreferenceScreen preferenceScreen = getPreferenceManager().getPreferenceScreen(); 147 preferenceScreen.setOrderingAsAdded(false); 148 mVideoPreference.setOrder(0); 149 mConfigWarningPreference.setOrder(2); 150 preferenceScreen.addPreference(mVideoPreference); 151 preferenceScreen.addPreference(mConfigWarningPreference); 152 } 153 154 @Override onResume()155 public void onResume() { 156 super.onResume(); 157 158 VideoView videoView = (VideoView) getView().findViewById(R.id.video); 159 if (videoView != null) { 160 videoView.start(); 161 } 162 163 updateConfigurationWarningIfNeeded(); 164 } 165 166 @Override getMetricsCategory()167 public int getMetricsCategory() { 168 // TODO: Distinguish between magnification modes 169 return MetricsEvent.ACCESSIBILITY_TOGGLE_SCREEN_MAGNIFICATION; 170 } 171 172 @Override onSwitchChanged(Switch switchView, boolean isChecked)173 public void onSwitchChanged(Switch switchView, boolean isChecked) { 174 onPreferenceToggled(mPreferenceKey, isChecked); 175 } 176 177 @Override onPreferenceToggled(String preferenceKey, boolean enabled)178 protected void onPreferenceToggled(String preferenceKey, boolean enabled) { 179 Settings.Secure.putInt(getContentResolver(), preferenceKey, enabled ? 1 : 0); 180 updateConfigurationWarningIfNeeded(); 181 } 182 183 @Override onInstallSwitchBarToggleSwitch()184 protected void onInstallSwitchBarToggleSwitch() { 185 super.onInstallSwitchBarToggleSwitch(); 186 187 mSwitchBar.setCheckedInternal( 188 Settings.Secure.getInt(getContentResolver(), mPreferenceKey, 0) == 1); 189 mSwitchBar.addOnSwitchChangeListener(this); 190 } 191 192 @Override onRemoveSwitchBarToggleSwitch()193 protected void onRemoveSwitchBarToggleSwitch() { 194 super.onRemoveSwitchBarToggleSwitch(); 195 mSwitchBar.removeOnSwitchChangeListener(this); 196 } 197 198 @Override onProcessArguments(Bundle arguments)199 protected void onProcessArguments(Bundle arguments) { 200 super.onProcessArguments(arguments); 201 if (arguments == null) { 202 return; 203 } 204 205 if (arguments.containsKey(AccessibilitySettings.EXTRA_VIDEO_RAW_RESOURCE_ID)) { 206 mVideoPreference.setVisible(true); 207 final int resId = arguments.getInt( 208 AccessibilitySettings.EXTRA_VIDEO_RAW_RESOURCE_ID); 209 } else { 210 mVideoPreference.setVisible(false); 211 } 212 213 if (arguments.containsKey(AccessibilitySettings.EXTRA_LAUNCHED_FROM_SUW)) { 214 mLaunchFromSuw = arguments.getBoolean(AccessibilitySettings.EXTRA_LAUNCHED_FROM_SUW); 215 } 216 217 if (arguments.containsKey(AccessibilitySettings.EXTRA_CHECKED)) { 218 mInitialSetting = arguments.getBoolean(AccessibilitySettings.EXTRA_CHECKED); 219 } 220 } 221 updateConfigurationWarningIfNeeded()222 private void updateConfigurationWarningIfNeeded() { 223 final CharSequence warningMessage = 224 MagnificationPreferenceFragment.getConfigurationWarningStringForSecureSettingsKey( 225 mPreferenceKey, getPrefContext()); 226 if (warningMessage != null) { 227 mConfigWarningPreference.setSummary(warningMessage); 228 } 229 mConfigWarningPreference.setVisible(warningMessage != null); 230 } 231 getScreenWidth(Context context)232 private static int getScreenWidth(Context context) { 233 WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 234 Display display = wm.getDefaultDisplay(); 235 Point size = new Point(); 236 display.getSize(size); 237 return size.x; 238 } 239 } 240