• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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